人家说要想百站百胜,你必须知己知彼,你要保护系统不被攻击,你首先必须了
解攻击者,被动特征探测(Passive Fingerprinting )是一种了解攻击者的而
不被其发觉的一种方法
Fingerprinting
传统上,操作系统特征可以使用一些积极的工具,如queso或者nmap,这些工具是
在每一个操作系统上的IP堆栈有自己不同特性的原理上来操作的,每个操作系统
响应通过的多种信息包。所以这些工具只要建立一个基于不同的操作系统对应不
同的信息包的数据库,然后,要判断远程主机的操作系统,发送多种不寻常的信
息包,检测其是怎样响应这些信息包的,再与数据库进行对比做出判断。Fyodor
的 nmap--http://www.insecure.org/nmap工具就是利用这种方法的,他也写了一
份具体的文档http://www.insecure.org/nmap/nmap-fingerprinting-article.html,
另外绿盟backend也写过这中文文章。
而被动特征探测(Passive Fingerprinting )遵循相同的概念,但实现的方法不
同。被动特征探测(Passive Fingerprinting )基于嗅探远程主机上的通信来代替
主动的去查询远程主机,所有你需要做的是抓取从远程主机上发送的信息包。在
嗅谈这些信息包的基础上,你可以判断远程主机的操作系统,就象主动特征探测
一样,被动特征探测(Passive Fingerprinting )也是由每个操作系统的有自己
的IP堆栈特征,通过分析sniffer traces 和鉴别他们之间的不同之处,就可以判断
远程主机的操作系统了
信号
判断主机的操作系统一般可以由4个方面来决定(当然也有其他信号存在):
--TTL -
这个数据是操作系统对出站的信息包设置的存活时间。 --
窗口大小Window Size - 是操作系统设置的窗口大小,这个窗口大小是 在发送FIN信息包时包含的选项。
--DF -
可以查看是否操作系统设置了Don't Fragment bit位? --TOS -
是否操作系统设置了设备类型?
通过分析信息包这些因数,你可以判断一个远程的操作系统,当然探测到的系统
不可能100%正确,也不能依靠上面单个的信号特征来判断系统,但是,通过查看
多个信号特征和组合这些信息,你可以增加对远程主机的精确程度。下面是一个
简单的例子,下面是the sniffer trace of a system 发送一个信息包,
. This system launched a mountd exploit against me,
我现在不要使用finger 或者NMAP等工具,而想要了解被动接受到的信息,使用snort--
http://www.clark.net/~roesch/security.html
得到了下面的一些信号特征:
04/20-21:41:48.129662 129.142.224.3:659 - 172.16.1.107:604
TCP TTL:45 TOS:0x0 ID:56257
***F**A* Seq: 0x9DD90553 Ack: 0xE3C65D7 Win: 0x7D78
根据上面的四条准则,我们可以达到下面的情况:
-- TTL: 45
-- Window Size: 0x7D78 (or 32120 in decimal)
-- DF: The Don't Fragment bit is set
--TOS: 0x0
我们在比较信号特征数据库--,首先,我们查看使用在远程系统上的TTL,从我们
的sniffer trace 可以看到TTL是45,这多数表示它通过19跳来被我们捕获,因此
原始的TTL是设置为64,基于这个TTL,这个信息包应该看来是由LINUX和FREEBSD
系统发来的(当然更多的系统信号特征需要放到数据库中),这个TTL通过了
traceroute
远程主机得到证实,如果你考虑到远程主机在检测你的traceroute, 你可以设置你traceroute的time-to-live(默认是30跳),使用-m选项来设定到
主机的跳数少1到2跳的数值,如,刚才的例子里,我们可以使用traceroute -m 18
来设置跳数为18跳,这样做可以让你看到到达主机的路径而不碰到远程主机。
要多TTL的信息,请查看http://www.switch.ch/docs/ttl_default.html
下一步是比较窗口大小-Windows size,用Windows size来判断是另一个非常有效
的工具,特别是使用多大的窗口大小和改变大小的规律,在上面的信号特征中,
我们可以看到其设置为0x7D78,这是LINUX通常使用的默认窗口大小。LINUX,FREEBSD
和SOLARIS系统在完整的一个会话过程中窗口的大小是维持不变的,但是 ,部分
Cisco
路由器(如2514)和WINDOWS/NT的窗口是经常改变的(在一个会话阶段), 如果在初始化三次握手后衡量窗口大小是比较精确的,具体信息,可以看看
Richard Stevens
的"TCP/IP Illustrated, Volume 1" 20章.
多数系统使用DF位设置,因此这个是一个限定的值,但是有些系统如SCO和OPENBSD
不使用这个DF标志,所以就比较容易的用来鉴别一些没有这个DF位设置的系统,在
更多的测试后,发现TOS也是一个限定的值,这就表示不是很多操作系统来判断TOS,
而是协议在使用这个值。TOS的判定需要更多的测试。因此,根据上面的信息,一些
特殊的TTL值和窗口大小值,你可以通过信号数据库来比较结果。
注意,与主动特征探测一样,passive Fingerpinting有许多限制,首先,应用
程序必须构建他们自己的与操作系统不同信号特征信息包(如NMAP,HUNT ,TEARDROP等)。
其次,这种探测可以使用调整系统的信息包的值来避免,如可以用下面的方法来
改变TTL值:
Solaris: ndd -set /dev/ip ip_def_ttl 'number'
Linux: echo 'number'
/proc/sys/net/ipv4/ip_default_ttl
NT: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
其他信息特征和使用
上面的是讨论了4个信号特征,但还有其他的特征可以被跟踪,如一些初始化序列
好,IP鉴定号码(IP Identification numbers ),TCP或者IP的选项。如:
Cisco
路由器趋向由0开始IP鉴定号码(IP Identification numbers )来代替 随机的指派号码。也可以使用ICMP的有效负载来判断,
http://dev.whitehats.com/papers/passive/index.html
使用ICMP有效负载类型 或者TCP选项来鉴别远程主机,举个离子,微软的ICMP REQUEST的有效负荷包含
字母,而SOLAIRS或者LINUX的ICMP REQUEST有效符合包含数字和符号。又如TCP
选项,选择性的应答Acknowledgement选项SackOK --(rfc2018)通常被WINDOWS
和LINUX使用,但FREEBSD和SOLARIS这个选项不使用。另一个信号特征是信息包状
态,什么类型的信息包被使用,可以应用FYODOR的话说:
"For example, the initial SYN request can be a gold mine (as can the reply
to it). RST packets also have some interesting features that can be used
for identification."(例如,初始化的SYN请求是一个金矿(以为这个SYN请求
是要回复的),RST信息包也具有一些比较有趣的特征用来鉴别系统)。