mirror of
https://github.com/mukul975/Anthropic-Cybersecurity-Skills.git
synced 2026-06-12 14:14:56 +03:00
c21af3347e
- Add scripts/agent.py and references/api-reference.md to all remaining skills - Update all 648 LICENSE files: copyright now reads 'Mahipal' - Add implementing-security-monitoring-with-datadog (new skill with full anatomy) - All 649 skills now have: SKILL.md, LICENSE, scripts/agent.py, references/api-reference.md
146 lines
5.5 KiB
Python
146 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Agent for wireless network penetration testing.
|
|
|
|
Runs aircrack-ng suite tools via subprocess for WiFi reconnaissance,
|
|
WPA handshake capture, deauthentication testing, and generates
|
|
a wireless security assessment report.
|
|
"""
|
|
|
|
import subprocess
|
|
import json
|
|
import sys
|
|
import re
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
|
|
class WirelessPentestAgent:
|
|
"""Automates wireless network penetration testing with aircrack-ng."""
|
|
|
|
def __init__(self, interface, output_dir="./wireless_pentest"):
|
|
self.interface = interface
|
|
self.output_dir = Path(output_dir)
|
|
self.output_dir.mkdir(parents=True, exist_ok=True)
|
|
self.networks = []
|
|
self.findings = []
|
|
|
|
def enable_monitor_mode(self):
|
|
"""Put wireless interface into monitor mode using airmon-ng."""
|
|
result = subprocess.run(
|
|
["airmon-ng", "start", self.interface],
|
|
capture_output=True, text=True, timeout=30)
|
|
mon_iface = f"{self.interface}mon"
|
|
match = re.search(r"monitor mode.*enabled on (\w+)", result.stdout)
|
|
if match:
|
|
mon_iface = match.group(1)
|
|
self.interface = mon_iface
|
|
return {"monitor_interface": mon_iface, "status": result.returncode}
|
|
|
|
def scan_networks(self, duration=30):
|
|
"""Scan for wireless networks using airodump-ng."""
|
|
csv_prefix = str(self.output_dir / "scan")
|
|
try:
|
|
subprocess.run(
|
|
["airodump-ng", self.interface, "-w", csv_prefix,
|
|
"--output-format", "csv", "--write-interval", "1"],
|
|
capture_output=True, text=True, timeout=duration)
|
|
except subprocess.TimeoutExpired:
|
|
pass
|
|
|
|
csv_file = Path(f"{csv_prefix}-01.csv")
|
|
if csv_file.exists():
|
|
self.networks = self._parse_airodump_csv(csv_file)
|
|
return self.networks
|
|
|
|
def _parse_airodump_csv(self, csv_path):
|
|
"""Parse airodump-ng CSV output for network details."""
|
|
networks = []
|
|
try:
|
|
lines = csv_path.read_text(errors="ignore").splitlines()
|
|
in_ap_section = False
|
|
for line in lines:
|
|
if "BSSID" in line and "channel" in line.lower():
|
|
in_ap_section = True
|
|
continue
|
|
if "Station MAC" in line:
|
|
break
|
|
if in_ap_section and line.strip():
|
|
parts = [p.strip() for p in line.split(",")]
|
|
if len(parts) >= 14:
|
|
enc = parts[5].strip()
|
|
networks.append({
|
|
"bssid": parts[0], "channel": parts[3],
|
|
"encryption": enc, "essid": parts[13],
|
|
"power": parts[8],
|
|
})
|
|
if enc in ("OPN", "WEP", ""):
|
|
self.findings.append({
|
|
"type": "Weak Encryption",
|
|
"severity": "Critical" if enc in ("OPN", "") else "High",
|
|
"bssid": parts[0], "essid": parts[13],
|
|
"encryption": enc or "Open",
|
|
})
|
|
except (IndexError, UnicodeDecodeError):
|
|
pass
|
|
return networks
|
|
|
|
def capture_handshake(self, bssid, channel, duration=60):
|
|
"""Capture WPA/WPA2 4-way handshake."""
|
|
cap_prefix = str(self.output_dir / "handshake")
|
|
try:
|
|
subprocess.run(
|
|
["airodump-ng", self.interface, "--bssid", bssid,
|
|
"-c", str(channel), "-w", cap_prefix],
|
|
capture_output=True, timeout=duration)
|
|
except subprocess.TimeoutExpired:
|
|
pass
|
|
cap_file = Path(f"{cap_prefix}-01.cap")
|
|
return {"capture_file": str(cap_file), "exists": cap_file.exists()}
|
|
|
|
def crack_handshake(self, cap_file, wordlist):
|
|
"""Attempt to crack WPA handshake with aircrack-ng."""
|
|
result = subprocess.run(
|
|
["aircrack-ng", cap_file, "-w", wordlist],
|
|
capture_output=True, text=True, timeout=600)
|
|
if "KEY FOUND" in result.stdout:
|
|
match = re.search(r"KEY FOUND! \[ (.+?) \]", result.stdout)
|
|
key = match.group(1) if match else "unknown"
|
|
self.findings.append({"type": "WPA Key Cracked",
|
|
"severity": "Critical", "key": key})
|
|
return {"cracked": True, "key": key}
|
|
return {"cracked": False}
|
|
|
|
def test_wps(self, bssid):
|
|
"""Test WPS PIN vulnerability using reaver/wash."""
|
|
result = subprocess.run(
|
|
["wash", "-i", self.interface], capture_output=True,
|
|
text=True, timeout=30)
|
|
wps_enabled = bssid in result.stdout
|
|
if wps_enabled:
|
|
self.findings.append({"type": "WPS Enabled", "severity": "High",
|
|
"bssid": bssid})
|
|
return {"wps_enabled": wps_enabled}
|
|
|
|
def generate_report(self):
|
|
report = {
|
|
"report_date": datetime.utcnow().isoformat(),
|
|
"interface": self.interface,
|
|
"networks_found": len(self.networks),
|
|
"findings": self.findings,
|
|
"networks": self.networks[:50],
|
|
}
|
|
print(json.dumps(report, indent=2))
|
|
return report
|
|
|
|
|
|
def main():
|
|
iface = sys.argv[1] if len(sys.argv) > 1 else "wlan0"
|
|
agent = WirelessPentestAgent(iface)
|
|
agent.enable_monitor_mode()
|
|
agent.scan_networks(duration=30)
|
|
agent.generate_report()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|