bbot 2.0.1.4720rc0__py3-none-any.whl → 2.3.0.5401rc0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bbot might be problematic. Click here for more details.
- bbot/__init__.py +1 -1
- bbot/cli.py +3 -7
- bbot/core/config/files.py +0 -1
- bbot/core/config/logger.py +34 -4
- bbot/core/core.py +21 -4
- bbot/core/engine.py +9 -8
- bbot/core/event/base.py +131 -52
- bbot/core/helpers/bloom.py +10 -3
- bbot/core/helpers/command.py +8 -7
- bbot/core/helpers/depsinstaller/installer.py +31 -13
- bbot/core/helpers/diff.py +10 -10
- bbot/core/helpers/dns/brute.py +7 -4
- bbot/core/helpers/dns/dns.py +1 -2
- bbot/core/helpers/dns/engine.py +4 -6
- bbot/core/helpers/dns/helpers.py +2 -2
- bbot/core/helpers/dns/mock.py +0 -1
- bbot/core/helpers/files.py +1 -1
- bbot/core/helpers/helper.py +7 -4
- bbot/core/helpers/interactsh.py +3 -3
- bbot/core/helpers/libmagic.py +65 -0
- bbot/core/helpers/misc.py +65 -22
- bbot/core/helpers/names_generator.py +17 -3
- bbot/core/helpers/process.py +0 -20
- bbot/core/helpers/regex.py +1 -1
- bbot/core/helpers/regexes.py +12 -6
- bbot/core/helpers/validators.py +1 -2
- bbot/core/helpers/web/client.py +1 -1
- bbot/core/helpers/web/engine.py +1 -2
- bbot/core/helpers/web/web.py +4 -114
- bbot/core/helpers/wordcloud.py +5 -5
- bbot/core/modules.py +36 -27
- bbot/core/multiprocess.py +58 -0
- bbot/core/shared_deps.py +46 -3
- bbot/db/sql/models.py +147 -0
- bbot/defaults.yml +12 -10
- bbot/modules/anubisdb.py +2 -2
- bbot/modules/apkpure.py +63 -0
- bbot/modules/azure_tenant.py +2 -2
- bbot/modules/baddns.py +35 -19
- bbot/modules/baddns_direct.py +92 -0
- bbot/modules/baddns_zone.py +3 -8
- bbot/modules/badsecrets.py +4 -3
- bbot/modules/base.py +195 -51
- bbot/modules/bevigil.py +7 -7
- bbot/modules/binaryedge.py +7 -4
- bbot/modules/bufferoverrun.py +47 -0
- bbot/modules/builtwith.py +6 -10
- bbot/modules/bypass403.py +5 -5
- bbot/modules/c99.py +10 -7
- bbot/modules/censys.py +9 -13
- bbot/modules/certspotter.py +5 -3
- bbot/modules/chaos.py +9 -7
- bbot/modules/code_repository.py +1 -0
- bbot/modules/columbus.py +3 -3
- bbot/modules/crt.py +5 -3
- bbot/modules/deadly/dastardly.py +1 -1
- bbot/modules/deadly/ffuf.py +9 -9
- bbot/modules/deadly/nuclei.py +3 -3
- bbot/modules/deadly/vhost.py +4 -3
- bbot/modules/dehashed.py +1 -1
- bbot/modules/digitorus.py +1 -1
- bbot/modules/dnsbimi.py +145 -0
- bbot/modules/dnscaa.py +3 -3
- bbot/modules/dnsdumpster.py +4 -4
- bbot/modules/dnstlsrpt.py +144 -0
- bbot/modules/docker_pull.py +7 -5
- bbot/modules/dockerhub.py +2 -2
- bbot/modules/dotnetnuke.py +20 -21
- bbot/modules/emailformat.py +1 -1
- bbot/modules/extractous.py +122 -0
- bbot/modules/filedownload.py +9 -7
- bbot/modules/fullhunt.py +7 -4
- bbot/modules/generic_ssrf.py +5 -5
- bbot/modules/github_codesearch.py +3 -2
- bbot/modules/github_org.py +4 -4
- bbot/modules/github_workflows.py +4 -4
- bbot/modules/gitlab.py +2 -5
- bbot/modules/google_playstore.py +93 -0
- bbot/modules/gowitness.py +48 -50
- bbot/modules/hackertarget.py +5 -3
- bbot/modules/host_header.py +5 -5
- bbot/modules/httpx.py +1 -4
- bbot/modules/hunterio.py +3 -9
- bbot/modules/iis_shortnames.py +19 -30
- bbot/modules/internal/cloudcheck.py +29 -12
- bbot/modules/internal/dnsresolve.py +22 -22
- bbot/modules/internal/excavate.py +97 -59
- bbot/modules/internal/speculate.py +41 -32
- bbot/modules/internetdb.py +4 -2
- bbot/modules/ip2location.py +3 -5
- bbot/modules/ipneighbor.py +1 -1
- bbot/modules/ipstack.py +3 -8
- bbot/modules/jadx.py +87 -0
- bbot/modules/leakix.py +11 -10
- bbot/modules/myssl.py +2 -2
- bbot/modules/newsletters.py +2 -2
- bbot/modules/otx.py +5 -3
- bbot/modules/output/asset_inventory.py +7 -7
- bbot/modules/output/base.py +1 -1
- bbot/modules/output/csv.py +1 -1
- bbot/modules/output/http.py +20 -14
- bbot/modules/output/mysql.py +51 -0
- bbot/modules/output/neo4j.py +7 -2
- bbot/modules/output/postgres.py +49 -0
- bbot/modules/output/slack.py +0 -1
- bbot/modules/output/sqlite.py +29 -0
- bbot/modules/output/stdout.py +2 -2
- bbot/modules/output/teams.py +107 -6
- bbot/modules/paramminer_headers.py +8 -11
- bbot/modules/passivetotal.py +13 -13
- bbot/modules/portscan.py +32 -6
- bbot/modules/postman.py +50 -126
- bbot/modules/postman_download.py +220 -0
- bbot/modules/rapiddns.py +3 -8
- bbot/modules/report/asn.py +18 -11
- bbot/modules/robots.py +3 -3
- bbot/modules/securitytrails.py +7 -10
- bbot/modules/securitytxt.py +1 -1
- bbot/modules/shodan_dns.py +7 -9
- bbot/modules/sitedossier.py +1 -1
- bbot/modules/skymem.py +2 -2
- bbot/modules/social.py +2 -1
- bbot/modules/subdomaincenter.py +1 -1
- bbot/modules/subdomainradar.py +160 -0
- bbot/modules/telerik.py +8 -8
- bbot/modules/templates/bucket.py +1 -1
- bbot/modules/templates/github.py +22 -14
- bbot/modules/templates/postman.py +21 -0
- bbot/modules/templates/shodan.py +14 -13
- bbot/modules/templates/sql.py +95 -0
- bbot/modules/templates/subdomain_enum.py +51 -16
- bbot/modules/templates/webhook.py +2 -4
- bbot/modules/trickest.py +8 -37
- bbot/modules/trufflehog.py +10 -12
- bbot/modules/url_manipulation.py +3 -3
- bbot/modules/urlscan.py +1 -1
- bbot/modules/viewdns.py +1 -1
- bbot/modules/virustotal.py +8 -30
- bbot/modules/wafw00f.py +1 -1
- bbot/modules/wayback.py +1 -1
- bbot/modules/wpscan.py +17 -11
- bbot/modules/zoomeye.py +11 -6
- bbot/presets/baddns-thorough.yml +12 -0
- bbot/presets/fast.yml +16 -0
- bbot/presets/kitchen-sink.yml +1 -2
- bbot/presets/spider.yml +4 -0
- bbot/presets/subdomain-enum.yml +7 -7
- bbot/presets/web/dotnet-audit.yml +0 -1
- bbot/scanner/manager.py +5 -16
- bbot/scanner/preset/args.py +46 -26
- bbot/scanner/preset/environ.py +7 -2
- bbot/scanner/preset/path.py +7 -4
- bbot/scanner/preset/preset.py +36 -23
- bbot/scanner/scanner.py +172 -62
- bbot/scanner/target.py +236 -434
- bbot/scripts/docs.py +1 -1
- bbot/test/bbot_fixtures.py +13 -3
- bbot/test/conftest.py +132 -100
- bbot/test/fastapi_test.py +17 -0
- bbot/test/owasp_mastg.apk +0 -0
- bbot/test/run_tests.sh +4 -4
- bbot/test/test.conf +2 -0
- bbot/test/test_step_1/test__module__tests.py +0 -1
- bbot/test/test_step_1/test_bbot_fastapi.py +79 -0
- bbot/test/test_step_1/test_bloom_filter.py +2 -1
- bbot/test/test_step_1/test_cli.py +138 -64
- bbot/test/test_step_1/test_dns.py +61 -27
- bbot/test/test_step_1/test_engine.py +17 -19
- bbot/test/test_step_1/test_events.py +183 -30
- bbot/test/test_step_1/test_helpers.py +64 -29
- bbot/test/test_step_1/test_manager_deduplication.py +1 -1
- bbot/test/test_step_1/test_manager_scope_accuracy.py +333 -330
- bbot/test/test_step_1/test_modules_basic.py +68 -70
- bbot/test/test_step_1/test_presets.py +183 -100
- bbot/test/test_step_1/test_python_api.py +7 -2
- bbot/test/test_step_1/test_regexes.py +35 -5
- bbot/test/test_step_1/test_scan.py +39 -5
- bbot/test/test_step_1/test_scope.py +4 -3
- bbot/test/test_step_1/test_target.py +242 -145
- bbot/test/test_step_1/test_web.py +14 -10
- bbot/test/test_step_2/module_tests/base.py +15 -7
- bbot/test/test_step_2/module_tests/test_module_anubisdb.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_apkpure.py +71 -0
- bbot/test/test_step_2/module_tests/test_module_asset_inventory.py +0 -1
- bbot/test/test_step_2/module_tests/test_module_azure_realm.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_baddns.py +6 -6
- bbot/test/test_step_2/module_tests/test_module_baddns_direct.py +62 -0
- bbot/test/test_step_2/module_tests/test_module_bevigil.py +29 -2
- bbot/test/test_step_2/module_tests/test_module_binaryedge.py +4 -2
- bbot/test/test_step_2/module_tests/test_module_bucket_amazon.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_bucket_azure.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py +35 -0
- bbot/test/test_step_2/module_tests/test_module_builtwith.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_bypass403.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_c99.py +126 -0
- bbot/test/test_step_2/module_tests/test_module_censys.py +4 -1
- bbot/test/test_step_2/module_tests/test_module_cloudcheck.py +4 -0
- bbot/test/test_step_2/module_tests/test_module_code_repository.py +11 -1
- bbot/test/test_step_2/module_tests/test_module_columbus.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_credshed.py +3 -3
- bbot/test/test_step_2/module_tests/test_module_dastardly.py +2 -1
- bbot/test/test_step_2/module_tests/test_module_dehashed.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_digitorus.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_discord.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_dnsbimi.py +103 -0
- bbot/test/test_step_2/module_tests/test_module_dnsbrute.py +9 -10
- bbot/test/test_step_2/module_tests/test_module_dnsbrute_mutations.py +1 -2
- bbot/test/test_step_2/module_tests/test_module_dnscommonsrv.py +1 -2
- bbot/test/test_step_2/module_tests/test_module_dnsdumpster.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_dnstlsrpt.py +64 -0
- bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py +0 -8
- bbot/test/test_step_2/module_tests/test_module_excavate.py +28 -48
- bbot/test/test_step_2/module_tests/test_module_extractous.py +54 -0
- bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_filedownload.py +14 -14
- bbot/test/test_step_2/module_tests/test_module_git_clone.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_github_org.py +19 -8
- bbot/test/test_step_2/module_tests/test_module_github_workflows.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_gitlab.py +9 -4
- bbot/test/test_step_2/module_tests/test_module_google_playstore.py +83 -0
- bbot/test/test_step_2/module_tests/test_module_gowitness.py +4 -6
- bbot/test/test_step_2/module_tests/test_module_host_header.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_http.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_httpx.py +10 -8
- bbot/test/test_step_2/module_tests/test_module_hunterio.py +68 -4
- bbot/test/test_step_2/module_tests/test_module_jadx.py +55 -0
- bbot/test/test_step_2/module_tests/test_module_json.py +22 -9
- bbot/test/test_step_2/module_tests/test_module_leakix.py +7 -3
- bbot/test/test_step_2/module_tests/test_module_mysql.py +76 -0
- bbot/test/test_step_2/module_tests/test_module_myssl.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_neo4j.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_newsletters.py +16 -16
- bbot/test/test_step_2/module_tests/test_module_ntlm.py +8 -7
- bbot/test/test_step_2/module_tests/test_module_oauth.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_otx.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py +1 -2
- bbot/test/test_step_2/module_tests/test_module_paramminer_getparams.py +0 -6
- bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py +2 -9
- bbot/test/test_step_2/module_tests/test_module_passivetotal.py +3 -1
- bbot/test/test_step_2/module_tests/test_module_pgp.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_portscan.py +9 -8
- bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
- bbot/test/test_step_2/module_tests/test_module_postman.py +84 -253
- bbot/test/test_step_2/module_tests/test_module_postman_download.py +439 -0
- bbot/test/test_step_2/module_tests/test_module_rapiddns.py +93 -1
- bbot/test/test_step_2/module_tests/test_module_shodan_dns.py +20 -1
- bbot/test/test_step_2/module_tests/test_module_sitedossier.py +2 -2
- bbot/test/test_step_2/module_tests/test_module_smuggler.py +14 -14
- bbot/test/test_step_2/module_tests/test_module_social.py +11 -1
- bbot/test/test_step_2/module_tests/test_module_speculate.py +4 -8
- bbot/test/test_step_2/module_tests/test_module_splunk.py +4 -4
- bbot/test/test_step_2/module_tests/test_module_sqlite.py +18 -0
- bbot/test/test_step_2/module_tests/test_module_sslcert.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_stdout.py +5 -3
- bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_subdomainradar.py +208 -0
- bbot/test/test_step_2/module_tests/test_module_subdomains.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_teams.py +8 -6
- bbot/test/test_step_2/module_tests/test_module_telerik.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_trufflehog.py +317 -14
- bbot/test/test_step_2/module_tests/test_module_viewdns.py +1 -1
- bbot/test/test_step_2/module_tests/test_module_wayback.py +1 -1
- bbot/test/test_step_2/template_tests/test_template_subdomain_enum.py +2 -2
- bbot/wordlists/devops_mutations.txt +1 -1
- bbot/wordlists/ffuf_shortname_candidates.txt +1 -1
- bbot/wordlists/nameservers.txt +1 -1
- bbot/wordlists/paramminer_headers.txt +1 -1
- bbot/wordlists/paramminer_parameters.txt +1 -1
- bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt +1 -1
- bbot/wordlists/valid_url_schemes.txt +1 -1
- {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/METADATA +48 -18
- bbot-2.3.0.5401rc0.dist-info/RECORD +421 -0
- {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/WHEEL +1 -1
- bbot/modules/unstructured.py +0 -163
- bbot/test/test_step_2/module_tests/test_module_unstructured.py +0 -102
- bbot-2.0.1.4720rc0.dist-info/RECORD +0 -387
- {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/LICENSE +0 -0
- {bbot-2.0.1.4720rc0.dist-info → bbot-2.3.0.5401rc0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from .base import ModuleTestBase
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestGoogle_Playstore(ModuleTestBase):
|
|
5
|
+
modules_overrides = ["google_playstore", "speculate"]
|
|
6
|
+
|
|
7
|
+
async def setup_after_prep(self, module_test):
|
|
8
|
+
await module_test.mock_dns({"blacklanternsecurity.com": {"A": ["127.0.0.99"]}})
|
|
9
|
+
module_test.httpx_mock.add_response(
|
|
10
|
+
url="https://play.google.com/store/search?q=blacklanternsecurity&c=apps",
|
|
11
|
+
text="""<!DOCTYPE html>
|
|
12
|
+
<html>
|
|
13
|
+
<head>
|
|
14
|
+
<title>"blacklanternsecurity" - Android Apps on Google Play</title>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<a href="/store/apps/details?id=com.bbot.test&pcampaignid=dontmatchme&pli=1"/>
|
|
18
|
+
<a href="/store/apps/details?id=com.bbot.other"/>
|
|
19
|
+
</body>
|
|
20
|
+
</html>""",
|
|
21
|
+
)
|
|
22
|
+
module_test.httpx_mock.add_response(
|
|
23
|
+
url="https://play.google.com/store/apps/details?id=com.bbot.test",
|
|
24
|
+
text="""<!DOCTYPE html>
|
|
25
|
+
<html>
|
|
26
|
+
<head>
|
|
27
|
+
<title>BBOT</title>
|
|
28
|
+
</head>
|
|
29
|
+
<body>
|
|
30
|
+
<meta name="appstore:developer_url" content="https://www.blacklanternsecurity.com">
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</body>
|
|
34
|
+
</html>""",
|
|
35
|
+
)
|
|
36
|
+
module_test.httpx_mock.add_response(
|
|
37
|
+
url="https://play.google.com/store/apps/details?id=com.bbot.other",
|
|
38
|
+
text="""<!DOCTYPE html>
|
|
39
|
+
<html>
|
|
40
|
+
<head>
|
|
41
|
+
<title>BBOT</title>
|
|
42
|
+
</head>
|
|
43
|
+
<body>
|
|
44
|
+
<meta name="appstore:developer_url" content="">
|
|
45
|
+
<a href="mailto:support@blacklanternsecurity.com"></a>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</body>
|
|
49
|
+
</html>""",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def check(self, module_test, events):
|
|
53
|
+
assert len(events) == 6
|
|
54
|
+
assert 1 == len(
|
|
55
|
+
[
|
|
56
|
+
e
|
|
57
|
+
for e in events
|
|
58
|
+
if e.type == "DNS_NAME" and e.data == "blacklanternsecurity.com" and e.scope_distance == 0
|
|
59
|
+
]
|
|
60
|
+
), "Failed to emit target DNS_NAME"
|
|
61
|
+
assert 1 == len(
|
|
62
|
+
[e for e in events if e.type == "ORG_STUB" and e.data == "blacklanternsecurity" and e.scope_distance == 0]
|
|
63
|
+
), "Failed to find ORG_STUB"
|
|
64
|
+
assert 1 == len(
|
|
65
|
+
[
|
|
66
|
+
e
|
|
67
|
+
for e in events
|
|
68
|
+
if e.type == "MOBILE_APP"
|
|
69
|
+
and "android" in e.tags
|
|
70
|
+
and e.data["id"] == "com.bbot.test"
|
|
71
|
+
and e.data["url"] == "https://play.google.com/store/apps/details?id=com.bbot.test"
|
|
72
|
+
]
|
|
73
|
+
), "Failed to find bbot android app"
|
|
74
|
+
assert 1 == len(
|
|
75
|
+
[
|
|
76
|
+
e
|
|
77
|
+
for e in events
|
|
78
|
+
if e.type == "MOBILE_APP"
|
|
79
|
+
and "android" in e.tags
|
|
80
|
+
and e.data["id"] == "com.bbot.other"
|
|
81
|
+
and e.data["url"] == "https://play.google.com/store/apps/details?id=com.bbot.other"
|
|
82
|
+
]
|
|
83
|
+
), "Failed to find other bbot android app"
|
|
@@ -27,8 +27,8 @@ class TestGowitness(ModuleTestBase):
|
|
|
27
27
|
"headers": {"Server": "Apache/2.4.41 (Ubuntu)"},
|
|
28
28
|
}
|
|
29
29
|
module_test.set_expect_requests(respond_args=respond_args)
|
|
30
|
-
request_args =
|
|
31
|
-
respond_args =
|
|
30
|
+
request_args = {"uri": "/blacklanternsecurity"}
|
|
31
|
+
respond_args = {"response_data": """blacklanternsecurity github <a data-bem"""}
|
|
32
32
|
module_test.set_expect_requests(request_args, respond_args)
|
|
33
33
|
|
|
34
34
|
# monkeypatch social
|
|
@@ -45,7 +45,7 @@ class TestGowitness(ModuleTestBase):
|
|
|
45
45
|
webscreenshots = [e for e in events if e.type == "WEBSCREENSHOT"]
|
|
46
46
|
assert webscreenshots, "failed to raise WEBSCREENSHOT events"
|
|
47
47
|
assert not any(
|
|
48
|
-
|
|
48
|
+
"blob" in e.data for e in webscreenshots
|
|
49
49
|
), "blob was included in WEBSCREENSHOT data when it shouldn't have been"
|
|
50
50
|
|
|
51
51
|
screenshots_path = self.home_dir / "scans" / module_test.scan.name / "gowitness" / "screenshots"
|
|
@@ -101,6 +101,4 @@ class TestGoWitnessWithBlob(TestGowitness):
|
|
|
101
101
|
def check(self, module_test, events):
|
|
102
102
|
webscreenshots = [e for e in events if e.type == "WEBSCREENSHOT"]
|
|
103
103
|
assert webscreenshots, "failed to raise WEBSCREENSHOT events"
|
|
104
|
-
assert all(
|
|
105
|
-
["blob" in e.data and e.data["blob"] for e in webscreenshots]
|
|
106
|
-
), "blob not found in WEBSCREENSHOT data"
|
|
104
|
+
assert all("blob" in e.data and e.data["blob"] for e in webscreenshots), "blob not found in WEBSCREENSHOT data"
|
|
@@ -31,7 +31,7 @@ class TestHost_Header(ModuleTestBase):
|
|
|
31
31
|
if subdomain_tag_overrides:
|
|
32
32
|
return Response(f"Alive, host is: {subdomain_tag}.{self.fake_host}", status=200)
|
|
33
33
|
|
|
34
|
-
return Response(
|
|
34
|
+
return Response("Alive, host is: defaulthost.com", status=200)
|
|
35
35
|
|
|
36
36
|
async def setup_before_prep(self, module_test):
|
|
37
37
|
self.interactsh_mock_instance = module_test.mock_interactsh("host_header")
|
|
@@ -48,10 +48,10 @@ class TestHTTP(ModuleTestBase):
|
|
|
48
48
|
)
|
|
49
49
|
|
|
50
50
|
def check(self, module_test, events):
|
|
51
|
-
assert self.got_event
|
|
52
|
-
assert self.headers_correct
|
|
53
|
-
assert self.method_correct
|
|
54
|
-
assert self.url_correct
|
|
51
|
+
assert self.got_event is True
|
|
52
|
+
assert self.headers_correct is True
|
|
53
|
+
assert self.method_correct is True
|
|
54
|
+
assert self.url_correct is True
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
class TestHTTPSIEMFriendly(TestHTTP):
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
from .base import ModuleTestBase
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
class
|
|
4
|
+
class TestHTTPXBase(ModuleTestBase):
|
|
5
5
|
targets = ["http://127.0.0.1:8888/url", "127.0.0.1:8888"]
|
|
6
|
+
module_name = "httpx"
|
|
7
|
+
modules_overrides = ["httpx", "excavate"]
|
|
6
8
|
config_overrides = {"modules": {"httpx": {"store_responses": True}}}
|
|
7
9
|
|
|
8
10
|
# HTML for a page with a login form
|
|
@@ -29,11 +31,11 @@ class TestHTTPX(ModuleTestBase):
|
|
|
29
31
|
</html>"""
|
|
30
32
|
|
|
31
33
|
async def setup_after_prep(self, module_test):
|
|
32
|
-
request_args =
|
|
33
|
-
respond_args =
|
|
34
|
+
request_args = {"uri": "/", "headers": {"test": "header"}}
|
|
35
|
+
respond_args = {"response_data": self.html_without_login}
|
|
34
36
|
module_test.set_expect_requests(request_args, respond_args)
|
|
35
|
-
request_args =
|
|
36
|
-
respond_args =
|
|
37
|
+
request_args = {"uri": "/url", "headers": {"test": "header"}}
|
|
38
|
+
respond_args = {"response_data": self.html_with_login}
|
|
37
39
|
module_test.set_expect_requests(request_args, respond_args)
|
|
38
40
|
|
|
39
41
|
def check(self, module_test, events):
|
|
@@ -42,7 +44,7 @@ class TestHTTPX(ModuleTestBase):
|
|
|
42
44
|
for e in events:
|
|
43
45
|
if e.type == "HTTP_RESPONSE":
|
|
44
46
|
if e.data["path"] == "/":
|
|
45
|
-
assert
|
|
47
|
+
assert "login-page" not in e.tags
|
|
46
48
|
open_port = True
|
|
47
49
|
elif e.data["path"] == "/url":
|
|
48
50
|
assert "login-page" in e.tags
|
|
@@ -122,8 +124,8 @@ class TestHTTPX_URLBlacklist(ModuleTestBase):
|
|
|
122
124
|
assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.1:8888/"])
|
|
123
125
|
assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.1:8888/test.aspx"])
|
|
124
126
|
assert 1 == len([e for e in events if e.type == "URL" and e.data == "http://127.0.0.1:8888/test.txt"])
|
|
125
|
-
assert not any(
|
|
126
|
-
assert not any(
|
|
127
|
+
assert not any(e for e in events if "URL" in e.type and ".svg" in e.data)
|
|
128
|
+
assert not any(e for e in events if "URL" in e.type and ".woff" in e.data)
|
|
127
129
|
|
|
128
130
|
|
|
129
131
|
class TestHTTPX_querystring_removed(ModuleTestBase):
|
|
@@ -2,7 +2,7 @@ from .base import ModuleTestBase
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class TestHunterio(ModuleTestBase):
|
|
5
|
-
config_overrides = {"modules": {"hunterio": {"api_key": "asdf"}}}
|
|
5
|
+
config_overrides = {"modules": {"hunterio": {"api_key": ["asdf", "1234", "4321", "fdsa"]}}}
|
|
6
6
|
|
|
7
7
|
async def setup_before_prep(self, module_test):
|
|
8
8
|
module_test.httpx_mock.add_response(
|
|
@@ -17,7 +17,7 @@ class TestHunterio(ModuleTestBase):
|
|
|
17
17
|
"reset_date": "1917-05-23",
|
|
18
18
|
"team_id": 1234,
|
|
19
19
|
"calls": {
|
|
20
|
-
"_deprecation_notice": "Sums the searches and the verifications, giving an
|
|
20
|
+
"_deprecation_notice": "Sums the searches and the verifications, giving an imprecise look of the available requests",
|
|
21
21
|
"used": 999,
|
|
22
22
|
"available": 2000,
|
|
23
23
|
},
|
|
@@ -29,7 +29,7 @@ class TestHunterio(ModuleTestBase):
|
|
|
29
29
|
},
|
|
30
30
|
)
|
|
31
31
|
module_test.httpx_mock.add_response(
|
|
32
|
-
url="https://api.hunter.io/v2/domain-search?domain=blacklanternsecurity.com&api_key=
|
|
32
|
+
url="https://api.hunter.io/v2/domain-search?domain=blacklanternsecurity.com&api_key=fdsa&limit=100&offset=0",
|
|
33
33
|
json={
|
|
34
34
|
"data": {
|
|
35
35
|
"domain": "blacklanternsecurity.com",
|
|
@@ -91,6 +91,70 @@ class TestHunterio(ModuleTestBase):
|
|
|
91
91
|
},
|
|
92
92
|
},
|
|
93
93
|
)
|
|
94
|
+
module_test.httpx_mock.add_response(
|
|
95
|
+
url="https://api.hunter.io/v2/domain-search?domain=blacklanternsecurity.com&api_key=4321&limit=100&offset=100",
|
|
96
|
+
json={
|
|
97
|
+
"data": {
|
|
98
|
+
"domain": "blacklanternsecurity.com",
|
|
99
|
+
"disposable": False,
|
|
100
|
+
"webmail": False,
|
|
101
|
+
"accept_all": False,
|
|
102
|
+
"pattern": "{first}",
|
|
103
|
+
"organization": "Black Lantern Security",
|
|
104
|
+
"description": None,
|
|
105
|
+
"twitter": None,
|
|
106
|
+
"facebook": None,
|
|
107
|
+
"linkedin": "https://linkedin.com/company/black-lantern-security",
|
|
108
|
+
"instagram": None,
|
|
109
|
+
"youtube": None,
|
|
110
|
+
"technologies": ["jekyll", "nginx"],
|
|
111
|
+
"country": "US",
|
|
112
|
+
"state": "CA",
|
|
113
|
+
"city": "Night City",
|
|
114
|
+
"postal_code": "12345",
|
|
115
|
+
"street": "123 Any St",
|
|
116
|
+
"emails": [
|
|
117
|
+
{
|
|
118
|
+
"value": "fdsa@blacklanternsecurity.com",
|
|
119
|
+
"type": "generic",
|
|
120
|
+
"confidence": 77,
|
|
121
|
+
"sources": [
|
|
122
|
+
{
|
|
123
|
+
"domain": "blacklanternsecurity.com",
|
|
124
|
+
"uri": "http://blacklanternsecurity.com",
|
|
125
|
+
"extracted_on": "2021-06-09",
|
|
126
|
+
"last_seen_on": "2023-03-21",
|
|
127
|
+
"still_on_page": True,
|
|
128
|
+
}
|
|
129
|
+
],
|
|
130
|
+
"first_name": None,
|
|
131
|
+
"last_name": None,
|
|
132
|
+
"position": None,
|
|
133
|
+
"seniority": None,
|
|
134
|
+
"department": "support",
|
|
135
|
+
"linkedin": None,
|
|
136
|
+
"twitter": None,
|
|
137
|
+
"phone_number": None,
|
|
138
|
+
"verification": {"date": None, "status": None},
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"linked_domains": [],
|
|
142
|
+
},
|
|
143
|
+
"meta": {
|
|
144
|
+
"results": 1,
|
|
145
|
+
"limit": 100,
|
|
146
|
+
"offset": 0,
|
|
147
|
+
"params": {
|
|
148
|
+
"domain": "blacklanternsecurity.com",
|
|
149
|
+
"company": None,
|
|
150
|
+
"type": None,
|
|
151
|
+
"seniority": None,
|
|
152
|
+
"department": None,
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
)
|
|
94
157
|
|
|
95
158
|
def check(self, module_test, events):
|
|
96
|
-
assert any(e.data == "asdf@blacklanternsecurity.com" for e in events), "Failed to detect email"
|
|
159
|
+
assert any(e.data == "asdf@blacklanternsecurity.com" for e in events), "Failed to detect email #1"
|
|
160
|
+
assert any(e.data == "fdsa@blacklanternsecurity.com" for e in events), "Failed to detect email #2"
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from bbot.core.helpers.libmagic import get_magic_info
|
|
3
|
+
from bbot.test.test_step_2.module_tests.base import ModuleTestBase, tempapkfile
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestJadx(ModuleTestBase):
|
|
7
|
+
modules_overrides = ["apkpure", "google_playstore", "speculate", "jadx"]
|
|
8
|
+
apk_file = tempapkfile()
|
|
9
|
+
|
|
10
|
+
async def setup_after_prep(self, module_test):
|
|
11
|
+
await module_test.mock_dns({"blacklanternsecurity.com": {"A": ["127.0.0.99"]}})
|
|
12
|
+
module_test.httpx_mock.add_response(
|
|
13
|
+
url="https://play.google.com/store/search?q=blacklanternsecurity&c=apps",
|
|
14
|
+
text="""<!DOCTYPE html>
|
|
15
|
+
<html>
|
|
16
|
+
<head>
|
|
17
|
+
<title>"blacklanternsecurity" - Android Apps on Google Play</title>
|
|
18
|
+
</head>
|
|
19
|
+
<body>
|
|
20
|
+
<a href="/store/apps/details?id=com.bbot.test&pcampaignid=dontmatchme&pli=1"/>
|
|
21
|
+
</body>
|
|
22
|
+
</html>""",
|
|
23
|
+
)
|
|
24
|
+
module_test.httpx_mock.add_response(
|
|
25
|
+
url="https://play.google.com/store/apps/details?id=com.bbot.test",
|
|
26
|
+
text="""<!DOCTYPE html>
|
|
27
|
+
<html>
|
|
28
|
+
<head>
|
|
29
|
+
<title>BBOT</title>
|
|
30
|
+
</head>
|
|
31
|
+
<body>
|
|
32
|
+
<meta name="appstore:developer_url" content="https://www.blacklanternsecurity.com">
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</body>
|
|
36
|
+
</html>""",
|
|
37
|
+
)
|
|
38
|
+
module_test.httpx_mock.add_response(
|
|
39
|
+
url="https://d.apkpure.com/b/XAPK/com.bbot.test?version=latest",
|
|
40
|
+
content=self.apk_file,
|
|
41
|
+
headers={
|
|
42
|
+
"Content-Type": "application/vnd.android.package-archive",
|
|
43
|
+
"Content-Disposition": "attachment; filename=com.bbot.test.apk",
|
|
44
|
+
},
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def check(self, module_test, events):
|
|
48
|
+
filesystem_events = [e for e in events if e.type == "FILESYSTEM"]
|
|
49
|
+
apk_event = [e for e in filesystem_events if "file" in e.tags]
|
|
50
|
+
extension, mime_type, description, confidence = get_magic_info(apk_event[0].data["path"])
|
|
51
|
+
assert description == "Android Application Package", f"Downloaded file was detected as {description}"
|
|
52
|
+
extract_event = [e for e in filesystem_events if "folder" in e.tags]
|
|
53
|
+
assert 1 == len(extract_event), "Failed to extract apk"
|
|
54
|
+
extract_path = Path(extract_event[0].data["path"])
|
|
55
|
+
assert extract_path.is_dir(), "Destination apk doesn't exist"
|
|
@@ -9,6 +9,9 @@ class TestJSON(ModuleTestBase):
|
|
|
9
9
|
dns_data = "blacklanternsecurity.com"
|
|
10
10
|
context_data = f"Scan {module_test.scan.name} seeded with DNS_NAME: blacklanternsecurity.com"
|
|
11
11
|
|
|
12
|
+
scan_event = [e for e in events if e.type == "SCAN"][0]
|
|
13
|
+
dns_event = [e for e in events if e.type == "DNS_NAME"][0]
|
|
14
|
+
|
|
12
15
|
# json events
|
|
13
16
|
txt_file = module_test.scan.home / "output.json"
|
|
14
17
|
lines = list(module_test.scan.helpers.read_file(txt_file))
|
|
@@ -16,30 +19,40 @@ class TestJSON(ModuleTestBase):
|
|
|
16
19
|
json_events = [json.loads(line) for line in lines]
|
|
17
20
|
scan_json = [e for e in json_events if e["type"] == "SCAN"]
|
|
18
21
|
dns_json = [e for e in json_events if e["type"] == "DNS_NAME"]
|
|
19
|
-
assert len(scan_json) ==
|
|
22
|
+
assert len(scan_json) == 2
|
|
20
23
|
assert len(dns_json) == 1
|
|
21
|
-
scan_json = scan_json[0]
|
|
22
24
|
dns_json = dns_json[0]
|
|
23
|
-
|
|
24
|
-
assert
|
|
25
|
-
assert
|
|
26
|
-
assert
|
|
25
|
+
scan = scan_json[0]
|
|
26
|
+
assert scan["data"]["name"] == module_test.scan.name
|
|
27
|
+
assert scan["data"]["id"] == module_test.scan.id
|
|
28
|
+
assert scan["id"] == module_test.scan.id
|
|
29
|
+
assert scan["uuid"] == str(module_test.scan.root_event.uuid)
|
|
30
|
+
assert scan["parent_uuid"] == str(module_test.scan.root_event.uuid)
|
|
31
|
+
assert scan["data"]["target"]["seeds"] == ["blacklanternsecurity.com"]
|
|
32
|
+
assert scan["data"]["target"]["whitelist"] == ["blacklanternsecurity.com"]
|
|
27
33
|
assert dns_json["data"] == dns_data
|
|
34
|
+
assert dns_json["id"] == str(dns_event.id)
|
|
35
|
+
assert dns_json["uuid"] == str(dns_event.uuid)
|
|
36
|
+
assert dns_json["parent_uuid"] == str(module_test.scan.root_event.uuid)
|
|
28
37
|
assert dns_json["discovery_context"] == context_data
|
|
29
38
|
assert dns_json["discovery_path"] == [context_data]
|
|
30
|
-
assert dns_json["parent_chain"] == ["
|
|
39
|
+
assert dns_json["parent_chain"] == [dns_json["uuid"]]
|
|
31
40
|
|
|
32
41
|
# event objects reconstructed from json
|
|
33
|
-
scan_reconstructed = event_from_json(scan_json)
|
|
42
|
+
scan_reconstructed = event_from_json(scan_json[0])
|
|
34
43
|
dns_reconstructed = event_from_json(dns_json)
|
|
35
44
|
assert scan_reconstructed.data["name"] == module_test.scan.name
|
|
36
45
|
assert scan_reconstructed.data["id"] == module_test.scan.id
|
|
46
|
+
assert scan_reconstructed.uuid == scan_event.uuid
|
|
47
|
+
assert scan_reconstructed.parent_uuid == scan_event.uuid
|
|
37
48
|
assert scan_reconstructed.data["target"]["seeds"] == ["blacklanternsecurity.com"]
|
|
38
49
|
assert scan_reconstructed.data["target"]["whitelist"] == ["blacklanternsecurity.com"]
|
|
39
50
|
assert dns_reconstructed.data == dns_data
|
|
51
|
+
assert dns_reconstructed.uuid == dns_event.uuid
|
|
52
|
+
assert dns_reconstructed.parent_uuid == module_test.scan.root_event.uuid
|
|
40
53
|
assert dns_reconstructed.discovery_context == context_data
|
|
41
54
|
assert dns_reconstructed.discovery_path == [context_data]
|
|
42
|
-
assert dns_reconstructed.parent_chain == ["
|
|
55
|
+
assert dns_reconstructed.parent_chain == [dns_json["uuid"]]
|
|
43
56
|
|
|
44
57
|
|
|
45
58
|
class TestJSONSIEMFriendly(ModuleTestBase):
|
|
@@ -6,12 +6,12 @@ class TestLeakIX(ModuleTestBase):
|
|
|
6
6
|
|
|
7
7
|
async def setup_before_prep(self, module_test):
|
|
8
8
|
module_test.httpx_mock.add_response(
|
|
9
|
-
url="https://leakix.net/host/1.
|
|
9
|
+
url="https://leakix.net/host/1.1.1.1",
|
|
10
10
|
match_headers={"api-key": "asdf"},
|
|
11
11
|
json={"title": "Not Found", "description": "Host not found"},
|
|
12
12
|
)
|
|
13
13
|
module_test.httpx_mock.add_response(
|
|
14
|
-
url=
|
|
14
|
+
url="https://leakix.net/api/subdomains/blacklanternsecurity.com",
|
|
15
15
|
match_headers={"api-key": "asdf"},
|
|
16
16
|
json=[
|
|
17
17
|
{
|
|
@@ -31,7 +31,11 @@ class TestLeakIX_NoAPIKey(ModuleTestBase):
|
|
|
31
31
|
|
|
32
32
|
async def setup_before_prep(self, module_test):
|
|
33
33
|
module_test.httpx_mock.add_response(
|
|
34
|
-
url=
|
|
34
|
+
url="https://leakix.net/host/1.1.1.1",
|
|
35
|
+
json={"title": "Not Found", "description": "Host not found"},
|
|
36
|
+
)
|
|
37
|
+
module_test.httpx_mock.add_response(
|
|
38
|
+
url="https://leakix.net/api/subdomains/blacklanternsecurity.com",
|
|
35
39
|
json=[
|
|
36
40
|
{
|
|
37
41
|
"subdomain": "asdf.blacklanternsecurity.com",
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
from .base import ModuleTestBase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TestMySQL(ModuleTestBase):
|
|
8
|
+
targets = ["evilcorp.com"]
|
|
9
|
+
skip_distro_tests = True
|
|
10
|
+
|
|
11
|
+
async def setup_before_prep(self, module_test):
|
|
12
|
+
process = await asyncio.create_subprocess_exec(
|
|
13
|
+
"docker",
|
|
14
|
+
"run",
|
|
15
|
+
"--name",
|
|
16
|
+
"bbot-test-mysql",
|
|
17
|
+
"--rm",
|
|
18
|
+
"-e",
|
|
19
|
+
"MYSQL_ROOT_PASSWORD=bbotislife",
|
|
20
|
+
"-e",
|
|
21
|
+
"MYSQL_DATABASE=bbot",
|
|
22
|
+
"-p",
|
|
23
|
+
"3306:3306",
|
|
24
|
+
"-d",
|
|
25
|
+
"mysql",
|
|
26
|
+
stdout=asyncio.subprocess.PIPE,
|
|
27
|
+
stderr=asyncio.subprocess.PIPE,
|
|
28
|
+
)
|
|
29
|
+
stdout, stderr = await process.communicate()
|
|
30
|
+
|
|
31
|
+
import aiomysql
|
|
32
|
+
|
|
33
|
+
# wait for the container to start
|
|
34
|
+
start_time = time.time()
|
|
35
|
+
while True:
|
|
36
|
+
try:
|
|
37
|
+
conn = await aiomysql.connect(user="root", password="bbotislife", db="bbot", host="localhost")
|
|
38
|
+
conn.close()
|
|
39
|
+
break
|
|
40
|
+
except Exception as e:
|
|
41
|
+
if time.time() - start_time > 60: # timeout after 60 seconds
|
|
42
|
+
self.log.error("MySQL server did not start in time.")
|
|
43
|
+
raise e
|
|
44
|
+
await asyncio.sleep(1)
|
|
45
|
+
|
|
46
|
+
if process.returncode != 0:
|
|
47
|
+
self.log.error(f"Failed to start MySQL server: {stderr.decode()}")
|
|
48
|
+
|
|
49
|
+
async def check(self, module_test, events):
|
|
50
|
+
import aiomysql
|
|
51
|
+
|
|
52
|
+
# Connect to the MySQL database
|
|
53
|
+
conn = await aiomysql.connect(user="root", password="bbotislife", db="bbot", host="localhost")
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
async with conn.cursor() as cur:
|
|
57
|
+
await cur.execute("SELECT * FROM event")
|
|
58
|
+
events = await cur.fetchall()
|
|
59
|
+
assert len(events) == 3, "No events found in MySQL database"
|
|
60
|
+
|
|
61
|
+
await cur.execute("SELECT * FROM scan")
|
|
62
|
+
scans = await cur.fetchall()
|
|
63
|
+
assert len(scans) == 1, "No scans found in MySQL database"
|
|
64
|
+
|
|
65
|
+
await cur.execute("SELECT * FROM target")
|
|
66
|
+
targets = await cur.fetchall()
|
|
67
|
+
assert len(targets) == 1, "No targets found in MySQL database"
|
|
68
|
+
finally:
|
|
69
|
+
conn.close()
|
|
70
|
+
process = await asyncio.create_subprocess_exec(
|
|
71
|
+
"docker", "stop", "bbot-test-mysql", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
|
|
72
|
+
)
|
|
73
|
+
stdout, stderr = await process.communicate()
|
|
74
|
+
|
|
75
|
+
if process.returncode != 0:
|
|
76
|
+
raise Exception(f"Failed to stop MySQL server: {stderr.decode()}")
|
|
@@ -5,7 +5,7 @@ class TestMySSL(ModuleTestBase):
|
|
|
5
5
|
async def setup_after_prep(self, module_test):
|
|
6
6
|
module_test.module.abort_if = lambda e: False
|
|
7
7
|
module_test.httpx_mock.add_response(
|
|
8
|
-
url=
|
|
8
|
+
url="https://myssl.com/api/v1/discover_sub_domain?domain=blacklanternsecurity.com",
|
|
9
9
|
json={
|
|
10
10
|
"code": 0,
|
|
11
11
|
"data": [
|
|
@@ -10,16 +10,16 @@ class TestNewsletters(ModuleTestBase):
|
|
|
10
10
|
modules_overrides = ["speculate", "httpx", "newsletters"]
|
|
11
11
|
|
|
12
12
|
html_with_newsletter = """
|
|
13
|
-
<input aria-required="true"
|
|
14
|
-
class="form-input form-input-text required"
|
|
15
|
-
data-at="form-email"
|
|
16
|
-
data-describedby="form-validation-error-box-element-5"
|
|
17
|
-
data-label-inside="Enter your email"
|
|
18
|
-
id="field-5f329905b4bfe1027b44513f94b50363-0"
|
|
19
|
-
name="Enter your email"
|
|
20
|
-
placeholder="Enter your email"
|
|
21
|
-
required=""
|
|
22
|
-
title="Enter your email"
|
|
13
|
+
<input aria-required="true"
|
|
14
|
+
class="form-input form-input-text required"
|
|
15
|
+
data-at="form-email"
|
|
16
|
+
data-describedby="form-validation-error-box-element-5"
|
|
17
|
+
data-label-inside="Enter your email"
|
|
18
|
+
id="field-5f329905b4bfe1027b44513f94b50363-0"
|
|
19
|
+
name="Enter your email"
|
|
20
|
+
placeholder="Enter your email"
|
|
21
|
+
required=""
|
|
22
|
+
title="Enter your email"
|
|
23
23
|
type="email" value=""/>
|
|
24
24
|
"""
|
|
25
25
|
|
|
@@ -33,11 +33,11 @@ class TestNewsletters(ModuleTestBase):
|
|
|
33
33
|
"""
|
|
34
34
|
|
|
35
35
|
async def setup_after_prep(self, module_test):
|
|
36
|
-
request_args =
|
|
37
|
-
respond_args =
|
|
36
|
+
request_args = {"uri": "/found", "headers": {"test": "header"}}
|
|
37
|
+
respond_args = {"response_data": self.html_with_newsletter}
|
|
38
38
|
module_test.set_expect_requests(request_args, respond_args)
|
|
39
|
-
request_args =
|
|
40
|
-
respond_args =
|
|
39
|
+
request_args = {"uri": "/missing", "headers": {"test": "header"}}
|
|
40
|
+
respond_args = {"response_data": self.html_without_newsletter}
|
|
41
41
|
module_test.set_expect_requests(request_args, respond_args)
|
|
42
42
|
|
|
43
43
|
def check(self, module_test, events):
|
|
@@ -53,5 +53,5 @@ class TestNewsletters(ModuleTestBase):
|
|
|
53
53
|
# Verify Negative Result (should skip this statement if correct)
|
|
54
54
|
elif event.data["url"] == self.missing_tgt:
|
|
55
55
|
missing = False
|
|
56
|
-
assert found,
|
|
57
|
-
assert missing,
|
|
56
|
+
assert found, "NEWSLETTER 'Found' Error - Expect status of True but got False"
|
|
57
|
+
assert missing, "NEWSLETTER 'Missing' Error - Expect status of True but got False"
|
|
@@ -7,16 +7,17 @@ class TestNTLM(ModuleTestBase):
|
|
|
7
7
|
config_overrides = {"modules": {"ntlm": {"try_all": True}}}
|
|
8
8
|
|
|
9
9
|
async def setup_after_prep(self, module_test):
|
|
10
|
-
request_args =
|
|
10
|
+
request_args = {"uri": "/", "headers": {"test": "header"}}
|
|
11
11
|
module_test.set_expect_requests(request_args, {})
|
|
12
|
-
request_args =
|
|
13
|
-
uri
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
request_args = {
|
|
13
|
+
"uri": "/oab/",
|
|
14
|
+
"headers": {"Authorization": "NTLM TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAGFKAAAADw=="},
|
|
15
|
+
}
|
|
16
|
+
respond_args = {
|
|
17
|
+
"headers": {
|
|
17
18
|
"WWW-Authenticate": "NTLM TlRMTVNTUAACAAAABgAGADgAAAAVgoni89aZT4Q0mH0AAAAAAAAAAHYAdgA+AAAABgGxHQAAAA9WAE4ATwACAAYAVgBOAE8AAQAKAEUAWABDADAAMQAEABIAdgBuAG8ALgBsAG8AYwBhAGwAAwAeAEUAWABDADAAMQAuAHYAbgBvAC4AbABvAGMAYQBsAAUAEgB2AG4AbwAuAGwAbwBjAGEAbAAHAAgAXxo0p/6L2QEAAAAA"
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
+
}
|
|
20
21
|
module_test.set_expect_requests(request_args, respond_args)
|
|
21
22
|
|
|
22
23
|
def check(self, module_test, events):
|
|
@@ -167,7 +167,7 @@ class TestOAUTH(ModuleTestBase):
|
|
|
167
167
|
async def setup_after_prep(self, module_test):
|
|
168
168
|
await module_test.mock_dns({"evilcorp.com": {"A": ["127.0.0.1"]}})
|
|
169
169
|
module_test.httpx_mock.add_response(
|
|
170
|
-
url=
|
|
170
|
+
url="https://login.microsoftonline.com/getuserrealm.srf?login=test@evilcorp.com",
|
|
171
171
|
json=Azure_Realm.response_json,
|
|
172
172
|
)
|
|
173
173
|
module_test.httpx_mock.add_response(
|
|
@@ -4,7 +4,7 @@ from .base import ModuleTestBase
|
|
|
4
4
|
class TestOTX(ModuleTestBase):
|
|
5
5
|
async def setup_after_prep(self, module_test):
|
|
6
6
|
module_test.httpx_mock.add_response(
|
|
7
|
-
url=
|
|
7
|
+
url="https://otx.alienvault.com/api/v1/indicators/domain/blacklanternsecurity.com/passive_dns",
|
|
8
8
|
json={
|
|
9
9
|
"passive_dns": [
|
|
10
10
|
{
|
|
@@ -28,7 +28,7 @@ class TestParamminer_Cookies(Paramminer_Headers):
|
|
|
28
28
|
module_test.monkeypatch.setattr(
|
|
29
29
|
helper.HttpCompare, "gen_cache_buster", lambda *args, **kwargs: {"AAAAAA": "1"}
|
|
30
30
|
)
|
|
31
|
-
expect_args =
|
|
31
|
+
expect_args = {"headers": {"Cookie": "admincookie=AAAAAAAAAAAAAA"}}
|
|
32
32
|
respond_args = {"response_data": self.cookies_body_match}
|
|
33
33
|
module_test.set_expect_requests(expect_args=expect_args, respond_args=respond_args)
|
|
34
34
|
|
|
@@ -36,7 +36,6 @@ class TestParamminer_Cookies(Paramminer_Headers):
|
|
|
36
36
|
module_test.set_expect_requests(respond_args=respond_args)
|
|
37
37
|
|
|
38
38
|
def check(self, module_test, events):
|
|
39
|
-
|
|
40
39
|
found_reflected_cookie = False
|
|
41
40
|
false_positive_match = False
|
|
42
41
|
|