Probequest Documentation: Release 0.7.2
Probequest Documentation: Release 0.7.2
Release 0.7.2
Paul-Emmanuel Raoul
2 Installation 5
2.1 Using pip (recommended) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 From sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Usage 7
3.1 Enabling the monitor mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Command line arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 Use Case 11
5 Mitigation 13
6 Modules 17
6.1 ProbeQuest Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.2 Fake Packet Sniffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6.3 Packet Sniffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.4 PNL Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.5 Probe Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.6 Probe Request Sniffer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.7 Raw Probe Request Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
7 Development 21
7.1 Running the unit tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7.2 Releasing a new version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8 Security Policy 23
8.1 Reporting a Vulnerability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Index 27
i
ii
ProbeQuest Documentation, Release 0.7.2
ProbeQuest is a toolkit allowing to sniff and display the Wi-Fi probe requests passing nearby your wireless interface.
This project has been inspired by this paper.
TABLE OF CONTENTS 1
ProbeQuest Documentation, Release 0.7.2
2 TABLE OF CONTENTS
CHAPTER
ONE
Probe requests are sent by a station to elicit information about access points, in particular to determine if an access
point is present or not in the nearby environment. Some devices (mostly smartphones and tablets) use these requests
to determine if one of the networks they have previously been connected to is in range, leaking their preferred network
list (PNL) and, therefore, your personal information.
Below is a typical Wi-Fi authentication process between a mobile station (for example, your smartphone) and an
access point (AP):
3
ProbeQuest Documentation, Release 0.7.2
Step 1 is optional (and therefore, step 2) since the access points announce their presence by broadcasting their name
(ESSID) using beacon frames. Consequently, it is not necessary to rely on probe requests to get the list of the access
points available. It is a design choice that, although it speeds up the discovery process, causes privacy and security
issues.
ProbeQuest can be used to leverage this leak of information to conduct diverse social engineering and network attacks.
TWO
INSTALLATION
5
ProbeQuest Documentation, Release 0.7.2
6 Chapter 2. Installation
CHAPTER
THREE
USAGE
To be able to sniff the probe requests, your Wi-Fi network interface must be set to monitor mode.
For example:
For example:
7
ProbeQuest Documentation, Release 0.7.2
8 Chapter 3. Usage
ProbeQuest Documentation, Release 0.7.2
10 Chapter 3. Usage
CHAPTER
FOUR
USE CASE
Let’s consider the following simple scenario inspired from a real data collection (the data have been anonymised): a
device tries to connect to John’s iPhone, CompanyX_staff, STARBUCKS-FREE-WIFI and VM21ECAB2. Based on
this information, several assumptions can be made:
• The device owner’s name is John.
• The device is set in English and its owner speaks this language (otherwise it would have been iPhone de John
in French, iPhone von John in German, etc).
• The device should be a laptop trying to connect to an iPhone in hotspot mode. The owner has consequently at
least two devices and is nomad.
• The owner works for CompanyX.
• The owner frequents coffee shops, in particular StarBucks.
• The owner is used to connecting to open Wi-Fi access points.
• VM21ECAB2 seems to be a home access point and is the only one in the device’s PNL. It is likely the owner’s
place and, consequently, the device’s owner is a customer of Virgin Media.
As you can see, the amount of data inferred from these four probe requests is already impressive, but we can go
further. Relying on a database of Wi-Fi access points’ location, such as WIGLE.net, it becomes possible to determine
the places the device’s owner has previously been to. VM21ECAB2 should be a unique name, easily localisable on
a map. Same for CompanyX_staff. If this last one is not unique (because CompanyX has several offices), crossing
the data we have can help us in our investigation. For example, if CompanyX is present in several countries, we can
assume that the device’s owner lives in a country where both CompanyX and Virgin Media are present. Once we have
determined which office it is, we can suppose that the device’s owner is used to stopping in StarBucks located on their
way from home to their office.
Profiling a person is the first step to conduct a social engineering attack. The more we know about our target, the better
chance the attack has to succeed. Also, because we know which Wi-Fi access points our target’s devices will try to
connect to, an evil twin attack is conceivable.
11
ProbeQuest Documentation, Release 0.7.2
FIVE
MITIGATION
13
ProbeQuest Documentation, Release 0.7.2
14 Chapter 5. Mitigation
ProbeQuest Documentation, Release 0.7.2
15
ProbeQuest Documentation, Release 0.7.2
16 Chapter 5. Mitigation
CHAPTER
SIX
MODULES
ProbeQuest configuration.
class probequest.config.Config
Configuration object.
complile_essid_regex()
Returns the compiled version of the ESSID regex.
property display_func
Callback function triggered when a packet needs to be displayed.
generate_frame_filter()
Generates and returns the frame filter according to the different options set of the current ‘Config’ object.
property storage_func
Callback function triggered when a packet needs to be stored.
class probequest.config.Mode
Enumeration of the different operational modes supported by this software.
17
ProbeQuest Documentation, Release 0.7.2
stop()
Stops the fake packet sniffer.
Alias for ‘join()’.
18 Chapter 6. Modules
ProbeQuest Documentation, Release 0.7.2
toggle_sniffer_state()
Toggles the sniffer’s state.
unhandled_keypress(key)
Contains handlers for each keypress that is not handled by the widgets being displayed.
stop()
Stops the probe request sniffer.
20 Chapter 6. Modules
CHAPTER
SEVEN
DEVELOPMENT
21
ProbeQuest Documentation, Release 0.7.2
22 Chapter 7. Development
CHAPTER
EIGHT
SECURITY POLICY
If you have found a security issue in ProbeQuest, please disclose it responsibly by emailing me at
skyper(at)skyplabs[dot]net. My PGP public key can be found on my Keybase profile:
To facilitate the encryption process, you can use this online tool. You can also use it to verify my signatures.
23
ProbeQuest Documentation, Release 0.7.2
p
probequest.config, 17
probequest.fake_packet_sniffer, 17
probequest.packet_sniffer, 18
probequest.probe_request, 19
probequest.probe_request_sniffer, 19
probequest.ui.pnl, 18
probequest.ui.raw, 19
25
ProbeQuest Documentation, Release 0.7.2
J R
join() (probequest.fake_packet_sniffer.FakePacketSniffer RawProbeRequestViewer (class in probe-
method), 17 quest.ui.raw), 19
run() (probequest.fake_packet_sniffer.FakePacketSniffer
M method), 17
main() (probequest.ui.pnl.PNLViewer method), 18
27
ProbeQuest Documentation, Release 0.7.2
S
setup_menu() (probequest.ui.pnl.PNLViewer
method), 18
setup_view() (probequest.ui.pnl.PNLViewer
method), 18
start() (probequest.packet_sniffer.PacketSniffer
method), 18
start() (probequest.probe_request_sniffer.ProbeRequestSniffer
method), 19
start() (probequest.ui.raw.RawProbeRequestViewer
method), 19
start_sniffer() (probequest.ui.pnl.PNLViewer
method), 18
station_chosen() (probequest.ui.pnl.PNLViewer
method), 18
stop() (probequest.fake_packet_sniffer.FakePacketSniffer
method), 17
stop() (probequest.packet_sniffer.PacketSniffer
method), 18
stop() (probequest.probe_request_sniffer.ProbeRequestSniffer
method), 19
stop() (probequest.ui.raw.RawProbeRequestViewer
method), 19
stop_sniffer() (probequest.ui.pnl.PNLViewer
method), 18
storage_func() (probequest.config.Config prop-
erty), 17
T
toggle_sniffer_state() (probe-
quest.ui.pnl.PNLViewer method), 18
U
unhandled_keypress() (probe-
quest.ui.pnl.PNLViewer method), 19
28 Index