Net Spy
EXP
netspy / ns — Client-Isolation Device Recon
Discovers devices on a WiFi network that has client isolation enabled — where a normal ARP scan (netdiscover / nd) sees only the gateway because the access point blocks client-to-client unicast traffic.
Connect first.
nsworks only while associated to the target network — runconnectwifi/cwfirst. Use on your own networks only.
CMD> cw MyNetwork
CMD> ns
How it works — 100% passive
ns never transmits a single frame. Client isolation only blocks client↔client unicast; broadcast and multicast frames (ARP, DHCP, mDNS, SSDP) are still relayed by the AP to all associated clients, encrypted with the group key. Because the T-Deck is associated, its WiFi hardware already decrypts those group frames — in promiscuous mode they arrive in the clear. So ns simply listens to that group traffic and parses it. To the network it looks like an ordinary idle client.
From this passive stream it reconstructs each device’s IP, MAC, vendor, hostname, and services:
| Source | Gives |
|---|---|
| ARP | MAC + IP |
| IPv4 | MAC + IP |
| DHCP (opt 12) | hostname |
mDNS (.local) | hostname + service types |
| SSDP / UPnP | product/model (Roku, Sonos, TVs, printers) |
The HOW column flags which sources saw each device: A=ARP I=IPv4 D=DHCP M=mDNS S=SSDP.
Timing note: IP/MAC fill in within seconds (constant broadcast traffic). Hostnames depend on the device talking — DHCP only fires when a device joins or renews its lease (can be hours), while mDNS/SSDP devices (Apple/Google/IoT/media) announce constantly, so they name themselves quickly. Reconnect a phone’s WiFi to force an immediate DHCP hostname.
Keys
| Key | Action |
|---|---|
trackball ↑ / ↓ | Select a device row |
Enter (or i) | Open the device detail (full MAC, IP, name, vendor, seen-via, services) — any key returns |
p | Ping the selected device |
o | Port-scan the selected device (top ports) |
s | Save the table to SD |
c | Clear the table |
l / a | Next / previous page |
q | Quit |
p and o run the normal ping / portscan tools against the selected device’s IP without leaving netspy — sniffing pauses while the scan runs, then resumes with the table intact. No need to remember an index. (This is the recon → probe workflow: find a device isolation hid, then ping/scan it in place.)
Targeting netspy devices from the CLI
The table’s leftmost # column is the device index. After ns runs (the list persists after you quit, like the netdiscover cache), you can target those devices from the command line with an ns<#> token — the same way a bare # targets the netdiscover list:
CMD> pg ns0 # ping netspy device 0
CMD> ps top ns2 # top-ports scan of netspy device 2
CMD> ps ns3 1 1024 # full port scan of netspy device 3
# (or nd<#>) still means the netdiscover ARP-cache index; ns<#> means the netspy index.
A + next to a row means services were detected — press Enter to see them (AirPlay, Cast, HomeKit, Printer, SSH, SMB, DLNA, …).
Subcommands
CMD> ns gtk # show the live group key (read from RAM; does not transmit)
CMD> ns dump # dump wpa_supplicant state to /apps/netspy/gwpasm.txt
These read the device’s own wpa_supplicant memory and are groundwork for a future active module — ns itself stays passive.
Files
/apps/netspy/NNN.csv # full recon table — time,mac,ip,name,vendor,type,how,services
/apps/netspy/gwpasm.txt # ns dump output
Credit
Technique reimplemented from AirSnitch (Mathy Vanhoef et al., NDSS 2026) — published research, no code used. See NOTICES.