bbot 2.1.0.5082rc0__py3-none-any.whl → 2.1.1__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.1.0.5082rc"
2
+ __version__ = "v2.1.1"
3
3
 
4
4
  from .scanner import Scanner, Preset
@@ -5,6 +5,7 @@ from copy import copy
5
5
  import multiprocessing
6
6
  import logging.handlers
7
7
  from pathlib import Path
8
+ from contextlib import suppress
8
9
 
9
10
  from ..helpers.misc import mkdir, error_and_exit
10
11
  from ...logger import colorize, loglevel_mapping
@@ -71,10 +72,36 @@ class BBOTLogger:
71
72
  # Start the QueueListener
72
73
  self.listener = logging.handlers.QueueListener(self.queue, *self.log_handlers.values())
73
74
  self.listener.start()
74
- atexit.register(self.listener.stop)
75
+ atexit.register(self.cleanup_logging)
75
76
 
76
77
  self.log_level = logging.INFO
77
78
 
79
+ def cleanup_logging(self):
80
+ # Close the queue handler
81
+ with suppress(Exception):
82
+ self.queue_handler.close()
83
+
84
+ # Clean root logger
85
+ root_logger = logging.getLogger()
86
+ for handler in list(root_logger.handlers):
87
+ with suppress(Exception):
88
+ root_logger.removeHandler(handler)
89
+ with suppress(Exception):
90
+ handler.close()
91
+
92
+ # Clean all other loggers
93
+ for logger in logging.Logger.manager.loggerDict.values():
94
+ if hasattr(logger, "handlers"): # Logger, not PlaceHolder
95
+ for handler in list(logger.handlers):
96
+ with suppress(Exception):
97
+ logger.removeHandler(handler)
98
+ with suppress(Exception):
99
+ handler.close()
100
+
101
+ # Stop queue listener
102
+ with suppress(Exception):
103
+ self.listener.stop()
104
+
78
105
  def setup_queue_handler(self, logging_queue=None, log_level=logging.DEBUG):
79
106
  if logging_queue is None:
80
107
  logging_queue = self.queue
@@ -342,7 +342,15 @@ class DepsInstaller:
342
342
  # ensure tldextract data is cached
343
343
  self.parent_helper.tldextract("evilcorp.co.uk")
344
344
  # command: package_name
345
- core_deps = {"unzip": "unzip", "curl": "curl"}
345
+ core_deps = {
346
+ "unzip": "unzip",
347
+ "zipinfo": "unzip",
348
+ "curl": "curl",
349
+ "git": "git",
350
+ "make": "make",
351
+ "gcc": "gcc",
352
+ "bash": "bash",
353
+ }
346
354
  for command, package_name in core_deps.items():
347
355
  if not self.parent_helper.which(command):
348
356
  to_install.add(package_name)
bbot/modules/gowitness.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import asyncio
2
- import sqlite3
2
+ import aiosqlite
3
3
  import multiprocessing
4
4
  from pathlib import Path
5
5
  from contextlib import suppress
@@ -34,6 +34,7 @@ class gowitness(BaseModule):
34
34
  "idle_timeout": "Skip the current gowitness batch if it stalls for longer than this many seconds",
35
35
  }
36
36
  deps_common = ["chromium"]
37
+ deps_pip = ["aiosqlite"]
37
38
  deps_ansible = [
38
39
  {
39
40
  "name": "Download gowitness",
@@ -72,7 +73,7 @@ class gowitness(BaseModule):
72
73
 
73
74
  # make sure we have a working chrome install
74
75
  chrome_test_pass = False
75
- for binary in ("chrome", "chromium", custom_chrome_path):
76
+ for binary in ("chrome", "chromium", "chromium-browser", custom_chrome_path):
76
77
  binary_path = self.helpers.which(binary)
77
78
  if binary_path and Path(binary_path).is_file():
78
79
  chrome_test_proc = await self.run_process([binary_path, "--version"])
@@ -136,7 +137,8 @@ class gowitness(BaseModule):
136
137
  return
137
138
 
138
139
  # emit web screenshots
139
- for filename, screenshot in self.new_screenshots.items():
140
+ new_screenshots = await self.get_new_screenshots()
141
+ for filename, screenshot in new_screenshots.items():
140
142
  url = screenshot["url"]
141
143
  final_url = screenshot["final_url"]
142
144
  filename = self.screenshot_path / screenshot["filename"]
@@ -150,7 +152,8 @@ class gowitness(BaseModule):
150
152
  )
151
153
 
152
154
  # emit URLs
153
- for url, row in self.new_network_logs.items():
155
+ new_network_logs = await self.get_new_network_logs()
156
+ for url, row in new_network_logs.items():
154
157
  ip = row["ip"]
155
158
  status_code = row["status_code"]
156
159
  tags = [f"status-{status_code}", f"ip-{ip}", "spider-danger"]
@@ -168,7 +171,8 @@ class gowitness(BaseModule):
168
171
  )
169
172
 
170
173
  # emit technologies
171
- for _, row in self.new_technologies.items():
174
+ new_technologies = await self.get_new_technologies()
175
+ for _, row in new_technologies.items():
172
176
  parent_id = row["url_id"]
173
177
  parent_url = self.screenshots_taken[parent_id]
174
178
  parent_event = event_dict[parent_url]
@@ -207,59 +211,53 @@ class gowitness(BaseModule):
207
211
  command += ["--timeout", str(self.timeout)]
208
212
  return command
209
213
 
210
- @property
211
- def new_screenshots(self):
214
+ async def get_new_screenshots(self):
212
215
  screenshots = {}
213
216
  if self.db_path.is_file():
214
- with sqlite3.connect(str(self.db_path)) as con:
215
- con.row_factory = sqlite3.Row
217
+ async with aiosqlite.connect(str(self.db_path)) as con:
218
+ con.row_factory = aiosqlite.Row
216
219
  con.text_factory = self.helpers.smart_decode
217
- cur = con.cursor()
218
- res = self.cur_execute(cur, "SELECT * FROM urls")
219
- for row in res:
220
- row = dict(row)
221
- _id = row["id"]
222
- if _id not in self.screenshots_taken:
223
- self.screenshots_taken[_id] = row["url"]
224
- screenshots[_id] = row
220
+ async with con.execute("SELECT * FROM urls") as cur:
221
+ async for row in cur:
222
+ row = dict(row)
223
+ _id = row["id"]
224
+ if _id not in self.screenshots_taken:
225
+ self.screenshots_taken[_id] = row["url"]
226
+ screenshots[_id] = row
225
227
  return screenshots
226
228
 
227
- @property
228
- def new_network_logs(self):
229
+ async def get_new_network_logs(self):
229
230
  network_logs = dict()
230
231
  if self.db_path.is_file():
231
- with sqlite3.connect(str(self.db_path)) as con:
232
- con.row_factory = sqlite3.Row
233
- cur = con.cursor()
234
- res = self.cur_execute(cur, "SELECT * FROM network_logs")
235
- for row in res:
236
- row = dict(row)
237
- url = row["final_url"]
238
- if url not in self.connections_logged:
239
- self.connections_logged.add(url)
240
- network_logs[url] = row
232
+ async with aiosqlite.connect(str(self.db_path)) as con:
233
+ con.row_factory = aiosqlite.Row
234
+ async with con.execute("SELECT * FROM network_logs") as cur:
235
+ async for row in cur:
236
+ row = dict(row)
237
+ url = row["final_url"]
238
+ if url not in self.connections_logged:
239
+ self.connections_logged.add(url)
240
+ network_logs[url] = row
241
241
  return network_logs
242
242
 
243
- @property
244
- def new_technologies(self):
243
+ async def get_new_technologies(self):
245
244
  technologies = dict()
246
245
  if self.db_path.is_file():
247
- with sqlite3.connect(str(self.db_path)) as con:
248
- con.row_factory = sqlite3.Row
249
- cur = con.cursor()
250
- res = self.cur_execute(cur, "SELECT * FROM technologies")
251
- for row in res:
252
- _id = row["id"]
253
- if _id not in self.technologies_found:
254
- self.technologies_found.add(_id)
255
- row = dict(row)
256
- technologies[_id] = row
246
+ async with aiosqlite.connect(str(self.db_path)) as con:
247
+ con.row_factory = aiosqlite.Row
248
+ async with con.execute("SELECT * FROM technologies") as cur:
249
+ async for row in cur:
250
+ _id = row["id"]
251
+ if _id not in self.technologies_found:
252
+ self.technologies_found.add(_id)
253
+ row = dict(row)
254
+ technologies[_id] = row
257
255
  return technologies
258
256
 
259
- def cur_execute(self, cur, query):
257
+ async def cur_execute(self, cur, query):
260
258
  try:
261
- return cur.execute(query)
262
- except sqlite3.OperationalError as e:
259
+ return await cur.execute(query)
260
+ except aiosqlite.OperationalError as e:
263
261
  self.warning(f"Error executing query: {query}: {e}")
264
262
  return []
265
263
 
@@ -13,7 +13,7 @@ class trufflehog(BaseModule):
13
13
  }
14
14
 
15
15
  options = {
16
- "version": "3.82.11",
16
+ "version": "3.83.1",
17
17
  "config": "",
18
18
  "only_verified": True,
19
19
  "concurrency": 8,
bbot/modules/wpscan.py CHANGED
@@ -33,7 +33,7 @@ class wpscan(BaseModule):
33
33
  deps_apt = ["curl", "make", "gcc"]
34
34
  deps_ansible = [
35
35
  {
36
- "name": "Install Ruby Deps (Debian/Ubuntu)",
36
+ "name": "Install Ruby Deps (Debian)",
37
37
  "package": {"name": ["ruby-rubygems", "ruby-dev"], "state": "present"},
38
38
  "become": True,
39
39
  "when": "ansible_facts['os_family'] == 'Debian'",
@@ -48,7 +48,13 @@ class wpscan(BaseModule):
48
48
  "name": "Install Ruby Deps (Fedora)",
49
49
  "package": {"name": ["rubygems", "ruby-devel"], "state": "present"},
50
50
  "become": True,
51
- "when": "ansible_facts['os_family'] == 'Fedora'",
51
+ "when": "ansible_facts['os_family'] == 'RedHat'",
52
+ },
53
+ {
54
+ "name": "Install Ruby Deps (Alpine)",
55
+ "package": {"name": ["ruby-dev", "ruby-bundler"], "state": "present"},
56
+ "become": True,
57
+ "when": "ansible_facts['os_family'] == 'Alpine'",
52
58
  },
53
59
  {
54
60
  "name": "Install wpscan gem",
bbot/test/conftest.py CHANGED
@@ -13,17 +13,31 @@ from bbot.core import CORE
13
13
  from bbot.core.helpers.misc import execute_sync_or_async
14
14
  from bbot.core.helpers.interactsh import server_list as interactsh_servers
15
15
 
16
+ # silence stdout + trace
17
+ root_logger = logging.getLogger()
18
+ pytest_debug_file = Path(__file__).parent.parent.parent / "pytest_debug.log"
19
+ print(f"pytest_debug_file: {pytest_debug_file}")
20
+ debug_handler = logging.FileHandler(pytest_debug_file)
21
+ debug_handler.setLevel(logging.DEBUG)
22
+ debug_format = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s %(filename)s:%(lineno)s %(message)s")
23
+ debug_handler.setFormatter(debug_format)
24
+ root_logger.addHandler(debug_handler)
16
25
 
17
26
  test_config = OmegaConf.load(Path(__file__).parent / "test.conf")
18
- if test_config.get("debug", False):
19
- os.environ["BBOT_DEBUG"] = "True"
20
- logging.getLogger("bbot").setLevel(logging.DEBUG)
21
- CORE.logger.log_level = logging.DEBUG
22
- else:
23
- # silence stdout + trace
24
- root_logger = logging.getLogger()
25
- for h in root_logger.handlers:
26
- h.addFilter(lambda x: x.levelname not in ("STDOUT", "TRACE"))
27
+
28
+ os.environ["BBOT_DEBUG"] = "True"
29
+ CORE.logger.log_level = logging.DEBUG
30
+
31
+ # silence all stderr output:
32
+ stderr_handler = CORE.logger.log_handlers["stderr"]
33
+ stderr_handler.setLevel(logging.CRITICAL)
34
+ handlers = list(CORE.logger.listener.handlers)
35
+ handlers.remove(stderr_handler)
36
+ CORE.logger.listener.handlers = tuple(handlers)
37
+
38
+ for h in root_logger.handlers:
39
+ h.addFilter(lambda x: x.levelname not in ("STDOUT", "TRACE"))
40
+
27
41
 
28
42
  CORE.merge_default(test_config)
29
43
 
@@ -33,6 +47,13 @@ def assert_all_responses_were_requested() -> bool:
33
47
  return False
34
48
 
35
49
 
50
+ @pytest.fixture(autouse=True)
51
+ def silence_live_logging():
52
+ for handler in logging.getLogger().handlers:
53
+ if type(handler).__name__ == "_LiveLoggingStreamHandler":
54
+ handler.setLevel(logging.CRITICAL)
55
+
56
+
36
57
  @pytest.fixture
37
58
  def bbot_httpserver():
38
59
  server = HTTPServer(host="127.0.0.1", port=8888, threaded=True)
@@ -202,20 +223,20 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config): # pragma: no
202
223
  errors = len(stats.get("error", []))
203
224
  failed = stats.get("failed", [])
204
225
 
205
- print("\nTest Session Summary:")
206
- print(f"Total tests run: {total_tests}")
207
- print(
208
- f"{GREEN}Passed: {passed}{RESET}, {RED}Failed: {len(failed)}{RESET}, {YELLOW}Skipped: {skipped}{RESET}, Errors: {errors}"
226
+ terminalreporter.write("\nTest Session Summary:")
227
+ terminalreporter.write(f"\nTotal tests run: {total_tests}")
228
+ terminalreporter.write(
229
+ f"\n{GREEN}Passed: {passed}{RESET}, {RED}Failed: {len(failed)}{RESET}, {YELLOW}Skipped: {skipped}{RESET}, Errors: {errors}"
209
230
  )
210
231
 
211
232
  if failed:
212
- print(f"\n{RED}Detailed failed test report:{RESET}")
233
+ terminalreporter.write(f"\n{RED}Detailed failed test report:{RESET}")
213
234
  for item in failed:
214
235
  test_name = item.nodeid.split("::")[-1] if "::" in item.nodeid else item.nodeid
215
236
  file_and_line = f"{item.location[0]}:{item.location[1]}" # File path and line number
216
- print(f"{BLUE}Test Name: {test_name}{RESET} {CYAN}({file_and_line}){RESET}")
217
- print(f"{RED}Location: {item.nodeid} at {item.location[0]}:{item.location[1]}{RESET}")
218
- print(f"{RED}Failure details:\n{item.longreprtext}{RESET}")
237
+ terminalreporter.write(f"\n{BLUE}Test Name: {test_name}{RESET} {CYAN}({file_and_line}){RESET}")
238
+ terminalreporter.write(f"\n{RED}Location: {item.nodeid} at {item.location[0]}:{item.location[1]}{RESET}")
239
+ terminalreporter.write(f"\n{RED}Failure details:\n{item.longreprtext}{RESET}")
219
240
 
220
241
 
221
242
  # BELOW: debugging for frozen/hung tests
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bbot
3
- Version: 2.1.0.5082rc0
3
+ Version: 2.1.1
4
4
  Summary: OSINT automation for hackers.
5
5
  Home-page: https://github.com/blacklanternsecurity/bbot
6
6
  License: GPL-3.0
@@ -1,9 +1,9 @@
1
- bbot/__init__.py,sha256=ySHQPiAGcGB9Q3oG9Il3s_EB6K2_oDGzjNwuHWeZkdQ,130
1
+ bbot/__init__.py,sha256=JBzSHYgx82_Tcg4e3kFjN1igI0ZnazzrEIl85QZ_J-c,123
2
2
  bbot/cli.py,sha256=7S3a4eB-Dl8yodc5WC-927Z30CNlLl9EXimGvIVypJo,10434
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=pNrcw61UKKZeMt0rp9Ac5mUK7LdIRmcpojMxI-LwjeA,1413
6
- bbot/core/config/logger.py,sha256=C9txmKQtqSFnWU1AapwFS9cZgDBtNZQh4io_13d3AxA,9503
6
+ bbot/core/config/logger.py,sha256=zkD08_KNiIa8LTZkI4wiAeA4g0zVCiA7d7P5MmocXsk,10467
7
7
  bbot/core/core.py,sha256=twd7-fiaaxzgcWTPwT1zbSWfAa_gHHfl7gAFvLYvFYg,6358
8
8
  bbot/core/engine.py,sha256=wGopKa2GNs61r16Pr_xtp6Si9AT6I-lE83iWhEgtxwA,29290
9
9
  bbot/core/event/__init__.py,sha256=8ut88ZUg0kbtWkOx2j3XzNr_3kTfgoM-3UdiWHFA_ag,56
@@ -16,7 +16,7 @@ bbot/core/helpers/bloom.py,sha256=z7gttz-ugvwj7s2L14feJhEx2rzECdqcB255A0hjvNI,25
16
16
  bbot/core/helpers/cache.py,sha256=1aMr3HVD45cDtHEG5xlznDUCywRgO9oRFidscrs_5sA,1537
17
17
  bbot/core/helpers/command.py,sha256=kORIRaDdbJF7yGOd5BNJH-UDLKi6rHfUoVUaJMF662M,12774
18
18
  bbot/core/helpers/depsinstaller/__init__.py,sha256=2mx1nYylSyvwl0GCM9YDHqrFEt2_5dSWAjP1RmhmbQg,37
19
- bbot/core/helpers/depsinstaller/installer.py,sha256=iL_wUUUU2mEfRSE9Zb2zVwBZvfsLVhuk82lIPLZL6Ls,16450
19
+ bbot/core/helpers/depsinstaller/installer.py,sha256=esbN35gcm_OBr3QEDCpmoJIJ-Z7Enw9GcNbdzz9uY9E,16625
20
20
  bbot/core/helpers/depsinstaller/sudo_askpass.py,sha256=yGa2OQv30RO75QkMuG1iruKqb7amQxRVRRcHmvIeGhk,1276
21
21
  bbot/core/helpers/diff.py,sha256=7waBeHFGnAKn-R-sBd-wc3yjwxT_umwy4YxfE7JFd6w,10599
22
22
  bbot/core/helpers/dns/__init__.py,sha256=2JK8P0BUfPlh4CTuuOWQCOacwL7NEtGFYPJsxbA0Zwo,27
@@ -105,7 +105,7 @@ bbot/modules/github_org.py,sha256=O1VBn65sYJaPWBDjssyQSnlEh6XQgLEF7gKDzWj64qc,91
105
105
  bbot/modules/github_workflows.py,sha256=GvEVEa2vp5FnpKIthyMIkMmV84Sgh9whxpCcdFY1PB0,9555
106
106
  bbot/modules/gitlab.py,sha256=9oWWpBijeHCjuFBfWW4HvNqt7bvJvrBgBjaaz_UPPnE,5964
107
107
  bbot/modules/google_playstore.py,sha256=N4QjzQag_bgDXfX17rytBiiWA-SQtYI2N0J_ZNEOdv0,3701
108
- bbot/modules/gowitness.py,sha256=akYxtFBQqzyldvUmcvxc4Og7--diZcGqmsdRUoRC7T8,11051
108
+ bbot/modules/gowitness.py,sha256=DG23F2O4zVhY4lMSEk6uRRbQ-Jczpa6Yz_vXBICY9tA,11294
109
109
  bbot/modules/hackertarget.py,sha256=brp0khcRaSyzwjs6z89WbgULZEE8RmjLM_SxBrj3fDo,969
110
110
  bbot/modules/host_header.py,sha256=JQGqdsuvaCwFaA5_9790T1P2DKJoDUQSPjyHgh6u2tU,7694
111
111
  bbot/modules/httpx.py,sha256=wmgyRyCNg9vw_qO0pVo7I7QzGybDgt9pEdfU3QPgBMA,7588
@@ -179,7 +179,7 @@ bbot/modules/templates/shodan.py,sha256=BfI0mNPbqkykGmjMtARhmCGKmk1uq7yTlZoPgzzJ
179
179
  bbot/modules/templates/subdomain_enum.py,sha256=lT5MZF66OuzsyFFrj20wKlsZflzL9MOkPjDIbN3o65o,8375
180
180
  bbot/modules/templates/webhook.py,sha256=MYhKWrNYrsfM0a4PR6yVotudLyyCwgmy2eI-l9LvpBs,3706
181
181
  bbot/modules/trickest.py,sha256=HfAzjnawxXd9ypi3gumDHqImE5-C7uwNugo8d_b9HT0,1544
182
- bbot/modules/trufflehog.py,sha256=KMFYbjKEyoNaJDoID0SoDvbCRPaDwalMD6H2lQaI1QE,8555
182
+ bbot/modules/trufflehog.py,sha256=aVA1g3WvS1QifXqGMmdtjEeRA83z9C-y7s5PGnAS9Vs,8554
183
183
  bbot/modules/unstructured.py,sha256=si3_Y__A36QOBdkIUocVXCHrmUqM0E-JSnoOeRpELYE,5311
184
184
  bbot/modules/url_manipulation.py,sha256=BI-OhlzNzP5xvwzHphL4qdehc4NiEYnL2BNK-JoEm90,4322
185
185
  bbot/modules/urlscan.py,sha256=ajhiX2sj-zZDlKU1q5rE8JTzxioj1mDLqZ9PRSQCpAw,3741
@@ -188,7 +188,7 @@ bbot/modules/virustotal.py,sha256=GsGaVF05IMgSNOQtUx1B8UXL5JA1Bt8M6ZDWJiiEQ1k,12
188
188
  bbot/modules/wafw00f.py,sha256=I-jEnHWxO4Ga72ukdeBlTGJB9xeucCT3lpDhhFaVyAk,2536
189
189
  bbot/modules/wappalyzer.py,sha256=LL5QeY5DeG7LdaFzZZU-LXaVlJ-sHzOwQLgFtxW3TNg,2176
190
190
  bbot/modules/wayback.py,sha256=9cxd_HfHgLp4AChzA8C0Zjd6DIJ7c3NsJ02W2oLIXuU,3257
191
- bbot/modules/wpscan.py,sha256=jbv1o8FHTIAEhctgIGW6-s3VEocXQhzgSU57Wdtm2Nc,11345
191
+ bbot/modules/wpscan.py,sha256=_mE1OAU7sZUW5HbJ5GepFsljzJ89Z0zmam4jZb69a40,11582
192
192
  bbot/modules/zoomeye.py,sha256=3zZjafgLUFMzkqRSAi6CYVEsjGTN-BWzvbw8gvAxlCQ,2658
193
193
  bbot/presets/baddns-thorough.yml,sha256=FXiNnsf3IIms3UJtS2CwLk82Yp0IXm1OvRM61-CHrno,195
194
194
  bbot/presets/cloud-enum.yml,sha256=U1IuN_Vx4zFSvobQenXwSeEqFxRX28beS1Aek3hNUBg,121
@@ -220,7 +220,7 @@ bbot/scanner/target.py,sha256=X25gpgRv5HmqQjGADiSe6b8744yOkRhAGAvKKYbXnSI,19886
220
220
  bbot/scripts/docs.py,sha256=kg2CzovmUVGJx9hBZjAjUdE1hXeIwC7Ry3CyrnE8GL8,10782
221
221
  bbot/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
222
222
  bbot/test/bbot_fixtures.py,sha256=J1_MfpCMXftfGHZc-dgn42ODpTmSJidoBibOltfthac,9862
223
- bbot/test/conftest.py,sha256=QBLUuJSsjYpy8mX1iQTZh9xYMJju3EORUwOEwA-nlH0,10350
223
+ bbot/test/conftest.py,sha256=js4NAX3iiIc2CCTpWKEclkcSH4egmjMNnqBiHzK_7BA,11242
224
224
  bbot/test/coverage.cfg,sha256=ko9RacAYsJxWJCL8aEuNtkAOtP9lexYiDbeFWe8Tp8Y,31
225
225
  bbot/test/owasp_mastg.apk,sha256=Hai_V9JmEJ-aB8Ab9xEaGXXOAfGQudkUvNOuPb75byE,66651
226
226
  bbot/test/run_tests.sh,sha256=0oprBl970NAqXS4YQa8nRUtKljPeS_WNSvd-QmO5FNY,945
@@ -395,8 +395,8 @@ bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt,sha256=ruUQwVfia1_m2u
395
395
  bbot/wordlists/top_open_ports_nmap.txt,sha256=LmdFYkfapSxn1pVuQC2LkOIY2hMLgG-Xts7DVtYzweM,42727
396
396
  bbot/wordlists/valid_url_schemes.txt,sha256=VciB-ww0y-O8Ii1wpTR6rJzGDiC2r-dhVsIJApS1ZYU,3309
397
397
  bbot/wordlists/wordninja_dns.txt.gz,sha256=DYHvvfW0TvzrVwyprqODAk4tGOxv5ezNmCPSdPuDUnQ,570241
398
- bbot-2.1.0.5082rc0.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
399
- bbot-2.1.0.5082rc0.dist-info/METADATA,sha256=4fRHOgeCohCtqez5Cudegh46ZG2vJmKvC62Q1x-VfAo,16930
400
- bbot-2.1.0.5082rc0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
401
- bbot-2.1.0.5082rc0.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
402
- bbot-2.1.0.5082rc0.dist-info/RECORD,,
398
+ bbot-2.1.1.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
399
+ bbot-2.1.1.dist-info/METADATA,sha256=GDNMYGz1sXOdrYJu5GcLgZR8-oPWHy6UYIK-24lcSrc,16922
400
+ bbot-2.1.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
401
+ bbot-2.1.1.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
402
+ bbot-2.1.1.dist-info/RECORD,,