网络安全 频道

远程主机探测技术FAQ集 - OS识别篇

1:为什么要识别远程主机的OS?
OS识别是入侵或安全检测需要收集的重要信息,是分析漏洞和各种安全隐患的基础。只有确定了远程主机的操作系统类型,版本,才能对其安全状况做进一步评估。

2:什么能标识远程主机的OS信息?
端口及其运行的服务,主机上运行的程序种类及版本信息,TCP/IP协议栈实现的差异等等,凡是能标明某个类型[版本]OS与其他所有不同类型[版本]OS不同的差别
均可作为标识远程主机OS信息的手段。

3:识别远程主机OS的方法都有什么?
根据ICMP协议的应用得到TTL值: 直接对目标主机进行ping 指令将返回 TTL 值,也可以配合Tracert确定原始[或者更精确]的TTL值,这种方法相当简单,但是不精确且
不可靠,因为主机管理员可以手动修改TTL值 WINDOWS系统中只需要修改注册表的对应键值,将DefaultTTL 这个key修改即可。

获取应用程序旗标:比如:直接对主机进行telnet 或者 Ftp 连接,缺省情况下你将得到远程主机返回的Banner信息,它将诚实地交代自己的信息,telnet 可以直接得到一些OS的信息,FTP将得到FTP SERVER的信息,便于辅助确认远程OS。当然,这些 Banner 信息也可以很方便地被修改,因此不要过分相信它。[此方法将在“我该怎样获取远程OS及其上运行的应用程序的旗标?”中专门指出]

利用TCP/IP协议栈指纹鉴别 :[此方法将在“TCP/IP协议栈指纹鉴别究竟是怎么回事?”中专门指出]需要指出:这个方法的准确性和可靠性都很高!因为一般的管理员可不会去有意识地修改OS底层工作着的网络堆栈参数。queso,nMAP,checkOS等工具就是利用这个原理来识别远程OS。

WEB查点+综合分析:若目标主机是一台WEB主机,那么可以直接通过WWW访问它,当今很少见HTML静态页面了,许多站点都是通过一些WEB脚本[ASP PHP CGI等]搭建,通过在WEB页面上搜集的信息也可以粗略判断OS,比如ASP的脚本,那主机当然是WINDOWS系列了,通常这个方法粗略且不准确 [除非他们把主机配置信息详细发布在WEBSITE上~:)]现在也有不少WEB站点用VMWARE等软件建造一个虚拟机环境,这给通过访问WEB来获取OS信息又造成了障碍。

社交工程探测:这个不必多讲了,与技术无关,看你的骗术高低了~:)

4:TCP/IP协议栈指纹鉴别究竟是怎么回事?

协议栈指纹识别[stack fingerprinting]
此技术分两类,一类是主动识别,另一类则是被动识别

主动协议栈指纹识别
原理:由于TCP/IP协议栈技术只是在RFC 文档中描叙,并没有一个统一的行业标准,于是各个公司在编写应用于自己的OS的TCP/IP协议栈时,对RFC文档做出了不尽相同的
诠释,于是造成了各个OS在TCP/IP协议的实现上不同。好比人类的指纹,每个普通人都有指纹,但是没有两个人的指纹是一模一样的。通过对不同 OS的TCP/IP协议栈存在的些微差异的鉴别来判定OS类型[版本]的技术也就好比人们往往应用指纹来标明是否同一人一样,这种技术是目前很高级的远程OS鉴别方法。最早将此技术应用于网络探测的工具是queso ,它通过一个已开放端口进行协议栈指纹识别[默认情况下是80端口],后来这个程序的作者Fyodor将它整和进nMAP里,造就了这一伟大扫描器的辉煌。
一般情况下nMAP要求远程主机至少开放一个端口以供刺探,不过即使没有任何端口开放,nMAP也能智能判断远程OS,当然精确度要大打折扣。
关于主动协议栈指纹识别这个领域最权威的论文是Fyodor发表在Phrack杂志上的《Remote OS detection via TCP/IP Stack FingerPrinting 》
各种主动发送的探测数据包类型:
FIN 探测:根据RFC 793文档,往目标主机上一个打开的端口发送一个FIN分组[其实任何无ACK和SYN标记的包可以达到同样的目的],正确的响应应该是无任何响应;
但是,许多OS的TCP/IP协议栈实现上将返回一个FIN/ACK包[据笔者不完全统计有WINNT ,CISCO IOS,HP/UX,IRIX等]

BOGUS 标记探测:发送一个含有未定义的TCP标记的TCP头的SYN包,那么一些OS[比如Linux]的回应将包含这个未定义的标记,在其它一些系统收到SYN+BOGU包将关闭连接
利用这些特性可以标识一些OS。

ISN 采样探测:寻找初始化序列长度模板与特定的OS匹配的方法,这样可以区分一些OS 比如早些的UNIX系统是64K长度;而一些新的UNIX系统则是随机增加长度。
[比如 Solaris,IRIX,FreeBSD,Digital Unix,Cray等)

Don''t Fragement 位 探测:一些操作系统会设置IP头部 “Don''t Fragement 位”[不分片位]以改善性能,监视这个位就可以判定区分远程OS

TCP 初始窗口大小 检测:简单检查返回的包里包含的窗口大小,某些OS在TCP/IP协议栈的实现中,这个值是独特的[AIX是0x3F25,NT和BSD是0x402E],可以增加指纹鉴别的准确度。

TCP 可选项 探测:由RFC 793,1323文档定义的TCP 可选项[比如:无操作;最大段大小MSS ;时间戳等],利用在发送的TCP包里设定一些TCP 可选项,根据返回包内容判断OS。在RFC 1323定义的一些高级可选项有许多在比较新的OS对TCP/IP协议栈实现中加入。

ACK 值探测:不同OS对TCP/IP协议栈实现在ACK包序列号值选择上存在差异,有些OS发送回所确认TCP包的序列号[多数情况下],另外一些则发送回所确认TCP包的序列号加1
[WINDOWS系列和一些打印机系统]

ICMP出错消息抑制:根据RFC 1812文档 的规定,有些OS限制ICMP出错消息的速率;通过某个随即选定的高位端口发送UDP包,可能统计出在某个给定时间段内接受的不可达出错消息的数目。

ICMP消息引用:当需要发送ICMP出错消息时,不同OS在引用网络包的的信息量不同。通过检测所引用的消息,可以粗略判断OS

ICMP出错消息回射完整性:某些OS对TCP/IP协议栈的实现在返回ICMP出错消息的时候会修改所引用的IP头,检测对IP头改动的类型可以粗略判断OS。

TOS [服务类型]:检测ICMP端口不可达消息的TOS字段,多数OS会是0,另一些则不是

片段处理:不同 TCP/IP协议栈实现在对重叠的片段处理上有差异。有些在重组时会用后到达的新数据覆盖旧数据,有些则相反。


被动协议栈指纹识别
主动协议栈指纹识别由于需要主动往目标发送数据包,但这些数据包在网络流量中比较惹人注目,因为正常使用网络不会按这样的顺序出现包,因此比较容易被IDS捕获
为了隐秘地识别远程OS,就需要使用被动协议栈指纹识别。
被动协议栈指纹识别在原理上和主动协议栈指纹识别相似,但是它从不主动发送数据包,只是被动地捕获远程主机返回的包来分析其OS类型[版本]
四种常用的被动签名[signature]:
TTL值: Time-To-Live 设置是什么
窗口大小: OS设置的窗口大小
DF: 是否设置 Don''t Fragment [不分片]
TOS:设置的服务类型

被动分析这些属性并将得到的比较结果与属性库比较以判断远程OS类型[版本]
siphon是利用此技术的识别工具http://www.subterrain.net/projects/siphon


5:我该怎样防护我的系统免受TCP/IP协议栈指纹鉴别?

主动协议栈指纹识别:由于其主动向你的主机发送数据包,你可以使用IDS检测到异常包,比如SYN
被动协议栈指纹识别:从其原理上这个是无法检测的,只可能尽量干扰其结果,比如修改TTL值等

对付TCP/IP协议栈指纹识别技术其实也可以通过修改系统底层实现,但是这么做通常会付出代价,比如丧失一些网络功能

6:我该怎样获取远程OS及其上运行的应用程序的旗标?

[笔者水平所限这里列出的例子都很初级,事实上旗标是重要而危险的信息!了解了旗标和其一般获取方法,你就知道该怎么样来利用那些已经公布出来的应用程序漏洞(现在很多是溢出或格式化字符串类的)了,不要以为许多旗标将由扫描器自动获取,你就不需要去练习如何手动获取旗标,切记永远不要依赖你手上的扫描器!它不仅更新慢而且误报率高!如果你自认为是个勤奋的HACKER或者安全技术员,你的入侵手法就不能落在人家后面,究竟要怎样才能不落人后?不论是习惯性地常去浏览最新漏洞列表,查找新exploit还是自己在家写出来SHELLCODE,总之在实验你手头的新东西时查找实验品上所需要的程序旗标可就是你的基本功了!]

针对UNIX:利用远程过程调用[RPC]与服务器交互 :在WINNT下我们用rpcdump工具可以查询:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
+ c:\sheepxxy>rpcdump 172.16.0.88 +
+ +
+ Program no. Name Version Protocol Port +
+ +
+ (100000) portmapper 4 TCP 111 +
+ (100000) portmapper 3 TCP 222 +
+ ........ ....... .. ... .. +
+ +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在UNIX类下我们可以用rpcinfo -p 和NT下的rpcdump效果差不多

针对NT:除了使用系统自带的TELNET 和FTP工具外[利用方法前面已经提过,提示:还可以尝试HTTP的80端口、SMTP的25端口],还可以请出netcat这一瑞士军刀

使用netcat 连接到远程端口:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
+ c:\sheepxxy>nc -v www.hackart.org 80 +
+ www.hackart.org [xxx.xxx.xxx.xxx] 80 (?) open +
+ +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这样我们可以得到HTTP的响应,输入回车后:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
+ +
+ HTTP:/1.1 400 bad Reguest +
+ Server: Microsoft-IIS/5.0 +
+ Date: ......................................... +
+ Content-Type: text/html +
+ Content-Length:............................... +
+ +
+ +
+............................................................ +
+ +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

从上表我们很清楚地知道了对方的WEB SERVER信息。

针对 WWW 站点:Sam Spade 这个工具可以筛选整个站点获取指定信息,可以匹配选定的关键字搜索
Teleport pro 这个工具可以把整个站点打包回来供你细心分析信息。[当然其他很多离线浏览器有同样的功能,但Teleport pro 更方便使用一些]

7:我已经看过本文了[是否感觉它粗浅的很?~:)],我想知道哪里还能得到关于这些的更多信息

加拿大PGCI公司网站上 有你想要得到的丰富资源,包括指纹鉴别,以及针对sendmail,FTP,WEB server 旗标查点的方法与对策[毕竟是安全公司,以防护为主]
http://www.pgci.ca/p_fingerprint.html

Fyodor 关于主动协议栈指纹鉴别技术的论文是绝对经典 《Remote OS detection via TCP/IP Stack FingerPrinting》
http://www.insecure.org/nmap/nmap-fingerprinting-article.html

Lance Spitzner 关于的被动协议栈指纹鉴别技术的论文
《Passive Fingerprinting》

http://hackbase.com/tech/2004-09-29/03656.html

0
相关文章