bbot 2.4.0.6005rc0__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 CHANGED
@@ -1,4 +1,4 @@
1
1
  # version placeholder (replaced by poetry-dynamic-versioning)
2
- __version__ = "v2.4.0.6005rc"
2
+ __version__ = "v2.4.0.6031rc"
3
3
 
4
4
  from .scanner import Scanner, Preset
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 = [sys.stdout.fileno(), sys.stderr.fileno()]
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)
@@ -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 = logging.handlers.TimedRotatingFileHandler(
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 = logging.handlers.TimedRotatingFileHandler(
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
- deps_pip = ["asyncpg"]
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.db_conn = None
18
+ self.cert_ids = set()
27
19
  return await super().setup()
28
20
 
29
21
  async def request_url(self, query):
30
- if not self.db_conn:
31
- self.db_conn = await asyncpg.connect(
32
- host=self.db_host, port=self.db_port, user=self.db_user, database=self.db_name
33
- )
34
-
35
- sql = """
36
- WITH ci AS (
37
- SELECT array_agg(DISTINCT sub.NAME_VALUE) NAME_VALUES
38
- FROM (
39
- SELECT DISTINCT cai.CERTIFICATE, cai.NAME_VALUE
40
- FROM certificate_and_identities cai
41
- WHERE plainto_tsquery('certwatch', $1) @@ identities(cai.CERTIFICATE)
42
- AND cai.NAME_VALUE ILIKE ('%.' || $1)
43
- LIMIT 50000
44
- ) sub
45
- GROUP BY sub.CERTIFICATE
46
- )
47
- SELECT DISTINCT unnest(NAME_VALUES) as name_value FROM ci;
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()
@@ -15,7 +15,7 @@ class nuclei(BaseModule):
15
15
  }
16
16
 
17
17
  options = {
18
- "version": "3.3.10",
18
+ "version": "3.4.1",
19
19
  "tags": "",
20
20
  "templates": "",
21
21
  "severity": "",
@@ -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
- if event.data["magic_mime_type"] in self.ignore_compressions:
33
- return False, f"Ignoring file type: {event.data['magic_mime_type']}, {event.data['path']}"
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 (
@@ -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({"extra_headers": {"Authorization": f"Bearer {self.token}"}})
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._ws = await websockets.connect(self.url, **kwargs)
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
 
@@ -14,7 +14,7 @@ class trufflehog(BaseModule):
14
14
  }
15
15
 
16
16
  options = {
17
- "version": "3.88.15",
17
+ "version": "3.88.20",
18
18
  "config": "",
19
19
  "only_verified": True,
20
20
  "concurrency": 8,
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 = logging.handlers.TimedRotatingFileHandler(
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 = logging.handlers.TimedRotatingFileHandler(
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
@@ -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
- assert not output_dir.exists()
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
- assert "[INFO]" in open(scan_dir / "scan.log").read()
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 open(scan_log).read()
23
+ assert "python_api_test" in read_gzipped_file(scan_log)
24
24
  assert debug_log.is_file()
25
- assert "python_api_test" in open(debug_log).read()
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 open(scan_log).read()
31
- assert "scan_logging_test" not in open(debug_log).read()
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 open(scan_log).read()
41
- assert "scan_logging_test" in open(debug_log).read()
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
- class AsyncMock:
7
- async def fetch(self, *args, **kwargs):
8
- print("mock_fetch", args, kwargs)
9
- return [
10
- {"name_value": "asdf.blacklanternsecurity.com"},
11
- {"name_value": "zzzz.blacklanternsecurity.com"},
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
- log_file = module_test.scan.home / "debug.log"
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 log_text
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 log_text
1042
- assert "Error sanitizing event data" not in log_text
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
- with open(module_test.scan.home / "debug.log") as f:
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
- with open(module_test.scan.home / "debug.log") as f:
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.6005rc0
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 (>=11.0.2,<16.0.0)
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=6A-p182RghFcx3wMeCmkTTTzaKIjOloH7N_VzETOHQU,130
2
- bbot/cli.py,sha256=JF1kVzccGA2Yh0B7LMiNkwHdT-Fu6nwzeqGA7q-qRxs,11660
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=FzQ7Myl0MVqBi7gpn9LOnbuL-UTXxSKpl11xuEGxS5I,10583
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=rLcLzNDvfR8rFj7_tZ-f5QB3Z8T0RVroact3W0ogjpA,1408
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=-_ZTmQofCqhtGl-Xp4kWmDndivAKZx71I1JwHWjl4Rg,2048
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=65DRumg3izYfIRcn88W99dCJJeGyC25U5cOaOT5muaQ,17809
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=X5lG8lh8vbwWNhQDCEADAHBZVcror5EZDLTUnvcuAuM,3723
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=sDTtHU-Ey_tvS0gMi6PVPV9L4qAmGyWeccxAKfEWCac,2278
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=WvTiXV--yOfBmHVjLQjlg64VJqMeqxgalcaCfvYct-s,8743
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=O9LPaOa33yjdtolri3pcmQOBj4_8fMpMlwoYICZYK0M,54617
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=JZhqObsSQ5H2RJZCkq4eNaGo6DcxKYMPQ1XFcbE8vQg,9995
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=-D215MH27fLo7xpR8U2FfwL78IQuh7HG4Fi6xo-rFrM,27271
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=GM5Kp2AAFl92ozo1kL6axsM87F8Gdq2_mWQvRnbXW_0,5503
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=RoFfLS0hgASdSoctJEzaKrHVqqRkuPRKPTYVCX2rZLo,4177
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=HOx8z9ZUWAvqhso3_xfgbUElL-KHw3yX_LgHTBGObPI,944
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=eROTkAHYo5lLqJVAVpSl-wprp2-YNQkT9hcaqHEEf7I,43604
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=rLCTuKWnGWiGDcVnMjk4D7x6RGftEj3D4Woqpam-cgQ,7050
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.6005rc0.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
429
- bbot-2.4.0.6005rc0.dist-info/METADATA,sha256=FkUXAeFfJVSqYa3Skx1qJU7kle1HlQKCDhvoKVHI4sk,18218
430
- bbot-2.4.0.6005rc0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
431
- bbot-2.4.0.6005rc0.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
432
- bbot-2.4.0.6005rc0.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.1
2
+ Generator: poetry-core 2.1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any