#### 简介
p0f是一个纯粹的被动指纹识别工具,它在不干涉双方通信的情况下,通过嗅探的方式来分析流经某一网卡的流量以达到指纹识别的目的。
它的能力如下:
- 高度可扩展性
- 能够快速识别一个tcp连接两端的主机操作系统,因为它是被动识别工具,所以在某些nmap被禁止、不可靠、太慢或者会触发警报的情况下,它仍然能够很好的工作
- 探测系统uptime,network hookup,距离(包括位于nat或者包过滤器后的网络环境)等等
- 自动探测NAT,负载均衡,应用级的代理设置情况
- 探测一些客户端/服务器的X-Mailer与User-Agent
这个工具可以运行在前台也可以后台运行,p0f还提供了简单易用的实时API供第三方平台调用(以此来开发垃圾邮件拦截工具等)。我们可以利用该工具进行渗透测试以及日常的网络管理,探测内网中可疑的网络连接。
ubuntu下的安装
0x00
默认kali下是集成了该工具的,所以如果不想安装就直接在kali上使用吧,在kali下只需要输入命令:
p0f
你就会看到如下画面,这就表示已经开始嗅探了,如果你打开浏览器访问网页应该就可以看到终端中捕获的信息了:
0x01
从github上下载p0f源码
git clone https://github.com/p0f/p0f.git
然后到进入目录p0f,执行目录中的build.sh脚本,这个脚本会自动执行编译工作,但是我在安装过程中出现了诸多问题,在此列出解决办法
- ubuntu缺少libpcap,导致编译过程中报错:
fatal error:pcap.h:没有哪个文件或目
只需要安装好libcap就行,具体方法参考:
https://blog.csdn.net/fengyun1989/article/details/7384899
安装过后就可以执行了,注意要以管理员权限执行
使用方法
命令行参数
用法: p0f [ …选项… ] [ ‘过滤规则’ ]
网络接口选项:
-i iface - 指定监听的网络接口
-r file - 读取由抓包工具抓到的网络数据包文件
-p - 设置 -i参数 指定的网卡 为混杂模式
-L - 列出所有可用接口
操作模式和输出设置:
-f file - 指定指纹数据库 (p0f.fp) 路径,不指定则使用默认数据库。(默认:/etc/p0f/p0f.fp)
-o file - 将信息写入指定的日志文件中。只有同一网卡的log文件才可以附加合并到本次监听中来。
-s name - 回答 unix socket 的查询 API
-u user - 以指定用户身份运行程序,工作目录会切换到到当前用户根目录下;
-d - 以后台进程方式运行p0f ,需要配合-0或者-s选项
性能相关的选项:
-S limit - 设置API并发数,默认为20,上限为100;
-t c,h - 设置连接超时时间 (30s,120m)
-m c,h - 设置最大网络连接数(connect)和同时追踪的主机数(host)(默认值: c = 1,000, h = 10,000).
通过 man tcpdump 命令可以了解更过 过滤选项表达式。例如:
sudo ./p0f -i eth0 'port 443'
常用选项使用实例
1.通过嗅探流经eth0的流量来识别连接双方的指纹信息
./p0f -i eth0
2. 后台以指定用户权限运行,并且将识别记录写入到/var/log/p0f.log文件中,日志是用|符号来分隔每一项的
./p0f -i eth0 -d -u user -o /var/log/p0f.log
日志文件格式如下:
3.从cap文件中来识别系统
./p0f -r test.cap
API使用
有了API我们就可以很方便的把p0f集成到各个工具里啦,例如用它来开发垃圾邮件过滤器,web应用等等,我们只需要用客户端来连接到p0f -s选项指定的unix socket,并按照规定发送请求,就可以得到p0f的应答啦。
下面是API的使用规则:
- 查询必须是21个字节,格式如下
字段 | 字节 | 作用 |
---|---|---|
Magic dword | 本地主机字节存储顺序(大端小端) | |
Address type byte | ipv4四个字节,ipv6六个字节 | ip地址字节 |
地址数据,网络字节存储顺序 | 16 |
- p0f返回数据格式
magic dword | native endian |
status dword | 0x00表示错误查询,0x01表示查询成功,0x20表示没有匹配项 |
主机信息 | 主机信息是一个很大的数据项,也是我们最需要的信息,它的每组字节也有特别含义,我直接贴出官方文档 |
Host information, valid only if status is 'OK' (byte width in square
brackets):
[4] first_seen - unix time (seconds) of first observation of the host.
[4] last_seen - unix time (seconds) of most recent traffic.
[4] total_conn - total number of connections seen.
[4] uptime_min - calculated system uptime, in minutes. Zero if not known.
[4] up_mod_days - uptime wrap-around interval, in days.
[4] last_nat - time of the most recent detection of IP sharing (NAT,
load balancing, proxying). Zero if never detected.
[4] last_chg - time of the most recent individual OS mismatch (e.g.,
due to multiboot or IP reuse).
[2] distance - system distance (derived from TTL; -1 if no data).
[1] bad_sw - p0f thinks the User-Agent or Server strings aren't
accurate. The value of 1 means OS difference (possibly
due to proxying), while 2 means an outright mismatch.
NOTE: If User-Agent is not present at all, this value
stays at 0.
[1] os_match_q - OS match quality: 0 for a normal match; 1 for fuzzy
(e.g., TTL or DF difference); 2 for a generic signature;
and 3 for both.
[32] os_name - NUL-terminated name of the most recent positively matched
OS. If OS not known, os_name[0] is NUL.
NOTE: If the host is first seen using an known system and
then switches to an unknown one, this field is not
reset.
[32] os_flavor - OS version. May be empty if no data.
[32] http_name - most recent positively identified HTTP application
(e.g. 'Firefox').
[32] http_flavor - version of the HTTP application, if any.
[32] link_type - network link type, if recognized.
[32] language - system language, if recognized.
指纹数据库
p0f是有默认的指纹数据库的,与p0f可执行文件在同一目录下,名字叫p0f.fp,部分截图如下:
至于每个字段的含义,由于内容太多,此处不在详述,具体参考github上的使用说明
总结
总的来说,个人认为它的功能与nmap比起来要逊色很多,但是由于是被动信息收集工具,所以在某种程度上弥补了nmap的不足,同时它对tcp,http头信息的解析还是很强大的。