Kali Forensic WiFi Capture Toolkit
Field guide for passive WiFi monitoring and attack device location -- CTRS incident, March 20, 2026
Designed for tablet reference while operating Kali on the laptop. All commands are copy-ready. This is your only field reference -- everything you need is in this document.
An attack device is still actively transmitting on channel 157 from a planted device inside or near the building. The AP has been moved to channel 149 and PMF is enabled (WPA2/WPA3 transition mode), but the rogue device continues broadcasting. The attack has been running autonomously since at least Friday, March 20. Your goal is to passively capture its traffic, identify the attack method, and physically locate the device.
Your adapter in monitor mode never transmits. You are a passive listener. No one on the network -- including the attacker -- can see you. You are not connecting, not probing, not sending a single frame.
If anyone asks what you're doing: "Running network diagnostics for a connectivity issue."
The attack persists through PMF -- CSA injection and evil twin are the two leading candidates. Classic deauth should have been blocked by PMF, but the disruption continues. Your capture data will confirm which method is in use.
Hardware & Target Environment
| Component | Details |
|---|---|
| Laptop | Acer Nitro ANV16-72 |
| External WiFi | ALFA AWUS036AXM -- mt7921au chipset, WiFi 6E, USB 3.0 (monitor mode capture) |
| Internal WiFi | Intel built-in adapter (internet via phone hotspot) |
| Boot Drive | SSK 256GB USB-C SSD (550 MB/s) |
| Extension Cable | USB 3.0 6ft (for positioning adapter away from laptop) |
| Kali Version | 2025.4 Live (kali-linux-2025.4-live-amd64.iso) |
| Parameter | Value |
|---|---|
| Access Point | Peplink B-ONE (model B-ONE-A29F) |
| BSSID | 19:33:CE:D0:A2:9F |
| SSID | CTS-A (5 GHz) |
| Current Channel | 149 (moved from 157 during mitigation) |
| Attack Channel | 157 (disabled on AP, but attacker still transmitting) |
| Security | WPA2/WPA3 transition mode with PMF (802.11w) |
The AP BSSID 19:33:CE:D0:A2:9F is from the AP logs. Verify this is correct by running a quick airodump-ng scan on channel 149 and confirming the Peplink B-ONE's real BSSID. The model is B-ONE-A29F, so the BSSID may contain characters from that identifier. If it differs from what's listed here, update your filters accordingly.
Download Kali 2025.4 Live ISO
Get the official live ISO via torrent for integrity verification.
https://cdimage.kali.org/kali-2025.4/kali-linux-2025.4-live-amd64.iso.torrent
Verify the SHA256 checksum after download against the value published on kali.org/get-kali.
Flash with Rufus
- Download and open Rufus (rufus.ie)
- Select the SSK 256GB SSD as the target device
- Select the Kali ISO
- When prompted, select "Write in DD Image mode" (not ISO mode)
- Create a persistence partition -- set to ~100GB
- Click Start and wait for completion
ISO mode will not work correctly for Kali live persistence. You must select DD Image mode when Rufus prompts you.
BIOS Setup (Acer Nitro ANV16-72)
- Power on the laptop, press F2 repeatedly to enter BIOS
- Navigate to Security tab -- set Secure Boot to Disabled
- Navigate to Boot tab -- set the SSK SSD as first boot priority
- Save and exit (F10)
First Boot
- At the GRUB menu, select "Live system (persistence, check kali-runp)" or "Live (persistence)"
- Wait for Kali desktop to load
- Open a terminal
Change Default Password
Default credentials are kali / kali. Change immediately.
$ passwdUpdate System
$ sudo apt update && sudo apt upgrade -yThis ensures aircrack-ng, wireshark, and drivers are at their latest versions.
You need two WiFi adapters working simultaneously: the internal Intel adapter (wlan0) connects to your phone hotspot for internet access, and the ALFA AWUS036AXM (wlan1) goes into monitor mode for passive capture. They operate independently.
Monitor mode captures ALL frames on a channel -- it can't be connected to a network simultaneously. The internal adapter handles internet (updates, VPN, uploads) while the ALFA is dedicated to forensic capture.
Connect Internal WiFi to Phone Hotspot
First, set up your phone as a WiFi hotspot. Then connect the laptop's internal adapter:
# List available WiFi networks $ nmcli dev wifi list # Connect to your phone hotspot $ nmcli dev wifi connect "YourHotspotName" password "YourPassword" # Verify connection $ nmcli con show --active # Test internet $ ping -c 3 1.1.1.1
Replace YourHotspotName and YourPassword with your actual phone hotspot credentials before running.
Install and Connect ProtonVPN
Route your internet traffic through a VPN so your ISP and anyone monitoring the hotspot can't see what you're doing.
# Install ProtonVPN CLI $ sudo apt install protonvpn-cli -y # Login (will prompt for credentials) $ protonvpn-cli login # Connect to fastest available server $ protonvpn-cli connect --fastest # Verify VPN is active $ protonvpn-cli status # Check your external IP has changed $ curl ifconfig.me
Plug In ALFA Adapter
With the internal WiFi connected to the hotspot, plug in the ALFA via the USB 3.0 extension cable.
# Check USB device is recognized $ lsusb | grep -i mediatek # Check wireless interfaces -- should see both wlan0 and wlan1 $ iwconfig # Detailed interface info $ iw dev # Check link state $ ip link show
Troubleshooting -- Not Detected
# Check kernel messages for driver loading $ dmesg | grep mt7921 # Manually load the driver module $ sudo modprobe mt7921u # Full USB device listing (look for MediaTek or 0e8d vendor ID) $ lsusb
The ALFA AWUS036AXM requires USB 3.0 for full bandwidth. If you're using a USB 2.0 port or hub, the adapter may work but capture throughput will be reduced. Use the laptop's blue USB-A port or the USB-C port.
Verify Both Adapters Working Simultaneously
After putting the ALFA into monitor mode (Section 4), verify both are operational:
$ iwconfigExpected output should show both adapters:
wlan0 IEEE 802.11 ESSID:"YourHotspotName"
Mode:Managed Frequency:2.437 GHz Access Point: AA:BB:CC:DD:EE:FF
Bit Rate=72.2 Mb/s Tx-Power=20 dBm
Link Quality=70/70 Signal level=-38 dBm
wlan1mon IEEE 802.11 Mode:Monitor Frequency:5.785 GHz
Tx-Power=20 dBm
Retry short limit:7 RTS thr:off Fragment thr:offExpected Outputwlan0 = internal adapter, Managed mode, connected to hotspot. wlan1mon = ALFA, Monitor mode, capturing. Both working independently.
Pre-installed on Kali (verify with which)
| Tool | Purpose | Verify |
|---|---|---|
| wireshark | GUI packet analyzer -- inspect captured frames in detail | which wireshark |
| tshark | CLI version of Wireshark -- headless capture and analysis | which tshark |
| airmon-ng | Enable/disable monitor mode on wireless interfaces | which airmon-ng |
| airodump-ng | Passive wireless scanner -- AP and client discovery | which airodump-ng |
| aireplay-ng | Frame injection tool (NOT needed for passive capture) | which aireplay-ng |
| airbase-ng | Rogue AP creation tool (NOT needed -- reference only) | which airbase-ng |
Install Additional Tools
Run these while connected to internet via hotspot:
# mdk4 -- Attack signature analysis tool (understand what attack looks like, NOT for attacking) $ sudo apt install mdk4 -y # hcxdumptool -- Alternative capture tool, good for PMKID capture and extended frame analysis $ sudo apt install hcxdumptool -y # kismet -- Wireless IDS / network detector, can run as daemon for continuous monitoring $ sudo apt install kismet -y # wifite2 -- Automated wireless auditing tool $ sudo apt install wifite -y # horst -- Lightweight wireless scanner, great for signal strength histograms $ sudo apt install horst -y # wavemon -- Terminal-based WiFi signal monitor with real-time visualization $ sudo apt install wavemon -y # linssid -- Graphical WiFi scanner with signal strength graphs over time $ sudo apt install linssid -y
Or install all at once:
$ sudo apt install mdk4 hcxdumptool kismet wifite horst wavemon linssid -ymdk4 is installed so you can recognize attack signatures in your captures. It can reproduce the exact frame patterns used in deauth floods, CSA injection, and beacon floods. Knowing what the tool generates helps you identify what's in your capture files. Do NOT use it to generate traffic on the CTS-A network.
Monitor mode puts the adapter into a state where it captures all wireless frames on a channel -- not just traffic addressed to it. This is how you'll see the attacker's frames.
Enable Monitor Mode (ALFA Only) -- Preserving Internet
airmon-ng check kill kills NetworkManager, which manages ALL adapters including your internet connection on wlan0. This drops your hotspot connection and makes reconnecting painful. Instead, use the manual method below which ONLY affects wlan1.
Method 1: Manual (RECOMMENDED -- keeps internet alive)
# Put ONLY the ALFA adapter into monitor mode # This does NOT touch wlan0 or NetworkManager $ sudo ip link set wlan1 down $ sudo iw dev wlan1 set type monitor $ sudo ip link set wlan1 up
The interface stays named wlan1 (does NOT become wlan1mon). Use wlan1 in all subsequent commands.
# Verify monitor mode is active $ iwconfig wlan1
Confirm: Mode:Monitor in the output. Your internet on wlan0 should still be working.
# Start capturing on channel 157 $ sudo airodump-ng wlan1 --channel 157 -w evidence_ch157
Method 2: airmon-ng (if Method 1 doesn't work)
Only use this if the manual method above fails. It WILL kill your internet temporarily.
# This kills NetworkManager -- your internet WILL drop $ sudo airmon-ng check kill $ sudo airmon-ng start wlan1
This creates wlan1mon. Then immediately restore internet:
# Restart NetworkManager to get internet back on wlan0 $ sudo systemctl start NetworkManager # Wait a few seconds for it to initialize, then reconnect $ sleep 3 $ nmcli device wifi connect "Praxis" password "YOUR_HOTSPOT_PASSWORD" ifname wlan0
After setup, you should have TWO adapters working simultaneously:
# Check both adapters $ iwconfig # You should see: # wlan0 Mode:Managed ESSID:"Praxis" (internet, connected) # wlan1 Mode:Monitor (capture, listening) # -- OR if using Method 2 -- # wlan0 Mode:Managed ESSID:"Praxis" (internet, connected) # wlan1mon Mode:Monitor (capture, listening)
Stop Monitor Mode (When Done)
If using Method 1:
$ sudo ip link set wlan1 down $ sudo iw dev wlan1 set type managed $ sudo ip link set wlan1 up
If using Method 2:
$ sudo airmon-ng stop wlan1monDo not connect the Kali laptop to the CTS-A network. Keep the ALFA adapter in monitor mode at all times. Connecting would make you visible on the network and could alert the attacker.
This is where you'll spend most of your time. airodump-ng passively listens and displays all APs and clients it can see.
Scan All Channels
# See everything -- all APs, all clients, all channels $ sudo airodump-ng wlan1mon
Use this first to get a lay of the land. Look for the CTS-A SSID on both channel 149 (legitimate) and channel 157 (attacker).
Lock to Attack Channel
# Focus on channel 157 only -- the attack channel $ sudo airodump-ng wlan1mon --channel 157
Capture Everything on Channel 157
# Capture to file on channel 157 (all BSSIDs -- don't filter yet) $ sudo airodump-ng wlan1mon --channel 157 -w capture_157 # Or filter to AP BSSID on channel 157 $ sudo airodump-ng wlan1mon --channel 157 --bssid 19:33:CE:D0:A2:9F -w capture_157
This writes capture files to capture_157-01.cap, capture_157-01.csv, etc. These are your forensic evidence files.
The planted device is still active on channel 157. The moment you scan channel 157, you should see it. If you see a BSSID broadcasting CTS-A on 157 that is NOT 19:33:CE:D0:A2:9F, that's your rogue device. Note its BSSID immediately.
Run without --bssid initially. If there's an evil twin, it will have a DIFFERENT BSSID than the real AP. Filtering to the real AP's BSSID would hide the rogue.
Reading the airodump-ng Output
Top section -- Access Points:
| Column | Meaning |
|---|---|
| BSSID | MAC address of the access point |
| PWR | Signal strength (closer to 0 = stronger = physically closer) |
| Beacons | Number of beacon frames received from this AP |
| #Data | Number of data frames captured |
| CH | Channel the AP is operating on |
| ENC | Encryption type (WPA2, WPA3, OPN, etc.) |
| ESSID | Network name (SSID) |
Bottom section -- Clients:
| Column | Meaning |
|---|---|
| STATION | Client MAC address |
| PWR | Client signal strength |
| Rate | Connection speed |
| Lost | Packets lost (high = interference or distance) |
| Frames | Total frames captured from this client |
| Probe | SSIDs the client is actively searching for |
-20 to -30 dBm = very close (within a few feet). -30 to -50 dBm = same room. -50 to -70 dBm = through a wall or two. -70 to -90 dBm = barely detectable, far away. Use this to physically locate the transmitting device as you walk through the building.
Example airodump-ng Output
All-channel scan (what you might see initially):
CH 9 ][ Elapsed: 30 s ][ 2026-03-22 14:30
BSSID PWR Beacons #Data #/s CH MB ENC CIPHER AUTH ESSID
19:33:CE:D0:A2:9F -42 245 18 0 149 540 WPA2 CCMP PSK CTS-A
AA:BB:CC:DD:EE:FF -58 198 0 0 157 270 WPA2 CCMP PSK CTS-A
00:1A:2B:3C:4D:5E -71 82 3 0 36 130 WPA2 CCMP PSK Neighbor_WiFi
11:22:33:44:55:66 -85 31 0 0 6 54 WPA2 CCMP PSK DIRECT-tv
BSSID STATION PWR Rate Lost Frames Probe
19:33:CE:D0:A2:9F C0:A8:10:42:67:7E -38 54e-24e 0 124 CTS-A
19:33:CE:D0:A2:9F 50:2E:91:48:F6:4A -45 54e-24e 0 87 CTS-A
(not associated) B0:68:E6:B2:19:7B -32 0 - 1 0 3 CTS-AExampleIn this example, the highlighted line shows a SECOND AP broadcasting "CTS-A" on channel 157 with a DIFFERENT BSSID. That's the rogue device. Note the BSSID AA:BB:CC:DD:EE:FF (placeholder -- yours will be different).
Locked to channel 157 (what the attack channel looks like):
CH 157 ][ Elapsed: 2 mins ][ 2026-03-22 14:35
BSSID PWR Beacons #Data #/s CH MB ENC CIPHER AUTH ESSID
AA:BB:CC:DD:EE:FF -52 1247 0 0 157 270 WPA2 CCMP PSK CTS-A
BSSID STATION PWR Rate Lost Frames Probe
(no clients -- everyone has moved to channel 149)Example -- Ch 157A lone AP on channel 157 still broadcasting CTS-A -- that's the planted device. High beacon count, zero data frames (no clients are connecting), signal strength tells you how close you are.
What Is an Evil Twin?
An evil twin is a rogue access point broadcasting the same SSID (CTS-A) on the same or nearby channel, potentially with a stronger signal than the real AP. It creates a cycle:
- Client sees two APs advertising "CTS-A" -- one is the real Peplink, one is the rogue
- Client tries to roam to the rogue (especially if it has stronger signal)
- Client fails WPA2 authentication (wrong PSK or no PSK on the rogue)
- Client falls back to the real AP
- Client sees the rogue again, tries again -- cycle repeats
- Result: constant disconnects, reconnects, degraded performance
Moving the real AP to channel 149 doesn't help if the rogue is still broadcasting "CTS-A" on 157. Clients that remember channel 157 will still see the rogue during background scans. And if the rogue has stronger signal, clients may prefer it over the real AP.
How to Detect an Evil Twin
Step 1: airodump-ng -- look for two BSSIDs with the same ESSID
# Scan all channels -- look for TWO entries for "CTS-A" with different BSSIDs $ sudo airodump-ng wlan1mon
What to look for:
- Two BSSIDs for "CTS-A" -- the real one (
19:33:CE:D0:A2:9F) and an unknown one - Different channels -- real AP on 149, rogue potentially on 157 (or any channel)
- Different encryption level -- rogue may show OPN (open) or lower encryption
- Different signal strength -- rogue may be stronger if it's closer to the building
- Different MB (speed) rating -- rogue hardware may support different max speeds
Step 2: Wireshark -- compare beacon frame details between the two BSSIDs
# Filter beacons from the suspected rogue BSSID wlan.fc.type_subtype == 0x0008 && wlan.bssid == AA:BB:CC:DD:EE:FF # Compare with beacons from the real AP wlan.fc.type_subtype == 0x0008 && wlan.bssid == 19:33:CE:D0:A2:9F
Compare these details between the two BSSIDs:
- Vendor-specific IEs (Information Elements) -- real Peplink will have Peplink vendor IEs; a Raspberry Pi or Pineapple won't
- Supported rates -- different hardware = different rate sets
- HT/VHT capabilities -- hardware capability differences will show here
- Beacon interval -- default is 100 TU; attack tools sometimes use different values
- RSN (Robust Security Network) IE -- differences in cipher suites or AKM suites
Confirmation Steps
# Lock to channel 157 and look for ANY AP broadcasting "CTS-A" # that ISN'T the real Peplink BSSID $ sudo airodump-ng wlan1mon --channel 157 # If you find one, capture its traffic specifically $ sudo airodump-ng wlan1mon --channel 157 --bssid AA:BB:CC:DD:EE:FF -w evil_twin_capture
A neighbor's AP won't be broadcasting "CTS-A". If you see a non-Peplink BSSID with ESSID "CTS-A", it is definitively a rogue device. There is no innocent explanation for a second AP broadcasting your company's private SSID.
How CSA Works
Channel Switch Announcement is a legitimate 802.11 mechanism designed to let an AP tell clients "I'm moving to a new channel -- follow me." It's embedded as an Information Element (IE) inside beacon frames and probe responses.
In a CSA injection attack:
- The attacker sends fake beacon frames with the real AP's BSSID (spoofed)
- These beacons contain a CSA IE that says "AP is moving to channel X"
- Clients receive the beacon, see the CSA, and obey -- they switch to channel X
- On channel X, the real AP isn't there. Clients lose connectivity.
- Clients eventually scan back, find the real AP, reconnect -- then get hit again
Why PMF Does NOT Protect Against CSA
PMF (802.11w) protects unicast management frames (deauth, disassoc sent to specific clients). But beacon frames are broadcast -- they must be readable by any device, including ones that haven't authenticated yet. There is no mechanism to sign or encrypt beacons in 802.11w. CSA rides inside beacons, so PMF cannot protect against it.
This is the critical distinction: deauth attacks send forged unicast management frames (which PMF can verify). CSA attacks modify broadcast beacons (which PMF cannot verify). The 802.11 specification has no protection for broadcast management frames.
Detection in Your Captures
Wireshark filters for CSA:
# CSA Information Element (tag number 37) wlan.tag.number == 37 # Extended CSA (tag number 60, extension 33) wlan.ext_tag.number == 33 # CSA channel switch mode field wlan.csa.channel_switch_mode # Beacons containing CSA on channel 157 wlan.fc.type_subtype == 0x0008 && wlan.tag.number == 37 # Action frames with Spectrum Management category (includes CSA) wlan.fixed.category_code == 0 # Combine: any CSA activity on the CTS-A BSSID wlan.tag.number == 37 && wlan.bssid == 19:33:CE:D0:A2:9F
tshark one-liner to detect CSA in a capture file:
$ tshark -r capture_157-01.cap -Y "wlan.tag.number == 37" -T fields -e frame.time -e wlan.bssid -e wlan.csa.channel_switch.new_channel_numbermdk4 CSA signature (what the attack tool generates):
# This is what an attacker WOULD run (DO NOT EXECUTE -- reference only) # mdk4 wlan0mon d -c 157 # This generates fake beacons with CSA IE on channel 157
What the Captured Frame Looks Like
In Wireshark, expand a beacon frame containing CSA. You'll see:
IEEE 802.11 Beacon frame
Tagged parameters:
...
Tag: Channel Switch Announcement (37)
Tag Number: Channel Switch Announcement (37)
Tag length: 3
Channel Switch Mode: 1 <-- 1 = clients must stop transmitting
New Channel Number: 36 <-- channel the attacker wants clients to go to
Channel Switch Count: 1 <-- switch after 1 more beacon intervalWireshark DetailKey fields to examine:
- Channel Switch Mode: 1 -- tells clients to stop transmitting immediately (more disruptive)
- New Channel Number -- where clients are being told to go. If this is a channel the real AP isn't on, it's an attack
- Channel Switch Count -- how many beacon intervals before the switch. Low values (1-3) cause immediate disruption
Legitimate CSA from the real AP WOULD be expected if it was actually changing channels. Check the BSSID on the CSA-containing beacons. If the BSSID is the real AP but the channel switch target makes no sense, the frames are spoofed. If the BSSID is different from the real AP, it's either an evil twin or a beacon flood with CSA embedded.
For each model below: what it looks like in airodump-ng, what to filter for in Wireshark, whether PMF blocks it, and how to remediate.
A. Classic Deauth Flood
Blocked by PMFForged deauthentication frames sent from a spoofed AP BSSID to target client MACs, forcing them to disconnect.
| Airodump-ng | "Deauth" counter on the AP row climbs rapidly (tens/hundreds per second) |
| Wireshark filter | wlan.fc.type_subtype == 0x000c |
| Frame details | src=AP BSSID, dst=target client MAC, reason code usually 7 or 1 |
| PMF status | Blocked when PMF is Required. In Optional/transition mode, only clients that negotiated PMF are protected. |
| Remediation | PMF Required (not Optional). WPA3-only mode (not transition). |
B. CSA (Channel Switch Announcement) Injection
NOT Blocked by PMF Strongest CandidateFake beacon frames injected with a Channel Switch Announcement (CSA) Information Element, telling clients to move to a different channel. The client obeys because CSA is in unprotected beacon frames.
| Airodump-ng | May not show obviously -- looks like normal beacon traffic. Watch for unexpected channel changes on clients. |
| Wireshark filter | wlan.tag.number == 37 or wlan.csa.channel_switch_mode |
| Frame details | Beacon frames containing Channel Switch Announcement IE with a target channel number |
| PMF status | NOT protected by PMF. CSA is carried in beacon frames, which are unprotected management frames even with 802.11w enabled. |
| Remediation | No direct PMF fix. Client-side: disable auto-roaming. AP-side: some APs can validate CSA. Best: avoid the channel, find and remove the device. |
PMF was enabled at 19:11 on March 20 and the attack continued. Classic deauth would have been blocked. CSA injection is the most likely method that can bypass PMF, because beacon frames are inherently unprotected in 802.11.
C. Rogue AP / Evil Twin
PMF Doesn't Apply Strong CandidateA second AP broadcasting the same SSID, attempting to trick clients into connecting to the attacker instead of the real AP. The client voluntarily roams. See Section 6 for detailed detection.
| Airodump-ng | TWO different BSSIDs for "CTS-A" -- the real one (19:33:CE:D0:A2:9F) and a second unknown BSSID. Different signal strengths, possibly different encryption. |
| Wireshark filter | wlan.fc.type_subtype == 0x0008 && wlan.ssid == "CTS-A" -- then check for multiple BSSIDs |
| PMF status | Doesn't apply -- client voluntarily connects to the rogue AP |
| Remediation | WIDS/WIPS, BSSID pinning on managed clients, find and remove the rogue AP |
D. Authentication Flood / DoS
PMF IrrelevantFloods the AP with fake authentication requests from random MAC addresses, exhausting the AP's client association table.
| Airodump-ng | High "Auth" count on the AP. Many unknown STATION entries appearing and disappearing. |
| Wireshark filter | wlan.fc.type_subtype == 0x000b |
| Frame details | Hundreds of authentication frames from random/spoofed MACs directed at the AP BSSID |
| PMF status | Irrelevant -- targets AP resources, not client protection mechanisms |
| Remediation | AP-side rate limiting, maximum client limits, AP firmware updates |
E. Beacon Flood
PMF IrrelevantThousands of fake beacon frames broadcast with the target SSID from many different spoofed BSSIDs, creating SSID confusion.
| Airodump-ng | Screen fills with dozens or hundreds of "CTS-A" entries, each from a different BSSID |
| Wireshark filter | wlan.fc.type_subtype == 0x0008 && wlan.ssid == "CTS-A" |
| PMF status | Irrelevant -- beacons are unprotected management frames |
| Remediation | Client-side BSSID pinning, WIDS |
F. RF Jamming
Not MAC-levelRaw RF noise on the 5 GHz frequency, not protocol-level. No valid frames, just electromagnetic interference.
| Airodump-ng | High noise floor, many retransmissions, poor signal quality. But NO suspicious management frames at all -- just degraded everything. |
| Wireshark | Lots of FCS errors, retransmissions, but no deauth/disassoc/CSA frames |
| PMF status | Irrelevant -- operates below the protocol layer |
| Characteristic | Affects ALL devices on the channel indiscriminately. Not MAC-targetable. |
| Remediation | Channel change (already done -- AP moved to 149), FCC complaint if persistent, find the source |
Management Frame Types
# All management frames wlan.fc.type == 0 # All control frames wlan.fc.type == 1 # All data frames wlan.fc.type == 2 # --- Specific management frame subtypes --- # Association request wlan.fc.type_subtype == 0x0000 # Association response wlan.fc.type_subtype == 0x0001 # Reassociation request wlan.fc.type_subtype == 0x0002 # Probe request wlan.fc.type_subtype == 0x0004 # Probe response wlan.fc.type_subtype == 0x0005 # Beacon frames wlan.fc.type_subtype == 0x0008 # Disassociation wlan.fc.type_subtype == 0x000a # Authentication wlan.fc.type_subtype == 0x000b # Deauthentication wlan.fc.type_subtype == 0x000c # Action frames wlan.fc.type_subtype == 0x000d
Reason Codes (Deauth/Disassoc)
# Reason code 1 -- Unspecified reason wlan.fixed.reason_code == 1 # Reason code 7 -- Class 3 frame from nonassociated STA (most common in attacks) wlan.fixed.reason_code == 7 # Reason code 6 -- Class 2 frame from nonauthenticated STA wlan.fixed.reason_code == 6
Address-based Filters
# Frames from specific BSSID wlan.bssid == XX:XX:XX:XX:XX:XX # Frames TO a specific client (destination address) wlan.da == XX:XX:XX:XX:XX:XX # Frames FROM a specific client (source address) wlan.sa == XX:XX:XX:XX:XX:XX # Any frame involving a specific MAC (source, dest, or BSSID) wlan.addr == XX:XX:XX:XX:XX:XX # Broadcast frames (sent to all clients) wlan.da == ff:ff:ff:ff:ff:ff
Other Useful Filters
# Retransmissions (high count = interference or jamming) wlan.fc.retry == 1 # FCS (Frame Check Sequence) errors -- corrupted frames frame.checksum_bad == 1 # CSA Information Element wlan.tag.number == 37 # Extended CSA wlan.ext_tag.number == 33 # Specific SSID in beacons/probes wlan.ssid == "CTS-A" # Beacons claiming to be CTS-A (spot the rogue) wlan.fc.type_subtype == 0x0008 && wlan.ssid == "CTS-A"
Combined Filter Examples
# All deauth AND disassoc frames from the CTS-A BSSID (wlan.fc.type_subtype == 0x000c || wlan.fc.type_subtype == 0x000a) && wlan.bssid == 19:33:CE:D0:A2:9F # Deauth frames targeting Jonathan's desktop wlan.fc.type_subtype == 0x000c && wlan.da == C0:A8:10:42:67:7E # All management frames from an unknown/rogue BSSID wlan.fc.type == 0 && wlan.bssid == AA:BB:CC:DD:EE:FF # Beacons with CSA from CTS-A (the attack signature) wlan.fc.type_subtype == 0x0008 && wlan.ssid == "CTS-A" && wlan.tag.number == 37 # Everything NOT from the real AP (find the rogue) wlan.ssid == "CTS-A" && !(wlan.bssid == 19:33:CE:D0:A2:9F)
Wireshark Deauth Frame Details (What You'll See)
Frame 1247: 26 bytes on wire, 26 bytes captured
IEEE 802.11 Deauthentication, Flags: ........
Type/Subtype: Deauthentication (0x000c)
Frame Control Field: 0x00c0
Duration: 314 microseconds
Receiver address: C0:A8:10:42:67:7E (CTRS-JONATHAN-DESK)
Transmitter address: 19:33:CE:D0:A2:9F (CTS-A AP -- likely spoofed)
BSS Id: 19:33:CE:D0:A2:9F
Fragment number: 0
Sequence number: 0 <-- Sequence 0 is suspicious (attackers often use 0)
IEEE 802.11 wireless LAN management frame
Fixed parameters:
Reason code: Class 3 frame received from nonassociated STA (0x0007)Wireshark Detailtshark is Wireshark's CLI counterpart. Use it when you want to capture or analyze without the GUI -- useful for headless operation, scripted analysis, or when the GUI is too resource-heavy.
Basic Capture to File
# Capture on channel 157, write to file $ sudo tshark -i wlan1mon -w capture_157.pcap # Capture with a packet count limit (stop after 10000 frames) $ sudo tshark -i wlan1mon -c 10000 -w capture_157.pcap # Capture with a time limit (stop after 300 seconds / 5 minutes) $ sudo tshark -i wlan1mon -a duration:300 -w capture_157.pcap
tshark doesn't set the channel itself. Set it first with: sudo iwconfig wlan1mon channel 157
Live Display with Filter
# Show only deauth frames in real-time $ sudo tshark -i wlan1mon -Y "wlan.fc.type_subtype == 0x000c" # Show only CSA frames in real-time $ sudo tshark -i wlan1mon -Y "wlan.tag.number == 37" # Show deauth + disassoc with details $ sudo tshark -i wlan1mon -Y "wlan.fc.type_subtype == 0x000c || wlan.fc.type_subtype == 0x000a" -T fields -e frame.time -e wlan.sa -e wlan.da -e wlan.fixed.reason_code
Count, Export, and Analyze
# Count deauth frames in real time -- grouped by source and destination $ sudo tshark -i wlan1mon -Y "wlan.fc.type_subtype == 0x000c" -T fields -e wlan.sa -e wlan.da | sort | uniq -c | sort -rn # Export only deauth frames from a capture file to a new file $ tshark -r capture_157.pcap -Y "wlan.fc.type_subtype == 0x000c" -w deauth_only.pcap # Export CSA frames from a capture file $ tshark -r capture_157.pcap -Y "wlan.tag.number == 37" -w csa_only.pcap # Count all unique BSSIDs advertising "CTS-A" in a capture $ tshark -r capture_157.pcap -Y "wlan.fc.type_subtype == 0x0008 && wlan.ssid == \"CTS-A\"" -T fields -e wlan.bssid | sort -u # Summary statistics from a capture file $ tshark -r capture_157.pcap -z io,stat,0,"wlan.fc.type_subtype == 0x000c","wlan.fc.type_subtype == 0x000a","wlan.tag.number == 37"
Example tshark Deauth Count Output
1247 19:33:CE:D0:A2:9F C0:A8:10:42:67:7E
893 19:33:CE:D0:A2:9F 50:2E:91:48:F6:4A
456 19:33:CE:D0:A2:9F B0:3C:DC:3A:B8:FD
312 19:33:CE:D0:A2:9F ff:ff:ff:ff:ff:ff
89 19:33:CE:D0:A2:9F 2C:0D:A7:9C:63:D2Example OutputLeft column = count, middle = source (spoofed AP BSSID), right = target. Jonathan's desktop was hit hardest (1247 deauths), followed by Nick's laptop (893).
Before walking the building (Section 12), understand the tools available for signal strength monitoring. Each gives you a different view of RF activity.
Monitoring Tools
airodump-ng PWR column -- simplest, already running
# The PWR column in airodump-ng updates in real-time $ sudo airodump-ng wlan1mon --channel 157
wavemon -- terminal-based real-time signal visualization
# Launch wavemon on the monitor interface $ sudo wavemon -i wlan1mon
wavemon - wlan1mon
Levels:
link quality: ||||||||||||||||||||||||---- 70/100
signal level: |||||||||||||||----------- -52 dBm
noise level: ||||----------------------- -95 dBm
SNR: ||||||||||||||||----------- 43 dB
Statistics:
RX: 12847 packets TX: 0 packets (monitor mode)
Interface: wlan1mon Mode: Monitor Channel: 157 (5785 MHz)wavemon Examplehorst -- histogram view of signal strength
# horst with channel lock $ sudo horst -i wlan1mon -C 157
linssid -- graphical scanner with signal strength over time (requires X display)
$ sudo linssidSystematic Sweep Procedure
- Start at the AP location -- this gives you a known reference point for signal baseline
- Open
airodump-ng --channel 157and note the rogue device's PWR at the AP location - Walk a grid pattern through the building -- hallway first, then each room
- At each location, pause for 5 seconds and note the PWR value
- Record observations as you go: "Loading dock: PWR -45 from rogue on ch157"
- Move toward stronger signal (closer to 0 = closer to device)
- Draw a rough signal heat map as you go -- even on paper
Signal Strength Reference:
| PWR (dBm) | Approximate Distance | You Are... |
|---|---|---|
| -20 to -30 | Within a few feet | Right on top of it |
| -30 to -50 | Same room | Very close, narrow it down |
| -50 to -65 | Adjacent room / through one wall | Getting warmer |
| -65 to -75 | Two rooms away / multiple walls | In the right area |
| -75 to -90 | Far away or heavily obstructed | Keep searching |
- Hold the adapter at chest height -- consistent elevation reduces variance
- Use the USB extension cable to position the adapter away from your body (body blocks RF)
- Signal bounces off metal -- reading may spike near filing cabinets, ductwork, or elevator shafts
- 5 GHz signals don't penetrate walls well -- rapid PWR changes mean the device is probably on your floor, not above/below
- Take multiple readings at each spot -- WiFi signal fluctuates by +/- 5 dBm moment to moment
Your goal is to use signal strength (PWR) to physically walk toward the planted device. This is RF direction-finding on foot.
Walk-Down Procedure
# Lock to channel 157 and watch signal strength $ sudo airodump-ng wlan1mon --channel 157
- Start at the AP location -- this gives you a known reference point
- Note the PWR value of the suspicious BSSID on channel 157
- Walk slowly through the building, watching the PWR column on your laptop screen
- Move in the direction where PWR gets closer to 0 (stronger signal)
- When PWR is around -30 to -20 dBm, you are within a few feet of the device
- Use the USB extension cable to position the adapter like a wand -- move it around to pinpoint the exact spot
Common Hiding Spots
- Server closets, network cabinets, patch panel areas
- Behind or under desks, especially in unused workstations
- Ceiling tiles (dropped ceiling) -- check above the grid
- Electrical outlets with USB ports -- could be a tiny device plugged directly in
- Behind furniture, shelving, filing cabinets
- Vehicles in the parking lot (if signal is strongest near exterior wall)
- Powered USB hubs behind monitors or under desks
Common Device Form Factors
- Raspberry Pi in a small case (credit-card sized computer, usually black, with a USB WiFi adapter plugged in)
- USB WiFi adapter plugged into a powered USB hub or wall-wart USB charger behind furniture
- Old laptop left running in a bag or backpack, possibly under a desk or in a closet
- WiFi Pineapple or similar purpose-built attack device (small box, usually with multiple antennas)
- Modified router running OpenWrt or similar custom firmware
When You Find It: DO NOT TOUCH IT
- Photograph it in place -- multiple angles, show what it's connected to and exactly where it is
- Note the exact location -- room, desk, outlet, whose workspace it's near
- Note what it's connected to -- power source, any network cables, any attached antennas
- Check if anyone is nearby and note who
- Take a screenshot of airodump-ng showing the signal strength at this location:
$ scrot ~/evidence/device_found_$(date +%Y%m%d_%H%M%S).png - THEN retrieve it as evidence -- handle with care, power it off by unplugging (do not use the shutdown command; pulling power preserves volatile memory state better)
- Bag and label with date, time, location, who found it
The .cap / .pcap files generated by airodump-ng and tshark are your primary forensic evidence. They are timestamped, contain every raw 802.11 frame captured, and are admissible as network forensic evidence.
File Handling
- Capture files are written to the current directory with the prefix you specified in
-w - Multiple file types are created:
.cap(packet capture),.csv(summary),.kismet.csv,.kismet.netxml - The
.capfile is the important one -- it contains the raw frames
Backup Immediately
# Create an evidence directory with today's date $ mkdir -p ~/evidence/$(date +%Y%m%d) # Copy all capture files $ cp capture_157* ~/evidence/$(date +%Y%m%d)/ # Also copy to a separate USB drive if available $ cp capture_157* /media/kali/BACKUP_USB/ # Generate SHA256 checksums for integrity verification $ sha256sum ~/evidence/$(date +%Y%m%d)/*.cap > ~/evidence/$(date +%Y%m%d)/checksums.sha256
Documentation Checklist
For every capture session, record:
- Date and time (start and stop of capture)
- Channel monitored
- Physical location of the laptop/adapter during capture
- What you observed -- BSSIDs seen, signal strengths, unusual activity
- File names of all captures generated
- SHA256 checksums of all evidence files
Screenshots
# Take a screenshot of the current screen $ scrot ~/evidence/screenshot_$(date +%Y%m%d_%H%M%S).png
Screenshot airodump-ng output at key moments -- when you first see the rogue device, when signal strength peaks (closest approach), etc.
If this evidence may be used in legal proceedings or HR action: maintain a written log of who handled the evidence files, when they were copied, and to where. The timestamps in the .cap files themselves are tamper-evident -- altering them would break the internal consistency of the capture.
For each attack type, what to do to stop it. The definitive fix for ALL of these is finding and removing the planted device.
| Attack Type | Immediate Mitigation | Long-term Fix |
|---|---|---|
| Classic Deauth | PMF set to Required (not Optional), WPA3-only mode (not transition) | WPA3-SAE with PMF Required. No transition mode -- legacy devices that don't support PMF will need to be upgraded. |
| CSA Injection | No direct PMF fix. Client-side: disable auto-roaming if supported. AP-side: some enterprise APs can validate CSA origin. | Avoid the attacked channel. Some client drivers allow CSA validation. Enterprise APs with WIDS can detect anomalous CSA. Finding and removing the device is the only reliable fix. |
| Evil Twin | WIDS/WIPS alerts. BSSID pinning on managed clients (not always possible with consumer devices). | Enterprise wireless with rogue AP detection. 802.1X authentication (eliminates PSK-based rogue risk). Find and remove the rogue AP. |
| Auth Flood | AP-side rate limiting, max client limits. | AP firmware updates, enterprise APs with DoS protection, find and remove the source. |
| Beacon Flood | BSSID pinning on clients, WIDS. | Enterprise wireless IDS. Find and remove the source. |
| RF Jamming | Channel change (already done -- AP moved to 149). | FCC complaint (illegal under 47 U.S.C. § 333). Find the jamming source and remove it. |
For ALL attack types: finding and physically removing the planted device is the definitive solution. Every other mitigation is a workaround. That's why you're here with this toolkit.
What You're Doing Is Legal
Passive monitoring of your own network is legal. You own the network infrastructure, you are authorized to manage it, and you are operating in a purely passive (receive-only) mode. Your adapter never transmits. You are a listener.
Key Legal Points
- Passive monitoring (what you're doing) is legal -- you own the network, you're an authorized administrator, you are a listener only
- Active attacks (deauth, injection, etc.) are illegal under the Computer Fraud and Abuse Act (CFAA, 18 U.S.C. § 1030) even on your own network IF they affect other people's devices -- but that's not what you're doing
- WiFi jamming is illegal under FCC regulations (47 U.S.C. § 333) -- if the planted device is jamming, it's the attacker who is breaking the law
- Evidence from passive capture is admissible in employment proceedings, civil litigation, and criminal investigations
Evidence Handling Best Practices
- Photograph everything before touching it -- multiple angles, context shots showing location
- Chain of custody: maintain a written log of who touched the evidence, when, where, and what was done
- Don't modify captures -- work with copies, keep originals pristine
- Hash everything -- SHA256 checksums on all evidence files, generated immediately after capture
- Timestamps are critical -- note your system clock accuracy, use NTP if internet is available
- Witness -- if possible, have a second person present when you find the device
Passive WiFi captures showing attack traffic from a planted device are strong evidence in employment proceedings. The capture files contain timestamped, machine-generated data that is difficult to fabricate. Combined with physical evidence (the device itself, photographs, location data), this builds a compelling case without relying on subjective testimony.
This section provides general information, not legal counsel. If this evidence is going to be used in legal proceedings beyond HR action, consult with an attorney who specializes in computer crime or employment law.
Quick Reference Card
The commands you'll use 90% of the time. Keep this visible.
Connect to Hotspot
$ nmcli dev wifi connect "YourHotspotName" password "YourPassword"Monitor Mode On (keeps internet alive)
$ sudo ip link set wlan1 down && sudo iw dev wlan1 set type monitor && sudo ip link set wlan1 upScan All Channels
$ sudo airodump-ng wlan1Lock to Channel 157 + Capture
$ sudo airodump-ng wlan1 --channel 157 -w evidenceOpen Capture in Wireshark
$ wireshark evidence-01.capKey Wireshark Filters
# Deauth frames wlan.fc.type_subtype == 0x000c # Disassociation frames wlan.fc.type_subtype == 0x000a # CSA (Channel Switch Announcement) wlan.tag.number == 37 # All beacons for CTS-A (spot the rogue) wlan.fc.type_subtype == 0x0008 && wlan.ssid == "CTS-A" # Everything from rogue that ISN'T the real AP wlan.ssid == "CTS-A" && !(wlan.bssid == 19:33:CE:D0:A2:9F) # Specific MAC wlan.addr == XX:XX:XX:XX:XX:XX
tshark Deauth Counter
$ sudo tshark -i wlan1mon -Y "wlan.fc.type_subtype == 0x000c" -T fields -e wlan.sa -e wlan.da | sort | uniq -c | sort -rnScreenshot Evidence
$ scrot ~/evidence/screenshot_$(date +%Y%m%d_%H%M%S).pngMonitor Mode Off
$ sudo airmon-ng stop wlan1mon- You are a passive listener. Your adapter never transmits. You are invisible to the network.
- The planted device is still running on channel 157 right now. It will be visible the moment you scan.
- Do NOT connect to CTS-A from the Kali laptop. Keep the ALFA adapter in monitor mode only.
- Internet goes through your phone hotspot on the internal WiFi adapter. These are independent.
- Document everything. Timestamps, locations, observations, screenshots, checksums.
- If you find the device: photograph first, retrieve second.