攻击者知道哪些机器是活动的和哪些端口是开放的后,下一步是要识别每台主机运行哪种操作系统。判断操作系统类型的一种相对比较准确的方法是利用网络操作系统里的TCP/IP堆栈作为特殊的"指纹"。因为不同的操作系统在网络底层协议的各种实现细节上略有不同。可以通过远程向目标发送特殊的包,然后通过返回的包来确定操作系统类型。例如通过向目标机发送一个FIN的包(或者是任何没有ACK或SYN标记的包)到目标主机的一个开放的端口,然后等待回应。许多系统如Windows、BSDI、CISCO、HP/UX和IRIX会返回一个RESET。通过发送一个SYN包,它含有没有定义的TCP标记的TCP头。那么在Linux系统的回应包就会包含这个没有定义的标记,而在一些别的系统则会在收到SYN+BOGU包之后关闭连接。或是利用寻找初始化序列长度模板与特定的操作系统相匹配的方法。利用它可以对许多系统分类,如较早的UNIX系统是64 KB长度,一些新的UNIX系统的长度则是随机增长。还有就是利用TCP的初始化窗口检查返回包里包含的窗口长度,这项技术根据各个操作系统的不同的初始化窗口大小来唯一确定它们。
也有专门用来探测远程主机并确定在运行哪种操作系统的程序。这些程序通过向远程主机发送不平常的或者没有意义的数据包来完成。因为这些数据包RFC没有列出,一个操作系统对它们的处理方法不同,攻击者通过解析输出,能够弄清自己正在访问的是什么类型的设备和在运行哪种操作系统。这种工具软件比较著名的有Nmap、CheckOS、Queso和Satan等。CheckOS软件可到这里下载:http://www.aventosoft.de/English/Demos/Freeware/CheckOS.html。