← retour aux outils back to tools

# 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