Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/cmd/integration-test/network.go
2070 views
1
package main
2
3
import (
4
"fmt"
5
"net"
6
"os"
7
"strings"
8
"time"
9
10
"github.com/projectdiscovery/nuclei/v3/pkg/testutils"
11
osutils "github.com/projectdiscovery/utils/os"
12
"github.com/projectdiscovery/utils/reader"
13
)
14
15
var networkTestcases = []TestCaseInfo{
16
{Path: "protocols/network/basic.yaml", TestCase: &networkBasic{}, DisableOn: func() bool { return osutils.IsWindows() }},
17
{Path: "protocols/network/hex.yaml", TestCase: &networkBasic{}, DisableOn: func() bool { return osutils.IsWindows() }},
18
{Path: "protocols/network/multi-step.yaml", TestCase: &networkMultiStep{}},
19
{Path: "protocols/network/self-contained.yaml", TestCase: &networkRequestSelContained{}},
20
{Path: "protocols/network/variables.yaml", TestCase: &networkVariables{}},
21
{Path: "protocols/network/same-address.yaml", TestCase: &networkBasic{}},
22
{Path: "protocols/network/network-port.yaml", TestCase: &networkPort{}},
23
{Path: "protocols/network/net-https.yaml", TestCase: &networkhttps{}},
24
{Path: "protocols/network/net-https-timeout.yaml", TestCase: &networkhttps{}},
25
}
26
27
const defaultStaticPort = 5431
28
29
type networkBasic struct{}
30
31
// Execute executes a test case and returns an error if occurred
32
func (h *networkBasic) Execute(filePath string) error {
33
var routerErr error
34
35
ts := testutils.NewTCPServer(nil, defaultStaticPort, func(conn net.Conn) {
36
defer func() {
37
_ = conn.Close()
38
}()
39
40
data, err := reader.ConnReadNWithTimeout(conn, 4, time.Duration(5)*time.Second)
41
if err != nil {
42
routerErr = err
43
return
44
}
45
if string(data) == "PING" {
46
_, _ = conn.Write([]byte("PONG"))
47
} else {
48
routerErr = fmt.Errorf("invalid data received: %s", string(data))
49
}
50
})
51
defer ts.Close()
52
53
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL, debug)
54
if err != nil {
55
_, _ = fmt.Fprintf(os.Stderr, "Could not run nuclei: %s\n", err)
56
return err
57
}
58
if routerErr != nil {
59
_, _ = fmt.Fprintf(os.Stderr, "routerErr: %s\n", routerErr)
60
return routerErr
61
}
62
63
return expectResultsCount(results, 1)
64
}
65
66
type networkMultiStep struct{}
67
68
// Execute executes a test case and returns an error if occurred
69
func (h *networkMultiStep) Execute(filePath string) error {
70
var routerErr error
71
72
ts := testutils.NewTCPServer(nil, defaultStaticPort, func(conn net.Conn) {
73
defer func() {
74
_ = conn.Close()
75
}()
76
77
data, err := reader.ConnReadNWithTimeout(conn, 5, time.Duration(5)*time.Second)
78
if err != nil {
79
routerErr = err
80
return
81
}
82
if string(data) == "FIRST" {
83
_, _ = conn.Write([]byte("PING"))
84
}
85
86
data, err = reader.ConnReadNWithTimeout(conn, 6, time.Duration(5)*time.Second)
87
if err != nil {
88
routerErr = err
89
return
90
}
91
if string(data) == "SECOND" {
92
_, _ = conn.Write([]byte("PONG"))
93
}
94
_, _ = conn.Write([]byte("NUCLEI"))
95
})
96
defer ts.Close()
97
98
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL, debug)
99
if err != nil {
100
return err
101
}
102
if routerErr != nil {
103
return routerErr
104
}
105
106
var expectedResultsSize int
107
if debug {
108
expectedResultsSize = 3
109
} else {
110
expectedResultsSize = 1
111
}
112
113
return expectResultsCount(results, expectedResultsSize)
114
}
115
116
type networkRequestSelContained struct{}
117
118
// Execute executes a test case and returns an error if occurred
119
func (h *networkRequestSelContained) Execute(filePath string) error {
120
ts := testutils.NewTCPServer(nil, defaultStaticPort, func(conn net.Conn) {
121
defer func() {
122
_ = conn.Close()
123
}()
124
125
_, _ = conn.Write([]byte("Authentication successful"))
126
})
127
defer ts.Close()
128
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "", debug, "-esc")
129
if err != nil {
130
return err
131
}
132
133
return expectResultsCount(results, 1)
134
}
135
136
type networkVariables struct{}
137
138
// Execute executes a test case and returns an error if occurred
139
func (h *networkVariables) Execute(filePath string) error {
140
var routerErr error
141
142
ts := testutils.NewTCPServer(nil, defaultStaticPort, func(conn net.Conn) {
143
defer func() {
144
_ = conn.Close()
145
}()
146
147
data, err := reader.ConnReadNWithTimeout(conn, 4, time.Duration(5)*time.Second)
148
if err != nil {
149
routerErr = err
150
return
151
}
152
if string(data) == "PING" {
153
_, _ = conn.Write([]byte("aGVsbG8="))
154
}
155
})
156
defer ts.Close()
157
158
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL, debug)
159
if err != nil {
160
return err
161
}
162
if routerErr != nil {
163
return routerErr
164
}
165
166
return expectResultsCount(results, 1)
167
}
168
169
type networkPort struct{}
170
171
func (n *networkPort) Execute(filePath string) error {
172
ts := testutils.NewTCPServer(nil, 23846, func(conn net.Conn) {
173
defer func() {
174
_ = conn.Close()
175
}()
176
177
data, err := reader.ConnReadNWithTimeout(conn, 4, time.Duration(5)*time.Second)
178
if err != nil {
179
return
180
}
181
if string(data) == "PING" {
182
_, _ = conn.Write([]byte("PONG"))
183
}
184
})
185
defer ts.Close()
186
187
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL, debug)
188
if err != nil {
189
return err
190
}
191
192
if err := expectResultsCount(results, 1); err != nil {
193
return err
194
}
195
196
// even though we passed port 443 in url it is ignored and port 23846 is used
197
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, strings.ReplaceAll(ts.URL, "23846", "443"), debug)
198
if err != nil {
199
return err
200
}
201
202
if err := expectResultsCount(results, 1); err != nil {
203
return err
204
}
205
206
// this is positive test case where we expect port to be overridden and 34567 to be used
207
ts2 := testutils.NewTCPServer(nil, 34567, func(conn net.Conn) {
208
defer func() {
209
_ = conn.Close()
210
}()
211
212
data, err := reader.ConnReadNWithTimeout(conn, 4, time.Duration(5)*time.Second)
213
if err != nil {
214
return
215
}
216
if string(data) == "PING" {
217
_, _ = conn.Write([]byte("PONG"))
218
}
219
})
220
defer ts2.Close()
221
222
// even though we passed port 443 in url it is ignored and port 23846 is used
223
// instead of hardcoded port 23846 in template
224
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, ts2.URL, debug)
225
if err != nil {
226
return err
227
}
228
229
return expectResultsCount(results, 1)
230
}
231
232
type networkhttps struct{}
233
234
// Execute executes a test case and returns an error if occurred
235
func (h *networkhttps) Execute(filePath string) error {
236
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "scanme.sh", debug)
237
if err != nil {
238
return err
239
}
240
return expectResultsCount(results, 1)
241
}
242
243