p0f
Empreinte OS et réseau passive. Identifie les systèmes d'exploitation, navigateurs, et la topologie réseau depuis du trafic capturé sans envoyer aucun paquet : reconnaissance totalement furtive. Passive OS and network fingerprinter. Identifies operating systems, browsers, and network topology from captured traffic without sending any packets — completely covert reconnaissance.
↗ https://lcamtuf.coredump.cx/p0f3/Overview
p0f performs passive OS fingerprinting by analyzing network traffic characteristics. Unlike active scanners, it never sends packets — it only observes existing traffic. Identifies OS, browser, NAT presence, firewall behavior, and network topology from TCP/IP characteristics.
Basic Usage
Passive fingerprinting on an interface
p0f -i eth0
Read from pcap file
p0f -r capture.pcap
Listen on specific interface
sudo p0f -i wlan0
With API socket (for integration)
p0f -i eth0 -s /tmp/p0f.sock
Output Reading
# p0f shows connection fingerprints as they arrive:
# .-[ 192.168.1.100/45123 -> 192.168.1.1/80 (syn) ]-
# | client = 192.168.1.100
# | os = Windows 7 or 8
# | dist = 3
# | params = none
# | raw_sig = 4:128+8:0:1460:mss*44,6:mss,sok,ts,nop,ws:df,id+:0
# `----
# Fields:
# os — detected operating system
# dist — TTL-estimated hop distance
# params — connection characteristics (NAT, firewall, etc.)
Capturing Traffic for Analysis
Capture traffic to pcap first (for later analysis)
tcpdump -i eth0 -w capture.pcap
Analyze with p0f
p0f -r capture.pcap -o p0f_output.txt
Filter to specific host
p0f -r capture.pcap 'host 192.168.1.100'
API Mode
Start with API socket
p0f -i eth0 -s /tmp/p0f.sock -d
# Query the API (Python)
# p0f provides a C API and Python bindings
# Useful for embedding in applications
Filtering
Only fingerprint specific traffic
p0f -i eth0 'tcp and host 10.10.10.1'
Only SYN packets (most informative)
p0f -i eth0 'tcp[tcpflags] == tcp-syn'
Tips
- p0f requires no special privileges beyond raw socket access (run with sudo)
- Most useful in man-in-the-middle positions or when monitoring network traffic
- OS detection from TCP fingerprints is probabilistic — treat as a hint, not fact
- The
distfield shows estimated network hops — helps understand topology - Identify NAT devices by spotting mismatched TTLs and packet characteristics
- Run alongside a packet capture during engagements to profile client environments
Help / Man page
p0f [options] ['filter rule']
-i IFACE Capture interface (default: first non-loopback)
-r FILE Read from pcap file
-o FILE Output log file
-s FILE Socket for API queries
-d Daemon mode (fork to background)
-u USER Drop privileges to this user
-p Run in promiscuous mode
-v Verbose output
Vue d’ensemble
p0f effectue une prise d’empreinte OS passive en analysant les caractéristiques du trafic réseau. Contrairement aux scanners actifs, il n’envoie jamais de paquets : il ne fait qu’observer le trafic existant. Identifie l’OS, le navigateur, la présence de NAT, le comportement du firewall, et la topologie réseau à partir des caractéristiques TCP/IP.
Utilisation de base
# Prise d'empreinte passive sur une interface
p0f -i eth0
# Lire depuis un fichier pcap
p0f -r capture.pcap
# Écouter sur une interface spécifique
sudo p0f -i wlan0
# Avec socket API (pour intégration)
p0f -i eth0 -s /tmp/p0f.sock
Lecture de la sortie
# p0f affiche les empreintes de connexion au fur et à mesure :
# .-[ 192.168.1.100/45123 -> 192.168.1.1/80 (syn) ]-
# | client = 192.168.1.100
# | os = Windows 7 or 8
# | dist = 3
# | params = none
# | raw_sig = 4:128+8:0:1460:mss*44,6:mss,sok,ts,nop,ws:df,id+:0
# `----
# Champs :
# os : système d'exploitation détecté
# dist : distance en sauts estimée via le TTL
# params : caractéristiques de connexion (NAT, firewall, etc.)
Capture de trafic pour analyse
# Capturer le trafic dans un pcap d'abord (pour une analyse ultérieure)
tcpdump -i eth0 -w capture.pcap
# Analyser avec p0f
p0f -r capture.pcap -o p0f_output.txt
# Filtrer sur un hôte spécifique
p0f -r capture.pcap 'host 192.168.1.100'
Mode API
# Démarrer avec un socket API
p0f -i eth0 -s /tmp/p0f.sock -d
# Interroger l'API (Python)
# p0f fournit une API C et des bindings Python
# Utile pour l'intégrer dans des applications
Filtrage
# Ne prendre l'empreinte que du trafic spécifique
p0f -i eth0 'tcp and host 10.10.10.1'
# Uniquement les paquets SYN (les plus informatifs)
p0f -i eth0 'tcp[tcpflags] == tcp-syn'
Conseils
- p0f ne nécessite aucun privilège particulier au-delà de l’accès raw socket (lancer avec sudo)
- Le plus utile en position man-in-the-middle ou lors de la surveillance du trafic réseau
- La détection d’OS depuis les empreintes TCP est probabiliste : à traiter comme un indice, pas un fait
- Le champ
distmontre le nombre de sauts réseau estimé : aide à comprendre la topologie - Identifier les équipements NAT en repérant les TTL incohérents et les caractéristiques de paquets
- Lancer en parallèle d’une capture de paquets pendant les missions pour profiler les environnements clients
Aide / Page de manuel
p0f [options] ['filter rule']
-i IFACE Capture interface (default: first non-loopback)
-r FILE Read from pcap file
-o FILE Output log file
-s FILE Socket for API queries
-d Daemon mode (fork to background)
-u USER Drop privileges to this user
-p Run in promiscuous mode
-v Verbose output