传统的技术
传统的判别操作系统的技术是通过直接登陆主机的办法来识别的。比如:
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来得到信息
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的初始化窗口: 在这里只是简单地检查返回包里包含的窗口长度。这项技术根据各个操作系统的不同的初始化窗口大小 来唯一确定它