iOS devices transmit ARPs which sometimes contain MAC addresses (BSSIDs) of previously joined WiFi networks. iSniff GPS captures these ARPs and submits MAC addresses to Apple’s WiFi location service (masquerading as an iOS device) to obtain GPS coordinates for a given BSSID. If only SSID probes have been captured for a particular device, iSniff GPS can query network names on wigle.net and visualise possible locations.
By geo-locating multiple SSIDs and WiFi router MAC addresses, it is possible to determine where a device (and by implication its owner) is likely to have been.
Below: Visualisation of WiFi router locations in Melbourne, AU returned by Apple Location Services
iSniff GPS was developed and tested on a Ubuntu 12.04 (32-bit) VM with Python 2.7.3, Django 1.5.4 and Scapy 2.2.0-dev.
See requirements.txt for additional python modules required.
iSniff GPS contains 2 major components and further python modules:
- iSniff_import.py uses Scapy to extract data from a live capture or pcap file and inserts it into a database (iSniff_GPS.sqlite3 by default).
- A Django web application provides a browser-based interface to
view and analyse the data collected. This includes views of all detected
devices and the SSIDs / BSSIDs each has probed for, a view by network,
Google Maps views for visualising possible locations of a given BSSID or
SSID, and a pie chart view showing a breakdown of the most popular
device manufacturers based on client MAC address Ethernet OUIs.
- wloc.py provides a QueryBSSID()
function which looks up a given BSSID (AP MAC address) on Apple’s WiFi
location service. It will return the coordinates of the MAC queried for
and usually an additional 400 nearby BSSIDs and their coordinates.
- wigle.py provides a getLocation()
function for querying a given SSID on the wigle.net database and returns
GPS coordinates. It must be configured with a valid wigle.net auth
cookie. Please respect the wigle.net ToS in using this module.