@@ -9,13 +9,14 @@ import (
9
9
"errors"
10
10
"fmt"
11
11
"regexp"
12
+ "sync"
12
13
14
+ "github.com/caffix/service"
15
+ luaurl "github.com/cjoudrey/gluaurl"
13
16
"github.com/owasp-amass/amass/v3/config"
14
17
"github.com/owasp-amass/amass/v3/net/dns"
15
18
"github.com/owasp-amass/amass/v3/requests"
16
19
"github.com/owasp-amass/amass/v3/systems"
17
- "github.com/caffix/service"
18
- luaurl "github.com/cjoudrey/gluaurl"
19
20
lua "github.com/yuin/gopher-lua"
20
21
luajson "layeh.com/gopher-json"
21
22
)
@@ -43,6 +44,7 @@ type Script struct {
43
44
sys systems.System
44
45
luaState * lua.LState
45
46
cbs * callbacks
47
+ cbsLock sync.Mutex
46
48
subre * regexp.Regexp
47
49
seconds int
48
50
ctx context.Context
@@ -135,8 +137,10 @@ func (s *Script) newLuaState(cfg *config.Config) *lua.LState {
135
137
136
138
// Save references to the script functions that serve as callbacks for Amass events.
137
139
func (s * Script ) assignCallbacks () {
138
- L := s .luaState
140
+ s .cbsLock .Lock ()
141
+ defer s .cbsLock .Unlock ()
139
142
143
+ L := s .luaState
140
144
s .cbs = & callbacks {
141
145
Start : L .GetGlobal ("start" ),
142
146
Stop : L .GetGlobal ("stop" ),
@@ -193,6 +197,41 @@ func (s *Script) OnStop() error {
193
197
return nil
194
198
}
195
199
200
+ // HandlesReq implements the Service interface.
201
+ func (s * Script ) HandlesReq (req interface {}) bool {
202
+ s .cbsLock .Lock ()
203
+ defer s .cbsLock .Unlock ()
204
+
205
+ var handles bool
206
+ switch t := req .(type ) {
207
+ case * requests.DNSRequest :
208
+ if s .cbs .Vertical .Type () != lua .LTNil && t != nil && t .Domain != "" {
209
+ handles = true
210
+ }
211
+ case * requests.ResolvedRequest :
212
+ if s .cbs .Resolved .Type () != lua .LTNil && t != nil && t .Name != "" && len (t .Records ) > 0 {
213
+ handles = true
214
+ }
215
+ case * requests.SubdomainRequest :
216
+ if s .cbs .Subdomain .Type () != lua .LTNil && t != nil && t .Name != "" {
217
+ handles = true
218
+ }
219
+ case * requests.AddrRequest :
220
+ if s .cbs .Address .Type () != lua .LTNil && t != nil && t .Address != "" {
221
+ handles = true
222
+ }
223
+ case * requests.ASNRequest :
224
+ if s .cbs .Asn .Type () != lua .LTNil && t != nil && (t .Address != "" || t .ASN != 0 ) {
225
+ handles = true
226
+ }
227
+ case * requests.WhoisRequest :
228
+ if s .cbs .Horizontal .Type () != lua .LTNil {
229
+ handles = true
230
+ }
231
+ }
232
+ return handles
233
+ }
234
+
196
235
func (s * Script ) requests () {
197
236
for {
198
237
select {
@@ -283,41 +322,57 @@ func (s *Script) stopScript() {
283
322
}
284
323
285
324
func (s * Script ) dispatch (in interface {}) {
325
+ s .cbsLock .Lock ()
326
+
286
327
switch req := in .(type ) {
287
328
case * requests.DNSRequest :
288
329
if s .cbs .Vertical .Type () != lua .LTNil && req != nil && req .Domain != "" {
330
+ callback := s .cbs .Vertical
331
+ s .cbsLock .Unlock ()
289
332
s .CheckRateLimit ()
290
- s .dnsRequest (s .ctx , req )
333
+ s .dnsRequest (s .ctx , callback , req )
291
334
}
292
335
case * requests.ResolvedRequest :
293
336
if s .cbs .Resolved .Type () != lua .LTNil && req != nil && req .Name != "" && len (req .Records ) > 0 {
337
+ callback := s .cbs .Resolved
338
+ s .cbsLock .Unlock ()
294
339
s .CheckRateLimit ()
295
- s .resolvedRequest (s .ctx , req )
340
+ s .resolvedRequest (s .ctx , callback , req )
296
341
}
297
342
case * requests.SubdomainRequest :
298
343
if s .cbs .Subdomain .Type () != lua .LTNil && req != nil && req .Name != "" {
344
+ callback := s .cbs .Subdomain
345
+ s .cbsLock .Unlock ()
299
346
s .CheckRateLimit ()
300
- s .subdomainRequest (s .ctx , req )
347
+ s .subdomainRequest (s .ctx , callback , req )
301
348
}
302
349
case * requests.AddrRequest :
303
350
if s .cbs .Address .Type () != lua .LTNil && req != nil && req .Address != "" {
351
+ callback := s .cbs .Address
352
+ s .cbsLock .Unlock ()
304
353
s .CheckRateLimit ()
305
- s .addrRequest (s .ctx , req )
354
+ s .addrRequest (s .ctx , callback , req )
306
355
}
307
356
case * requests.ASNRequest :
308
357
if s .cbs .Asn .Type () != lua .LTNil && req != nil && (req .Address != "" || req .ASN != 0 ) {
358
+ callback := s .cbs .Asn
359
+ s .cbsLock .Unlock ()
309
360
s .CheckRateLimit ()
310
- s .asnRequest (s .ctx , req )
361
+ s .asnRequest (s .ctx , callback , req )
311
362
}
312
363
case * requests.WhoisRequest :
313
364
if s .cbs .Horizontal .Type () != lua .LTNil {
365
+ callback := s .cbs .Horizontal
366
+ s .cbsLock .Unlock ()
314
367
s .CheckRateLimit ()
315
- s .whoisRequest (s .ctx , req )
368
+ s .whoisRequest (s .ctx , callback , req )
316
369
}
370
+ default :
371
+ s .cbsLock .Unlock ()
317
372
}
318
373
}
319
374
320
- func (s * Script ) dnsRequest (ctx context.Context , req * requests.DNSRequest ) {
375
+ func (s * Script ) dnsRequest (ctx context.Context , callback lua. LValue , req * requests.DNSRequest ) {
321
376
L := s .luaState
322
377
323
378
if contextExpired (ctx ) {
@@ -327,7 +382,7 @@ func (s *Script) dnsRequest(ctx context.Context, req *requests.DNSRequest) {
327
382
s .sys .Config ().Log .Printf ("Querying %s for %s subdomains" , s .String (), req .Domain )
328
383
329
384
err := L .CallByParam (lua.P {
330
- Fn : s . cbs . Vertical ,
385
+ Fn : callback ,
331
386
NRet : 0 ,
332
387
Protect : true ,
333
388
}, s .contextToUserData (ctx ), lua .LString (req .Domain ))
@@ -336,7 +391,7 @@ func (s *Script) dnsRequest(ctx context.Context, req *requests.DNSRequest) {
336
391
}
337
392
}
338
393
339
- func (s * Script ) resolvedRequest (ctx context.Context , req * requests.ResolvedRequest ) {
394
+ func (s * Script ) resolvedRequest (ctx context.Context , callback lua. LValue , req * requests.ResolvedRequest ) {
340
395
L := s .luaState
341
396
342
397
if contextExpired (ctx ) {
@@ -354,7 +409,7 @@ func (s *Script) resolvedRequest(ctx context.Context, req *requests.ResolvedRequ
354
409
}
355
410
356
411
err := L .CallByParam (lua.P {
357
- Fn : s . cbs . Resolved ,
412
+ Fn : callback ,
358
413
NRet : 0 ,
359
414
Protect : true ,
360
415
}, s .contextToUserData (ctx ), lua .LString (req .Name ), lua .LString (req .Domain ), records )
@@ -363,15 +418,15 @@ func (s *Script) resolvedRequest(ctx context.Context, req *requests.ResolvedRequ
363
418
}
364
419
}
365
420
366
- func (s * Script ) subdomainRequest (ctx context.Context , req * requests.SubdomainRequest ) {
421
+ func (s * Script ) subdomainRequest (ctx context.Context , callback lua. LValue , req * requests.SubdomainRequest ) {
367
422
L := s .luaState
368
423
369
424
if contextExpired (ctx ) {
370
425
return
371
426
}
372
427
373
428
err := L .CallByParam (lua.P {
374
- Fn : s . cbs . Subdomain ,
429
+ Fn : callback ,
375
430
NRet : 0 ,
376
431
Protect : true ,
377
432
}, s .contextToUserData (ctx ), lua .LString (req .Name ), lua .LString (req .Domain ), lua .LNumber (req .Times ))
@@ -380,15 +435,15 @@ func (s *Script) subdomainRequest(ctx context.Context, req *requests.SubdomainRe
380
435
}
381
436
}
382
437
383
- func (s * Script ) addrRequest (ctx context.Context , req * requests.AddrRequest ) {
438
+ func (s * Script ) addrRequest (ctx context.Context , callback lua. LValue , req * requests.AddrRequest ) {
384
439
L := s .luaState
385
440
386
441
if contextExpired (ctx ) {
387
442
return
388
443
}
389
444
390
445
err := L .CallByParam (lua.P {
391
- Fn : s . cbs . Address ,
446
+ Fn : callback ,
392
447
NRet : 0 ,
393
448
Protect : true ,
394
449
}, s .contextToUserData (ctx ), lua .LString (req .Address ))
@@ -397,15 +452,15 @@ func (s *Script) addrRequest(ctx context.Context, req *requests.AddrRequest) {
397
452
}
398
453
}
399
454
400
- func (s * Script ) asnRequest (ctx context.Context , req * requests.ASNRequest ) {
455
+ func (s * Script ) asnRequest (ctx context.Context , callback lua. LValue , req * requests.ASNRequest ) {
401
456
L := s .luaState
402
457
403
458
if contextExpired (ctx ) {
404
459
return
405
460
}
406
461
407
462
err := L .CallByParam (lua.P {
408
- Fn : s . cbs . Asn ,
463
+ Fn : callback ,
409
464
NRet : 0 ,
410
465
Protect : true ,
411
466
}, s .contextToUserData (ctx ), lua .LString (req .Address ), lua .LNumber (req .ASN ))
@@ -414,15 +469,15 @@ func (s *Script) asnRequest(ctx context.Context, req *requests.ASNRequest) {
414
469
}
415
470
}
416
471
417
- func (s * Script ) whoisRequest (ctx context.Context , req * requests.WhoisRequest ) {
472
+ func (s * Script ) whoisRequest (ctx context.Context , callback lua. LValue , req * requests.WhoisRequest ) {
418
473
L := s .luaState
419
474
420
475
if contextExpired (ctx ) {
421
476
return
422
477
}
423
478
424
479
err := L .CallByParam (lua.P {
425
- Fn : s . cbs . Horizontal ,
480
+ Fn : callback ,
426
481
NRet : 0 ,
427
482
Protect : true ,
428
483
}, s .contextToUserData (ctx ), lua .LString (req .Domain ))
0 commit comments