Skip to content

Commit aa925b0

Browse files
Merge pull request #2897 from blacklanternsecurity/retire-wappalyzer
Retire wappalyzer
2 parents 6a54b04 + 03e6134 commit aa925b0

20 files changed

Lines changed: 2481 additions & 1769 deletions

File tree

bbot/modules/wappalyzer.py

Lines changed: 0 additions & 60 deletions
This file was deleted.

bbot/presets/tech-detect.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
description: Detect technologies via Wappalyzer, Nuclei, and FingerprintX
1+
description: Detect technologies via Nuclei, and FingerprintX
22

33
modules:
44
- nuclei
5-
- wappalyzer
65
- fingerprintx
76

87
config:

bbot/scanner/preset/args.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class BBOTArgs:
4040
),
4141
(
4242
"Subdomains + basic web scan",
43-
"A basic web scan includes wappalyzer, robots.txt, and other non-intrusive web modules",
43+
"A basic web scan includes robots.txt, storage buckets, IIS shortnames, and other non-intrusive web modules",
4444
"bbot -t evilcorp.com -p subdomain-enum web-basic",
4545
),
4646
(

bbot/test/test_step_1/test_cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,8 @@ async def test_cli_args(monkeypatch, caplog, capsys, clean_default_config):
384384
result = await cli._main()
385385
assert result is True
386386

387-
# unresolved dependency
388-
monkeypatch.setattr("sys.argv", ["bbot", "-m", "wappalyzer"])
387+
# python dependency
388+
monkeypatch.setattr("sys.argv", ["bbot", "-m", "baddns"])
389389
result = await cli._main()
390390
assert result is True
391391

bbot/test/test_step_1/test_presets.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ def test_preset_yaml(clean_default_config):
125125
- rapiddns
126126
127127
modules:
128+
- baddns
128129
- robots
129-
- wappalyzer
130130
131131
output_modules:
132132
- csv
@@ -479,16 +479,16 @@ def test_preset_module_resolution(clean_default_config):
479479
preset = Preset().bake()
480480
sslcert_preloaded = preset.preloaded_module("sslcert")
481481
wayback_preloaded = preset.preloaded_module("wayback")
482-
wappalyzer_preloaded = preset.preloaded_module("wappalyzer")
482+
dotnetnuke_preloaded = preset.preloaded_module("dotnetnuke")
483483
sslcert_flags = sslcert_preloaded.get("flags", [])
484484
wayback_flags = wayback_preloaded.get("flags", [])
485-
wappalyzer_flags = wappalyzer_preloaded.get("flags", [])
485+
dotnetnuke_flags = dotnetnuke_preloaded.get("flags", [])
486486
assert "active" in sslcert_flags
487487
assert "passive" in wayback_flags
488-
assert "active" in wappalyzer_flags
488+
assert "active" in dotnetnuke_flags
489489
assert "subdomain-enum" in sslcert_flags
490490
assert "subdomain-enum" in wayback_flags
491-
assert "httpx" in wappalyzer_preloaded["deps"]["modules"]
491+
assert "httpx" in dotnetnuke_preloaded["deps"]["modules"]
492492

493493
# make sure we have the expected defaults
494494
assert not preset.scan_modules
@@ -504,8 +504,8 @@ def test_preset_module_resolution(clean_default_config):
504504
assert preset.modules == set(preset.output_modules).union(set(preset.internal_modules))
505505

506506
# make sure dependency resolution works as expected
507-
preset = Preset(modules=["wappalyzer"]).bake()
508-
assert set(preset.scan_modules) == {"wappalyzer", "httpx"}
507+
preset = Preset(modules=["dotnetnuke"]).bake()
508+
assert set(preset.scan_modules) == {"dotnetnuke", "httpx"}
509509

510510
# make sure flags work as expected
511511
preset = Preset(flags=["subdomain-enum"]).bake()
@@ -537,19 +537,19 @@ def test_preset_module_resolution(clean_default_config):
537537
assert "wayback" in preset.scan_modules
538538

539539
# normal module enableement
540-
preset = Preset(modules=["sslcert", "wappalyzer", "wayback"]).bake()
541-
assert set(preset.scan_modules) == {"sslcert", "wappalyzer", "wayback", "httpx"}
540+
preset = Preset(modules=["sslcert", "dotnetnuke", "wayback"]).bake()
541+
assert set(preset.scan_modules) == {"sslcert", "dotnetnuke", "wayback", "httpx"}
542542

543543
# modules + flag exclusions
544-
preset = Preset(exclude_flags=["active"], modules=["sslcert", "wappalyzer", "wayback"]).bake()
544+
preset = Preset(exclude_flags=["active"], modules=["sslcert", "dotnetnuke", "wayback"]).bake()
545545
assert set(preset.scan_modules) == {"wayback"}
546546

547547
# modules + flag requirements
548-
preset = Preset(require_flags=["passive"], modules=["sslcert", "wappalyzer", "wayback"]).bake()
548+
preset = Preset(require_flags=["passive"], modules=["sslcert", "dotnetnuke", "wayback"]).bake()
549549
assert set(preset.scan_modules) == {"wayback"}
550550

551551
# modules + module exclusions
552-
preset = Preset(exclude_modules=["sslcert"], modules=["sslcert", "wappalyzer", "wayback"]).bake()
552+
preset = Preset(exclude_modules=["sslcert"], modules=["sslcert", "dotnetnuke", "wayback"]).bake()
553553
baked_preset = preset.bake()
554554
assert baked_preset.modules == {
555555
"wayback",
@@ -564,7 +564,7 @@ def test_preset_module_resolution(clean_default_config):
564564
"txt",
565565
"httpx",
566566
"csv",
567-
"wappalyzer",
567+
"dotnetnuke",
568568
}
569569

570570

@@ -633,14 +633,14 @@ class TestModule4(BaseModule):
633633
assert preset.module_loader.preload_cache_file.is_file()
634634

635635
# at this point, core modules should be loaded, but not custom ones
636-
assert "wappalyzer" in preset.module_loader.preloaded()
636+
assert "baddns" in preset.module_loader.preloaded()
637637
assert "testmodule1" not in preset.module_loader.preloaded()
638638

639639
import pickle
640640

641641
with open(preset.module_loader.preload_cache_file, "rb") as f:
642642
preloaded = pickle.load(f)
643-
assert "wappalyzer" in preloaded
643+
assert "baddns" in preloaded
644644
assert "testmodule1" not in preloaded
645645

646646
# add custom module dir
@@ -651,7 +651,7 @@ class TestModule4(BaseModule):
651651
assert custom_internal_module_dir in preset.module_dirs
652652

653653
# now our custom modules should be loaded
654-
assert "wappalyzer" in preset.module_loader.preloaded()
654+
assert "baddns" in preset.module_loader.preloaded()
655655
assert "testmodule1" in preset.module_loader.preloaded()
656656
assert "testmodule2" in preset.module_loader.preloaded()
657657
assert "testmodule3" in preset.module_loader.preloaded()
@@ -660,15 +660,15 @@ class TestModule4(BaseModule):
660660
preset.module_loader.save_preload_cache()
661661
with open(preset.module_loader.preload_cache_file, "rb") as f:
662662
preloaded = pickle.load(f)
663-
assert "wappalyzer" in preloaded
663+
assert "baddns" in preloaded
664664
assert "testmodule1" in preloaded
665665
assert "testmodule2" in preloaded
666666
assert "testmodule3" in preloaded
667667
assert "testmodule4" in preloaded
668668

669669
# since module loader is shared across all presets, a new preset should now also have our custom modules
670670
preset2 = Preset()
671-
assert "wappalyzer" in preset2.module_loader.preloaded()
671+
assert "baddns" in preset2.module_loader.preloaded()
672672
assert "testmodule1" in preset2.module_loader.preloaded()
673673
assert "testmodule2" in preset2.module_loader.preloaded()
674674
assert "testmodule3" in preset2.module_loader.preloaded()

bbot/test/test_step_2/module_tests/test_module_wappalyzer.py

Lines changed: 0 additions & 20 deletions
This file was deleted.

bbot/test/test_step_2/module_tests/test_module_web_report.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
class TestWebReport(ModuleTestBase):
55
targets = ["http://127.0.0.1:8888"]
6-
modules_overrides = ["httpx", "wappalyzer", "badsecrets", "web_report", "trufflehog"]
6+
modules_overrides = ["httpx", "dotnetnuke", "badsecrets", "web_report", "trufflehog"]
77
config_overrides = {"modules": {"trufflehog": {"only_verified": False}}}
88

99
async def setup_before_prep(self, module_test):
1010
# trufflehog --> FINDING
11-
# wappalyzer --> TECHNOLOGY
11+
# dotnetnuke --> TECHNOLOGY
1212
# badsecrets --> VULNERABILITY
1313
respond_args = {"response_data": web_body}
1414
module_test.set_expect_requests(respond_args=respond_args)
@@ -26,12 +26,13 @@ def check(self, module_test, events):
2626
)
2727
assert """Possible Secret Found. Detector Type: [PrivateKey]""" in report_content
2828
assert "<h3>TECHNOLOGY</h3>" in report_content
29-
assert "<p>flask</p>" in report_content
29+
assert "<li>DotNetNuke</li>" in report_content
3030

3131

3232
web_body = """
3333
<html>
3434
<body>
35+
<!-- by DotNetNuke Corporation -->
3536
<link rel="preconnect" href="https://fonts.googleapis.com">
3637
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
3738
<link href="https://fonts.googleapis.com/css2?family=Open+Sans+Condensed:wght@700&family=Open+Sans:ital,wght@0,400;0,600;0,700;0,800;1,400&display=swap" rel="stylesheet">

0 commit comments

Comments
 (0)