bbot 2.4.0.6007rc0__py3-none-any.whl → 2.4.0.6031rc0__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 +7 -1
- bbot/core/config/logger.py +5 -10
- bbot/logger.py +9 -0
- bbot/modules/crt.py +20 -46
- bbot/modules/crt_db.py +70 -0
- bbot/modules/deadly/nuclei.py +1 -1
- bbot/modules/internal/unarchive.py +3 -2
- bbot/modules/output/websocket.py +12 -6
- bbot/modules/trufflehog.py +1 -1
- bbot/scanner/scanner.py +3 -6
- bbot/test/bbot_fixtures.py +20 -0
- bbot/test/test_step_1/test_cli.py +12 -2
- bbot/test/test_step_1/test_python_api.py +10 -10
- bbot/test/test_step_2/module_tests/test_module_censys.py +3 -3
- bbot/test/test_step_2/module_tests/test_module_crt.py +6 -16
- bbot/test/test_step_2/module_tests/test_module_crt_db.py +23 -0
- bbot/test/test_step_2/module_tests/test_module_excavate.py +5 -5
- bbot/test/test_step_2/module_tests/test_module_nuclei.py +4 -7
- {bbot-2.4.0.6007rc0.dist-info → bbot-2.4.0.6031rc0.dist-info}/METADATA +2 -2
- {bbot-2.4.0.6007rc0.dist-info → bbot-2.4.0.6031rc0.dist-info}/RECORD +24 -22
- {bbot-2.4.0.6007rc0.dist-info → bbot-2.4.0.6031rc0.dist-info}/WHEEL +1 -1
- {bbot-2.4.0.6007rc0.dist-info → bbot-2.4.0.6031rc0.dist-info}/LICENSE +0 -0
- {bbot-2.4.0.6007rc0.dist-info → bbot-2.4.0.6031rc0.dist-info}/entry_points.txt +0 -0
bbot/__init__.py
CHANGED
bbot/cli.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
|
+
import io
|
|
3
4
|
import sys
|
|
4
5
|
import logging
|
|
5
6
|
import multiprocessing
|
|
@@ -240,7 +241,12 @@ async def _main():
|
|
|
240
241
|
|
|
241
242
|
# set stdout and stderr to blocking mode
|
|
242
243
|
# this is needed to prevent BlockingIOErrors in logging etc.
|
|
243
|
-
fds = [
|
|
244
|
+
fds = []
|
|
245
|
+
for stream in [sys.stdout, sys.stderr]:
|
|
246
|
+
try:
|
|
247
|
+
fds.append(stream.fileno())
|
|
248
|
+
except io.UnsupportedOperation:
|
|
249
|
+
log.debug(f"Can't get fileno for {stream}")
|
|
244
250
|
for fd in fds:
|
|
245
251
|
flags = fcntl.fcntl(fd, fcntl.F_GETFL)
|
|
246
252
|
fcntl.fcntl(fd, fcntl.F_SETFL, flags & ~os.O_NONBLOCK)
|
bbot/core/config/logger.py
CHANGED
|
@@ -9,9 +9,8 @@ from pathlib import Path
|
|
|
9
9
|
from contextlib import suppress
|
|
10
10
|
|
|
11
11
|
from ..helpers.misc import mkdir, error_and_exit
|
|
12
|
-
from ...logger import colorize, loglevel_mapping
|
|
13
12
|
from ..multiprocess import SHARED_INTERPRETER_STATE
|
|
14
|
-
|
|
13
|
+
from ...logger import colorize, loglevel_mapping, GzipRotatingFileHandler
|
|
15
14
|
|
|
16
15
|
debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
|
|
17
16
|
|
|
@@ -216,15 +215,11 @@ class BBOTLogger:
|
|
|
216
215
|
if not mkdir(log_dir, raise_error=False):
|
|
217
216
|
error_and_exit(f"Failure creating or error writing to BBOT logs directory ({log_dir})")
|
|
218
217
|
|
|
219
|
-
# Main log file
|
|
220
|
-
main_handler =
|
|
221
|
-
f"{log_dir}/bbot.log", when="d", interval=1, backupCount=14
|
|
222
|
-
)
|
|
218
|
+
# Main log file (compressed)
|
|
219
|
+
main_handler = GzipRotatingFileHandler(f"{log_dir}/bbot.log", when="d", interval=1, backupCount=14)
|
|
223
220
|
|
|
224
|
-
# Separate log file for debugging
|
|
225
|
-
debug_handler =
|
|
226
|
-
f"{log_dir}/bbot.debug.log", when="d", interval=1, backupCount=14
|
|
227
|
-
)
|
|
221
|
+
# Separate log file for debugging (compressed)
|
|
222
|
+
debug_handler = GzipRotatingFileHandler(f"{log_dir}/bbot.debug.log", when="d", interval=1, backupCount=14)
|
|
228
223
|
|
|
229
224
|
# Log to stderr
|
|
230
225
|
stderr_handler = logging.StreamHandler(sys.stderr)
|
bbot/logger.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import sys
|
|
2
|
+
import logging.handlers
|
|
2
3
|
|
|
3
4
|
loglevel_mapping = {
|
|
4
5
|
"DEBUG": "DBUG",
|
|
@@ -50,3 +51,11 @@ def log_to_stderr(msg, level="INFO", logname=True):
|
|
|
50
51
|
if logname:
|
|
51
52
|
msg = f"{levelshort} {msg}"
|
|
52
53
|
print(msg, file=sys.stderr)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# Create a compressed file handler for logs
|
|
57
|
+
class GzipRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
|
|
58
|
+
def _open(self):
|
|
59
|
+
import gzip
|
|
60
|
+
|
|
61
|
+
return gzip.open(f"{self.baseFilename}.gz", mode="at", encoding=self.encoding)
|
bbot/modules/crt.py
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import time
|
|
2
|
-
import asyncpg
|
|
3
|
-
|
|
4
1
|
from bbot.modules.templates.subdomain_enum import subdomain_enum
|
|
5
2
|
|
|
6
3
|
|
|
@@ -14,53 +11,30 @@ class crt(subdomain_enum):
|
|
|
14
11
|
"author": "@TheTechromancer",
|
|
15
12
|
}
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
db_host = "crt.sh"
|
|
20
|
-
db_port = 5432
|
|
21
|
-
db_user = "guest"
|
|
22
|
-
db_name = "certwatch"
|
|
14
|
+
base_url = "https://crt.sh"
|
|
23
15
|
reject_wildcards = False
|
|
24
16
|
|
|
25
17
|
async def setup(self):
|
|
26
|
-
self.
|
|
18
|
+
self.cert_ids = set()
|
|
27
19
|
return await super().setup()
|
|
28
20
|
|
|
29
21
|
async def request_url(self, query):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"""
|
|
49
|
-
start = time.time()
|
|
50
|
-
results = await self.db_conn.fetch(sql, query)
|
|
51
|
-
end = time.time()
|
|
52
|
-
self.verbose(f"SQL query executed in: {end - start} seconds with {len(results):,} results")
|
|
22
|
+
params = {"q": f"%.{query}", "output": "json"}
|
|
23
|
+
url = self.helpers.add_get_params(self.base_url, params).geturl()
|
|
24
|
+
return await self.api_request(url, timeout=self.http_timeout + 30)
|
|
25
|
+
|
|
26
|
+
async def parse_results(self, r, query):
|
|
27
|
+
results = set()
|
|
28
|
+
j = r.json()
|
|
29
|
+
for cert_info in j:
|
|
30
|
+
if not type(cert_info) == dict:
|
|
31
|
+
continue
|
|
32
|
+
cert_id = cert_info.get("id")
|
|
33
|
+
if cert_id:
|
|
34
|
+
if hash(cert_id) not in self.cert_ids:
|
|
35
|
+
self.cert_ids.add(hash(cert_id))
|
|
36
|
+
domain = cert_info.get("name_value")
|
|
37
|
+
if domain:
|
|
38
|
+
for d in domain.splitlines():
|
|
39
|
+
results.add(d.lower())
|
|
53
40
|
return results
|
|
54
|
-
|
|
55
|
-
async def parse_results(self, results, query):
|
|
56
|
-
domains = set()
|
|
57
|
-
for row in results:
|
|
58
|
-
domain = row["name_value"]
|
|
59
|
-
if domain:
|
|
60
|
-
for d in domain.splitlines():
|
|
61
|
-
domains.add(d.lower())
|
|
62
|
-
return domains
|
|
63
|
-
|
|
64
|
-
async def cleanup(self):
|
|
65
|
-
if self.db_conn:
|
|
66
|
-
await self.db_conn.close()
|
bbot/modules/crt_db.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import asyncpg
|
|
3
|
+
|
|
4
|
+
from bbot.modules.templates.subdomain_enum import subdomain_enum
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class crt_db(subdomain_enum):
|
|
8
|
+
flags = ["subdomain-enum", "passive", "safe"]
|
|
9
|
+
watched_events = ["DNS_NAME"]
|
|
10
|
+
produced_events = ["DNS_NAME"]
|
|
11
|
+
meta = {
|
|
12
|
+
"description": "Query crt.sh (certificate transparency) for subdomains via PostgreSQL",
|
|
13
|
+
"created_date": "2025-03-27",
|
|
14
|
+
"author": "@TheTechromancer",
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
deps_pip = ["asyncpg"]
|
|
18
|
+
|
|
19
|
+
db_host = "crt.sh"
|
|
20
|
+
db_port = 5432
|
|
21
|
+
db_user = "guest"
|
|
22
|
+
db_name = "certwatch"
|
|
23
|
+
reject_wildcards = False
|
|
24
|
+
|
|
25
|
+
async def setup(self):
|
|
26
|
+
self.db_conn = None
|
|
27
|
+
return await super().setup()
|
|
28
|
+
|
|
29
|
+
async def request_url(self, query):
|
|
30
|
+
if not self.db_conn:
|
|
31
|
+
self.db_conn = await asyncpg.connect(
|
|
32
|
+
host=self.db_host,
|
|
33
|
+
port=self.db_port,
|
|
34
|
+
user=self.db_user,
|
|
35
|
+
database=self.db_name,
|
|
36
|
+
statement_cache_size=0, # Disable automatic statement preparation
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
sql = """
|
|
40
|
+
WITH ci AS (
|
|
41
|
+
SELECT array_agg(DISTINCT sub.NAME_VALUE) NAME_VALUES
|
|
42
|
+
FROM (
|
|
43
|
+
SELECT DISTINCT cai.CERTIFICATE, cai.NAME_VALUE
|
|
44
|
+
FROM certificate_and_identities cai
|
|
45
|
+
WHERE plainto_tsquery('certwatch', $1) @@ identities(cai.CERTIFICATE)
|
|
46
|
+
AND cai.NAME_VALUE ILIKE ('%.' || $1)
|
|
47
|
+
LIMIT 50000
|
|
48
|
+
) sub
|
|
49
|
+
GROUP BY sub.CERTIFICATE
|
|
50
|
+
)
|
|
51
|
+
SELECT DISTINCT unnest(NAME_VALUES) as name_value FROM ci;
|
|
52
|
+
"""
|
|
53
|
+
start = time.time()
|
|
54
|
+
results = await self.db_conn.fetch(sql, query)
|
|
55
|
+
end = time.time()
|
|
56
|
+
self.verbose(f"SQL query executed in: {end - start} seconds with {len(results):,} results")
|
|
57
|
+
return results
|
|
58
|
+
|
|
59
|
+
async def parse_results(self, results, query):
|
|
60
|
+
domains = set()
|
|
61
|
+
for row in results:
|
|
62
|
+
domain = row["name_value"]
|
|
63
|
+
if domain:
|
|
64
|
+
for d in domain.splitlines():
|
|
65
|
+
domains.add(d.lower())
|
|
66
|
+
return domains
|
|
67
|
+
|
|
68
|
+
async def cleanup(self):
|
|
69
|
+
if self.db_conn:
|
|
70
|
+
await self.db_conn.close()
|
bbot/modules/deadly/nuclei.py
CHANGED
|
@@ -29,8 +29,9 @@ class unarchive(BaseInternalModule):
|
|
|
29
29
|
|
|
30
30
|
async def filter_event(self, event):
|
|
31
31
|
if "file" in event.tags:
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
magic_mime_type = event.data.get("magic_mime_type", "")
|
|
33
|
+
if magic_mime_type in self.ignore_compressions:
|
|
34
|
+
return False, f"Ignoring file type: {magic_mime_type}, {event.data['path']}"
|
|
34
35
|
if "compression" in event.data:
|
|
35
36
|
if not event.data["compression"] in self.compression_methods:
|
|
36
37
|
return (
|
bbot/modules/output/websocket.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import asyncio
|
|
3
|
+
import ssl
|
|
3
4
|
import websockets
|
|
4
5
|
|
|
5
6
|
from bbot.modules.output.base import BaseOutputModule
|
|
@@ -8,11 +9,12 @@ from bbot.modules.output.base import BaseOutputModule
|
|
|
8
9
|
class Websocket(BaseOutputModule):
|
|
9
10
|
watched_events = ["*"]
|
|
10
11
|
meta = {"description": "Output to websockets", "created_date": "2022-04-15", "author": "@TheTechromancer"}
|
|
11
|
-
options = {"url": "", "token": "", "preserve_graph": True}
|
|
12
|
+
options = {"url": "", "token": "", "preserve_graph": True, "ignore_ssl": False}
|
|
12
13
|
options_desc = {
|
|
13
14
|
"url": "Web URL",
|
|
14
15
|
"token": "Authorization Bearer token",
|
|
15
16
|
"preserve_graph": "Preserve full chains of events in the graph (prevents orphans)",
|
|
17
|
+
"ignore_ssl": "Ignores all Websocket SSL related errors (like Self-Signed Certificates, etc.)",
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
async def setup(self):
|
|
@@ -31,12 +33,16 @@ class Websocket(BaseOutputModule):
|
|
|
31
33
|
if self._ws is None or rebuild:
|
|
32
34
|
kwargs = {"close_timeout": 0.5}
|
|
33
35
|
if self.token:
|
|
34
|
-
kwargs.update({"
|
|
35
|
-
verbs = ("Building", "Built")
|
|
36
|
-
if rebuild:
|
|
37
|
-
verbs = ("Rebuilding", "Rebuilt")
|
|
36
|
+
kwargs.update({"additional_headers": {"Authorization": f"Bearer {self.token}"}})
|
|
37
|
+
verbs = ("Building", "Built") if not rebuild else ("Rebuilding", "Rebuilt")
|
|
38
38
|
self.debug(f"{verbs[0]} websocket connection to {self.url}")
|
|
39
|
-
self.
|
|
39
|
+
if self.config.get("ignore_ssl", False):
|
|
40
|
+
ssl_context = ssl.create_default_context()
|
|
41
|
+
ssl_context.check_hostname = False
|
|
42
|
+
ssl_context.verify_mode = ssl.CERT_NONE
|
|
43
|
+
self._ws = await websockets.connect(self.url, ssl=ssl_context, **kwargs)
|
|
44
|
+
else:
|
|
45
|
+
self._ws = await websockets.connect(self.url, **kwargs)
|
|
40
46
|
self.debug(f"{verbs[1]} websocket connection to {self.url}")
|
|
41
47
|
return self._ws
|
|
42
48
|
|
bbot/modules/trufflehog.py
CHANGED
bbot/scanner/scanner.py
CHANGED
|
@@ -14,6 +14,7 @@ from bbot.core.event import make_event
|
|
|
14
14
|
from .manager import ScanIngress, ScanEgress
|
|
15
15
|
from bbot.core.helpers.misc import sha1, rand_string
|
|
16
16
|
from bbot.core.helpers.names_generator import random_name
|
|
17
|
+
from bbot.core.config.logger import GzipRotatingFileHandler
|
|
17
18
|
from bbot.core.multiprocess import SHARED_INTERPRETER_STATE
|
|
18
19
|
from bbot.core.helpers.async_helpers import async_to_sync_gen
|
|
19
20
|
from bbot.errors import BBOTError, ScanError, ValidationError
|
|
@@ -1228,13 +1229,9 @@ class Scanner:
|
|
|
1228
1229
|
def _log_handlers(self):
|
|
1229
1230
|
if self.__log_handlers is None:
|
|
1230
1231
|
self.helpers.mkdir(self.home)
|
|
1231
|
-
main_handler =
|
|
1232
|
-
str(self.home / "scan.log"), when="d", interval=1, backupCount=14
|
|
1233
|
-
)
|
|
1232
|
+
main_handler = GzipRotatingFileHandler(str(self.home / "scan.log"), when="d", interval=1, backupCount=14)
|
|
1234
1233
|
main_handler.addFilter(lambda x: x.levelno != logging.TRACE and x.levelno >= logging.VERBOSE)
|
|
1235
|
-
debug_handler =
|
|
1236
|
-
str(self.home / "debug.log"), when="d", interval=1, backupCount=14
|
|
1237
|
-
)
|
|
1234
|
+
debug_handler = GzipRotatingFileHandler(str(self.home / "debug.log"), when="d", interval=1, backupCount=14)
|
|
1238
1235
|
debug_handler.addFilter(lambda x: x.levelno >= logging.DEBUG)
|
|
1239
1236
|
self.__log_handlers = [main_handler, debug_handler]
|
|
1240
1237
|
return self.__log_handlers
|
bbot/test/bbot_fixtures.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os # noqa
|
|
2
2
|
import sys
|
|
3
|
+
import zlib
|
|
3
4
|
import pytest
|
|
4
5
|
import shutil # noqa
|
|
5
6
|
import asyncio # noqa
|
|
@@ -49,6 +50,25 @@ def tempapkfile():
|
|
|
49
50
|
return apk_file
|
|
50
51
|
|
|
51
52
|
|
|
53
|
+
def read_gzipped_file(file_path):
|
|
54
|
+
"""
|
|
55
|
+
Read and decompress a gzipped file, tolerating missing end markers.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
file_path: Path to the gzipped file
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
The decompressed content as a string
|
|
62
|
+
"""
|
|
63
|
+
with open(file_path, "rb") as f:
|
|
64
|
+
data = f.read()
|
|
65
|
+
decompressor = zlib.decompressobj(
|
|
66
|
+
16 + zlib.MAX_WBITS
|
|
67
|
+
) # This is needed because the file doesn't have an end marker
|
|
68
|
+
content = decompressor.decompress(data).decode("utf-8", errors="ignore")
|
|
69
|
+
return content
|
|
70
|
+
|
|
71
|
+
|
|
52
72
|
@pytest.fixture
|
|
53
73
|
def clean_default_config(monkeypatch):
|
|
54
74
|
clean_config = OmegaConf.merge(
|
|
@@ -129,6 +129,11 @@ async def test_cli_scan(monkeypatch):
|
|
|
129
129
|
dns_success = True
|
|
130
130
|
assert ip_success and dns_success, "IP_ADDRESS and/or DNS_NAME are not present in output.txt"
|
|
131
131
|
|
|
132
|
+
# Check for gzipped scan log file
|
|
133
|
+
scan_log_gz = scan_home / "scan.log.gz"
|
|
134
|
+
assert scan_log_gz.is_file(), "scan.log.gz not found"
|
|
135
|
+
assert "[INFO]" in read_gzipped_file(scan_log_gz)
|
|
136
|
+
|
|
132
137
|
|
|
133
138
|
@pytest.mark.asyncio
|
|
134
139
|
async def test_cli_args(monkeypatch, caplog, capsys, clean_default_config):
|
|
@@ -187,14 +192,19 @@ async def test_cli_args(monkeypatch, caplog, capsys, clean_default_config):
|
|
|
187
192
|
output_dir = bbot_test_dir / "bbot_cli_args_output"
|
|
188
193
|
scan_name = "bbot_cli_args_scan_name"
|
|
189
194
|
scan_dir = output_dir / scan_name
|
|
190
|
-
|
|
195
|
+
if output_dir.exists():
|
|
196
|
+
shutil.rmtree(output_dir)
|
|
191
197
|
monkeypatch.setattr("sys.argv", ["bbot", "-o", str(output_dir), "-n", scan_name, "-y"])
|
|
192
198
|
result = await cli._main()
|
|
193
199
|
assert result is True
|
|
194
200
|
assert output_dir.is_dir()
|
|
195
201
|
assert scan_dir.is_dir()
|
|
196
202
|
assert "[SCAN]" in open(scan_dir / "output.txt").read()
|
|
197
|
-
|
|
203
|
+
|
|
204
|
+
# Check for gzipped scan log file
|
|
205
|
+
scan_log_gz = scan_dir / "scan.log.gz"
|
|
206
|
+
assert scan_log_gz.is_file(), "scan.log.gz not found"
|
|
207
|
+
assert "[INFO]" in read_gzipped_file(scan_log_gz)
|
|
198
208
|
shutil.rmtree(output_dir)
|
|
199
209
|
|
|
200
210
|
# list module options
|
|
@@ -17,28 +17,28 @@ async def test_python_api():
|
|
|
17
17
|
scan_home = scan2.helpers.scans_dir / "python_api_test"
|
|
18
18
|
out_file = scan_home / "output.json"
|
|
19
19
|
assert list(scan2.helpers.read_file(out_file))
|
|
20
|
-
scan_log = scan_home / "scan.log"
|
|
21
|
-
debug_log = scan_home / "debug.log"
|
|
20
|
+
scan_log = scan_home / "scan.log.gz"
|
|
21
|
+
debug_log = scan_home / "debug.log.gz"
|
|
22
22
|
assert scan_log.is_file()
|
|
23
|
-
assert "python_api_test" in
|
|
23
|
+
assert "python_api_test" in read_gzipped_file(scan_log)
|
|
24
24
|
assert debug_log.is_file()
|
|
25
|
-
assert "python_api_test" in
|
|
25
|
+
assert "python_api_test" in read_gzipped_file(debug_log)
|
|
26
26
|
|
|
27
27
|
scan3 = Scanner("127.0.0.1", output_modules=["json"], scan_name="scan_logging_test")
|
|
28
28
|
await scan3.async_start_without_generator()
|
|
29
29
|
|
|
30
|
-
assert "scan_logging_test" not in
|
|
31
|
-
assert "scan_logging_test" not in
|
|
30
|
+
assert "scan_logging_test" not in read_gzipped_file(scan_log)
|
|
31
|
+
assert "scan_logging_test" not in read_gzipped_file(debug_log)
|
|
32
32
|
|
|
33
33
|
scan_home = scan3.helpers.scans_dir / "scan_logging_test"
|
|
34
34
|
out_file = scan_home / "output.json"
|
|
35
35
|
assert list(scan3.helpers.read_file(out_file))
|
|
36
|
-
scan_log = scan_home / "scan.log"
|
|
37
|
-
debug_log = scan_home / "debug.log"
|
|
36
|
+
scan_log = scan_home / "scan.log.gz"
|
|
37
|
+
debug_log = scan_home / "debug.log.gz"
|
|
38
38
|
assert scan_log.is_file()
|
|
39
39
|
assert debug_log.is_file()
|
|
40
|
-
assert "scan_logging_test" in
|
|
41
|
-
assert "scan_logging_test" in
|
|
40
|
+
assert "scan_logging_test" in read_gzipped_file(scan_log)
|
|
41
|
+
assert "scan_logging_test" in read_gzipped_file(debug_log)
|
|
42
42
|
|
|
43
43
|
# make sure config loads properly
|
|
44
44
|
bbot_home = "/tmp/.bbot_python_api_test"
|
|
@@ -7,7 +7,7 @@ class TestCensys(ModuleTestBase):
|
|
|
7
7
|
async def setup_before_prep(self, module_test):
|
|
8
8
|
module_test.httpx_mock.add_response(
|
|
9
9
|
url="https://search.censys.io/api/v1/account",
|
|
10
|
-
match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
|
|
10
|
+
# match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
|
|
11
11
|
json={
|
|
12
12
|
"email": "info@blacklanternsecurity.com",
|
|
13
13
|
"login": "nope",
|
|
@@ -18,7 +18,7 @@ class TestCensys(ModuleTestBase):
|
|
|
18
18
|
)
|
|
19
19
|
module_test.httpx_mock.add_response(
|
|
20
20
|
url="https://search.censys.io/api/v2/certificates/search",
|
|
21
|
-
match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
|
|
21
|
+
# match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
|
|
22
22
|
match_content=b'{"q": "names: blacklanternsecurity.com", "per_page": 100}',
|
|
23
23
|
json={
|
|
24
24
|
"code": 200,
|
|
@@ -47,7 +47,7 @@ class TestCensys(ModuleTestBase):
|
|
|
47
47
|
)
|
|
48
48
|
module_test.httpx_mock.add_response(
|
|
49
49
|
url="https://search.censys.io/api/v2/certificates/search",
|
|
50
|
-
match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
|
|
50
|
+
# match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
|
|
51
51
|
match_content=b'{"q": "names: blacklanternsecurity.com", "per_page": 100, "cursor": "NextToken"}',
|
|
52
52
|
json={
|
|
53
53
|
"code": 200,
|
|
@@ -3,22 +3,12 @@ from .base import ModuleTestBase
|
|
|
3
3
|
|
|
4
4
|
class TestCRT(ModuleTestBase):
|
|
5
5
|
async def setup_after_prep(self, module_test):
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
]
|
|
13
|
-
|
|
14
|
-
async def close(self):
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
async def mock_connect(*args, **kwargs):
|
|
18
|
-
print("mock_connect", args, kwargs)
|
|
19
|
-
return AsyncMock()
|
|
20
|
-
|
|
21
|
-
module_test.monkeypatch.setattr("asyncpg.connect", mock_connect)
|
|
6
|
+
module_test.module.abort_if = lambda e: False
|
|
7
|
+
for t in self.targets:
|
|
8
|
+
module_test.httpx_mock.add_response(
|
|
9
|
+
url="https://crt.sh?q=%25.blacklanternsecurity.com&output=json",
|
|
10
|
+
json=[{"id": 1, "name_value": "asdf.blacklanternsecurity.com\nzzzz.blacklanternsecurity.com"}],
|
|
11
|
+
)
|
|
22
12
|
|
|
23
13
|
def check(self, module_test, events):
|
|
24
14
|
assert any(e.data == "asdf.blacklanternsecurity.com" for e in events), "Failed to detect subdomain"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from .base import ModuleTestBase
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class TestCRT_DB(ModuleTestBase):
|
|
5
|
+
async def setup_after_prep(self, module_test):
|
|
6
|
+
class AsyncMock:
|
|
7
|
+
async def fetch(self, *args, **kwargs):
|
|
8
|
+
return [
|
|
9
|
+
{"name_value": "asdf.blacklanternsecurity.com"},
|
|
10
|
+
{"name_value": "zzzz.blacklanternsecurity.com"},
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
async def close(self):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
async def mock_connect(*args, **kwargs):
|
|
17
|
+
return AsyncMock()
|
|
18
|
+
|
|
19
|
+
module_test.monkeypatch.setattr("asyncpg.connect", mock_connect)
|
|
20
|
+
|
|
21
|
+
def check(self, module_test, events):
|
|
22
|
+
assert any(e.data == "asdf.blacklanternsecurity.com" for e in events), "Failed to detect subdomain"
|
|
23
|
+
assert any(e.data == "zzzz.blacklanternsecurity.com" for e in events), "Failed to detect subdomain"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from ...bbot_fixtures import *
|
|
1
2
|
from bbot.modules.base import BaseModule
|
|
2
3
|
from .base import ModuleTestBase, tempwordlist
|
|
3
4
|
|
|
@@ -1033,13 +1034,12 @@ class TestExcavateBadURLs(ModuleTestBase):
|
|
|
1033
1034
|
module_test.set_expect_requests({"uri": "/"}, {"response_data": self.bad_url_data})
|
|
1034
1035
|
|
|
1035
1036
|
def check(self, module_test, events):
|
|
1036
|
-
|
|
1037
|
-
log_text = log_file.read_text()
|
|
1037
|
+
debug_log_content = read_gzipped_file(module_test.scan.home / "debug.log.gz")
|
|
1038
1038
|
# make sure our logging is working
|
|
1039
|
-
assert "Setting scan status to STARTING" in
|
|
1039
|
+
assert "Setting scan status to STARTING" in debug_log_content
|
|
1040
1040
|
# make sure we don't have any URL validation errors
|
|
1041
|
-
assert "Error Parsing reconstructed URL" not in
|
|
1042
|
-
assert "Error sanitizing event data" not in
|
|
1041
|
+
assert "Error Parsing reconstructed URL" not in debug_log_content
|
|
1042
|
+
assert "Error sanitizing event data" not in debug_log_content
|
|
1043
1043
|
|
|
1044
1044
|
url_events = [e for e in events if e.type == "URL_UNVERIFIED"]
|
|
1045
1045
|
assert sorted([e.data for e in url_events]) == sorted(["https://ssl/", "http://127.0.0.1:8888/"])
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from ...bbot_fixtures import *
|
|
1
2
|
from .base import ModuleTestBase
|
|
2
3
|
|
|
3
4
|
|
|
@@ -100,9 +101,7 @@ class TestNucleiTechnology(TestNucleiManual):
|
|
|
100
101
|
|
|
101
102
|
def check(self, module_test, events):
|
|
102
103
|
assert any(e.type == "TECHNOLOGY" and "apache" in e.data["technology"].lower() for e in events)
|
|
103
|
-
|
|
104
|
-
with open(module_test.scan.home / "debug.log") as f:
|
|
105
|
-
assert "Using Interactsh Server" not in f.read()
|
|
104
|
+
assert "Using Interactsh Server" not in read_gzipped_file(module_test.scan.home / "debug.log.gz")
|
|
106
105
|
|
|
107
106
|
|
|
108
107
|
class TestNucleiBudget(TestNucleiManual):
|
|
@@ -141,8 +140,7 @@ class TestNucleiRetries(TestNucleiManual):
|
|
|
141
140
|
module_test.set_expect_requests(expect_args=expect_args, respond_args=respond_args)
|
|
142
141
|
|
|
143
142
|
def check(self, module_test, events):
|
|
144
|
-
|
|
145
|
-
assert "-retries 0" in f.read()
|
|
143
|
+
assert "-retries 0" in read_gzipped_file(module_test.scan.home / "debug.log.gz")
|
|
146
144
|
|
|
147
145
|
|
|
148
146
|
class TestNucleiRetriesCustom(TestNucleiRetries):
|
|
@@ -152,8 +150,7 @@ class TestNucleiRetriesCustom(TestNucleiRetries):
|
|
|
152
150
|
}
|
|
153
151
|
|
|
154
152
|
def check(self, module_test, events):
|
|
155
|
-
|
|
156
|
-
assert "-retries 1" in f.read()
|
|
153
|
+
assert "-retries 1" in read_gzipped_file(module_test.scan.home / "debug.log.gz")
|
|
157
154
|
|
|
158
155
|
|
|
159
156
|
class TestNucleiCustomHeaders(TestNucleiManual):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: bbot
|
|
3
|
-
Version: 2.4.0.
|
|
3
|
+
Version: 2.4.0.6031rc0
|
|
4
4
|
Summary: OSINT automation for hackers.
|
|
5
5
|
License: GPL-3.0
|
|
6
6
|
Keywords: python,cli,automation,osint,threat-intel,intelligence,neo4j,scanner,python-library,hacking,recursion,pentesting,recon,command-line-tool,bugbounty,subdomains,security-tools,subdomain-scanner,osint-framework,attack-surface,subdomain-enumeration,osint-tool
|
|
@@ -42,7 +42,7 @@ Requires-Dist: socksio (>=1.0.0,<2.0.0)
|
|
|
42
42
|
Requires-Dist: tabulate (==0.8.10)
|
|
43
43
|
Requires-Dist: tldextract (>=5.1.1,<6.0.0)
|
|
44
44
|
Requires-Dist: unidecode (>=1.3.8,<2.0.0)
|
|
45
|
-
Requires-Dist: websockets (>=
|
|
45
|
+
Requires-Dist: websockets (>=14.0.0,<16.0.0)
|
|
46
46
|
Requires-Dist: wordninja (>=2.0.0,<3.0.0)
|
|
47
47
|
Requires-Dist: xmltojson (>=2.0.2,<3.0.0)
|
|
48
48
|
Requires-Dist: yara-python (>=4.5.1,<5.0.0)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
bbot/__init__.py,sha256=
|
|
2
|
-
bbot/cli.py,sha256=
|
|
1
|
+
bbot/__init__.py,sha256=4GwIb-UIVs4SkE_VmIMLWycXRlLel_3xcF7GfbVL1Mw,130
|
|
2
|
+
bbot/cli.py,sha256=Jh8R_mSlitg6s4bFt5fqRzjMovxZAqtBPBa5A6pbedU,11883
|
|
3
3
|
bbot/core/__init__.py,sha256=l255GJE_DvUnWvrRb0J5lG-iMztJ8zVvoweDOfegGtI,46
|
|
4
4
|
bbot/core/config/__init__.py,sha256=zYNw2Me6tsEr8hOOkLb4BQ97GB7Kis2k--G81S8vofU,342
|
|
5
5
|
bbot/core/config/files.py,sha256=zANvrTRLJQIOWSNkxd9MpWmf9cQFr0gRZLUxeIbTwQc,1412
|
|
6
|
-
bbot/core/config/logger.py,sha256=
|
|
6
|
+
bbot/core/config/logger.py,sha256=sc_69k37YB98ngVnwa1P9jN0V9jDM0CuNPVNzWZzpm8,10537
|
|
7
7
|
bbot/core/core.py,sha256=V0G3dKPN5xCbXOoFeBRkh-BZb6A3kSNA060De01LiTU,7065
|
|
8
8
|
bbot/core/engine.py,sha256=9p7yoKMVvKGO0UCOkQK0D-9byvrcn2wFGDke6g_PY6c,29368
|
|
9
9
|
bbot/core/event/__init__.py,sha256=8ut88ZUg0kbtWkOx2j3XzNr_3kTfgoM-3UdiWHFA_ag,56
|
|
@@ -50,7 +50,7 @@ bbot/core/shared_deps.py,sha256=mCMZeKSt46trzVqQDPGfXfEWg0Zw5YjiJx4BnsIRgHM,7640
|
|
|
50
50
|
bbot/db/sql/models.py,sha256=SrUdDOBCICzXJBY29p0VvILhMQ1JCuh725bqvIYogX0,4884
|
|
51
51
|
bbot/defaults.yml,sha256=XPaGfTKWFjKV-lLIJy-Qs7X0d-8X8EYM0QELEu8KjBw,6670
|
|
52
52
|
bbot/errors.py,sha256=xwQcD26nU9oc7-o0kv5jmEDTInmi8_W8eKAgQZZxdVM,953
|
|
53
|
-
bbot/logger.py,sha256=
|
|
53
|
+
bbot/logger.py,sha256=1gsFlGpAJuKJvlHbM9rsFiMQdo3VMGsBIAjkqmAKW0A,1681
|
|
54
54
|
bbot/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
55
|
bbot/modules/ajaxpro.py,sha256=daE1yQoCsSI5c4dh3YKwRSggTISNjWgrK7qTPidk7cU,3764
|
|
56
56
|
bbot/modules/anubisdb.py,sha256=JCy2YCfa0e_VawpzNmcPXAosKUthmYGutireJ0gMDws,1916
|
|
@@ -79,10 +79,11 @@ bbot/modules/certspotter.py,sha256=AtL5BiOuDp4vu1-5fct4aQAGZM2qiODYsbgBsw0phoU,9
|
|
|
79
79
|
bbot/modules/chaos.py,sha256=JyuwytwE3IRmNbw-uyJ0gCaTnywhhsHzTiZ3OJ15PAw,1573
|
|
80
80
|
bbot/modules/code_repository.py,sha256=x70Z45VnNNMF8BPkHfGWZXsZXw_fStGB3y0-8jbP1Ns,2078
|
|
81
81
|
bbot/modules/credshed.py,sha256=HAF5wgRGKIIpdMAe4mIAtkZRLmFYjMFyXtjjst6RJ20,4203
|
|
82
|
-
bbot/modules/crt.py,sha256
|
|
82
|
+
bbot/modules/crt.py,sha256=6Zm90VKXwYYN6Sab0gwwhTARrtnQIqALJTVtFWMMTGk,1369
|
|
83
|
+
bbot/modules/crt_db.py,sha256=xaIm2457_xGJjnKss73l1HpPn7pLPHksVzejsimTfZA,2198
|
|
83
84
|
bbot/modules/deadly/dastardly.py,sha256=dxPkJUfAsuddDDuI_uVyTUxkJ5eps92nSrPtpBOTlQg,5315
|
|
84
85
|
bbot/modules/deadly/ffuf.py,sha256=VVehiHYEieVMuOjoAXD32NdgATW3aGg5PFm8NlQBjK0,14955
|
|
85
|
-
bbot/modules/deadly/nuclei.py,sha256=
|
|
86
|
+
bbot/modules/deadly/nuclei.py,sha256=FEs_mYD06ecFOMfA9-hBDAOBiL4Hqk0jjMa9_hqEtII,17808
|
|
86
87
|
bbot/modules/deadly/vhost.py,sha256=m7RdR0w7Hs38IGVHUu_3Er-_5ABVdalRG_8znQepxD0,5456
|
|
87
88
|
bbot/modules/dehashed.py,sha256=iyzWHmJs6zC7FsRhw9_AdkckQKCf_0oNnL9RwG409r0,5071
|
|
88
89
|
bbot/modules/digitorus.py,sha256=XQY0eAQrA7yo8S57tGncP1ARud-yG4LiWxx5VBYID34,1027
|
|
@@ -125,7 +126,7 @@ bbot/modules/internal/cloudcheck.py,sha256=ay6MvZFbDvdhAlFPe_kEITM4wRsfRgQJf1DLB
|
|
|
125
126
|
bbot/modules/internal/dnsresolve.py,sha256=1fwWChIGpSEIIkswueiIhEwIahQ7YngZ-njFK-RIsfU,15679
|
|
126
127
|
bbot/modules/internal/excavate.py,sha256=M-_HTTfA76H3ly54x6HeaimY0NekZ8-iRrthcpT6xgc,54282
|
|
127
128
|
bbot/modules/internal/speculate.py,sha256=NolqW2s8tokibc6gVM960KlrABkjhLB-7YlCdVx4O9s,9223
|
|
128
|
-
bbot/modules/internal/unarchive.py,sha256=
|
|
129
|
+
bbot/modules/internal/unarchive.py,sha256=sA6KYQnhkyHq0mHwhRESHy9wkaRE43PjPkShWW0mOvM,3763
|
|
129
130
|
bbot/modules/ip2location.py,sha256=yGivX9fzvwvLpnqmYCP2a8SPjTarzrZxfRluog-nkME,2628
|
|
130
131
|
bbot/modules/ipneighbor.py,sha256=b_0IhorihFLtXJZEz57EGXjXW30gIOEzzVgz2GFvM3A,1591
|
|
131
132
|
bbot/modules/ipstack.py,sha256=j_S8WMNqQuSQgBT7AX4tO70fgbWuRYrpsS3tVsu_hn4,2200
|
|
@@ -158,7 +159,7 @@ bbot/modules/output/teams.py,sha256=0aDzdQ2puScRKk47xvwBrGjsslmJUfSv2NDukrcnYOs,
|
|
|
158
159
|
bbot/modules/output/txt.py,sha256=I4zGvsFvqYZtruiCLg5spAYwR-wqjxCU0FRkPhqBUJo,976
|
|
159
160
|
bbot/modules/output/web_parameters.py,sha256=vQ8T8r8EQmYoV33w61VlVQa5gopD-kPzCAeVHGcDKUw,2013
|
|
160
161
|
bbot/modules/output/web_report.py,sha256=lZ0FqRZ7Jz1lljI9JMhH9gjtWLaTCSpSnAKQGAcPx-Q,3720
|
|
161
|
-
bbot/modules/output/websocket.py,sha256=
|
|
162
|
+
bbot/modules/output/websocket.py,sha256=oxMcYu3hIrA3BE3c3aJXe63JmGv_HWjADB2uO470-BE,2721
|
|
162
163
|
bbot/modules/paramminer_cookies.py,sha256=q1PzftHQpCHLz81_VgLZsO6moia7ZtnU32igfcySi2w,1816
|
|
163
164
|
bbot/modules/paramminer_getparams.py,sha256=_j6rgaqV5wGJoa8p5-KKbe2YsVGUtmWIanCVtFiF97Y,1893
|
|
164
165
|
bbot/modules/paramminer_headers.py,sha256=CuiqT3nY3eIrZhT4CAEkRDfCbCYci8CmnXsippf3Qb4,10450
|
|
@@ -193,7 +194,7 @@ bbot/modules/templates/sql.py,sha256=o-CdyyoJvHJdJBKkj3CIGXYxUta4w2AB_2Vr-k7cDDU
|
|
|
193
194
|
bbot/modules/templates/subdomain_enum.py,sha256=epyKSly08jqaINV_AMMWbNafIeQjJqvd3aj63KD0Mck,8402
|
|
194
195
|
bbot/modules/templates/webhook.py,sha256=0N7LorCxT0sVmT2XgrV81ubdcdPVW8s2X__BrKC2AcM,3313
|
|
195
196
|
bbot/modules/trickest.py,sha256=MRgLW0YiDWzlWdAjyqfPPLFb-a51r-Ffn_dphiJI_gA,1550
|
|
196
|
-
bbot/modules/trufflehog.py,sha256=
|
|
197
|
+
bbot/modules/trufflehog.py,sha256=KEObs5z0ce0Ck7gA3t3l66MJKUo6P_9TIfVOwFO28t4,8743
|
|
197
198
|
bbot/modules/url_manipulation.py,sha256=4J3oFkqTSJPPmbKEKAHJg2Q2w4QNKtQhiN03ZJq5VtI,4326
|
|
198
199
|
bbot/modules/urlscan.py,sha256=-w_3Bm6smyG2GLQyIbnMUkKmeQVauo-V6F4_kJDYG7s,3740
|
|
199
200
|
bbot/modules/viewdns.py,sha256=2SjNZNjQL1tko58tPAjP-CGYDmP-zZ1HpY-vACGa9UI,2595
|
|
@@ -234,12 +235,12 @@ bbot/scanner/preset/conditions.py,sha256=hFL9cSIWGEsv2TfM5UGurf0c91cyaM8egb5IngB
|
|
|
234
235
|
bbot/scanner/preset/environ.py,sha256=9KbEOLWkUdoAf5Ez_2A1NNm6QduQElbnNnrPi6VDhZs,4731
|
|
235
236
|
bbot/scanner/preset/path.py,sha256=Q29MO8cOEn690yW6bB08P72kbZ3C-H_TOEoXuwWnFM8,2274
|
|
236
237
|
bbot/scanner/preset/preset.py,sha256=Xmh9mkO4c985sOG8BGRwujBUmO1jCpHRC_Sgq2fD_dY,40805
|
|
237
|
-
bbot/scanner/scanner.py,sha256=
|
|
238
|
+
bbot/scanner/scanner.py,sha256=f0vv0-hqbJhIjB7YpDbzZbYyIEpbqA_f3QMkICuyHOQ,54581
|
|
238
239
|
bbot/scanner/stats.py,sha256=re93sArKXZSiD0Owgqk2J3Kdvfm3RL4Y9Qy_VOcaVk8,3623
|
|
239
240
|
bbot/scanner/target.py,sha256=icfcalZrFSP_LIQkH4MpQXuvrVmo-Xl83FCg7NlddX0,12133
|
|
240
241
|
bbot/scripts/docs.py,sha256=ZLY9-O6OeEElzOUvTglO5EMkRv1s4aEuxJb2CthCVsI,10782
|
|
241
242
|
bbot/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
242
|
-
bbot/test/bbot_fixtures.py,sha256=
|
|
243
|
+
bbot/test/bbot_fixtures.py,sha256=rXiCE9L0L4Lfrn4A3YMgEiOE1yXwc4BUNv3hBhCTCG4,10557
|
|
243
244
|
bbot/test/conftest.py,sha256=dQhpZ-DMkcc0ANiBPvO2Th-QNTecfvMHn0nryL-96i4,11796
|
|
244
245
|
bbot/test/coverage.cfg,sha256=ko9RacAYsJxWJCL8aEuNtkAOtP9lexYiDbeFWe8Tp8Y,31
|
|
245
246
|
bbot/test/fastapi_test.py,sha256=9OhOFRyagXTshMsnuzuKIcR4uzS6VW65m7h9KgB4jSA,381
|
|
@@ -251,7 +252,7 @@ bbot/test/test_step_1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
251
252
|
bbot/test/test_step_1/test__module__tests.py,sha256=uwuROxdXI52D-V9z3Q9VNslvBfaduj6MQS5tQ_UOqXA,1460
|
|
252
253
|
bbot/test/test_step_1/test_bbot_fastapi.py,sha256=FNGvlax4lFZVd0T3HvV9SJh1lsngOX58GrUnJVzoy20,2531
|
|
253
254
|
bbot/test/test_step_1/test_bloom_filter.py,sha256=Uy6qUZr4mSbD1VmU8Yq8u3ezqZziCjmZQiE844_FoX8,2143
|
|
254
|
-
bbot/test/test_step_1/test_cli.py,sha256
|
|
255
|
+
bbot/test/test_step_1/test_cli.py,sha256=jkTq-QReuVhp7H1iRq2Ap5Zq2TobVtf64deOi-SWZYA,27629
|
|
255
256
|
bbot/test/test_step_1/test_command.py,sha256=5IeGV6TKB0xtFEsfsU_0mNrOmEdIQiQ3FHkUmsBNoOI,6485
|
|
256
257
|
bbot/test/test_step_1/test_config.py,sha256=Q38hygpke2GDcv8OguVZuiSOnfDJxEMrRy20dN5Qsn0,887
|
|
257
258
|
bbot/test/test_step_1/test_depsinstaller.py,sha256=zr9f-wJDotD1ZvKXGEuDRWzFYMAYBI6209mI_PWPtTQ,703
|
|
@@ -265,7 +266,7 @@ bbot/test/test_step_1/test_manager_deduplication.py,sha256=hZQpDXzg6zvzxFolVOcJu
|
|
|
265
266
|
bbot/test/test_step_1/test_manager_scope_accuracy.py,sha256=JV1bQHt9EIM0GmGS4T4Brz_L2lfcwTxtNC06cfv7r64,79763
|
|
266
267
|
bbot/test/test_step_1/test_modules_basic.py,sha256=ELpGlsthSq8HaxB5My8-ESVHqMxqdL5Of0STMIyaWzA,20001
|
|
267
268
|
bbot/test/test_step_1/test_presets.py,sha256=hCyIWu7YHzEJ_mPD66Ms1J1xE_2PXKnYsIUULWTUPhA,40974
|
|
268
|
-
bbot/test/test_step_1/test_python_api.py,sha256=
|
|
269
|
+
bbot/test/test_step_1/test_python_api.py,sha256=eV_CfZCJ1SFsaSMxeGpTsq9HRhQ66Xmxj8znPj7T3Qk,5551
|
|
269
270
|
bbot/test/test_step_1/test_regexes.py,sha256=BMlaXY_5eybgbgz8MCZbXNrXsovbYK_mNPd_4AH6mSc,14353
|
|
270
271
|
bbot/test/test_step_1/test_scan.py,sha256=g1oB1TGXzOIm3Rvy-HCE6xDg_IJ-mOuTfqlRjI4wWnI,8872
|
|
271
272
|
bbot/test/test_step_1/test_scope.py,sha256=S2nssENKJKCvgXUMyU8MFQmXHeUIz0C_sbWGkdYti2A,3063
|
|
@@ -299,13 +300,14 @@ bbot/test/test_step_2/module_tests/test_module_bufferoverrun.py,sha256=6pyJ0dbx8
|
|
|
299
300
|
bbot/test/test_step_2/module_tests/test_module_builtwith.py,sha256=lMHyF4YXcIRoXMMaqiVaMilDcitnGggM67e0lbxA1Ic,5049
|
|
300
301
|
bbot/test/test_step_2/module_tests/test_module_bypass403.py,sha256=IvYZ04K0zt27CT8oc59mLuIuPJxnylKeMulPyDCR9UI,3552
|
|
301
302
|
bbot/test/test_step_2/module_tests/test_module_c99.py,sha256=F-46Kkwxe29xPZ-3kxCklPR_itOTKcL37uRpUh2F1C4,7405
|
|
302
|
-
bbot/test/test_step_2/module_tests/test_module_censys.py,sha256=
|
|
303
|
+
bbot/test/test_step_2/module_tests/test_module_censys.py,sha256=RAfZKCGAgX8ODKE5eJzHHDqzBh60J6JYS6nD61qTj8E,4183
|
|
303
304
|
bbot/test/test_step_2/module_tests/test_module_certspotter.py,sha256=60jCOeK1yaUEgtTxYW-T47kZgKt9XxP2qBH9w-0MDBk,636
|
|
304
305
|
bbot/test/test_step_2/module_tests/test_module_chaos.py,sha256=9JRgtDEnnJgmEMCTB2bqRJRkBavLys-6ypHPxrM_hXk,956
|
|
305
306
|
bbot/test/test_step_2/module_tests/test_module_cloudcheck.py,sha256=9KjGREpzOVByDVjIEWoaWbS3RwPlYLN3mw-OnRvD7sg,4083
|
|
306
307
|
bbot/test/test_step_2/module_tests/test_module_code_repository.py,sha256=i02Tgvr_F9_E4d6aEaXrfdk71NkoDvjzP4C98l2rNGg,2414
|
|
307
308
|
bbot/test/test_step_2/module_tests/test_module_credshed.py,sha256=ipkCFL7YmZBLWWoGyGr98saL_yh3E99EnLtagHqdY1g,3360
|
|
308
|
-
bbot/test/test_step_2/module_tests/test_module_crt.py,sha256=
|
|
309
|
+
bbot/test/test_step_2/module_tests/test_module_crt.py,sha256=V15tE1jcXdXJEzEEdAJvSMRWhKBFtxBBUJ_eewvV3U4,717
|
|
310
|
+
bbot/test/test_step_2/module_tests/test_module_crt_db.py,sha256=R0CvLnzhN5T7XNPVSDRYD9vSwYMTNED6w-EPGoWPVII,849
|
|
309
311
|
bbot/test/test_step_2/module_tests/test_module_csv.py,sha256=UJqMqdiPjx-UjJw10OoVMAj378wu5mWIq0v04TCljTM,579
|
|
310
312
|
bbot/test/test_step_2/module_tests/test_module_dastardly.py,sha256=jjpJD9mdCcbaJgnG63xE-J_Qqpjt9hpm_WvfHDLfTsc,2353
|
|
311
313
|
bbot/test/test_step_2/module_tests/test_module_dehashed.py,sha256=BZ0LFO4xBwDsXzsqjZCYRMTbXdwwUEma2OeJh8YQIEs,3625
|
|
@@ -324,7 +326,7 @@ bbot/test/test_step_2/module_tests/test_module_dockerhub.py,sha256=9T8CFcFP32MOp
|
|
|
324
326
|
bbot/test/test_step_2/module_tests/test_module_dotnetnuke.py,sha256=ps2u_yeDXSkhALGqtg574C5-YvyueRJMjEIoSoTRThc,8064
|
|
325
327
|
bbot/test/test_step_2/module_tests/test_module_emailformat.py,sha256=cKxBPnEQ4AiRKV_-hSYEE6756ypst3hi6MN0L5RTukY,461
|
|
326
328
|
bbot/test/test_step_2/module_tests/test_module_emails.py,sha256=bZjtO8N3GG2_g6SUEYprAFLcsi7SlwNPJJ0nODfrWYU,944
|
|
327
|
-
bbot/test/test_step_2/module_tests/test_module_excavate.py,sha256=
|
|
329
|
+
bbot/test/test_step_2/module_tests/test_module_excavate.py,sha256=XSoni9t59u2foYH1Wz_krC-k0Wj7E4YJzD82OLYv3w4,43653
|
|
328
330
|
bbot/test/test_step_2/module_tests/test_module_extractous.py,sha256=PuTE5rkEIFPwU9lhCYpTgNSkrVjcXm8PClbfOkfRS84,17973
|
|
329
331
|
bbot/test/test_step_2/module_tests/test_module_ffuf.py,sha256=z8ihAM1WYss7QGXIjbi67cekg8iOemDjaM8YR9_qSEs,4100
|
|
330
332
|
bbot/test/test_step_2/module_tests/test_module_ffuf_shortnames.py,sha256=aq8ycPMJmFJJO6mqM2EaFZoKBEpm6Umfz05OMMwxu4Q,8354
|
|
@@ -360,7 +362,7 @@ bbot/test/test_step_2/module_tests/test_module_neo4j.py,sha256=pUUaqxBsF6s11dEDh
|
|
|
360
362
|
bbot/test/test_step_2/module_tests/test_module_newsletters.py,sha256=uf5t2oRqxhNToPjEfkY9vMdOUzrSocvx8w5itS6HUaM,2295
|
|
361
363
|
bbot/test/test_step_2/module_tests/test_module_nmap_xml.py,sha256=KbUAjhARvtERv7Jx666n2hkuLOmK8Zah8RpLZqNyAuE,3548
|
|
362
364
|
bbot/test/test_step_2/module_tests/test_module_ntlm.py,sha256=tPUrsOnq8iV0l_qiD_4xkqp0-o_T2uI1e-yH22oNveA,1132
|
|
363
|
-
bbot/test/test_step_2/module_tests/test_module_nuclei.py,sha256=
|
|
365
|
+
bbot/test/test_step_2/module_tests/test_module_nuclei.py,sha256=vL-JAUTsOgL6MPiSN-Ie6bA_wuwzrcWEibUK5BQ0aRg,7032
|
|
364
366
|
bbot/test/test_step_2/module_tests/test_module_oauth.py,sha256=pN1o0DmcwGCa985FrIhUuX1jIGriDjaxMzWozuv8pR0,9481
|
|
365
367
|
bbot/test/test_step_2/module_tests/test_module_otx.py,sha256=-fHX5zNnke21lOQUnTfAj1KIoQXuLLYO_QunDRGkj8o,1159
|
|
366
368
|
bbot/test/test_step_2/module_tests/test_module_paramminer_cookies.py,sha256=wFGJjP1LvD04BTX822uNH30VRKr7b7DnFNjiBN1uJx0,2375
|
|
@@ -425,8 +427,8 @@ bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt,sha256=ZSIVebs7ptMvHx
|
|
|
425
427
|
bbot/wordlists/top_open_ports_nmap.txt,sha256=LmdFYkfapSxn1pVuQC2LkOIY2hMLgG-Xts7DVtYzweM,42727
|
|
426
428
|
bbot/wordlists/valid_url_schemes.txt,sha256=0B_VAr9Dv7aYhwi6JSBDU-3M76vNtzN0qEC_RNLo7HE,3310
|
|
427
429
|
bbot/wordlists/wordninja_dns.txt.gz,sha256=DYHvvfW0TvzrVwyprqODAk4tGOxv5ezNmCPSdPuDUnQ,570241
|
|
428
|
-
bbot-2.4.0.
|
|
429
|
-
bbot-2.4.0.
|
|
430
|
-
bbot-2.4.0.
|
|
431
|
-
bbot-2.4.0.
|
|
432
|
-
bbot-2.4.0.
|
|
430
|
+
bbot-2.4.0.6031rc0.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
|
|
431
|
+
bbot-2.4.0.6031rc0.dist-info/METADATA,sha256=MTk2S0UzDztlYpcK9IJuF5AcgqDSpr83CEwwHmx3VnA,18218
|
|
432
|
+
bbot-2.4.0.6031rc0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
|
433
|
+
bbot-2.4.0.6031rc0.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
|
|
434
|
+
bbot-2.4.0.6031rc0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|