被动服务定位器,一个识别服务器、客户端、名称以及更多信息的 Python 嗅探器
快速上手 passer(被动服务嗅探器)的简要说明。你有责任获得进行嗅探的许可。
Passer 可以基于实时数据包捕获或 pcap 文件工作(命令行参数,见下方示例)。它报告实时服务和客户端、局域网上的以太网卡、DNS 条目、操作系统以及路由器——全部以被动方式完成!
如果你使用的是 Windows,或者由于其他原因你的支持文件路径与我的不匹配,请告诉我它们的位置,我很乐意更新脚本。
# Install system dependencies
sudo apt-get install arp-scan ettercap-text-only nmap wireshark
# Install python dependencies
sudo pip install -r requirements.txt
# Prevent Scapy from performing DNS lookups
echo 'noenum = [ Resolve(), TCP_SERVICES, UDP_SERVICES ]' >> ~/.scapy_startup.py
# Install system dependencies
sudo yum install arp-scan ettercap nmap wireshark
# Install python dependencies
sudo pip install -r requirements.txt
# Prevent Scapy from performing DNS lookups
echo 'noenum = [ Resolve(), TCP_SERVICES, UDP_SERVICES ]' >> ~/.scapy_startup.py
要安装 scapy,请参阅安装指南。
Passer 也以 Docker 镜像的形式提供。如果你还没有安装 Docker,以下是在 Linux 上快速安装它的简便方法:
curl -fsSL https://get.docker.com | sh -
否则,请按照适用于你操作系统的安装说明进行操作。
对于大多数用途,我们推荐使用本仓库中包含的 passer 脚本。该脚本将处理所有 Docker 相关的
wget https://raw.githubusercontent.com/activecm/passer/master/passer
chmod +x passer
然后,你可以像在下面任何示例中那样使用此脚本。例如:
./passer -i eth0
# The equivalent without using the included script would be:
docker run --rm --name=passer -i --init --net=host --cap-add=net_raw activecm/passer -i eth0
要停止 passer 运行:
docker stop passer
/path/to/passer.py
这会从所有网络接口嗅探,并将所有输出行发送到你的控制台。
sudo /path/to/passer.py
或
su - -c '/path/to/passer.py'
/path/to/passer.py -i IfaceName
运行 route 应会显示一些你可能用到的活动接口。
❕
-i与-r不兼容。
/path/to/passer.py -r /path/to/packets.pcap
❕
-r与-i不兼容。
cat packetdata.pcap | ./passer.py -r /proc/self/fd/0
zcat packetdata.pcap.gz | ./passer.py -r /proc/self/fd/0
bzcat packetdata.pcap.bz2 | ./passer.py -r /proc/self/fd/0
tcpdump -i eth0 -qtnp -w - | ./passer.py -r /proc/self/fd/0
# etc...
这样,你就可以使用任何能够将数据包保存为 pcap 文件的工具来捕获数据包,之后再在另一个系统上用 passer 处理它们。
/path/to/passer.py -l /path/to/networkinfo.txt
/path/to/passer.py 2>/dev/null
/path/to/passer.py -h
/path/to/passer.py -u /path/to/oddpackets.pcap
这通常用于开发过程;保存到此文件的数据包是需要写入签名的数据包。我们欣然接受特殊数据包的贡献、服务描述以及对程序的补丁。
这_应该_只需将 BPF 过滤器用单引号放在命令行末尾即可。截至 1.16 版本,底层库似乎无法成功使用所提供的过滤器,但有一个变通方法。使用 tcpdump 进行过滤,并将精简后的数据包集合通过 stdin 交给 passer,如上所述:
tcpdump -r packets.pcap -w - 'icmp or arp' | ./passer.py -r /proc/self/fd/0
有关在预先捕获数据包或实时嗅探中使用的过滤器建议,请参见下文“示例过滤器”部分。
socket.error: (1, 'Operation not permitted')
你可能是以非 root 用户身份尝试进行实时嗅探。要么以 root 身份登录,使用 sudo/su,要么使用 pcap 文件。
如果 passer 崩溃或在你的系统上无法运行,请提交一个 issue,其中包含错误信息(如果有)以及关于你的操作系统的任何详细信息。
Passer 的输出会发送到 stdout,如果你提供命令行参数 -l /path/to/logfile,也会写入该文件。格式如下:
| Type | IPAddr | Proto | State | Optional description (may be empty) |
|---|---|---|---|---|
| 'IP' | IPaddr | 'IP' | dead or live | p0f OS description |
| 'MA' | IPaddr | 'Ethernet' | MacAddr | ManufDescription |
| 'TC' | IPaddr | 'TCP_'Port | closed or open | client description |
| 'TS' | IPaddr | 'TCP_'Port | closed or listening | server description |
| 'UC' | IPaddr | 'UDP_'Port | open or closed | udp client port description |
| 'US' | IPaddr | 'UDP_'Port | open or closed | udp server port description |
| 'DN' | IPaddr | 'A' or 'PTR' | hostname | possible extra info |
| 'RO' | IPaddr | 'TTLEx' | router | possible extra info |
各行以逗号分隔,便于加载到电子表格或进行 SQL 导入。任何字段都不应包含逗号。在 http://www.stearns.org/passer/passer-sample-log.txt 有一个示例输出文件。
以下是一些如何从这些行中提取所需数据的示例:
cat /var/tmp/passer-log | sort -u | less
cat /var/tmp/passer-log | sort -t, -k2 -u | less
cat /var/tmp/passer-log | sort -u | egrep '(^DN|^RO)' | less
cat /var/tmp/passer-log | sort -u | grep ',192\.168\.0\.17,' | less
cat /var/tmp/passer-log | sort -u | grep ',192\.168\.' | less
cat /var/tmp/passer-log | sort -u | grep ',TCP_25,listening,' | less
cat /var/tmp/passer-log | sort -u | grep -v ',closed,' | less
cat /var/tmp/passer-log | sort -u | grep ',closed,' | less
cat /var/tmp/passer-log | sort -u | grep -i 'google\.com\.,' | less
/path/to/make-hosts /var/tmp/passer-log | /path/to/mergehosts.pl >/var/tmp/passer-hosts
"make-hosts" 和 merge-hosts 是独立的 shell 和 perl 脚本, 位于 http://www.stearns.org/passer/make-hosts 。
这仅仅是个开始!请把你提取感兴趣条目的 常用方法发给我,我会将它们加入并注明出处。
各个记录类型需要特定类型的数据包 来提供其原始数据。如果你想包含或排除这些数据包,请使用 附带的过滤器。
'IP', IPaddr, 'IP', dead or live, p0f OS description
这需要 TCP SYN 数据包:
'tcp[13] & 0x12 = 0x02'
'MA', IPaddr, 'Ethernet', MacAddr, ManufDescription
这些来自 arp 回复(*1):
'arp'
'TC', IPaddr, 'TCP_'Port, closed or open, client description
这些需要 TCP SYN/ACK、FIN 和 RST(*2):
'tcp[13] & 0x07 != 0'
'TS', IPaddr, 'TCP_'Port, closed 或 listening, server description
我们需要 TCP SYN、SYN/ACK 和 RST 来判断端口是 开放还是关闭:
'tcp[13] & 0x06 != 0'
为了构造服务器描述字符串,我们还需要查看构成网络上大部分流量的 ACK 数据包:
'tcp[13] & 0x17 = 0x10'
如果你两者都想要,只需抓取所有 TCP 流量:
'tcp'
'UC', IPaddr, 'UDP_'Port, open or closed, udp client port description
最简单的方法就是把所有 UDP 端口和 ICMP 端口不可达消息都交给它处理:
'udp or icmp[0:2] = 0x0303'
'US', IPaddr, 'UDP_'Port, open or closed, udp server port description
同上:
'udp or icmp[0:2] = 0x0303'
'DN', IPaddr, A,AAAA,PTR,CNAME hostname, 可能的额外信息
UDP 或 TCP 端口 53 (*3):
'udp src port 53 or tcp src port 53'
'RO', IPaddr, 'TTLEx', router, possible extra info
我们识别路由器,是因为它们会发送 Time-To-Live-Exceeded 或 unreachable 消息:
'icmp[0:2] = 0x0B00 or icmp[0] = 0x03'
*1 这也会捕获 arp 请求,但这些请求会被忽略。
*2 该过滤器在技术上也会包含 SYN,但这只是少量额外数据
*3 自 1.16 版本起,仅提取 UDP 端口 53 的应答。
'not(tcp[13] & 0x17 = 0x10)'
这削减了需要处理的数据包数量和流量的 90% 以上,使 passer 能够跟上中等带宽的链路。
'not udp src port 53'
提取 DNS 记录需要做相当多的工作;如果你正试图跟上一条高速链路,这也可能是一个适合关闭的选项。
'host 1.2.3.4'
'net 1.2'