【オプション一覧つき】p0fで始めるパッシブOSフィンガープリンティング

ネットワークトラフィックを受動的に解析するパッシブOSフィンガープリンティングツール
- p0f -

p0fは、パケットを一切送信せずにOSやミドルウェア情報を推定できるパッシブフィンガープリンティングツールです。

本記事では、p0fのインストール方法からコマンドの使い方、各種オプションの活用法まで徹底解説!リアルタイム解析やpcap解析など、現場で役立つ具体的な活用方法が満載です。

実際にNmapと比較した検証デモも掲載していますので、理論と実践の両面からp0fへの理解を深めることができます。

目次

p0fとは

p0fは、ネットワーク上を流れるパケットを受動的に観測し、OSやミドルウェア情報の推定を行うパッシブフィンガープリンティングツールです。対象ホストに対してパケットを送信する必要はなく、トラフィックが流れているネットワーク上に配置することが前提となります。Michal Zalewski氏によって開発され、現在はバージョン3系が広く利用されています。

主な特徴
  • パッシブOSフィンガープリンティング
    • 通信パケットを観測するだけで、対象ホストのOSを推定(スキャン不要)
  • TCPのSYN、SYN/ACKパケットを解析
    • TTL、ウィンドウサイズ、TCPオプションなどから識別
  • リアルタイム解析が可能
    • ネットワークトラフィックを即座に分析し、結果を出力
  • 軽量・高速
    • リソース消費が少なく、常時監視用途に向いている

パッシブ(受動的)という点がp0fの最大の特徴です。p0fは自らパケットを送信せず、ネットワークインターフェースを流れるパケットをキャプチャし、TCPヘッダのフィールドやHTTPヘッダの特徴からOSやミドルウェア情報を推定します。

アクティブスキャンとの違い

p0fを理解する上で、Nmapに代表されるアクティブスキャンとの違いを整理することが重要です。両者は「対象のOS・サービスを把握する」という目的は共通していますが、アプローチが根本的に異なります。

比較項目p0f(パッシブ)Nmap(アクティブ)
パケット送信しないする
対象ホストへの痕跡残らないログに記録される
リアルタイム性通信が発生するまで待機が必要任意のタイミングで情報収集が可能
検出される可能性低いIDS/IPS に検知されやすい
取得できる情報の範囲主にOSOS・開放ポート・サービスバージョンなど
ネットワーク負荷ほぼゼロスキャン強度による
利用シーンネットワーク監視・トラフィック分析脆弱性診断、ペネトレーションテスト

Nmapはプローブパケットを対象ホストへ送信し、その応答を解析します。そのため、対象ホストのアクセスログやIDSのアラートに記録が残ります。

一方、p0fは既存のトラフィックを観測するだけなので、対象ホストに一切のパケットを送らず、ログにも痕跡が残りません。

ご利用に際しての留意点

通信が行われていないホストは検出できません

実際に通信が発生しなければ情報を収集できないため、通信が行われるまで待機する必要があります。また、取得できる情報はNmapと比較して限定的であり、開放ポートの一覧取得などはできません。

倫理および社内規定に関する注意事項

p0fは受動的なツールであるため安全に見えますが、ネットワークトラフィックの監視は極めてセンシティブな行為です。技術的に「見ているだけ」であっても、社内の情報セキュリティポリシーを確認した上でご使用下さい。

p0fのインストール

主要なLinuxディストリビューションでは、パッケージとして提供されています。この記事では、Debian系のディストリビューションであるKali LinuxUbuntu、およびWindowsへのインストール手順を解説します。

Windows環境にはネイティブ対応していないため、インストールには追加の手順が必要です。

Kali Linux 2026.1の場合

APTパッケージマネージャを使用してインストールします。

# パッケージリストの更新
$ sudo apt update

# パッケージ情報の確認
$ apt show p0f
Package: p0f
Version: 3.09b-4
Priority: optional
Section: net
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Installed-Size: 223 kB
Depends: libc6 (>= 2.34), libpcap0.8t64 (>= 0.9.8)
Homepage: https://lcamtuf.coredump.cx/p0f3/
Tag: interface::commandline, network::scanner, role::program, scope::utility
Download-Size: 80.0 kB
APT-Sources: http://http.kali.org/kali kali-rolling/main amd64 Packages
Description: Passive OS fingerprinting tool
 p0f performs passive OS detection based on SYN packets. Unlike nmap
 and queso, p0f does recognition without sending any data.
 Additionally, it is able to determine the distance to the remote
 host, and can be used to determine the structure of a foreign or
 local network. When running on the gateway of a network it is able
 to gather huge amounts of data and provide useful statistics. On a
 user-end computer it could be used as powerful IDS add-on. p0f
 supports full tcpdump-style filtering expressions, and has an
 extensible and detailed fingerprinting database.

# p0fのインストール
$ sudo apt install p0f

インストール後のバイナリは、/usr/sbin/p0fに配置されます。

$ which p0f
/usr/sbin/p0f

Ubuntu 24.04 LTSの場合

Kali Linuxと同様、Ubuntuでも公式リポジトリからインストール可能です。

# パッケージリストの更新
$ sudo apt update

# パッケージ情報の確認
$ apt show p0f
Package: p0f
Version: 3.09b-3build2
Priority: extra
Section: universe/net
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 221 kB
Depends: libc6 (>= 2.38), libpcap0.8t64 (>= 0.9.8)
Homepage: http://lcamtuf.coredump.cx/p0f3/
Download-Size: 79.9 kB
APT-Sources: http://jp.archive.ubuntu.com/ubuntu noble/universe amd64 Packages
Description: Passive OS fingerprinting tool
 p0f performs passive OS detection based on SYN packets. Unlike nmap
 and queso, p0f does recognition without sending any data.
 Additionally, it is able to determine the distance to the remote
 host, and can be used to determine the structure of a foreign or
 local network. When running on the gateway of a network it is able
 to gather huge amounts of data and provide useful statistics. On a
 user-end computer it could be used as powerful IDS add-on. p0f
 supports full tcpdump-style filtering expressions, and has an
 extensible and detailed fingerprinting database.

# p0fのインストール
$ sudo apt install p0f

Windowsの場合

p0fはもともとUnix系OS向けに開発されており、Windows環境ではネイティブ動作をサポートしていません。Windowsで利用するには、以下のいずれかの方法で実行環境を構築する必要があります。

  • VirtualBoxなどの仮想環境を利用する(推奨)
  • WSL(Windows Subsystem for Linux)を利用する
  • Cygwinを利用してソースコードからビルドする(非推奨)

p0fはLinux環境での利用が前提となるツールです。特にセキュリティ診断やトラフィック分析を目的とする場合は、Kali LinuxまたはUbuntuをベースとした環境構築が最も効率的です。

ソースコードを公式サイトからダウンロードして、Cygwin上でビルドすることも可能ですが、依存関係の問題により構築が難しいため、推奨しておりません。

以下の記事では、Windows上のVirtualBoxにKali Linuxをインストールする手順を解説しています。ぜひご覧ください。

p0fの使い方

基本構文

$ sudo p0f [オプション] [フィルタルール]

p0fの実行にはsudo(root権限)が必要です。

リアルタイム解析

$ sudo p0f -i eth0

-i:監視対象のネットワークインターフェースを指定

上記コマンドの場合、ネットワークインターフェースeth0上を流れるパケットを解析し、フィンガープリンティングの結果がリアルタイム出力されます。

本記事のコマンド例では、ネットワークインターフェースとしてeth0を使用しています。

pcapデータをオフライン解析

$ sudo p0f -r sample.pcap

-r:pcapファイルを指定

tcpdumpなどで取得したキャプチャデータ(.pcapファイル)を解析することも可能です。これは、後から通信ログを解析したい場合に有効です。

アドレスやポートでフィルタリング

BPF(Berkeley Packet Filter)形式のフィルタ式をオプションの末尾に付与することで、解析対象のトラフィックを絞り込めます。

# 例)宛先ポート22(SSH)への通信だけを対象にする
$ sudo p0f -i eth0 'dst port 22'

# 例)送信元が192.0.2.11以外の通信を対象にする
$ sudo p0f -i eth0 'not src host 192.0.2.11'

# 例)送信元ネットワークが192.0.2.0/24かつ宛先ポートが22(ssh)
$ sudo p0f -i eth0 'src net 192.0.2.0/24 and dst port 22'

BPFフィルタを活用することで、大量トラフィックが流れる本番環境でも診断対象を効率的に絞り込み、ログのノイズを大幅に削減できます。

オプション一覧

p0fにはいくつかの便利なオプションが用意されており、用途に応じて使い分けることで、より効率的なパッシブ分析が可能になります。

カテゴリ別オプション一覧

ネットワークインターフェースオプション

-i ifaceキャプチャ対象のネットワークインターフェースを指定(例:eth0wlan0
-r filepcapファイルを読み込んで解析する
-pプロミスキャスモードを有効にする(デフォルト:無効)
-L利用可能なネットワークインターフェースを一覧表示

動作モードと出力設定

-f fileシグネチャファイルを指定(デフォルト:/etc/p0f/p0f.fp
-o file解析結果をファイル出力
-s nameUNIXソケットを指定(外部連携用)
-u user起動後に指定ユーザーへ権限を降格する
-dデーモンモード(バックグラウンド実行) ※-oまたは-sオプションが必須

パフォーマンス関連オプション

-S limit並列API接続数(デフォルト:20) ※-sオプションが必須
-t c,hキャッシュの有効期限(接続情報、ホスト情報)
※デフォルト:接続 30秒、ホスト 120分
-m c,h同時に保持できる接続数 / ホスト数の上限
※デフォルト:接続 1000、ホスト 10000

オプションの使用例

ここでは、特に利用頻度の高い3つのオプションについて解説します。

有効なインターフェースを一覧表示

$ p0f -L

# 出力例
0: Name        : eth0
   Description : -
   IP address  : 192.0.2.11

1: Name        : eth1
   Description : -
   IP address  : 10.0.3.15

2: Name        : any
   Description : Pseudo-device that captures on all interfaces
   IP address  : (none)

p0fが利用可能なネットワークインターフェースを確認するには、-Lオプションを使用します。(このコマンドは、root権限なしで実行できます。)

プロミスキャスモード

$ sudo p0f -i eth0 -p

-p:プロミスキャスモードの有効化

通常、NICは自身のMACアドレス宛のパケットのみを受信します。しかし、プロミスキャスモード(Promiscuous Mode)を有効にすると、同一ネットワークセグメント上を流れるすべてのパケットをキャプチャできるようになります。

本記事の検証環境のようにVirtualBoxなどの仮想環境を使用する場合、仮想マシンのネットワークアダプターも設定変更する必要があります。

初期設定では「プロミスキャスモード:拒否」になっているので、「許可」に変更する

仮想マシンのネットワークアダプターの設定画面

ファイル出力

$ sudo p0f -i eth0 -o output.log

-o output.log:分析結果をファイル出力

解析結果をファイルに保存する場合、-oオプションを使用します。

当サイトの検証環境で取得したログ(一部抜粋)

[2026/04/22 18:20:11] mod=syn|cli=192.168.10.102/46220|srv=192.168.10.11/22|subj=cli|os=Linux 2.2.x-3.x|dist=0|params=generic tos:0x04|raw_sig=4:64+0:0:1460:mss*44,10:mss,sok,ts,nop,ws:df,id+:0
[2026/04/22 18:20:11] mod=mtu|cli=192.168.10.102/46220|srv=192.168.10.11/22|subj=cli|link=Ethernet or modem|raw_mtu=1500

このようにタイムスタンプ・IPアドレス・推定OS情報などがテキスト形式で記録されるため、後から grepawk といったコマンドを用いて分析が可能です。

【検証デモ】OS推定の精度を比較

本セクションでは、Windowsホスト上のVirtualBoxに構築した仮想ネットワークを用いて、パッシブおよびアクティブ方式のOS推定精度を検証します。

使用するツール
  • パッシブ方式 : p0f 3.09b
  • アクティブ方式 : Nmap 7.99

デモ環境のシステム構成

本デモでは、以下の検証環境を使用します。

項目OSIPアドレス
仮想マシン 1Kali Linux 2026.1192.168.10.11
仮想マシン 2Ubuntu 24.04 LTS192.168.10.102

VirtualBoxのネットワークアダプターは、ホストオンリーアダプター(Host-Only Ethernet Adapter)を使用します。ホストオンリーアダプターを使用することで、意図しない外部通信が発生せず、検証環境として安全に利用できます。

パッシブ方式(p0f)によるOS推定

Kali Linux上でp0fを起動し、UbuntuからKali Linuxへのトラフィックをパッシブに観測することで、p0fのOSフィンガープリンティング機能を確認します。

STEP

ネットワークインターフェース名を確認

まず、Kali Linuxで利用可能なネットワークインターフェースを確認します。

Kali Linuxで実行

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:79:3a:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.11/24 brd 192.168.10.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe79:3a0a/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:e8:48:7e brd ff:ff:ff:ff:ff:ff
    inet 10.0.3.15/24 brd 10.0.3.255 scope global dynamic noprefixroute eth1
       valid_lft 63772sec preferred_lft 52972sec
    inet6 fd17:625c:f037:3:273e:d7be:5d2a:c348/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 85971sec preferred_lft 13971sec
    inet6 fe80::fc79:c432:a841:bc46/64 scope link
       valid_lft forever preferred_lft forever

p0fコマンドでも確認可能です。

Kali Linuxで実行

$ p0f -L
--- p0f 3.09b by Michal Zalewski <lcamtuf@coredump.cx> ---


-- Available interfaces --

  0: Name        : eth0
     Description : -
     IP address  : 192.168.10.11

  1: Name        : eth1
     Description : -
     IP address  : 10.0.3.15

  2: Name        : any
     Description : Pseudo-device that captures on all interfaces
     IP address  : (none)

  3: Name        : lo
     Description : -
     IP address  : 127.0.0.1

  4: Name        : bluetooth-monitor
     Description : Bluetooth Linux Monitor
     IP address  : (none)

  5: Name        : nflog
     Description : Linux netfilter log (NFLOG) interface
     IP address  : (none)

  6: Name        : nfqueue
     Description : Linux netfilter queue (NFQUEUE) interface
     IP address  : (none)

  7: Name        : dbus-system
     Description : D-Bus system bus
     IP address  : (none)

  8: Name        : dbus-session
     Description : D-Bus session bus
     IP address  : (none)

本デモ環境では、eth0がホストオンリーアダプターに対応するインターフェース名であることが確認できました。次のステップでは、このインターフェースを指定してp0fを起動します。

STEP

p0fの起動

以下のコマンドでp0fを起動し、eth0のパッシブ監視を開始します。

Kali Linuxで実行

$ sudo p0f -i eth0

p0fはeth0上を流れるパケットを受動的に監視し、パケットを受信したタイミングでフィンガープリンティングを開始します。

STEP

UbuntuからKali LinuxにSSH接続

p0fはパッシブツールのため、自ら通信を発生させません。そのため、別のマシンから通信を行う必要があります。ここでは、Ubuntu側からKali LinuxへSSH接続を試みます。

Ubuntuで実行

$ ssh username@192.168.10.11

この操作により、TCPセッション(SYNパケット)が生成され、p0fが解析対象とするトラフィックが発生します。

STEP

p0fの出力内容を確認

UbuntuからのトラフィックがKali Linuxに届くとフィンガープリンティングが開始され、OS情報などが自動的に表示されます。

.-[ 192.168.10.102/58524 -> 192.168.10.11/22 (syn) ]-
|
| client   = 192.168.10.102/58524
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic tos:0x04
| raw_sig  = 4:64+0:0:1460:mss*44,10:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 192.168.10.102/58524 -> 192.168.10.11/22 (mtu) ]-
|
| client   = 192.168.10.102/58524
| link     = Ethernet or modem
| raw_mtu  = 1500
|
`----

この結果から、p0fはLinux 2.2.x-3.xと推定しました。

アクティブ方式(Nmap)によるOS推定

アクティブスキャンツールであるNmapを使用して、対象ホストのOSを推定します。Nmapは対象ホストに対してプローブパケットを送信し、その応答を分析することでOSを推定します。この点がp0fのパッシブ方式と根本的に異なります。

STEP

ポートスキャンを実行

Kali Linuxで実行

$ nmap -O 192.168.10.102

-Oは、OS検出を有効にするオプションです。

STEP

スキャン結果の確認

Nmapの実行結果

Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-22 21:08 +0900
Nmap scan report for 192.168.10.102
Host is up (0.00062s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:FD:A6:22 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 2.46 seconds

NmapはOS details: Linux 4.15 - 5.19と推定しました。

p0fとNmapの実行結果を検証

STEP

対象ホストのカーネルバージョン

まず、対象ホスト(Ubuntu)のカーネルバージョンを確認します。

Ubuntuで実行

$ uname -r
6.17.0-22-generic
STEP

実行結果の比較

対象ホストのカーネルバージョンは6.17.0-22-genericであり、両ツールの推定結果と比較すると以下のようになります。

ツール(方式)推定結果実際との差異
p0f(パッシブ)Linux 2.2.x-3.x大きく乖離
nmap(アクティブ)Linux 4.15 - 5.19比較的近い
STEP

まとめ

今回の検証では、p0f・Nmapのいずれも正確なバージョンを特定できませんでしたが、Nmapの方がp0fよりも実際のバージョンに近い推定結果を示しました。このデモを通じて、OSフィンガープリンティングはあくまで推定技術であり、その精度はシグネチャデータベースの更新状況やスキャン方式に依存するという重要な特性を理解できます。

デフォラボ

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
目次