TcpIp|利用TCP/IP堆栈进行远程操作系统判别的方法

利用TCP/IP堆栈进行远程操作系统判别的方法 正确识别一个操作系统的类型在网络安全领域的重要性想必大家都是明白的。
传统的技术
传统的判别操作系统的技术是通过直接登陆主机的办法来识别的。比如:
myhost~> telnet hpux.server1.net
Trying 123.123.123.123....
Connected to hpux.server1.net.
Escape character is '^]'
HP-UX hpux B.10.01 A 9000/715 (ttyp2)
login:
通过TELNET的登陆尝试,我们就可以很轻松地确定这是一个HP 9000系列的服务器,操作系统为10.01的 HP UNIX。如果一个怀有恶意的攻击者掌握了这些信息,那么从INTERNET网络上,找到关于这种类型的 服务器和操作系统的漏洞并不是一件很难的事情。事实上,很多有经验的管理员已经认识到了这种情况 的严重性,并已经通过改变/etc/issue,/etc/issus.net的方法,修改了登陆信息。这样至少可以将大部 分的攻击者迷惑,就是连著名的ISS的INTERNET SCANNER也无法很容易地确定是何种操作系统。
但是即便是这样,还是无法防止他人通过其他的手段获得操作系统的类型。在服务器上正常工作的一些 别的服务,如FTP SERVER或者WEB SERVER都会向人们暴露系统的身份。
我们来看下面的例子:
1. 利用FTP SERVER来获取系统类型
myhost~> telnet ftp.target.com 21
Trying 123.123.123.123......
Connected to ftp.target.com
Escape character is '^]' 220 ftp1 FTP Server (UNIX(r) System V Release 4.0) ready
SYST
215 UNIX Type: L8 Version: SUNOS
好了,这时虽然我们在登陆系统的TELNET端口没有什么收获,但在FTP的端口上却如愿以尝。一开始 FTP SERVER就告诉了登陆者这个系统为UNIX系统,然后通过使用SYST命令(完全合法的),它又告诉 登陆者进一步的信息。这里我们不打算讨论攻击的问题,但这些信息的获取,足以使一个有经验的攻击 者谋划一次成功的入侵行动!
2. 利用WEB SERVER来得到信息
【TcpIp|利用TCP/IP堆栈进行远程操作系统判别的方法】myhost~>echo 'GET / HTTP/1.0/n' | nc target.com 80 | egrep '^Server:'
Server: Microsoft-IIS/4.0
myhost~>
没错,WEB SERVER再一次地向我们坦白了“我是谁”!
还有一些不是很有效的方法诸如利用查询DNS的主机信息(不是很可靠)来看登记域名时的申请机器类型 和操作系统类型,或者使用社会工程学的方法来获得,以及利用某些主机开放的SNMP的公共组来查询。
目前的技术------利用TCP/IP的堆栈指纹的方法
我们发现利用尝试登陆的信息有时候尽管可以获取很多有用的资料,但是很难保证它的真实性与正确性。 因此,有人开发了利用网络操作系统里的TCP/IP堆栈作为特殊的“指纹”来确定系统的真正身份。这种 的准确性相当高,因为再精明的管理员都不太可能去修改系统底层的网络的堆栈参数。目前,利用这种 技术实现的工具很多,比较著名有NMAP,CHECKOS,QUESO等。
利用这一技术,可以精确地区分Solaris 2.6,2.5-2.51,2.4或者LINUX的内核的细微不同! 它的实现手段主要是以下的几种:
利用用FIN探测: 通过向目标机发送一个FIN的包(或者是任何没有ACK或SYN标记的包)到目标主机的一个开放的端口然后 等待回应。许多系统如MS-WINDOWS,BSDI,CISCO,HP/UX,MVS和IRIX会返回一个RESET。
利用BOGUS标记探测: 通过发送一个SYN包,它含有没有定义的TCP标记的TCP头。那么在LINUX系统的回应任就会包含这个没有 定义的标记,而在一些别的系统则会在收到SYN+BOGU包之后关闭连接。利用这些特性,可以区分一些操 作系统。
利用TCP ISN采样: 这是利用寻找初始化序列长度模板与特定的操作系统相匹配的方法。利用它可以对许多系统分类,如较 早的UNIX系统是64K长度。一些新的UNIX系统则是随机增长的长度(Solaris,IRIX,FreeBSD,Digital Unix, Cray等)
使用Don't Fragment位: 许多操作系统在发送的包里使用这个位,由此可以确定操作系统的类型。
使用TCP的初始化窗口: 在这里只是简单地检查返回包里包含的窗口长度。这项技术根据各个操作系统的不同的初始化窗口大小 来唯一确定它

    推荐阅读