
Point d'accès Wi-Fi ouvert malveillant pour la capture contrôlée du trafic à l'aide de hostapd, dnsmasq et iptables NAT. Permet la surveillance des clients en temps réel, la journalisation DNS/DHCP et l'analyse du trafic basée sur Wireshark.
Point d'accès Wi-Fi ouvert rogue pour la capture de trafic dans des environnements contrôlés. Utilise hostapd (mode AP natif nl80211) + dnsmasq (DHCP/DNS) + iptables NAT vers une interface de liaison montante.

iw phy → Supported interface modes: ... AP).hostapd, dnsmasq, iw, iptables, rfkill, wireshark.Modifiez les variables en haut de fake_ap.sh.
INTERNET_IFACE — liaison montante avec internetC'est l'interface qui a déjà une route par défaut (Ethernet, adaptateur USB, client Wi‑Fi, etc.). Les noms varient selon la machine (eth0, enp3s0, wlp3s0, …).
ip route | grep default
# default via 192.168.1.1 dev enp3s0 ...
# ^^^^^^
# use this name
Définissez INTERNET_IFACE comme l'interface après dev.
AP_IFACE — carte sans fil pour le point d'accès facticeUtilisez l'interface Wi‑Fi physique de iw dev. Souvent wlan0, mais cela peut être wlp2s0 ou similaire.
iw dev
# phy#0
# Interface wlan0
# ^^^^^
# use this name
Choisissez l'interface sur le phy qui supporte le mode AP (iw phy → Supported interface modes: ... AP). N'utilisez pas les ponts Docker (docker0, br-*) ou les interfaces virtuelles (veth*).
FAKE_SSID="Free_Public_WiFi"
CHANNEL="6"
INTERNET_IFACE="enp3s0"
AP_IFACE="wlan0"
GATEWAY_IP="10.0.0.1"
sudo ./fake_ap.sh
Le script :
wlan0) en mode managé sur le phy sans fil.hostapd avec un SSID ouvert sur le canal choisi.dnsmasq (DHCP + redirecteur DNS vers 1.1.1.1 / 8.8.8.8).sudo journalctl -t dnsmasq -f # DHCP leases + every client DNS query
sudo wireshark -i wlan0 # capture client L3 traffic (use your AP_IFACE)
sudo iw dev wlan0 station dump # client L2 state (RSSI, rate, traffic)
cat /var/lib/misc/dnsmasq.leases # active leases
Ouvrez Wireshark sur votre interface AP (par ex. wlan0) et appliquez le filtre d'affichage dont vous avez besoin.
| Ce que vous apprenez | Filtre |
|---|---|
| SYN uniquement (nouvelles connexions TCP) | tcp.flags.syn == 1 && tcp.flags.ack == 0 |
# one client's encrypted traffic + contacted domains
ip.src == 10.0.0.42 && (dns || tls.handshake.type == 1)
# passive phone model discovery
ip.src == 10.0.0.42 && (dhcp || mdns || ssdp || nbns)
# traffic to a specific domain (e.g. social)
tls.handshake.extensions_server_name contains "instagram"
# exclude broadcast/multicast noise
not (eth.dst == ff:ff:ff:ff:ff:ff) && not (ip.dst >= 224.0.0.0 && ip.dst <= 239.255.255.255)
sudo tshark -i wlan0 -Y 'tls.handshake.type==1 && ip.src==10.0.0.42' \
-T fields -e tls.handshake.extensions_server_name
sudo tcpdump -i wlan0 -w /tmp/capture.pcap
journalctl -t dnsmasq -f sans Wireshark.MIT — voir LICENSE.
Utilisez uniquement sur des réseaux et appareils que vous possédez ou pour lesquels vous avez une autorisation écrite de test. Intercepter le trafic d'autrui est illégal.
| Ce que vous apprenez | Filtre |
|---|
| Nom d'hôte et fabricant (options DHCP 12/55/60) | dhcp |
| Nom de l'appareil + services (Bonjour/AirPlay/Chromecast) | mdns |
| Nom d'hôte Windows / SMB | nbns |
| Modèle de l'appareil (UPnP) | ssdp |
| Fabricant depuis l'adresse MAC | eth.addr == aa:bb:cc:dd:ee:ff |
| Tout le trafic d'un client | ip.addr == 10.0.0.X |
| Ce que vous apprenez | Filtre |
|---|
| Domaines résolus via DNS | dns.qry.name |
| Domaines HTTPS (SNI dans ClientHello) | tls.handshake.type == 1 |
| Réponses DNS avec IP résolues | dns.flags.response == 1 |
| Connexions QUIC (Google, YouTube, Meta) | quic |
| HTTP clair (URL complète) | http.request |
| User-Agent de l'application/navigateur | http.user_agent |
| Poignées de main TLS en cours |
tls.handshake |
| Transferts volumineux (HTTP/2 sur TLS) | tcp.len > 1000 |
| ICMP (pings de diagnostic client) | icmp |
| Ce que vous apprenez | Filtre |
|---|
| HTTP POST (connexion sur sites http://) | http.request.method == "POST" |
| Identifiants FTP | ftp.request.command in {"USER","PASS"} |
| Telnet | telnet |
| SMTP/IMAP/POP3 en clair | `smtp |
| Chaînes suspectes dans la charge utile | frame contains "password" |