Skip to content

Commit faf1ccb

Browse files
committed
fix: correct Katana crawler directory resolution, phase count, and frontend vuln counter
- Fix Katana always failing on subdomain scans by using domain directly instead of extractRootDomain() which looked in the wrong directory. - Add panic recovery inside Katana crawl goroutine to prevent leaked semaphores and hung phases. - Fix totalSteps miscount in subdomain workflow (18 -> 20/21) so progress reporting matches the actual number of phases. - Fix frontend totalVuln calculation bug that inflated vulnerability counts due to broken operator precedence in the filter reduce.
1 parent 7f37e5b commit faf1ccb

5 files changed

Lines changed: 40 additions & 12 deletions

File tree

go.mod

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ require (
212212
github.com/google/go-github/v30 v30.1.0 // indirect
213213
github.com/google/go-github/v58 v58.0.0 // indirect
214214
github.com/google/go-querystring v1.1.0 // indirect
215-
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e // indirect
215+
github.com/google/pprof v0.0.0-20250423184734-337e5dd93bb4 // indirect
216216
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
217217
github.com/gopacket/gopacket v1.2.0 // indirect
218218
github.com/gorilla/css v1.0.1 // indirect
@@ -324,7 +324,7 @@ require (
324324
github.com/projectdiscovery/cdncheck v1.2.31 // indirect
325325
github.com/projectdiscovery/chaos-client v0.5.2 // indirect
326326
github.com/projectdiscovery/clistats v0.1.1 // indirect
327-
github.com/projectdiscovery/dsl v0.8.14 // indirect
327+
github.com/projectdiscovery/dsl v0.8.17 // indirect
328328
github.com/projectdiscovery/fastdialer v0.5.6 // indirect
329329
github.com/projectdiscovery/fasttemplate v0.0.2 // indirect
330330
github.com/projectdiscovery/fdmax v0.0.4 // indirect
@@ -338,21 +338,22 @@ require (
338338
github.com/projectdiscovery/hmap v0.0.100 // indirect
339339
github.com/projectdiscovery/interactsh v1.3.1 // indirect
340340
github.com/projectdiscovery/ipranger v0.0.53 // indirect
341+
github.com/projectdiscovery/katana v1.6.1 // indirect
341342
github.com/projectdiscovery/ldapserver v1.0.2-0.20240219154113-dcc758ebc0cb // indirect
342343
github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 // indirect
343344
github.com/projectdiscovery/mapcidr v1.1.97 // indirect
344345
github.com/projectdiscovery/n3iwf v0.0.0-20230523120440-b8cd232ff1f5 // indirect
345-
github.com/projectdiscovery/networkpolicy v0.1.36 // indirect
346-
github.com/projectdiscovery/ratelimit v0.0.85 // indirect
346+
github.com/projectdiscovery/networkpolicy v0.1.37 // indirect
347+
github.com/projectdiscovery/ratelimit v0.0.86 // indirect
347348
github.com/projectdiscovery/rawhttp v0.1.90 // indirect
348349
github.com/projectdiscovery/rdap v0.9.0 // indirect
349350
github.com/projectdiscovery/retryabledns v1.0.114 // indirect
350-
github.com/projectdiscovery/retryablehttp-go v1.3.8 // indirect
351+
github.com/projectdiscovery/retryablehttp-go v1.3.10 // indirect
351352
github.com/projectdiscovery/sarif v0.0.1 // indirect
352353
github.com/projectdiscovery/uncover v1.2.0 // indirect
353354
github.com/projectdiscovery/useragent v0.0.107 // indirect
354355
github.com/projectdiscovery/utils v0.10.1 // indirect
355-
github.com/projectdiscovery/wappalyzergo v0.2.76 // indirect
356+
github.com/projectdiscovery/wappalyzergo v0.2.79 // indirect
356357
github.com/projectdiscovery/yamldoc-go v1.0.6 // indirect
357358
github.com/redis/go-redis/v9 v9.11.0 // indirect
358359
github.com/refraction-networking/utls v1.8.2 // indirect
@@ -444,7 +445,7 @@ require (
444445
goftp.io/server/v2 v2.0.1 // indirect
445446
golang.org/x/arch v0.8.0 // indirect
446447
golang.org/x/crypto v0.49.0 // indirect
447-
golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect
448+
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect
448449
golang.org/x/mod v0.33.0 // indirect
449450
golang.org/x/oauth2 v0.34.0 // indirect
450451
golang.org/x/sync v0.20.0 // indirect

go.sum

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe
636636
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
637637
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
638638
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
639+
github.com/google/pprof v0.0.0-20250423184734-337e5dd93bb4 h1:gD0vax+4I+mAj+jEChEf25Ia07Jq7kYOFO5PPhAxFl4=
640+
github.com/google/pprof v0.0.0-20250423184734-337e5dd93bb4/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA=
639641
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
640642
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
641643
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
@@ -1048,6 +1050,8 @@ github.com/projectdiscovery/dnsx v1.2.2 h1:ZjUov0GOyrS8ERlKAAhk+AOkqzaYHBzCP0qZf
10481050
github.com/projectdiscovery/dnsx v1.2.2/go.mod h1:3iYm86OEqo0WxeGDkVl5WZNmG0qYE5TYNx8fBg6wX1I=
10491051
github.com/projectdiscovery/dsl v0.8.14 h1:g9szcXk2RRdVf2rsHEzbTXOPxiny3haKonSncU6pg2w=
10501052
github.com/projectdiscovery/dsl v0.8.14/go.mod h1:LYImt/EiBzqTWG1RswT3Yl0DZbfjUP93Nvq2Z/G7dcE=
1053+
github.com/projectdiscovery/dsl v0.8.17 h1:q0pKTuvI+Gov18+cra/Ql6umNUNbT0fDk3o+ooQP1yc=
1054+
github.com/projectdiscovery/dsl v0.8.17/go.mod h1:C742lJ6Yhpe0wHXGFz8Eg9H2UyvYsBQB97p2WyAlkfU=
10511055
github.com/projectdiscovery/fastdialer v0.5.6 h1:kIBFmzbXrua41uf4fGsQClTZmT7cm7E3vVgcSj8gs6Q=
10521056
github.com/projectdiscovery/fastdialer v0.5.6/go.mod h1:QxvCe02Jii+j8vA3hWYkymgZIY8cqMgs2s3Jbz6mvbs=
10531057
github.com/projectdiscovery/fasttemplate v0.0.2 h1:h2cISk5xDhlJEinlBQS6RRx0vOlOirB2y3Yu4PJzpiA=
@@ -1078,6 +1082,8 @@ github.com/projectdiscovery/interactsh v1.3.1 h1:5HzeVGVCAX/cjTguJ+7ClOmML5r97Ty
10781082
github.com/projectdiscovery/interactsh v1.3.1/go.mod h1:MXQ11EoBPROb4bEw+WP9e4DX4fMhrpS6EwfMfZomBsw=
10791083
github.com/projectdiscovery/ipranger v0.0.53 h1:gb4yEqtC2MJl1tSdx/ycao1A1wl7sHqjHeifZidO3Z4=
10801084
github.com/projectdiscovery/ipranger v0.0.53/go.mod h1:r6R0DFKQRo4QR2zjZXqLRCp0ovbco8F/NmOI+pK4db8=
1085+
github.com/projectdiscovery/katana v1.6.1 h1:Dd1MKntRLOQtvRPu72Vk8sxzpL9Igd7zol/DGXU+8sU=
1086+
github.com/projectdiscovery/katana v1.6.1/go.mod h1:sZh1uju9+06eHCiL3a777hINx9+cvxt7o19MTtKxmdQ=
10811087
github.com/projectdiscovery/ldapserver v1.0.2-0.20240219154113-dcc758ebc0cb h1:MGtI4oE12ruWv11ZlPXXd7hl/uAaQZrFvrIDYDeVMd8=
10821088
github.com/projectdiscovery/ldapserver v1.0.2-0.20240219154113-dcc758ebc0cb/go.mod h1:vmgC0DTFCfoCLp0RAfsfYTZZan0QMVs+cmTbH6blfjk=
10831089
github.com/projectdiscovery/machineid v0.0.0-20250715113114-c77eb3567582 h1:eR+0HE//Ciyfwy3HC7fjRyKShSJHYoX2Pv7pPshjK/Q=
@@ -1090,10 +1096,14 @@ github.com/projectdiscovery/naabu/v2 v2.3.7 h1:DFADMDWgaSDRBEOVZtZZ8DTb7ugewjSqp
10901096
github.com/projectdiscovery/naabu/v2 v2.3.7/go.mod h1:GsQWK3EzLla0+a+sMczqyswK4tb0ya7l5DIbZbRtV4c=
10911097
github.com/projectdiscovery/networkpolicy v0.1.36 h1:88EAYvEplBmn4vlGKenZJtzsGkEWALX3QzPiY930GtA=
10921098
github.com/projectdiscovery/networkpolicy v0.1.36/go.mod h1:lrm+DXxtH0cGpM4OKhILC+9ktnzrXVYcM0S2Jk+gQcc=
1099+
github.com/projectdiscovery/networkpolicy v0.1.37 h1:y/eGU4Mu+z8thiOrAMj9RMmxXG6Zi2Nci81cjZVkMqM=
1100+
github.com/projectdiscovery/networkpolicy v0.1.37/go.mod h1:RCyBSZmhCueYfQflmvvsMZHMMH+Z6AQubpXAgM5b5r0=
10931101
github.com/projectdiscovery/nuclei/v3 v3.7.1 h1:TX6s4Qly2+8LucLn+pw0iInD/s8lx7WKwwid+FG+s4E=
10941102
github.com/projectdiscovery/nuclei/v3 v3.7.1/go.mod h1:obb3CgjgNlABN/UqNVkm1tZnuKrlWWq4aVOj+4gq3j4=
10951103
github.com/projectdiscovery/ratelimit v0.0.85 h1:TrqYis/+6Djac20n3kgFXQbN/xj7ywObJpH3xDOd+40=
10961104
github.com/projectdiscovery/ratelimit v0.0.85/go.mod h1:enLZ8XGL02WPBhuoHAhgvMgOpuU9ALhFpFgCps5lxmM=
1105+
github.com/projectdiscovery/ratelimit v0.0.86 h1:wkSKOQj3FvPUnh5zbZj50o8Ddgir4qgZN+FqWMc7dfw=
1106+
github.com/projectdiscovery/ratelimit v0.0.86/go.mod h1:d15gU8NFjgKw0F0hrDYprcPf73DqS51NJ44BwYmM1D8=
10971107
github.com/projectdiscovery/rawhttp v0.1.90 h1:LOSZ6PUH08tnKmWsIwvwv1Z/4zkiYKYOSZ6n+8RFKtw=
10981108
github.com/projectdiscovery/rawhttp v0.1.90/go.mod h1:VZYAM25UI/wVB3URZ95ZaftgOnsbphxyAw/XnQRRz4Y=
10991109
github.com/projectdiscovery/rdap v0.9.0 h1:wPhHx5pQ2QI+WGhyNb2PjhTl0NtB39Nk7YFZ9cp8ZGA=
@@ -1102,6 +1112,8 @@ github.com/projectdiscovery/retryabledns v1.0.114 h1:COyNKzhA7oa3C/1639WRXeXsKrU
11021112
github.com/projectdiscovery/retryabledns v1.0.114/go.mod h1:+DyanDr8naxQ2dRO9c4Ezo3NHHXhz8L0tTSRYWhiwyA=
11031113
github.com/projectdiscovery/retryablehttp-go v1.3.8 h1:TA075ioaVyaM65R3dSzKSbOCiJSvFrlGScxzScu4ik8=
11041114
github.com/projectdiscovery/retryablehttp-go v1.3.8/go.mod h1:/vas835LvB4aqK9vCPGSgKF7Q7hY/BRcIJ/TgM2sPAY=
1115+
github.com/projectdiscovery/retryablehttp-go v1.3.10 h1:v2flyFi5byeSc4++8s6ik7rGKOM/YREkPVEDb0whhWc=
1116+
github.com/projectdiscovery/retryablehttp-go v1.3.10/go.mod h1:RplucKGOCf+lHFxd1HVEale4qWKLSEu1ZJp2BRnuFp8=
11051117
github.com/projectdiscovery/sarif v0.0.1 h1:C2Tyj0SGOKbCLgHrx83vaE6YkzXEVrMXYRGLkKCr/us=
11061118
github.com/projectdiscovery/sarif v0.0.1/go.mod h1:cEYlDu8amcPf6b9dSakcz2nNnJsoz4aR6peERwV+wuQ=
11071119
github.com/projectdiscovery/stringsutil v0.0.2 h1:uzmw3IVLJSMW1kEg8eCStG/cGbYYZAja8BH3LqqJXMA=
@@ -1118,6 +1130,8 @@ github.com/projectdiscovery/utils v0.10.1 h1:9luYfL7PpN1L/cLO4bAES4+ltDaEBKOUnRi
11181130
github.com/projectdiscovery/utils v0.10.1/go.mod h1:x3jGS2YIxnUYxlpB9HWBKf0k+AE83nYCGRX/YStC8G8=
11191131
github.com/projectdiscovery/wappalyzergo v0.2.76 h1:6zQt6Jmi/hIwD8InWswkk1yhJGWaVEAEzshTGiTGbeM=
11201132
github.com/projectdiscovery/wappalyzergo v0.2.76/go.mod h1:hRsnKNleH693FFJsBOD5NMUDbxw/Q94f0Oq2OV04Q6M=
1133+
github.com/projectdiscovery/wappalyzergo v0.2.79 h1:LBAd+nA+yv2Hf//q2TlODLRDkaaqzWlCaIPcwYyHZcU=
1134+
github.com/projectdiscovery/wappalyzergo v0.2.79/go.mod h1:hRsnKNleH693FFJsBOD5NMUDbxw/Q94f0Oq2OV04Q6M=
11211135
github.com/projectdiscovery/yamldoc-go v1.0.6 h1:GCEdIRlQjDux28xTXKszM7n3jlMf152d5nqVpVoetas=
11221136
github.com/projectdiscovery/yamldoc-go v1.0.6/go.mod h1:R5lWrNzP+7Oyn77NDVPnBsxx2/FyQZBBkIAaSaCQFxw=
11231137
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
@@ -1547,6 +1561,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
15471561
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
15481562
golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU=
15491563
golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk=
1564+
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0=
1565+
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA=
15501566
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
15511567
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
15521568
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=

internal/api/ui/pages/scan-detail.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,8 @@
442442
return true;
443443
});
444444

445-
const VULN_KINDS = new Set(['vuln', 'nuclei', 'reflection', 'ports', 'buckets', 'backup', 'zerodays', 'aem', 'misconfig', 's3', 'gf', 'ffuf', 'dns', 'github-scan', 'github', 'github', 'sqlmap', 'aem-findings']);
446-
const totalVuln = Array.from(VULN_KINDS).reduce((acc, k) => acc + (allRows.filter(r => (r.kind || r.module === 'github-scan' || r.module === 'github' ? k === 'github-scan' : k)).length), 0);
445+
const VULN_KINDS = new Set(['vuln', 'nuclei', 'reflection', 'ports', 'buckets', 'backup', 'zerodays', 'aem', 'misconfig', 's3', 'gf', 'ffuf', 'dns', 'github-scan', 'github', 'sqlmap', 'aem-findings']);
446+
const totalVuln = allRows.filter(r => VULN_KINDS.has(r.kind)).length;
447447

448448
const isReconScan = stNorm === 'recon' || stNorm === 'lite' || stNorm === 'domain_scan' || stNorm === 'subdomain_scan' || stNorm === 'subdomain_run' || stNorm === 'domain_run';
449449
const isGitHubScan = /github/.test(stNorm) || allRows.some(r => r.module === 'github-scan' || r.module === 'github');

internal/scanner/subdomain/subdomain.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,11 @@ func RunSubdomainWithOptions(subdomain string, opts RunOptions) (*Result, error)
101101
// Extract root domain for modules that need it (e.g., DNS, S3)
102102
rootDomain := extractDomain(subdomainClean)
103103

104-
totalSteps := 18
104+
// Phase 1 (1) + Phase 2 (13) + Phase 2.5 (1) + Phase 3 (4/5) + Phase 4 (1)
105+
totalSteps := 20
106+
if !opts.SkipFFuf {
107+
totalSteps = 21
108+
}
105109
var currentStep int32
106110

107111
// Helper to get next step safely

internal/scanner/urls/urls.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ type Result struct {
3838
// Results are merged into all-urls.txt and persisted as katana-urls.json.
3939
func RunKatanaPhase(domain string) error {
4040
resultsDir := utils.GetResultsDir()
41-
dirDomain := extractRootDomain(domain)
41+
// Use domain directly for directory path — RunKatanaPhase is called from
42+
// the subdomain workflow where the directory is named after the subdomain.
43+
dirDomain := domain
4244
domainDir := filepath.Join(resultsDir, dirDomain)
4345
liveFile := filepath.Join(domainDir, "subs", "live-subs.txt")
44-
allFile := filepath.Join(filepath.Join(domainDir, "urls"), "all-urls.txt")
46+
allFile := filepath.Join(domainDir, "urls", "all-urls.txt")
4547

4648
fi, err := os.Stat(liveFile)
4749
if err != nil || fi.Size() == 0 {
@@ -762,6 +764,11 @@ func runKatana(liveFile, domain string) []string {
762764
done := make(chan struct{})
763765
go func() {
764766
defer close(done)
767+
defer func() {
768+
if r := recover(); r != nil {
769+
logger.GetLogger().Infof("[WARN] Katana crawl panic recovered for %s: %v", domain, r)
770+
}
771+
}()
765772
for _, u := range hosts {
766773
crawler.Crawl(u) //nolint:errcheck
767774
}

0 commit comments

Comments
 (0)