[Mini PoC] WPA3 SAE Handshake Detector (Python)
[Mini PoC] WPA3 SAE Handshake Detector (Python)
Proje Hedefi
Bu Python scripti, bir pcap dosyasını tarayarak WPA3/SAE oturumlarını tespit eder.
Beacons, Probe Responses ve Association frame’lerinde SAE (00:0F:AC:08) AKM suite’i arar.
EAPOL (4-way handshake / key frames) paketlerini listeler.
Sonuçları Markdown veya JSON rapor olarak üretir.
Gereksinimler
Python 3.11+
Scapy (pip install scapy) veya Pyshark + tshark (pip install pyshark + sistemde tshark)
Terminal / CLI kullanımı
Dosya Yapısı
Bash:
MiniSecPoC/
├── wpa3_sae_detector.py # Ana script (Türkçe açıklamalı)
├── sample.pcap # Test pcap (opsiyonel)
├── output/ # Raporların kaydedileceği klasör
Kullanım Örnekleri
Bash:
# Markdown rapor üret
python wpa3_sae_detector.py --pcap sample.pcap --out output/report.md
# JSON rapor üret (opsiyonel)
python wpa3_sae_detector.py --pcap sample.pcap --out output/report.json
Python Script
Python:
#!/usr/bin/env python3
"""
Mini PoC: WPA3 SAE algılayıcı
Bu script, bir pcap dosyasını tarayarak WPA3/SAE handshake varlığını tespit eder.
Kullanım:
python wpa3_sae_detector.py --pcap sample.pcap --out report.md
Gereksinimler:
pip install scapy
"""
import argparse, os, sys
from scapy.all import rdpcap, Dot11, Raw
from scapy.layers.eap import EAPOL
# SAE AKM bilgisi
AKM_SAE_OUI = b'\x00\x0f\xac'
AKM_SAE_SUITE_TYPE = 8
def parse_with_scapy(pcap_file):
"""PCAP dosyasını oku ve SAE/EAPOL paketlerini tespit et"""
pkts = rdpcap(pcap_file)
findings = {"beacons_with_sae": [], "assoc_with_sae": [], "eapol_frames": []}
for i, p in enumerate(pkts):
if p.haslayer(Dot11):
dot11 = p.getlayer(Dot11)
if dot11.type == 0 and p.haslayer(Raw):
payload = bytes(p.getlayer(Raw).load)
idx = payload.find(AKM_SAE_OUI)
if idx != -1 and idx+3 < len(payload) and payload[idx+3] == AKM_SAE_SUITE_TYPE:
subtype = dot11.subtype
if subtype in [5,8]: # Beacon veya Probe
findings["beacons_with_sae"].append({"pkt_no": i+1, "addr2": dot11.addr2})
else: # Association veya diğer yönetim frame
findings["assoc_with_sae"].append({"pkt_no": i+1, "addr2": dot11.addr2})
if p.haslayer(EAPOL):
findings["eapol_frames"].append({"pkt_no": i+1, "raw_len": len(bytes(p.getlayer(EAPOL)))})
return findings
def generate_markdown_report(findings, out_path, pcap_name):
"""Markdown rapor üretir"""
lines = [f"# WPA3 SAE Analiz Raporu\n\n- pcap: `{pcap_name}`\n"]
lines.append(f"- Beacon/Probe SAE paketleri: {len(findings['beacons_with_sae'])}")
lines.append(f"- Association SAE paketleri: {len(findings['assoc_with_sae'])}")
lines.append(f"- EAPOL (handshake) paketleri: {len(findings['eapol_frames'])}\n")
with open(out_path, "w", encoding="utf-8") as f:
f.write("\n".join(lines))
return "\n".join(lines)
def main():
parser = argparse.ArgumentParser(description="WPA3 SAE algılayıcı")
parser.add_argument("--pcap", required=True, help="Analiz edilecek pcap dosyası")
parser.add_argument("--out", default="report.md", help="Rapor çıktısı")
args = parser.parse_args()
if not os.path.exists(args.pcap):
print("Hata: pcap dosyası bulunamadı!", file=sys.stderr)
sys.exit(1)
findings = parse_with_scapy(args.pcap)
report = generate_markdown_report(findings, args.out, os.path.basename(args.pcap))
print(f"[+] Rapor {args.out} dosyasına kaydedildi.\nÖrnek:\n{report[:500]}")
if __name__ == "__main__":
main()
Örnek Terminal Çıktısı
Bash:
$ python wpa3_sae_detector.py --pcap sample.pcap --out output/report.md
[*] Analiz başladı...
[+] Rapor output/report.md dosyasına kaydedildi.
Örnek:
# WPA3 SAE Analiz Raporu
- pcap: `sample.pcap`
- Beacon/Probe SAE paketleri: 2
- Association SAE paketleri: 1
- EAPOL (handshake) paketleri: 8
Örnek Markdown Rapor
Markdown (GitHub flavored):
# WPA3 SAE Analiz Raporu
- pcap: `sample.pcap`
- analysis summary:
- Beacon/Probe SAE paketleri: 2
- Association SAE paketleri: 1
- EAPOL paketleri: 8
Geliştirme ve İleri Adımlar
EAPOL 4-way handshake tam korelasyonu
pcap metadata >> meta.json otomatik doldurma (SecRepo entegrasyonu)
Web UI üzerinden pcap ve handshake özetleri görüntüleme
Docker ile kolay dağıtım
THT postunda terminal çıktısı ve GIF demo ekleme
Son düzenleme:

