Add requires_capture_bus attribute to BaseModule and passive modules

- BaseModule now has requires_capture_bus = False default
- All 17 passive modules set requires_capture_bus = True
- bigbrother.py imports CaptureBus from core.capture_bus
- Ready for Engine to instantiate and inject CaptureBus
This commit is contained in:
Cobra
2026-04-06 11:36:24 -04:00
parent 59cdda0596
commit 04eae3a43e
19 changed files with 19 additions and 0 deletions
+1
View File
@@ -37,6 +37,7 @@ from core.tool_manager import ToolManager
from core.scheduler import Scheduler
from core.resource_monitor import ResourceMonitor
from core.kill_switch import KillSwitch
from core.capture_bus import CaptureBus
from modules.base import BaseModule
from utils.config_loader import load_config, ConfigLoader
from utils.resource import (
+1
View File
@@ -15,6 +15,7 @@ class BaseModule(ABC):
priority: int = 100 # OOM priority (lower = more important)
dependencies: list = [] # Module names that must be running first
requires_root: bool = False
requires_capture_bus: bool = False
def __init__(self, bus, state, config, engine=None):
self.bus = bus
+1
View File
@@ -117,6 +117,7 @@ class AuthFlowTracker(BaseModule):
"or port 3389 or port 22 or port 1433"
)
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter=bpf, queue_depth=5000
)
+1
View File
@@ -95,6 +95,7 @@ class CloudTokenHarvester(BaseModule):
return
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="port 80", queue_depth=3000
)
+1
View File
@@ -97,6 +97,7 @@ class CredentialSniffer(BaseModule):
bpf_filter = "port 80 or port 21 or port 23 or port 25 or port 110 or port 143 or port 389 or port 88 or port 445"
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter=bpf_filter, queue_depth=8000
)
+1
View File
@@ -110,6 +110,7 @@ class DBInterceptor(BaseModule):
bpf = "port 1433 or port 3306 or port 5432 or port 6379 or port 27017"
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter=bpf, queue_depth=5000
)
+1
View File
@@ -363,6 +363,7 @@ class DNSLogger(BaseModule):
except Exception:
parts.append("?")
offset += length
requires_capture_bus = True
name = ".".join(parts) if parts else ""
return (name, saved_offset if jumped else offset)
+1
View File
@@ -640,6 +640,7 @@ class HostDiscovery(BaseModule):
break
parts.append(data[offset:offset + length].decode("utf-8", errors="replace"))
offset += length
requires_capture_bus = True
name = ".".join(parts) if parts else ""
return (name, saved_offset if jumped else offset)
+1
View File
@@ -89,6 +89,7 @@ class KerberosHarvester(BaseModule):
self._init_db()
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="port 88", queue_depth=5000
)
+1
View File
@@ -108,6 +108,7 @@ class LDAPHarvester(BaseModule):
return
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="port 389 or port 3268", queue_depth=5000
)
+1
View File
@@ -101,6 +101,7 @@ class NetworkMapper(BaseModule):
# Subscribe to all traffic
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="", queue_depth=5000
)
+1
View File
@@ -135,6 +135,7 @@ class OSFingerprint(BaseModule):
# Actually, let's keep SYN filter and add a second subscriber
self._capture_bus.unsubscribe(self.name)
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name,
bpf_filter="tcp", # All TCP — we filter SYN and app-layer in code
queue_depth=10000,
+1
View File
@@ -34,6 +34,7 @@ class PacketCapture(BaseModule):
name = "packet_capture"
module_type = "passive"
priority = 50
requires_capture_bus = True
requires_root = True
# Defaults
+1
View File
@@ -98,6 +98,7 @@ class QUICAnalyzer(BaseModule):
return
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="udp port 443", queue_depth=3000
)
+1
View File
@@ -92,6 +92,7 @@ class RDPMonitor(BaseModule):
return
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="port 3389", queue_depth=3000
)
+1
View File
@@ -103,6 +103,7 @@ class SMBMonitor(BaseModule):
return
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="port 445", queue_depth=5000
)
+1
View File
@@ -89,6 +89,7 @@ class TLSSNIExtractor(BaseModule):
self._init_db()
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="tcp port 443", queue_depth=8000
)
+1
View File
@@ -105,6 +105,7 @@ class TrafficAnalyzer(BaseModule):
# Subscribe to all traffic (no BPF filter)
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="", queue_depth=15000
)
+1
View File
@@ -113,6 +113,7 @@ class VLANDiscovery(BaseModule):
# Broad filter: we need 802.1Q (any ethertype), CDP/DTP (SNAP), LLDP, STP, EAPOL
# Compile a catch-all because these span multiple ethertypes and LLC frames
self._sub_queue = self._capture_bus.subscribe(
requires_capture_bus = True
name=self.name, bpf_filter="", queue_depth=3000
)