bbot 2.2.0.5311rc0__py3-none-any.whl → 2.3.0.5324rc0__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/db/sql/models.py +2 -1
- bbot/modules/output/postgres.py +49 -0
- bbot/modules/output/sqlite.py +1 -1
- bbot/modules/templates/sql.py +13 -12
- bbot/test/test_step_2/module_tests/base.py +6 -2
- bbot/test/test_step_2/module_tests/test_module_dastardly.py +1 -0
- bbot/test/test_step_2/module_tests/test_module_postgres.py +74 -0
- bbot/test/test_step_2/module_tests/test_module_sqlite.py +6 -6
- {bbot-2.2.0.5311rc0.dist-info → bbot-2.3.0.5324rc0.dist-info}/METADATA +1 -1
- {bbot-2.2.0.5311rc0.dist-info → bbot-2.3.0.5324rc0.dist-info}/RECORD +14 -12
- {bbot-2.2.0.5311rc0.dist-info → bbot-2.3.0.5324rc0.dist-info}/LICENSE +0 -0
- {bbot-2.2.0.5311rc0.dist-info → bbot-2.3.0.5324rc0.dist-info}/WHEEL +0 -0
- {bbot-2.2.0.5311rc0.dist-info → bbot-2.3.0.5324rc0.dist-info}/entry_points.txt +0 -0
bbot/__init__.py
CHANGED
bbot/db/sql/models.py
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
5
|
import logging
|
|
6
|
-
from datetime import datetime
|
|
7
6
|
from pydantic import ConfigDict
|
|
8
7
|
from typing import List, Optional
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
9
|
from typing_extensions import Annotated
|
|
10
10
|
from pydantic.functional_validators import AfterValidator
|
|
11
11
|
from sqlmodel import inspect, Column, Field, SQLModel, JSON, String, DateTime as SQLADateTime
|
|
@@ -114,6 +114,7 @@ class Event(BBOTBaseModel, table=True):
|
|
|
114
114
|
discovery_context: str = ""
|
|
115
115
|
discovery_path: List[str] = Field(default=[], sa_type=JSON)
|
|
116
116
|
parent_chain: List[str] = Field(default=[], sa_type=JSON)
|
|
117
|
+
inserted_at: NaiveUTC = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
117
118
|
|
|
118
119
|
|
|
119
120
|
### SCAN ###
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from bbot.modules.templates.sql import SQLTemplate
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Postgres(SQLTemplate):
|
|
5
|
+
watched_events = ["*"]
|
|
6
|
+
meta = {"description": "Output scan data to a SQLite database"}
|
|
7
|
+
options = {
|
|
8
|
+
"username": "postgres",
|
|
9
|
+
"password": "bbotislife",
|
|
10
|
+
"host": "localhost",
|
|
11
|
+
"port": 5432,
|
|
12
|
+
"database": "bbot",
|
|
13
|
+
}
|
|
14
|
+
options_desc = {
|
|
15
|
+
"username": "The username to connect to Postgres",
|
|
16
|
+
"password": "The password to connect to Postgres",
|
|
17
|
+
"host": "The server running Postgres",
|
|
18
|
+
"port": "The port to connect to Postgres",
|
|
19
|
+
"database": "The database name to connect to",
|
|
20
|
+
}
|
|
21
|
+
deps_pip = ["sqlmodel", "asyncpg"]
|
|
22
|
+
protocol = "postgresql+asyncpg"
|
|
23
|
+
|
|
24
|
+
async def create_database(self):
|
|
25
|
+
import asyncpg
|
|
26
|
+
from sqlalchemy import text
|
|
27
|
+
from sqlalchemy.ext.asyncio import create_async_engine
|
|
28
|
+
|
|
29
|
+
# Create the engine for the initial connection to the server
|
|
30
|
+
initial_engine = create_async_engine(self.connection_string().rsplit("/", 1)[0])
|
|
31
|
+
|
|
32
|
+
async with initial_engine.connect() as conn:
|
|
33
|
+
# Check if the database exists
|
|
34
|
+
result = await conn.execute(text(f"SELECT 1 FROM pg_database WHERE datname = '{self.database}'"))
|
|
35
|
+
database_exists = result.scalar() is not None
|
|
36
|
+
|
|
37
|
+
# Create the database if it does not exist
|
|
38
|
+
if not database_exists:
|
|
39
|
+
# Use asyncpg directly to create the database
|
|
40
|
+
raw_conn = await asyncpg.connect(
|
|
41
|
+
user=self.username,
|
|
42
|
+
password=self.password,
|
|
43
|
+
host=self.host,
|
|
44
|
+
port=self.port,
|
|
45
|
+
)
|
|
46
|
+
try:
|
|
47
|
+
await raw_conn.execute(f"CREATE DATABASE {self.database}")
|
|
48
|
+
finally:
|
|
49
|
+
await raw_conn.close()
|
bbot/modules/output/sqlite.py
CHANGED
|
@@ -12,7 +12,7 @@ class SQLite(SQLTemplate):
|
|
|
12
12
|
options_desc = {
|
|
13
13
|
"database": "The path to the sqlite database file",
|
|
14
14
|
}
|
|
15
|
-
deps_pip = ["sqlmodel", "
|
|
15
|
+
deps_pip = ["sqlmodel", "aiosqlite"]
|
|
16
16
|
|
|
17
17
|
async def setup(self):
|
|
18
18
|
db_file = self.config.get("database", "")
|
bbot/modules/templates/sql.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from sqlmodel import SQLModel
|
|
2
2
|
from sqlalchemy.orm import sessionmaker
|
|
3
3
|
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
4
|
-
from sqlalchemy_utils.functions import database_exists, create_database
|
|
5
4
|
|
|
6
5
|
from bbot.db.sql.models import Event, Scan, Target
|
|
7
6
|
from bbot.modules.output.base import BaseOutputModule
|
|
@@ -10,7 +9,6 @@ from bbot.modules.output.base import BaseOutputModule
|
|
|
10
9
|
class SQLTemplate(BaseOutputModule):
|
|
11
10
|
meta = {"description": "SQL output module template"}
|
|
12
11
|
options = {
|
|
13
|
-
"protocol": "",
|
|
14
12
|
"database": "bbot",
|
|
15
13
|
"username": "",
|
|
16
14
|
"password": "",
|
|
@@ -18,7 +16,6 @@ class SQLTemplate(BaseOutputModule):
|
|
|
18
16
|
"port": 0,
|
|
19
17
|
}
|
|
20
18
|
options_desc = {
|
|
21
|
-
"protocol": "The protocol to use to connect to the database",
|
|
22
19
|
"database": "The database to use",
|
|
23
20
|
"username": "The username to use to connect to the database",
|
|
24
21
|
"password": "The password to use to connect to the database",
|
|
@@ -26,6 +23,8 @@ class SQLTemplate(BaseOutputModule):
|
|
|
26
23
|
"port": "The port to use to connect to the database",
|
|
27
24
|
}
|
|
28
25
|
|
|
26
|
+
protocol = ""
|
|
27
|
+
|
|
29
28
|
async def setup(self):
|
|
30
29
|
self.database = self.config.get("database", "bbot")
|
|
31
30
|
self.username = self.config.get("username", "")
|
|
@@ -33,11 +32,6 @@ class SQLTemplate(BaseOutputModule):
|
|
|
33
32
|
self.host = self.config.get("host", "127.0.0.1")
|
|
34
33
|
self.port = self.config.get("port", 0)
|
|
35
34
|
|
|
36
|
-
self.log.info(f"Connecting to {self.connection_string(mask_password=True)}")
|
|
37
|
-
|
|
38
|
-
self.engine = create_async_engine(self.connection_string())
|
|
39
|
-
# Create a session factory bound to the engine
|
|
40
|
-
self.async_session = sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)
|
|
41
35
|
await self.init_database()
|
|
42
36
|
return True
|
|
43
37
|
|
|
@@ -65,12 +59,19 @@ class SQLTemplate(BaseOutputModule):
|
|
|
65
59
|
|
|
66
60
|
await session.commit()
|
|
67
61
|
|
|
62
|
+
async def create_database(self):
|
|
63
|
+
pass
|
|
64
|
+
|
|
68
65
|
async def init_database(self):
|
|
66
|
+
await self.create_database()
|
|
67
|
+
|
|
68
|
+
# Now create the engine for the actual database
|
|
69
|
+
self.engine = create_async_engine(self.connection_string())
|
|
70
|
+
# Create a session factory bound to the engine
|
|
71
|
+
self.async_session = sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession)
|
|
72
|
+
|
|
73
|
+
# Use the engine directly to create all tables
|
|
69
74
|
async with self.engine.begin() as conn:
|
|
70
|
-
# Check if the database exists using the connection's engine URL
|
|
71
|
-
if not await conn.run_sync(lambda sync_conn: database_exists(sync_conn.engine.url)):
|
|
72
|
-
await conn.run_sync(lambda sync_conn: create_database(sync_conn.engine.url))
|
|
73
|
-
# Create all tables
|
|
74
75
|
await conn.run_sync(SQLModel.metadata.create_all)
|
|
75
76
|
|
|
76
77
|
def connection_string(self, mask_password=False):
|
|
@@ -20,6 +20,8 @@ class ModuleTestBase:
|
|
|
20
20
|
config_overrides = {}
|
|
21
21
|
modules_overrides = None
|
|
22
22
|
log = logging.getLogger("bbot")
|
|
23
|
+
# if True, the test will be skipped (useful for tests that require docker)
|
|
24
|
+
skip_distro_tests = False
|
|
23
25
|
|
|
24
26
|
class ModuleTest:
|
|
25
27
|
def __init__(
|
|
@@ -90,7 +92,7 @@ class ModuleTestBase:
|
|
|
90
92
|
self, httpx_mock, bbot_httpserver, bbot_httpserver_ssl, monkeypatch, request, caplog, capsys
|
|
91
93
|
):
|
|
92
94
|
# Skip dastardly test if we're in the distro tests (because dastardly uses docker)
|
|
93
|
-
if os.getenv("BBOT_DISTRO_TESTS") and self.
|
|
95
|
+
if os.getenv("BBOT_DISTRO_TESTS") and self.skip_distro_tests:
|
|
94
96
|
pytest.skip("Skipping module_test for dastardly module due to BBOT_DISTRO_TESTS environment variable")
|
|
95
97
|
|
|
96
98
|
self.log.info(f"Starting {self.name} module test")
|
|
@@ -112,7 +114,9 @@ class ModuleTestBase:
|
|
|
112
114
|
|
|
113
115
|
@pytest.mark.asyncio
|
|
114
116
|
async def test_module_run(self, module_test):
|
|
115
|
-
|
|
117
|
+
from bbot.core.helpers.misc import execute_sync_or_async
|
|
118
|
+
|
|
119
|
+
await execute_sync_or_async(self.check, module_test, module_test.events)
|
|
116
120
|
module_test.log.info(f"Finished {self.name} module test")
|
|
117
121
|
current_task = asyncio.current_task()
|
|
118
122
|
tasks = [t for t in asyncio.all_tasks() if t != current_task]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import asyncio
|
|
3
|
+
|
|
4
|
+
from .base import ModuleTestBase
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TestPostgres(ModuleTestBase):
|
|
8
|
+
targets = ["evilcorp.com"]
|
|
9
|
+
skip_distro_tests = True
|
|
10
|
+
|
|
11
|
+
async def setup_before_prep(self, module_test):
|
|
12
|
+
process = await asyncio.create_subprocess_exec(
|
|
13
|
+
"docker",
|
|
14
|
+
"run",
|
|
15
|
+
"--name",
|
|
16
|
+
"bbot-test-postgres",
|
|
17
|
+
"--rm",
|
|
18
|
+
"-e",
|
|
19
|
+
"POSTGRES_PASSWORD=bbotislife",
|
|
20
|
+
"-e",
|
|
21
|
+
"POSTGRES_USER=postgres",
|
|
22
|
+
"-p",
|
|
23
|
+
"5432:5432",
|
|
24
|
+
"-d",
|
|
25
|
+
"postgres",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
import asyncpg
|
|
29
|
+
|
|
30
|
+
# wait for the container to start
|
|
31
|
+
start_time = time.time()
|
|
32
|
+
while True:
|
|
33
|
+
try:
|
|
34
|
+
# Connect to the default 'postgres' database to create 'bbot'
|
|
35
|
+
conn = await asyncpg.connect(
|
|
36
|
+
user="postgres", password="bbotislife", database="postgres", host="127.0.0.1"
|
|
37
|
+
)
|
|
38
|
+
await conn.execute("CREATE DATABASE bbot")
|
|
39
|
+
await conn.close()
|
|
40
|
+
break
|
|
41
|
+
except asyncpg.exceptions.DuplicateDatabaseError:
|
|
42
|
+
# If the database already exists, break the loop
|
|
43
|
+
break
|
|
44
|
+
except Exception as e:
|
|
45
|
+
if time.time() - start_time > 60: # timeout after 60 seconds
|
|
46
|
+
self.log.error("PostgreSQL server did not start in time.")
|
|
47
|
+
raise e
|
|
48
|
+
await asyncio.sleep(1)
|
|
49
|
+
|
|
50
|
+
if process.returncode != 0:
|
|
51
|
+
self.log.error(f"Failed to start PostgreSQL server")
|
|
52
|
+
|
|
53
|
+
async def check(self, module_test, events):
|
|
54
|
+
import asyncpg
|
|
55
|
+
|
|
56
|
+
# Connect to the PostgreSQL database
|
|
57
|
+
conn = await asyncpg.connect(user="postgres", password="bbotislife", database="bbot", host="127.0.0.1")
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
events = await conn.fetch("SELECT * FROM event")
|
|
61
|
+
assert len(events) == 3, "No events found in PostgreSQL database"
|
|
62
|
+
scans = await conn.fetch("SELECT * FROM scan")
|
|
63
|
+
assert len(scans) == 1, "No scans found in PostgreSQL database"
|
|
64
|
+
targets = await conn.fetch("SELECT * FROM target")
|
|
65
|
+
assert len(targets) == 1, "No targets found in PostgreSQL database"
|
|
66
|
+
finally:
|
|
67
|
+
await conn.close()
|
|
68
|
+
process = await asyncio.create_subprocess_exec(
|
|
69
|
+
"docker", "stop", "bbot-test-postgres", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
|
|
70
|
+
)
|
|
71
|
+
stdout, stderr = await process.communicate()
|
|
72
|
+
|
|
73
|
+
if process.returncode != 0:
|
|
74
|
+
raise Exception(f"Failed to stop PostgreSQL server: {stderr.decode()}")
|
|
@@ -10,9 +10,9 @@ class TestSQLite(ModuleTestBase):
|
|
|
10
10
|
assert sqlite_output_file.exists(), "SQLite output file not found"
|
|
11
11
|
with sqlite3.connect(sqlite_output_file) as db:
|
|
12
12
|
cursor = db.cursor()
|
|
13
|
-
cursor.execute("SELECT * FROM event")
|
|
14
|
-
assert len(
|
|
15
|
-
cursor.execute("SELECT * FROM scan")
|
|
16
|
-
assert len(
|
|
17
|
-
cursor.execute("SELECT * FROM target")
|
|
18
|
-
assert len(
|
|
13
|
+
results = cursor.execute("SELECT * FROM event").fetchall()
|
|
14
|
+
assert len(results) == 3, "No events found in SQLite database"
|
|
15
|
+
results = cursor.execute("SELECT * FROM scan").fetchall()
|
|
16
|
+
assert len(results) == 1, "No scans found in SQLite database"
|
|
17
|
+
results = cursor.execute("SELECT * FROM target").fetchall()
|
|
18
|
+
assert len(results) == 1, "No targets found in SQLite database"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
bbot/__init__.py,sha256=
|
|
1
|
+
bbot/__init__.py,sha256=a2kbcfeOJIfDMDvqI_sIkvScZM1Tke0cjCzvDhgoWpA,130
|
|
2
2
|
bbot/cli.py,sha256=-9d6yCAYZaP0lIOCja-fSk3MiNclc-kbEgos10jYNUQ,10440
|
|
3
3
|
bbot/core/__init__.py,sha256=l255GJE_DvUnWvrRb0J5lG-iMztJ8zVvoweDOfegGtI,46
|
|
4
4
|
bbot/core/config/__init__.py,sha256=zYNw2Me6tsEr8hOOkLb4BQ97GB7Kis2k--G81S8vofU,342
|
|
@@ -47,7 +47,7 @@ bbot/core/helpers/wordcloud.py,sha256=WdQwboCNcCxcUdLuB6MMMDQBL4ZshFM_f6GW7nUZEB
|
|
|
47
47
|
bbot/core/modules.py,sha256=OOUSncr-EM6bJBrI3iH5wvfnpTXKQ-A8OL8UMvkL0CU,31432
|
|
48
48
|
bbot/core/multiprocess.py,sha256=ocQHanskJ09gHwe7RZmwNdZyCOQyeyUoIHCtLbtvXUk,1771
|
|
49
49
|
bbot/core/shared_deps.py,sha256=A3vrI62uPTTayNIHhWAj6xz43cj--oXWC4prmDlgJnw,6958
|
|
50
|
-
bbot/db/sql/models.py,sha256=
|
|
50
|
+
bbot/db/sql/models.py,sha256=mrC8-Okp1iDcJ3d2hOZsCb8Xg6HHFfCWA3LDu4kRS-4,4825
|
|
51
51
|
bbot/defaults.yml,sha256=v6YZ2g-nnUZQdhD-rhod4LZiYciI-cMDFz4JF7Kh5Lk,6213
|
|
52
52
|
bbot/errors.py,sha256=xwQcD26nU9oc7-o0kv5jmEDTInmi8_W8eKAgQZZxdVM,953
|
|
53
53
|
bbot/logger.py,sha256=rLcLzNDvfR8rFj7_tZ-f5QB3Z8T0RVroact3W0ogjpA,1408
|
|
@@ -144,10 +144,11 @@ bbot/modules/output/emails.py,sha256=mzZideMCNfB8-naQANO5g8Y9HdgviAihRsdY_xPQjbQ
|
|
|
144
144
|
bbot/modules/output/http.py,sha256=4UWKpbQx3EHpi24VIem6oSvXr0W0NZ3lDpJOmQ3Mwik,2582
|
|
145
145
|
bbot/modules/output/json.py,sha256=zvM2NwWScGk3pN4wF0mm-OqVW_0ADYy95Am4T02VVD4,1289
|
|
146
146
|
bbot/modules/output/neo4j.py,sha256=u950eUwu8YMql_WaBA38TN2bUhx7xnZdIIvYfR3xVcY,6114
|
|
147
|
+
bbot/modules/output/postgres.py,sha256=2JdEF6mU-VmVqPrgEh5L2MGv-s0BoNwoz8EnG5i3u2s,1847
|
|
147
148
|
bbot/modules/output/python.py,sha256=RvK2KN-Zp0Vy_1zGSNioE5eeL5hIh6Z_riFtaTymyIM,270
|
|
148
149
|
bbot/modules/output/slack.py,sha256=Ir_z11VYBdXDx8DwntWCv33Ic43vO1UIbxcp9gj0vvk,1181
|
|
149
150
|
bbot/modules/output/splunk.py,sha256=TjTCUmDwRwKOFKBJw-Xbjku64U77OauHjtR56gyaAPs,1952
|
|
150
|
-
bbot/modules/output/sqlite.py,sha256=
|
|
151
|
+
bbot/modules/output/sqlite.py,sha256=GCtm1UoKfewtEKE79gBcj_UlTXO7jNHEEEuhqQ_iUnQ,888
|
|
151
152
|
bbot/modules/output/stdout.py,sha256=kRVlliUcQ6aZeweZvTsl12IqVbQdnPIhTO0Bid-ILaI,3024
|
|
152
153
|
bbot/modules/output/subdomains.py,sha256=3KZz4vD0itmqpo56uCyk43Z_zN1Q0Q_nyXjdnEublPA,1515
|
|
153
154
|
bbot/modules/output/teams.py,sha256=I2d52LqDC7e_oboLHoYBaRK6UpN0nkJ0uRnBXrhZf9E,4628
|
|
@@ -183,7 +184,7 @@ bbot/modules/templates/bucket.py,sha256=x-c_iAeMILux6wRm0xkUUJkc2P69hYWS6DxqD7g5
|
|
|
183
184
|
bbot/modules/templates/github.py,sha256=ENnDWpzzmZBsTisDx6Cg9V_NwJKyVyPIOpGAPktigdI,1455
|
|
184
185
|
bbot/modules/templates/postman.py,sha256=oxwVusW2EdNotVX7xnnxCTnWtj3xNPbfs8aff9s4phs,614
|
|
185
186
|
bbot/modules/templates/shodan.py,sha256=BfI0mNPbqkykGmjMtARhmCGKmk1uq7yTlZoPgzzJ040,1175
|
|
186
|
-
bbot/modules/templates/sql.py,sha256=
|
|
187
|
+
bbot/modules/templates/sql.py,sha256=bn8ZbTC0RkrA5wYOQ7RtSHfIywBm03L3mY344xH1Ue4,3417
|
|
187
188
|
bbot/modules/templates/subdomain_enum.py,sha256=h2YhIWoMLUXV7EBIidiQezuwXf35T8tXmOO9Vg__sIY,8393
|
|
188
189
|
bbot/modules/templates/webhook.py,sha256=MYhKWrNYrsfM0a4PR6yVotudLyyCwgmy2eI-l9LvpBs,3706
|
|
189
190
|
bbot/modules/trickest.py,sha256=MRgLW0YiDWzlWdAjyqfPPLFb-a51r-Ffn_dphiJI_gA,1550
|
|
@@ -261,7 +262,7 @@ bbot/test/test_step_1/test_target.py,sha256=9rJyKrMQqrCkCqnw4RH10DlfSrG8tw9k3HKo
|
|
|
261
262
|
bbot/test/test_step_1/test_web.py,sha256=sFkUutelRBXn2L48vZEMzB3LS5nHLQ-vzAH4cbPXo1c,18811
|
|
262
263
|
bbot/test/test_step_2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
263
264
|
bbot/test/test_step_2/module_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
264
|
-
bbot/test/test_step_2/module_tests/base.py,sha256=
|
|
265
|
+
bbot/test/test_step_2/module_tests/base.py,sha256=7SqVhwZYTOd85qhF_cSx4NChbAZmtj6LtwbzGlBBwOY,6023
|
|
265
266
|
bbot/test/test_step_2/module_tests/test_module_affiliates.py,sha256=d6uAzb_MF4oNGFEBG7Y6T2y0unWpf1gqNxUXRaYqOdk,673
|
|
266
267
|
bbot/test/test_step_2/module_tests/test_module_aggregate.py,sha256=hjxbMxAEFhS7W8RamBrM1t6T-tsLHq95MmQVfrYsock,487
|
|
267
268
|
bbot/test/test_step_2/module_tests/test_module_ajaxpro.py,sha256=0sPzcm0O3mmeqcOb8BUPijdAwt5TJvyaGDdbJdDMgYI,2789
|
|
@@ -296,7 +297,7 @@ bbot/test/test_step_2/module_tests/test_module_columbus.py,sha256=JZG_EvDQoKGNcB
|
|
|
296
297
|
bbot/test/test_step_2/module_tests/test_module_credshed.py,sha256=rlvKZERFoAS-gg7sdgk6Pa2JbySmHDPee3zKUYATWlw,3362
|
|
297
298
|
bbot/test/test_step_2/module_tests/test_module_crt.py,sha256=V15tE1jcXdXJEzEEdAJvSMRWhKBFtxBBUJ_eewvV3U4,717
|
|
298
299
|
bbot/test/test_step_2/module_tests/test_module_csv.py,sha256=UJqMqdiPjx-UjJw10OoVMAj378wu5mWIq0v04TCljTM,579
|
|
299
|
-
bbot/test/test_step_2/module_tests/test_module_dastardly.py,sha256=
|
|
300
|
+
bbot/test/test_step_2/module_tests/test_module_dastardly.py,sha256=jjpJD9mdCcbaJgnG63xE-J_Qqpjt9hpm_WvfHDLfTsc,2353
|
|
300
301
|
bbot/test/test_step_2/module_tests/test_module_dehashed.py,sha256=YVsTEFEPchahDT7q_8BofMsH4tYQlN-G1QtAxq6YUn0,3626
|
|
301
302
|
bbot/test/test_step_2/module_tests/test_module_digitorus.py,sha256=81mNwDb4WLUibstUSD8TowSJB3B5DBneS2LWimie9y4,1613
|
|
302
303
|
bbot/test/test_step_2/module_tests/test_module_discord.py,sha256=Z66fGb-kkdZTQfUh6WZiM35Ad-gDyvwxlA7mUUB2vnQ,1838
|
|
@@ -355,6 +356,7 @@ bbot/test/test_step_2/module_tests/test_module_paramminer_headers.py,sha256=qTT-
|
|
|
355
356
|
bbot/test/test_step_2/module_tests/test_module_passivetotal.py,sha256=fTGQECQ0OzcwiH64-0igFRKO-rs3kXScivZord_oWWU,1120
|
|
356
357
|
bbot/test/test_step_2/module_tests/test_module_pgp.py,sha256=-m-nPq6WR5UzPDuxeZbuzBQfFi1QfrZQ8RZH4g11ocE,1609
|
|
357
358
|
bbot/test/test_step_2/module_tests/test_module_portscan.py,sha256=StCm93P4q3o-NhPtUDOA6g_LTH2cwzEw0l2V5ZN5eeI,7306
|
|
359
|
+
bbot/test/test_step_2/module_tests/test_module_postgres.py,sha256=6Seqq1Bq2FEXbJnTi_BYv8ZZPWdy-SfnY8UJN24Op0Q,2689
|
|
358
360
|
bbot/test/test_step_2/module_tests/test_module_postman.py,sha256=XvgfMgUhJuVgGkgT-JzxJyevNSVv7YvX1yLKJHmD3dw,5026
|
|
359
361
|
bbot/test/test_step_2/module_tests/test_module_postman_download.py,sha256=B_NajQaGQjwMSmcBCr37_7cvcnw4Zmh8k_hVoWL7bVI,21623
|
|
360
362
|
bbot/test/test_step_2/module_tests/test_module_python.py,sha256=6UQVXGJ1ugfNbt9l_nN0q5FVxNWlpq6j0sZcB0Nh_Pg,184
|
|
@@ -371,7 +373,7 @@ bbot/test/test_step_2/module_tests/test_module_smuggler.py,sha256=J23iNHxJFbZ0vd
|
|
|
371
373
|
bbot/test/test_step_2/module_tests/test_module_social.py,sha256=McjY8g97HbZm5xnarW924pGytwwGGnzA6MfD0HmBPMU,2050
|
|
372
374
|
bbot/test/test_step_2/module_tests/test_module_speculate.py,sha256=UvlSWOAtxl6jS63m4JXFRUrBHuCZZzRCsTRgdbljSeQ,3131
|
|
373
375
|
bbot/test/test_step_2/module_tests/test_module_splunk.py,sha256=zCHVlgTVlFiXwhcYBeGb9Fy2RlmvVodpl4pq3j-8jJw,1859
|
|
374
|
-
bbot/test/test_step_2/module_tests/test_module_sqlite.py,sha256=
|
|
376
|
+
bbot/test/test_step_2/module_tests/test_module_sqlite.py,sha256=mpplbL84zPuH4WJgbmm698gFTJewi1Qw_e4AG_ZOTfE,829
|
|
375
377
|
bbot/test/test_step_2/module_tests/test_module_sslcert.py,sha256=XeiV9eQZNnA5oALCVnP7bEs3m9kMaVwEtg-hvYfgi3Y,711
|
|
376
378
|
bbot/test/test_step_2/module_tests/test_module_stdout.py,sha256=JbvSUCygrG3Tq225i9dabqeUFxBHUq44TeuxH-tEWpc,3250
|
|
377
379
|
bbot/test/test_step_2/module_tests/test_module_subdomaincenter.py,sha256=sNWlk4_dDtFhMtGGr7VLnMukJkVwcEGpCYViEcqrVEw,610
|
|
@@ -408,8 +410,8 @@ bbot/wordlists/raft-small-extensions-lowercase_CLEANED.txt,sha256=ruUQwVfia1_m2u
|
|
|
408
410
|
bbot/wordlists/top_open_ports_nmap.txt,sha256=LmdFYkfapSxn1pVuQC2LkOIY2hMLgG-Xts7DVtYzweM,42727
|
|
409
411
|
bbot/wordlists/valid_url_schemes.txt,sha256=VciB-ww0y-O8Ii1wpTR6rJzGDiC2r-dhVsIJApS1ZYU,3309
|
|
410
412
|
bbot/wordlists/wordninja_dns.txt.gz,sha256=DYHvvfW0TvzrVwyprqODAk4tGOxv5ezNmCPSdPuDUnQ,570241
|
|
411
|
-
bbot-2.
|
|
412
|
-
bbot-2.
|
|
413
|
-
bbot-2.
|
|
414
|
-
bbot-2.
|
|
415
|
-
bbot-2.
|
|
413
|
+
bbot-2.3.0.5324rc0.dist-info/LICENSE,sha256=GzeCzK17hhQQDNow0_r0L8OfLpeTKQjFQwBQU7ZUymg,32473
|
|
414
|
+
bbot-2.3.0.5324rc0.dist-info/METADATA,sha256=je-AQ1wE_cN7FZWBuYG3YKOHfqij2JVkhQri4AGreYc,17135
|
|
415
|
+
bbot-2.3.0.5324rc0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
416
|
+
bbot-2.3.0.5324rc0.dist-info/entry_points.txt,sha256=cWjvcU_lLrzzJgjcjF7yeGuRA_eDS8pQ-kmPUAyOBfo,38
|
|
417
|
+
bbot-2.3.0.5324rc0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|