第四章 指纹识别(二)
作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0
4.6 Nmap 服务识别
虽然特征抓取是非常有利的信息来源,服务特征中的版本发现越来越不重要。Nmap 拥有服务识别功能,不仅仅是简单的特征抓取机制。这个秘籍展示了如何使用 Nmap 基于探测响应的分析执行服务识别。
准备
为了使用 Nmap 执行服务识别,你需要拥有运行可被探测的网络服务的远程系统。提供的例子使用了 Metasploitable2 来执行这个任务。配置 Metasploitable2 的更多信息,请参考第一章的“安装 Metasploitable2”秘籍。
操作步骤
为了理解 Nmap 服务是被功能的高效性,我们应该考虑不提供自我开放的服务特征的服务。通过使用 Netcat 连接 Metasploitable2 系统的 TCP 80 端口(这个技巧在这一章的“Netcat 特征抓取”秘籍中讨论过了),我们可以看到,仅仅通过建立 TCP 连接,不能得到任何服务特征。
代码语言:javascript复制root@KaliLinux:~# nc -nv 172.16.36.135 80
(UNKNOWN) [172.16.36.135] 80 (http) open
^C
之后,为了在相同端口上执行 Nmap 扫描,我们可以使用-sV
选项,并且指定 IP 和端口。
root@KaliLinux:~# nmap 172.16.36.135 -p 80 -sV
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-19 05:20 EST
Nmap scan report for 172.16.36.135
Host is up (0.00035s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.2.8 ((Ubuntu) DAV/2)
MAC Address: 00:0C:29:3D:84:32 (VMware)
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.18 seconds
你可以看到在这个示例中,Nmap 能够识别该服务,厂商,以及产品的特定版本。这个服务识别功能也可以用于对特定端口列表使用。这在 Nmap 中并不需要指定端口,Nmap 会扫描 1000 个常用端口,并且尝试识别所有识别出来的监听服务。
代码语言:javascript复制root@KaliLinux:~# nmap 172.16.36.135 -sV
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-19 05:20 EST
Nmap scan report for 172.16.36.135
Host is up (0.00032s latency).
Not shown: 977 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.3.4
22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)
23/tcp open telnet Linux telnetd
25/tcp open smtp Postfix smtpd
53/tcp open domain ISC BIND 9.4.2
80/tcp open http Apache httpd 2.2.8 ((Ubuntu) DAV/2)
111/tcp open rpcbind 2 (RPC #100000)
139/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
512/tcp open exec netkit-rsh rexecd
513/tcp open login?
514/tcp open tcpwrapped
1099/tcp open rmiregistry GNU Classpath grmiregistry
1524/tcp open ingreslock?
2049/tcp open nfs 2-4 (RPC #100003)
2121/tcp open ftp ProFTPD 1.3.1
3306/tcp open mysql MySQL 5.0.51a-3ubuntu5
5432/tcp open postgresql PostgreSQL DB 8.3.0 - 8.3.7
5900/tcp open vnc VNC (protocol 3.3)
6000/tcp open X11 (access denied)
6667/tcp open irc Unreal ircd
8009/tcp open ajp13 Apache Jserv (Protocol v1.3)
8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1 MAC Address: 00:0C:29:3D:84:32 (VMware)
Service Info: Hosts: metasploitable.localdomain, localhost, irc.Metasploitable.LAN; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 161.49 seconds
工作原理
Nmap 服务识别会发送一系列复杂的探测请求,之后分析这些请求的响应,尝试基于服务特定的签名和预期行为,来识别服务。此外,你可以看到 Nmap 服务识别输出的底部,Nmap 依赖于用户的反馈,以便确保服务签名保持可靠。
4.7 Amap 服务识别
Amap 是 Nmap 的近亲,尤其为识别网络服务而设计。这个秘籍中,我们会探索如何使用 Amap 来执行服务识别。
准备
为了使用 Amap 执行服务识别,你需要拥有运行可被探测的网络服务的远程系统。提供的例子使用了 Metasploitable2 来执行这个任务。配置 Metasploitable2 的更多信息,请参考第一章的“安装 Metasploitable2”秘籍。
操作步骤
为了在单一端口上执行服务识别,以特定的 IP 地址和端口号来运行 Amap。
代码语言:javascript复制root@KaliLinux:~# amap 172.16.36.135 80
amap v5.4 (www.thc.org/thc-amap) started at 2013-12-19 05:26:13 - APPLICATION MAPPING mode
Protocol on 172.16.36.135:80/tcp matches http
Protocol on 172.16.36.135:80/tcp matches http-apache-2
Unidentified ports: none.
amap v5.4 finished at 2013-12-19 05:26:19
Amap 也可以使用破折号记法扫描端口号码序列。为了这样你工作,以特定 IP 地址和端口范围来执行amap
,端口范围由范围的第一个端口号,破折号,和范围的最后一个端口号指定。
root@KaliLinux:~# amap 172.16.36.135 20-30
amap v5.4 (www.thc.org/thc-amap) started at 2013-12-19 05:28:16 - APPLICATION MAPPING mode
Protocol on 172.16.36.135:25/tcp matches smtp
Protocol on 172.16.36.135:21/tcp matches ftp
Protocol on 172.16.36.135:25/tcp matches nntp
Protocol on 172.16.36.135:22/tcp matches ssh
Protocol on 172.16.36.135:22/tcp matches ssh-openssh
Protocol on 172.16.36.135:23/tcp matches telnet
Unidentified ports: 172.16.36.135:20/tcp 172.16.36.135:24/tcp 172.16.36.135:26/tcp 172.16.36.135:27/tcp 172.16.36.135:28/tcp 172.16.36.135:29/tcp 172.16.36.135:30/tcp (total 7).
amap v5.4 finished at 2013-12-19 05:28:17
除了识别任何服务,它也能够在输出末尾生产列表,表明任何未识别的端口。这个列表不仅仅包含运行不能识别的服务的开放端口,也包含所有扫描过的关闭端口。但是这个输出仅在扫描了 10 个端口时易于管理,当扫描更多端口范围之后会变得十分麻烦。为了去掉未识别端口的信息,可以使用-q
选项:
root@KaliLinux:~# amap 172.16.36.135 1-100 -q
amap v5.4 (www.thc.org/thc-amap) started at 2013-12-19 05:29:27 - APPLICATION MAPPING mode
Protocol on 172.16.36.135:21/tcp matches ftp
Protocol on 172.16.36.135:25/tcp matches smtp
Protocol on 172.16.36.135:22/tcp matches ssh
Protocol on 172.16.36.135:22/tcp matches ssh-openssh
Protocol on 172.16.36.135:23/tcp matches telnet
Protocol on 172.16.36.135:80/tcp matches http
Protocol on 172.16.36.135:80/tcp matches http-apache-2
Protocol on 172.16.36.135:25/tcp matches nntp
Protocol on 172.16.36.135:53/tcp matches dns
amap v5.4 finished at 2013-12-19 05:29:39
要注意,Amap 会指明常规匹配和更加特定的签名。在这个例子中,运行在端口 22 的服务被识别为匹配 SSH 签名,也匹配更加具体的 OpenSSH 签名。将服务签名和服务特征展示在一起很有意义。特征可以使用-b
选项,附加到和每个端口相关的信息后面:
root@KaliLinux:~# amap 172.16.36.135 1-100 -qb
amap v5.4 (www.thc.org/thc-amap) started at 2013-12-19 05:32:11 - APPLICATION MAPPING mode
Protocol on 172.16.36.135:21/tcp matches ftp - banner: 220 (vsFTPd 2.3.4)rn530 Please login with USER and PASS.rn
Protocol on 172.16.36.135:22/tcp matches ssh - banner: SSH-2.0- OpenSSH_4.7p1 Debian-8ubuntu1n
Protocol on 172.16.36.135:22/tcp matches ssh-openssh - banner: SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1n
Protocol on 172.16.36.135:25/tcp matches smtp - banner: 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)rn221 2.7.0 Error I can break rules, too. Goodbye.rn
Protocol on 172.16.36.135:23/tcp matches telnet - banner: #'
Protocol on 172.16.36.135:80/tcp matches http - banner: HTTP/1.1 200 OKrnDate Sat, 26 Oct 2013 014818 GMTrnServer Apache/2.2.8 (Ubuntu) DAV/2rnX-Powered-By PHP/5.2.4-2ubuntu5.10rnContent- Length 891rnConnection closernContent-Type text/htmlrnrn<html><head><title>Metasploitable2 - Linux</title><
Protocol on 172.16.36.135:80/tcp matches http-apache-2 - banner: HTTP/1.1 200 OKrnDate Sat, 26 Oct 2013 014818 GMTrnServer Apache/2.2.8 (Ubuntu) DAV/2rnX-Powered-By PHP/5.2.4- 2ubuntu5.10rnContent-Length 891rnConnection closernContent- Type text/htmlrnrn<html><head><title>Metasploitable2 - Linux</title><
Protocol on 172.16.36.135:53/tcp matches dns - banner: f
amap v5.4 finished at 2013-12-19 05:32:23
服务识别会扫描大量端口或者在多有 65536 个端口上执行复杂的扫描,如果每个服务上都探测了每个可能的签名,这样会花费大量时间。为了增加服务识别扫描的速度,我们可以使用-1
参数,在匹配到特定特性签名之后取消特定服务的分析。
root@KaliLinux:~# amap 172.16.36.135 1-100 -q1
amap v5.4 (www.thc.org/thc-amap) started at 2013-12-19 05:33:16 - APPLICATION MAPPING mode
Protocol on 172.16.36.135:21/tcp matches ftp
Protocol on 172.16.36.135:22/tcp matches ssh
Protocol on 172.16.36.135:25/tcp matches smtp
Protocol on 172.16.36.135:23/tcp matches telnet
Protocol on 172.16.36.135:80/tcp matches http
Protocol on 172.16.36.135:80/tcp matches http-apache-2
Protocol on 172.16.36.135:53/tcp matches dns
amap v5.4 finished at 2013-12-19 05:33:16
Amap 服务识别的底层原理和 Nmap 相似。它注入了一系列探测请求,来尝试请求唯一的响应,它可以用于识别运行在特定端口的软件的版本和服务。但是,要注意的是,虽然 Amap 是个服务识别的替代选项,它并不像 Nmap 那样保持更新和拥有良好维护。所以,Amap 不太可能产生可靠的结果。
4.8 Scapy 操作系统识别
由很多技术可以用于尝试识别操作系统或其它设备的指纹。高效的操作系统识别功能非常健壮并且会使用大量的技术作为分析因素。Scapy 可以用于独立分析任何此类因素。这个秘籍展示了如何通过检测返回的 TTL 值,使用 Scapy 执行 OS 识别。
准备
为了使用 Scapy 来识别 TTL 响应中的差异,你需要拥有运行 Linux/Unix 操作系统和运行 Windows 操作系统的远程系统。提供的例子使用 Metasploitable2 和 Windows XP。在本地实验环境中配置系统的更多信息请参考第一章的“安装 Metasploitable2”和“安装 Windows Server”秘籍。
此外,这一节也需要编写脚本的更多信息,请参考第一章中的“使用文本编辑器 VIM 和 Nano”。
操作步骤
Windows 和 Linux/Unix 操作系统拥有不同的 TTL 默认起始值。这个因素可以用于尝试识别操作系统的指纹。这些值如下:
操作系统 | TTL 起始值 |
---|---|
Windows | 128 |
Linux/Unix | 64 |
一些基于 Unix 的系统会的 TTL 默认起始值为 225 。但是,出于简单性考虑,我们会使用所提供的值作为这个秘籍的前提。为了分析来自远程系统的响应中的 TTL,我们首先需要构建请求。这里,我们使用 ICMP 回响请求。为了发送 ICMP请求,我们必须首先构建请求的层级。我们需要首先构建的是 IP 层。
代码语言:javascript复制root@KaliLinux:~# scapy Welcome to Scapy (2.2.0) >>> linux = "172.16.36.135"
>>> windows = "172.16.36.134"
>>> i = IP()
>>> i.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= ip
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
options
>>> i.dst = linux
>>> i.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= ip
chksum= None
src= 172.16.36.180
dst= 172.16.36.135
options
为了构建请求的 IP 层,我们应该将IP
对象赋给i
变量。通过调用display
函数,我们可以确认对象的属性配置。通常,发送和接受地址都设为回送地址127.0.0.1
,所以我们需要将其改为目标地址的值,将i.dst
改为我们希望扫描的地址的字符串值。
通过再次调用display
函数,我们可以看到不仅仅目标地址被更新,Scapy 也会将源 IP 地址自动更新为何默认接口相关的地址。现在我们成功构造了请求的 IP 层。既然我们构建了请求的 IP 层,我们应该开始构建 ICMP 层了。
>>> ping = ICMP()
>>> ping.display()
###[ ICMP ]###
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0
为了构建请求的 ICMP 层,我们会使用和 IP 层相同的技巧。在提供的例子中,ICMP
对象赋给了ping
遍历。像之前那样,默认的配置可以用过调用dispaly
函数来确认。通常 ICMP 类型已经设为了echo-request
。既然我们创建了 IP 和 ICMP 层,我们需要通过叠放这些层来构建请求。
>>> request = (i/ping)
>>> request.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= icmp
chksum= None
src= 172.16.36.180
dst= 172.16.36.135
options
###[ ICMP ]###
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0
IP 和 ICMP 层可以通过以斜杠分隔遍历来叠放。这些层可以赋给新的变量,它代表我们整个请求。display
函数之后可以调用来查看请求配置。一旦请求构建完毕,我么可以将其传递给sr1
函数,以便分析响应。
>>> ans = sr1(request)
Begin emission:
....................Finished to send 1 packets.
....*
Received 25 packets, got 1 answers, remaining 0 packets
>>> ans.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 28
id= 64067
flags=
frag= 0L
ttl= 64
proto= icmp
chksum= 0xdf41
src= 172.16.36.135
dst= 172.16.36.180
options
###[ ICMP ]###
type= echo-reply
code= 0
chksum= 0xffff
id= 0x0
seq= 0x0
###[ Padding ]###
load= 'x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 x00x00'
相同的请求可以不通过独立构建和叠放每一层来构建。反之,我们可以使用单行的命令,通过直接调用函数并传递合适参数:
代码语言:javascript复制>>> ans = sr1(IP(dst=linux)/ICMP())
.Begin emission:
...*Finished to send 1 packets.
Received 5 packets, got 1 answers, remaining 0 packets
>>> ans
<IP version=4L ihl=5L tos=0x0 len=28 id=64068 flags= frag=0L ttl=64 proto=icmp chksum=0xdf40 src=172.16.36.135 dst=172.16.36.180 options=[] |<ICMP type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding load='x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 x00x00x00' |>>>
要注意来自 Linux 系统的响应的 TTL 值为 64。同一测试可以对 Windows 系统的 IP 地址执行,我们应该注意到响应中 TTL 值的差异。
代码语言:javascript复制>>> ans = sr1(IP(dst=windows)/ICMP())
.Begin emission:
......Finished to send 1 packets.
....*
Received 12 packets, got 1 answers, remaining 0 packets
>>> ans
<IP version=4L ihl=5L tos=0x0 len=28 id=24714 flags= frag=0L ttl=128 proto=icmp chksum=0x38fc src=172.16.36.134 dst=172.16.36.180 options=[] |<ICMP type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding load='x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00 x00x00x00' |>>>
要注意由 Windows 系统返回的响应的 TTL 为 128。这个响应可以轻易在 Python 中测试:
代码语言:javascript复制root@KaliLinux:~# python Python 2.7.3 (default, Jan 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import *
WARNING: No route found for IPv6 destination :: (no default route?)
>>> ans = sr1(IP(dst="172.16.36.135")/ICMP())
.Begin emission:
............Finished to send 1 packets.
....*
Received 18 packets, got 1 answers, remaining 0 packets
>>> if int(ans[IP].ttl) <= 64:
... print "Host is Linux"
... else:
... print "Host is Windows"
... Host is Linux
>>> ans = sr1(IP(dst="172.16.36.134")/ICMP())
.Begin emission:
.......Finished to send 1 packets.
....*
Received 13 packets, got 1 answers, remaining 0 packets
>>> if int(ans[IP].ttl) <= 64:
... print "Host is Linux"
... else:
... print "Host is Windows"
... Host is Windows
通过发送相同请求,可以测试 TTL 值的相等性来判断是否小于等于 64。这里,我们可以假设设备运行 Linux/Unix 操作系统。否则,如果值大于 64,我们可以假设设备可能运行 Windows 操作系统。整个过程可以使用 Python 可执行脚本来自动化:
代码语言:javascript复制#!/usr/bin/python
from scapy.all
import * import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
import sys
if len(sys.argv) != 2:
print "Usage - ./ttl_id.py [IP Address]"
print "Example - ./ttl_id.py 10.0.0.5"
print "Example will perform ttl analysis to attempt to determine whether the system is Windows or Linux/Unix"
sys.exit()
ip = sys.argv[1]
ans = sr1(IP(dst=str(ip))/ICMP(),timeout=1,verbose=0)
if ans == None:
print "No response was returned"
elif int(ans[IP].ttl) <= 64:
print "Host is Linux/Unix"
else:
print "Host is Windows"
这个 Python 脚本接受单个参数,由被扫描的 IP 地址组成。基于返回的响应中的 TTL,脚本会猜测远程系统。这个脚本可以通过使用chmod
修改文件许可,并且直接从所在目标调用来执行:
root@KaliLinux:~# chmod 777 ttl_id.py
root@KaliLinux:~# ./ttl_id.py
Usage - ./ttl_id.py [IP Address]
Example - ./ttl_id.py 10.0.0.5
Example will perform ttl analysis to attempt to determine whether the system is Windows or Linux/Unix
root@KaliLinux:~# ./ttl_id.py 172.16.36.134 Host is Windows
root@KaliLinux:~# ./ttl_id.py 172.16.36.135 Host is Linux/Unix
工作原理
Windows 操作系统的网络流量的 TTL 起始值通常为 128,然而 Linux/Unix 操作系统为 64。通过假设不高于 64 应该为其中一种系统,我们可以安全地假设 Windows 系统的回复中 TTL 为 65 到 128,而 Linux/Unix 系统的回复中 TTL 为 1 到 64。当扫描系统和远程目标之间存在设备,并且设备拦截请求并重新封包的时候,这个识别方式就会失效。
4.9 Nmap 操作系统识别
虽然 TTL 分析有助于识别远程操作系统,采用更复杂的解法也是很重要的。Nmap 拥有操作系统识别功能,它不仅仅是简单的 TTL 分析。这个秘籍展示了如何使用 Nmap 执行基于探测响应分析的操作系统识别。
准备
为了使用 Nmap 来识别 TTL 响应中的差异,你需要拥有运行 Linux/Unix 操作系统和运行 Windows 操作系统的远程系统。提供的例子使用 Metasploitable2 和 Windows XP。在本地实验环境中配置系统的更多信息请参考第一章的“安装 Metasploitable2”和“安装 Windows Server”秘籍。
操作步骤
为了执行 Nmap 操作系统识别,Nmap 应该使用-o
选项并指定 IP 地址来调用:
root@KaliLinux:~# nmap 172.16.36.134 -O
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-19 10:59 EST
Nmap scan report for 172.16.36.134
Host is up (0.00044s latency).
Not shown: 991 closed ports
PORT STATE SERVICE
22/tcp open ssh
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
4444/tcp open krb524
8080/tcp open http-proxy
8081/tcp open blackice-icecap
15003/tcp open unknown
15004/tcp open unknown
MAC Address: 00:0C:29:18:11:FB (VMware) Device type: general purpose
Running: Microsoft Windows XP|2003
OS CPE: cpe:/o:microsoft:windows_xp::sp2:professional cpe:/o:microsoft:windows_server_2003
OS details: Microsoft Windows XP Professional SP2 or Windows Server 2003 Network Distance: 1 hop
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.67 seconds
在这个输出中,Nmap 会表明运行的操作系统或可能提供一列可能运行的操作系统。这里,Nmap 表明远程操作系统是 Windows XP 或者 Server 2003。
工作原理
Nmap 操作系统识别会发送一系列复杂的探测请求,之后分析这些请求的响应,来尝试基于 OS 特定的签名和预期行为识别底层的操作系统。此外,你可以在操作系统是被的输出底部看到,Nmap 依赖于用户的反馈,以便确保服务签名保持可靠。
4.10 xProbe2 操作系统识别
xProbe2 是个用于识别远程操作系统的复杂工具。这个秘籍展示了如何使用 xProbe2 基于探测响应分析来执行操作系统识别。
准备
为了使用 xProbe2 来识别 TTL 响应中的差异,你需要拥有运行 Linux/Unix 操作系统和运行 Windows 操作系统的远程系统。提供的例子使用 Metasploitable2 和 Windows XP。在本地实验环境中配置系统的更多信息请参考第一章的“安装 Metasploitable2”和“安装 Windows Server”秘籍。
操作步骤
为了使用 xProbe2 对远程系统上执行操作系统是被,需要将单个参数传递给程序,包含被扫描系统的 IP 地址。
代码语言:javascript复制root@KaliLinux:~# xprobe2 172.16.36.135
Xprobe2 v.0.3 Copyright (c) 2002-2005 fyodor@o0o.nu, ofir@sys- security.com, meder@o0o.nu
[ ] Target is 172.16.36.135
[ ] Loading modules.
[ ] Following modules are loaded:
[x] [1] ping:icmp_ping - ICMP echo discovery module
[x] [2] ping:tcp_ping - TCP-based ping discovery module
[x] [3] ping:udp_ping - UDP-based ping discovery module
[x] [4] infogather:ttl_calc - TCP and UDP based TTL distance calculation
[x] [5] infogather:portscan - TCP and UDP PortScanner
[x] [6] fingerprint:icmp_echo - ICMP Echo request fingerprinting module
[x] [7] fingerprint:icmp_tstamp - ICMP Timestamp request fingerprinting module
[x] [8] fingerprint:icmp_amask - ICMP Address mask request fingerprinting module
[x] [9] fingerprint:icmp_port_unreach - ICMP port unreachable fingerprinting module
[x] [10] fingerprint:tcp_hshake - TCP Handshake fingerprinting module
[x] [11] fingerprint:tcp_rst - TCP RST fingerprinting module
[x] [12] fingerprint:smb - SMB fingerprinting module
[x] [13] fingerprint:snmp - SNMPv2c fingerprinting module
[ ] 13 modules registered
[ ] Initializing scan engine
[ ] Running scan engine
[-] ping:tcp_ping module: no closed/open TCP ports known on 172.16.36.135. Module test failed
[-] ping:udp_ping module: no closed/open UDP ports known on 172.16.36.135. Module test failed
[-] No distance calculation. 172.16.36.135 appears to be dead or no ports known
[ ] Host: 172.16.36.135 is up (Guess probability: 50%)
[ ] Target: 172.16.36.135 is alive. Round-Trip Time: 0.00112 sec
[ ] Selected safe Round-Trip Time value is: 0.00225 sec
[-] fingerprint:tcp_hshake Module execution aborted (no open TCP ports known)
[-] fingerprint:smb need either TCP port 139 or 445 to run
[-] fingerprint:snmp: need UDP port 161 open
[ ] Primary guess:
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.22" (Guess probability: 100%)
[ ] Other guesses:
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.23" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.21" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.20" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.19" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.24" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.25" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.26" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.27" (Guess probability: 100%)
[ ] Host 172.16.36.135 Running OS: "Linux Kernel 2.4.28" (Guess probability: 100%)
[ ] Cleaning up scan engine
[ ] Modules deinitialized
[ ] Execution completed.
这个工具的输出有些误导性。输出中有好几种不同的 Linux 内核,表明特定操作系统概率为 100%。显然,这是不对的。xProbe2 实际上基于操作系统相关的签名的百分比,这些签名在目标系统上被验证。不幸的是,我们可以在输出中看出,签名对于分辨小版本并不足够细致。无论如何,这个工具在识别目标操作系统中,都是个有帮助的额外资源。
工作原理
xProbe2 服务识别的底层原理和 Nmap 相似。xProbe2 操作系统识别会发送一系列复杂的探测请求,之后分析这些请求的响应,来尝试基于 OS 特定的签名和预期行为识别底层的操作系统。