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 dist field 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 dist montre 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