ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

パッシブOSスキャンツール「p0f」

概要

p0fの使い方のメモです。

CEHの勉強をしていたら「パッシブOSスキャンツール」という言葉が出てきました。紹介されていたツール「p0f」の解説を読むに、受信したパケットを横から見て判断する(p0f自身はポートをリッスンしない)とのこと。

www.kali.org

インストール

※検証環境はKali Linux 2021.3です

apt でインストールできます。

$ sudo apt update
$ sudo apt install p0f

使い方

以下のような感じで、パケットを採取するインターフェイスと、採取するパケットの条件を指定します。tcpdumpみがありますね。

$ sudo p0f -i lo 'port 80'
[sudo] password for kali: 
--- p0f 3.09b by Michal Zalewski <lcamtuf@coredump.cx> ---

[+] Closed 1 file descriptor.
[+] Loaded 322 signatures from '/etc/p0f/p0f.fp'.
[+] Intercepting traffic on interface 'lo'.
[+] Custom filtering rule enabled: port 80 [+VLAN]
[+] Entered main event loop.

前述の通り、p0fはポートをリッスンしないので、80番ポートを開けて、そこに対する通信を発生させてみます。今回はPython3のhttpモジュールを使いました。

$ sudo python3 -m http.server --bind localhost 80
[sudo] password for kali: 
Serving HTTP on ::1 port 80 (http://[::1]:80/) ...

ブラウザからlocalhostへリクエストしてみると、p0f側にこんなログが出ました。ところどころ Linux 2.2.x-3.x とありますが……違くね?

.-[ 0:0:0:0:0:0:0:1/56094 -> 0:0:0:0:0:0:0:1/80 (syn) ]-
|
| client   = 0:0:0:0:0:0:0:1/56094
| os       = ???
| dist     = 0
| params   = none
| raw_sig  = 6:64+0:0:65476:mss*1,7:mss,sok,ts,nop,ws:flow:0
|
`----

.-[ 0:0:0:0:0:0:0:1/56094 -> 0:0:0:0:0:0:0:1/80 (mtu) ]-
|
| client   = 0:0:0:0:0:0:0:1/56094
| link     = ???
| raw_mtu  = 65536
|
`----

.-[ 127.0.0.1/58672 -> 127.0.0.1/80 (syn) ]-
|
| client   = 127.0.0.1/58672
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:65495:mss*1,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 127.0.0.1/58672 -> 127.0.0.1/80 (mtu) ]-
|
| client   = 127.0.0.1/58672
| link     = ???
| raw_mtu  = 65535
|
`----

.-[ 127.0.0.1/58674 -> 127.0.0.1/80 (syn) ]-
|
| client   = 127.0.0.1/58674
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:65495:mss*1,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 127.0.0.1/58674 -> 127.0.0.1/80 (mtu) ]-
|
| client   = 127.0.0.1/58674
| link     = ???
| raw_mtu  = 65535
|
`----

.-[ 0:0:0:0:0:0:0:1/56100 -> 0:0:0:0:0:0:0:1/80 (syn) ]-
|
| client   = 0:0:0:0:0:0:0:1/56100
| os       = ???
| dist     = 0
| params   = none
| raw_sig  = 6:64+0:0:65476:mss*1,7:mss,sok,ts,nop,ws:flow:0
|
`----

.-[ 0:0:0:0:0:0:0:1/56100 -> 0:0:0:0:0:0:0:1/80 (mtu) ]-
|
| client   = 0:0:0:0:0:0:0:1/56100
| link     = ???
| raw_mtu  = 65536
|
`----

.-[ 127.0.0.1/58678 -> 127.0.0.1/80 (syn) ]-
|
| client   = 127.0.0.1/58678
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:65495:mss*1,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 127.0.0.1/58678 -> 127.0.0.1/80 (mtu) ]-
|
| client   = 127.0.0.1/58678
| link     = ???
| raw_mtu  = 65535
|
`----

おわりに

私のOSスキャンのイメージはNmapの -O オプションで、たくさんパケットを投げてようやく成立するものだと思っていたので、パッシブなOSスキャンというのは新鮮でした。Windowsでも試したかったですが、あいにくライセンスを切らしているのでまたの機会に。