Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/cmd/integration-test/javascript.go
2843 views
1
package main
2
3
import (
4
"log"
5
"time"
6
7
"github.com/ory/dockertest/v3"
8
"github.com/projectdiscovery/nuclei/v3/pkg/testutils"
9
osutils "github.com/projectdiscovery/utils/os"
10
"go.uber.org/multierr"
11
)
12
13
var jsTestcases = []TestCaseInfo{
14
{Path: "protocols/javascript/redis-pass-brute.yaml", TestCase: &javascriptRedisPassBrute{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
15
{Path: "protocols/javascript/ssh-server-fingerprint.yaml", TestCase: &javascriptSSHServerFingerprint{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
16
{Path: "protocols/javascript/net-multi-step.yaml", TestCase: &networkMultiStep{}},
17
{Path: "protocols/javascript/net-https.yaml", TestCase: &javascriptNetHttps{}},
18
{Path: "protocols/javascript/rsync-test.yaml", TestCase: &javascriptRsyncTest{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
19
{Path: "protocols/javascript/oracle-auth-test.yaml", TestCase: &javascriptOracleAuthTest{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
20
{Path: "protocols/javascript/vnc-pass-brute.yaml", TestCase: &javascriptVncPassBrute{}},
21
{Path: "protocols/javascript/postgres-pass-brute.yaml", TestCase: &javascriptPostgresPassBrute{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
22
{Path: "protocols/javascript/mysql-connect.yaml", TestCase: &javascriptMySQLConnect{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
23
{Path: "protocols/javascript/multi-ports.yaml", TestCase: &javascriptMultiPortsSSH{}},
24
{Path: "protocols/javascript/no-port-args.yaml", TestCase: &javascriptNoPortArgs{}},
25
{Path: "protocols/javascript/telnet-auth-test.yaml", TestCase: &javascriptTelnetAuthTest{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},
26
}
27
28
var (
29
redisResource *dockertest.Resource
30
sshResource *dockertest.Resource
31
oracleResource *dockertest.Resource
32
vncResource *dockertest.Resource
33
telnetResource *dockertest.Resource
34
postgresResource *dockertest.Resource
35
mysqlResource *dockertest.Resource
36
rsyncResource *dockertest.Resource
37
pool *dockertest.Pool
38
defaultRetry = 3
39
)
40
41
type javascriptNetHttps struct{}
42
43
func (j *javascriptNetHttps) Execute(filePath string) error {
44
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "scanme.sh", debug)
45
if err != nil {
46
return err
47
}
48
return expectResultsCount(results, 1)
49
}
50
51
type javascriptRedisPassBrute struct{}
52
53
func (j *javascriptRedisPassBrute) Execute(filePath string) error {
54
if redisResource == nil || pool == nil {
55
// skip test as redis is not running
56
return nil
57
}
58
tempPort := redisResource.GetPort("6379/tcp")
59
finalURL := "localhost:" + tempPort
60
defer purge(redisResource)
61
errs := []error{}
62
for i := 0; i < defaultRetry; i++ {
63
results := []string{}
64
var err error
65
_ = pool.Retry(func() error {
66
//let ssh server start
67
time.Sleep(3 * time.Second)
68
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
69
return nil
70
})
71
if err != nil {
72
return err
73
}
74
if err := expectResultsCount(results, 1); err == nil {
75
return nil
76
} else {
77
errs = append(errs, err)
78
}
79
}
80
return multierr.Combine(errs...)
81
}
82
83
type javascriptSSHServerFingerprint struct{}
84
85
func (j *javascriptSSHServerFingerprint) Execute(filePath string) error {
86
if sshResource == nil || pool == nil {
87
// skip test as redis is not running
88
return nil
89
}
90
tempPort := sshResource.GetPort("2222/tcp")
91
finalURL := "localhost:" + tempPort
92
defer purge(sshResource)
93
errs := []error{}
94
for i := 0; i < defaultRetry; i++ {
95
results := []string{}
96
var err error
97
_ = pool.Retry(func() error {
98
//let ssh server start
99
time.Sleep(3 * time.Second)
100
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
101
return nil
102
})
103
if err != nil {
104
return err
105
}
106
if err := expectResultsCount(results, 1); err == nil {
107
return nil
108
} else {
109
errs = append(errs, err)
110
}
111
}
112
return multierr.Combine(errs...)
113
}
114
115
type javascriptOracleAuthTest struct{}
116
117
func (j *javascriptOracleAuthTest) Execute(filePath string) error {
118
if oracleResource == nil || pool == nil {
119
// skip test as oracle is not running
120
return nil
121
}
122
tempPort := oracleResource.GetPort("1521/tcp")
123
finalURL := "localhost:" + tempPort
124
defer purge(oracleResource)
125
126
errs := []error{}
127
for i := 0; i < defaultRetry; i++ {
128
results := []string{}
129
var err error
130
_ = pool.Retry(func() error {
131
// let oracle server start
132
time.Sleep(3 * time.Second)
133
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
134
return nil
135
})
136
if err != nil {
137
return err
138
}
139
if err := expectResultsCount(results, 1); err == nil {
140
return nil
141
} else {
142
errs = append(errs, err)
143
}
144
}
145
return multierr.Combine(errs...)
146
}
147
148
type javascriptVncPassBrute struct{}
149
150
func (j *javascriptVncPassBrute) Execute(filePath string) error {
151
if vncResource == nil || pool == nil {
152
// skip test as vnc is not running
153
return nil
154
}
155
tempPort := vncResource.GetPort("5900/tcp")
156
finalURL := "localhost:" + tempPort
157
defer purge(vncResource)
158
errs := []error{}
159
for i := 0; i < defaultRetry; i++ {
160
results := []string{}
161
var err error
162
_ = pool.Retry(func() error {
163
//let ssh server start
164
time.Sleep(3 * time.Second)
165
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
166
return nil
167
})
168
if err != nil {
169
return err
170
}
171
if err := expectResultsCount(results, 1); err == nil {
172
return nil
173
} else {
174
errs = append(errs, err)
175
}
176
}
177
return multierr.Combine(errs...)
178
}
179
180
type javascriptPostgresPassBrute struct{}
181
182
func (j *javascriptPostgresPassBrute) Execute(filePath string) error {
183
if postgresResource == nil || pool == nil {
184
// skip test as postgres is not running
185
return nil
186
}
187
tempPort := postgresResource.GetPort("5432/tcp")
188
finalURL := "localhost:" + tempPort
189
defer purge(postgresResource)
190
errs := []error{}
191
for i := 0; i < defaultRetry; i++ {
192
results := []string{}
193
var err error
194
_ = pool.Retry(func() error {
195
//let postgres server start
196
time.Sleep(3 * time.Second)
197
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
198
return nil
199
})
200
if err != nil {
201
return err
202
}
203
if err := expectResultsCount(results, 1); err == nil {
204
return nil
205
} else {
206
errs = append(errs, err)
207
}
208
}
209
return multierr.Combine(errs...)
210
}
211
212
type javascriptMySQLConnect struct{}
213
214
func (j *javascriptMySQLConnect) Execute(filePath string) error {
215
if mysqlResource == nil || pool == nil {
216
// skip test as mysql is not running
217
return nil
218
}
219
tempPort := mysqlResource.GetPort("3306/tcp")
220
finalURL := "localhost:" + tempPort
221
defer purge(mysqlResource)
222
errs := []error{}
223
for i := 0; i < defaultRetry; i++ {
224
results := []string{}
225
var err error
226
_ = pool.Retry(func() error {
227
//let mysql server start
228
time.Sleep(5 * time.Second)
229
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
230
return nil
231
})
232
if err != nil {
233
return err
234
}
235
if err := expectResultsCount(results, 1); err == nil {
236
return nil
237
} else {
238
errs = append(errs, err)
239
}
240
}
241
return multierr.Combine(errs...)
242
}
243
244
type javascriptMultiPortsSSH struct{}
245
246
func (j *javascriptMultiPortsSSH) Execute(filePath string) error {
247
// use scanme.sh as target to ensure we match on the 2nd default port 22
248
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "scanme.sh", debug)
249
if err != nil {
250
return err
251
}
252
return expectResultsCount(results, 1)
253
}
254
255
type javascriptNoPortArgs struct{}
256
257
func (j *javascriptNoPortArgs) Execute(filePath string) error {
258
results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "yo.dawg", debug)
259
if err != nil {
260
return err
261
}
262
return expectResultsCount(results, 1)
263
}
264
265
type javascriptRsyncTest struct{}
266
267
func (j *javascriptRsyncTest) Execute(filePath string) error {
268
if rsyncResource == nil || pool == nil {
269
// skip test as rsync is not running
270
return nil
271
}
272
tempPort := rsyncResource.GetPort("873/tcp")
273
finalURL := "localhost:" + tempPort
274
defer purge(rsyncResource)
275
errs := []error{}
276
for i := 0; i < defaultRetry; i++ {
277
results := []string{}
278
var err error
279
_ = pool.Retry(func() error {
280
//let rsync server start
281
time.Sleep(3 * time.Second)
282
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
283
return nil
284
})
285
if err != nil {
286
return err
287
}
288
if err := expectResultsCount(results, 1); err == nil {
289
return nil
290
} else {
291
errs = append(errs, err)
292
}
293
}
294
return multierr.Combine(errs...)
295
}
296
297
type javascriptTelnetAuthTest struct{}
298
299
func (j *javascriptTelnetAuthTest) Execute(filePath string) error {
300
if telnetResource == nil || pool == nil {
301
// skip test as telnet is not running
302
return nil
303
}
304
tempPort := telnetResource.GetPort("23/tcp")
305
finalURL := "localhost:" + tempPort
306
defer purge(telnetResource)
307
errs := []error{}
308
for i := 0; i < defaultRetry; i++ {
309
results := []string{}
310
var err error
311
_ = pool.Retry(func() error {
312
//let telnet server start
313
time.Sleep(3 * time.Second)
314
results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)
315
return nil
316
})
317
if err != nil {
318
return err
319
}
320
if err := expectResultsCount(results, 1); err == nil {
321
return nil
322
} else {
323
errs = append(errs, err)
324
}
325
}
326
return multierr.Combine(errs...)
327
}
328
329
// purge any given resource if it is not nil
330
func purge(resource *dockertest.Resource) {
331
if resource != nil && pool != nil {
332
containerName := resource.Container.Name
333
_ = pool.Client.StopContainer(resource.Container.ID, 0)
334
err := pool.Purge(resource)
335
if err != nil {
336
log.Printf("Could not purge resource: %s", err)
337
}
338
_ = pool.RemoveContainerByName(containerName)
339
}
340
}
341
342
func init() {
343
// uses a sensible default on windows (tcp/http) and linux/osx (socket)
344
pool, err := dockertest.NewPool("")
345
if err != nil {
346
log.Printf("something went wrong with dockertest: %s", err)
347
return
348
}
349
350
// uses pool to try to connect to Docker
351
err = pool.Client.Ping()
352
if err != nil {
353
log.Printf("Could not connect to Docker: %s", err)
354
}
355
356
// setup a temporary redis instance
357
redisResource, err = pool.RunWithOptions(&dockertest.RunOptions{
358
Repository: "redis",
359
Tag: "latest",
360
Cmd: []string{"redis-server", "--requirepass", "iamadmin"},
361
Platform: "linux/amd64",
362
})
363
if err != nil {
364
log.Printf("Could not start resource: %s", err)
365
return
366
}
367
// by default expire after 30 sec
368
if err := redisResource.Expire(30); err != nil {
369
log.Printf("Could not expire resource: %s", err)
370
}
371
372
// setup a temporary ssh server
373
sshResource, err = pool.RunWithOptions(&dockertest.RunOptions{
374
Repository: "lscr.io/linuxserver/openssh-server",
375
Tag: "latest",
376
Env: []string{
377
"PUID=1000",
378
"PGID=1000",
379
"TZ=Etc/UTC",
380
"PASSWORD_ACCESS=true",
381
"USER_NAME=admin",
382
"USER_PASSWORD=admin",
383
},
384
Platform: "linux/amd64",
385
})
386
if err != nil {
387
log.Printf("Could not start resource: %s", err)
388
return
389
}
390
// by default expire after 30 sec
391
if err := sshResource.Expire(30); err != nil {
392
log.Printf("Could not expire resource: %s", err)
393
}
394
395
// setup a temporary oracle instance
396
oracleResource, err = pool.RunWithOptions(&dockertest.RunOptions{
397
Repository: "gvenzl/oracle-xe",
398
Tag: "latest",
399
Env: []string{
400
"ORACLE_PASSWORD=mysecret",
401
},
402
Platform: "linux/amd64",
403
})
404
if err != nil {
405
log.Printf("Could not start Oracle resource: %s", err)
406
return
407
}
408
409
// by default expire after 30 sec
410
if err := oracleResource.Expire(30); err != nil {
411
log.Printf("Could not expire Oracle resource: %s", err)
412
}
413
414
// setup a temporary vnc server
415
vncResource, err = pool.RunWithOptions(&dockertest.RunOptions{
416
Repository: "dorowu/ubuntu-desktop-lxde-vnc",
417
Tag: "latest",
418
Env: []string{
419
"VNC_PASSWORD=mysecret",
420
},
421
Platform: "linux/amd64",
422
})
423
if err != nil {
424
log.Printf("Could not start resource: %s", err)
425
return
426
}
427
// by default expire after 30 sec
428
if err := vncResource.Expire(30); err != nil {
429
log.Printf("Could not expire resource: %s", err)
430
}
431
432
// setup a temporary postgres instance
433
postgresResource, err = pool.RunWithOptions(&dockertest.RunOptions{
434
Repository: "postgres",
435
Tag: "latest",
436
Env: []string{
437
"POSTGRES_PASSWORD=postgres",
438
"POSTGRES_USER=postgres",
439
},
440
Platform: "linux/amd64",
441
})
442
if err != nil {
443
log.Printf("Could not start postgres resource: %s", err)
444
return
445
}
446
// by default expire after 30 sec
447
if err := postgresResource.Expire(30); err != nil {
448
log.Printf("Could not expire postgres resource: %s", err)
449
}
450
451
// setup a temporary mysql instance
452
mysqlResource, err = pool.RunWithOptions(&dockertest.RunOptions{
453
Repository: "mysql",
454
Tag: "latest",
455
Env: []string{
456
"MYSQL_ROOT_PASSWORD=secret",
457
},
458
Platform: "linux/amd64",
459
})
460
if err != nil {
461
log.Printf("Could not start mysql resource: %s", err)
462
return
463
}
464
// by default expire after 30 sec
465
if err := mysqlResource.Expire(30); err != nil {
466
log.Printf("Could not expire mysql resource: %s", err)
467
}
468
469
// setup a temporary rsync server
470
rsyncResource, err = pool.RunWithOptions(&dockertest.RunOptions{
471
Repository: "alpine",
472
Tag: "latest",
473
Cmd: []string{"sh", "-c", "apk add --no-cache rsync shadow && useradd -m rsyncuser && echo 'rsyncuser:mysecret' | chpasswd && echo 'rsyncuser:MySecret123' > /etc/rsyncd.secrets && chmod 600 /etc/rsyncd.secrets && echo -e '[data]\\n path = /data\\n comment = Local Rsync Share\\n read only = false\\n auth users = rsyncuser\\n secrets file = /etc/rsyncd.secrets' > /etc/rsyncd.conf && mkdir -p /data && exec rsync --daemon --no-detach --config=/etc/rsyncd.conf"},
474
Platform: "linux/amd64",
475
})
476
if err != nil {
477
log.Printf("Could not start Rsync resource: %s", err)
478
return
479
}
480
// by default expire after 30 sec
481
if err := rsyncResource.Expire(30); err != nil {
482
log.Printf("Could not expire Rsync resource: %s", err)
483
}
484
485
// setup a temporary telnet server
486
// username: dev
487
// password: mysecret
488
telnetResource, err = pool.RunWithOptions(&dockertest.RunOptions{
489
Repository: "alpine",
490
Tag: "latest",
491
Cmd: []string{"sh", "-c", "apk add --no-cache busybox-extras shadow && useradd -m dev && echo 'dev:mysecret' | chpasswd && exec /usr/sbin/telnetd -F -p 23 -l /bin/login"},
492
Platform: "linux/amd64",
493
})
494
if err != nil {
495
log.Printf("Could not start Telnet resource: %s", err)
496
return
497
}
498
// by default expire after 30 sec
499
if err := telnetResource.Expire(30); err != nil {
500
log.Printf("Could not expire Telnet resource: %s", err)
501
}
502
}
503
504