Hello,嗨,大家好,我是哈喽猿。
这里是哈喽猿网
今天推送的是网络安全【kalinux】的文章,感谢您宝贵的时间阅读
操作系统指纹识别
识别目标主机的操作系统,首先,能够帮助咱们进一步勘探操作系统级别的漏洞然后能够从这一级别进行渗透测验。其次,操作系统和建筑在本系统之上的应用一般是成套出现的,例如LAMP或许LNMP。操作系统的版别也有助于咱们准确定位服务程序或许软件的版别,比如windows server 2003 搭载的IIS为6.0,windows server 2008 R2 搭载的是IIS7.5。 操作系统指纹识别技术多种多样,这儿我简要介绍我所知道的几种常用技术,不会详细深化到细节中,若您感兴趣可自己查阅材料。
Banner抓取
Banner抓取是最根底、最简略的指纹识别技能,并且在不需要其他专门的工具的情况下就可以做。操作简略,通常获取的信息也相对准确。 严厉的讲,banner抓取是应用程序指纹识别而不是操作系统指纹识别。Banner信息并不是操作系统自身的行为,是由应用程序主动返回的,比如apathe、exchange。并且许多时分并不会直接返回操作系统信息,幸运的话,可能会看到服务程序自身的版本信息,并以此进行推断。 凡事皆有利弊,越是简略的办法越简单被防御,这种办法见效的成功率也越来越低了。 先来看一个直接Banner抓取的例子。
在上图中,直接telnet 80端口,在返回的服务器banner信息中,看到“Server: Microsoft-HTTPAPI/2.0”的字样。 在IIS中使用ISAPI扩展后,经常会看到这样的Banner。下表可以帮助我们识别操作系统:
Server Header Value |
Windows Server Version |
Microsoft-HTTPAPI/2.0 |
Windows 2003 Sp2, Windows 7, Windows 2008, Windows 2008 R2 |
Microsoft-HTTPAPI/1.0 |
Windows 2003 |
如果没有ISAPI拦截,我们可能会看到如下图的信息
准确的IIS版本,会帮助我们更准确的判断操作系统,可以参考下表:
IIS Version |
Windows Server Version |
IIS 5.0 |
Windows 2000 |
IIS 5.1 |
Windows XP |
IIS 6.0 |
Windows 2003 |
IIS 7.0 |
Windows 2008, Windows Vista |
IIS 7.5 |
Windows 2008 R2, Windows 7 |
对于asp.net站点,通常会看到“X-Powered-By”字样,会指示.net 版本,但是这对判断操作系统版本帮助不大。 其他web服务器如apache、nginx,除非直接输出操作系统版本,否则根据服务程序版本无法推断操作系统版本。配置不当的服务可能会输出如下信息:
HTTP/1.1 200 OK
Date: Mon, 16 Jun 2003 02:53:29 GMT
Server: Apache/1.3.3 (Unix) (Red Hat/Linux)
Last-Modified: Wed, 07 Oct 1998 11:18:14 GMT
ETag: "1813-49b-361b4df6"
Accept-Ranges: bytes
Content-Length: 1179
Connection: close
Content-Type: text/html
有经验的管理员都会修改banner或者禁止输出banner信息,比如下面的测试:
我们可以看到图中目标站点并未输出任何banner信息。 除了web服务器程序,很多ftp、smtp服务也会返回banner信息。在2.3节《服务程序指纹识别》一节中,还会讲解Banner抓取,本节就简要介绍到这里。
TCP 和 ICMP 常规指纹识别技术
正常而言,操作系统对TCP/IP的实现,都是严格遵从RFC文档的,因为必须遵从相同的协议才能实现网络通信。但是在具体实现上还是有略微的差别,这些差别是在协议规范之内所允许的,大多数操作系统指纹识别工具都是基于这些细小的差别进行探测分析的。 如果您不熟悉TCP/IP协议,那么可以查询资料或者跳过这一部分,不影响对工具的使用。 为了节省篇幅,不影响实践学习,我只是简单列出使用的技术,并未深入。
TCP数据报格式
中间的标志位(flags)就是用于协议的一些机制的实现的比特位大家可以看到有6比特,它们依次如下:
URG、ACK、PSH、RST、SYN、FIN。
URG表明紧迫指针字段有效;
ACK置位表明承认号字段有效;
PSH表明当时报文需求恳求推(push)操作;
RST置位表明复位TCP衔接;
SYN用于建立TCP衔接时同步序号;
FIN用于释放TCP衔接时标识发送方比特流完毕。
源端口(Sequence Number)和意图端口:各为16比特,用于表明应用层的衔接。源端口表明发生数据包的应用层进程,而意图端口则表明数据包所要到达的意图进程。
序列号:为32比特,表明数据流中的字节数。序列号为首字节在整个数据流中的方位。初始序列号随机发生,并在衔接建立阶段予以同步。
承认号:表明序号为承认号减去1的数据包及其以前的所有数据包已经正确接纳,也就是说他相当于下一个准备接纳的字节的序号。
头部信息:4比特,用于指示数据开始方位。因为TCP包头中可选项的长度可变,因此整个包头的长度不固定。如果没有附加字段,则TCP数据包根本长度为20字节。
窗口:16位,表明源端主机在恳求接纳端等待承认之前需求接纳的字节数。它用于流量控制,窗口巨细根据网络拥塞情况和资源可用性进行增减。
校验位:16位。用于查看TCP数据包头和数据的一致性。
紧迫指针:16位。当URG码有效时只向紧迫数据字节。
可选项:存在时表明TCP包头后还有另外的4字节数据。TCP常用的选项为最大数据包(并非整个TCP报文)MSS。每一个TCP段都包含一个固定的20字节的段头。TCP段头由20字节固定头和一些可选项组成。实践数据部分最多可以有65495(65535-20-20=65495)字节。
ICMP首部格式
对于上图中的Data部分,不同的ICMP类型,会拆分成不同的格式,这里就不一一介绍了。
TCP数据报格式
下表是几个典型的操作系统的TTL和TCP窗口的大小数值。
Operating System |
Time To Live |
TCP Window Size |
Linux (Kernel 2.4 and 2.6) |
64 |
5840 |
Google Linux |
64 |
5720 |
FreeBSD |
64 |
65535 |
Windows XP |
128 |
65535 |
Windows Vista and 7 (Server 2008) |
128 |
8192 |
iOS 12.4 (Cisco Routers) |
255 |
4128 |
产生上表中数据差别的主要原因在于RFC文档对于TTL和滑动窗口大小并没有明确的规定。另外需要注意的是,TTL即时在同一系统下,也总是变化的,因为路由设备会修改它的值。 基于TTL与TCP窗口大小的操作系统探测需要监听网络,抓取数据包进行分析,这种方法通常被称之为被动分析。 FIN探测 在RFC793中规定FIN数据包被接收后,主机不发送响应信息。但是很多系统由于之前的固有实现,可能会发送一个RESET响应。比如MS Windows, BSDI, CISCO, HP/UX, MVS, 和IRIX。 BOGUS flag 探测 发送一个带有未定义FLAG的 TCP SYN数据包,不同的操作系统会有不同的响应。比如Linux 2.0.35之前的系统会在响应包中报告未定义的FLAG。 TCP ISN 抽样 TCP连接的初始序列号(ISN),是一个随机值,但是不同的操作系统的随机方式不一样,还有的操作系统每次的ISN都是相同的。针对ISN做多次抽样然后比对规律可以识别操作系统类型。 IPID 抽样 IP标识是用来分组数据包分片的标志位,和ISN一样,不同的操作系统初始化和增长该标识值的方式也不一样。 TCP Timestamp 有的操作系统不支持该特性,有的操作系统以不同的更新频率来更新时间戳,还有的操作系统返回0。 ACK值 在不同场景下,不同的请求,操作系统对ACK的值处理方式也不一样。比如对一个关闭的端口发送数据包,有的操作系统ACK+1,有的系统则不变。 ICMP错误信息 ICMP错误信息是操作系统指纹识别的最重要手段之一,因为ICMP本身具有多个类型,而错误信息又是每个操作系统在小范围内可以自定义的。 DHCP DHCP本身在RFC历史上经历了1541、2131、2132、4361、4388、4578多个版本,使得应用DHCP进行操作系统识别成为可能。
数据包重传延时技术
之所以把数据包延时重传技能单独拿出来,是因为相对于上面说的技能,它归于新技能,现在大多数体系都没有针对该方法做有用的防护。可是根据该技能的东西也不是很老练,这儿期望引起读者的重视或许激起你对该技能的热心。 对于在2.2.2节中介绍的技能,很大程度上遭到网络环境、防火墙、侵略检测体系的影响。那么数据包重传延时技能能处理这些问题吗? 因为数据包丢失,或许网络堵塞,TCP数据包重传归于正常状况。为了辨认重复的数据包,TCP协议运用相同的ISN和ACK来确定接收的数据包。 包重传的延时由重传定时器决议,可是确定一种适宜的延时算法比较困难,这是源于以下原因: 承认信号的延迟在实际网络环境中是可变的; 传输的分段或承认信号或许丢失,使得估计往复时间有误。 TCP选用了自习惯的重传算法,以习惯互连网络中时延的变化.该算法的基本思想是经过最近的时延变化来不断批改原有的时延样本,RFC中并没有明确详细如何执行。 因为不同操作体系会选择选用自己的重传延迟算法,这就造成了经过剖析各体系重发包的延迟来判别其操作体系类型的或许性,如果各操作体系的重传延迟彼此存在各异性,那么就很容易将它们彼此区别开来。 因为此种技能,选用标准的TCP数据包,一般状况下可以有用的躲过防火墙和侵略检测体系。可是现在根据此种技能的东西还很少。
使用Nmap进行操作系统探测
一般性探测 使用Nmap进行操作系统识别最简单的方法为使用-O参数,如下是我对内网扫描的几个数据。
nmap -O 192.168.1.1/24
上面的命令表示对192.168.1.1 所在网段的C类255个ip进行操作系统版本探测。 对192.168.1.1的扫描结果(1.1是Tp-link路由器):
MAC Address: A8:15:4D:85:4A:30 (Tp-link Technologies Co.)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.23 - 2.6.38
Network Distance: 1 hop
对192.168.1.101的扫描结果(实际为android系统手机):
MAC Address: 18:DC:56:F0:65:E0 (Yulong Computer Telecommunication Scientific(shenzhen)Co.)
No exact OS matches for host (If you know what OS is running on it, see http://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=6.40%E=4%D=12/27%OT=7800%CT=1%CU=39712%PV=Y%DS=1%DC=D%G=Y%M=18DC5
OS:6%TM=52BD035E%P=x86_64-unknown-linux-gnu)SEQ(SP=100%GCD=1%ISR=109%TI=Z%C
OS:I=Z%II=I%TS=7)OPS(O1=M5B4ST11NW6%O2=M5B4ST11NW6%O3=M5B4NNT11NW6%O4=M5B4S
OS:T11NW6%O5=M5B4ST11NW6%O6=M5B4ST11)WIN(W1=7120%W2=7120%W3=7120%W4=7120%W5
OS:=7120%W6=7120)ECN(R=Y%DF=Y%T=40%W=7210%O=M5B4NNSNW6%CC=Y%Q=)T1(R=Y%DF=Y%
OS:T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=
OS:R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T
OS:=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=
OS:0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(
OS:R=Y%DFI=N%T=40%CD=S)
从上面的结果可以看出,nmap对android系统识别率不高。 对192.168.1.102的结果如下(实际系统为windows 7 sp1):
Device type: general purpose
Running: Microsoft Windows 7
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:microsoft:windows_7::sp1
OS details: Microsoft Windows 7 SP0 - SP1
对192.168.1.106的探测结果如下(实际系统为ios 5.0):
MAC Address: CC:78:5F:82:98:68 (Apple)
Device type: media device|phone
Running: Apple iOS 4.X|5.X|6.X
OS CPE: cpe:/o:apple:iphone_os:4 cpe:/a:apple:apple_tv:4 cpe:/o:apple:iphone_os:5 cpe:/o:apple:iphone_os:6
OS details: Apple Mac OS X 10.8.0 - 10.8.3 (Mountain Lion) or iOS 4.4.2 - 6.1.3 (Darwin 11.0.0 - 12.3.0)
对192.168.1.106的探测结果如下(实际为苹果一体机、windows7 sp1):
MAC Address: 7C:C3:A1:A7:EF:8E (Apple)
Too many fingerprints match this host to give specific OS details
对192.168.1.119的探测结果如下(实际为windows server 2008 r2,vmware虚拟机):
MAC Address: 00:0C:29:AA:75:3D (VMware)
Device type: general purpose
Running: Microsoft Windows 7|2008
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:microsoft:windows_7::sp1 cpe:/o:microsoft:windows_server_2008::sp1 cpe:/o:microsoft:windows_8
OS details: Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, or Windows 8
Network Distance: 1 hop
对192.168.1.128探测结果如下(centOS 6.4,VMware虚拟机):
MAC Address: 00:0C:29:FE:DD:13 (VMware)
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.0 - 3.9
指定网络扫描类型 nmap支持以下扫描类型:
- -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon
- -sN/sF/sX: TCP Null, FIN, and Xmas
- --scanflags <flags>: Customize TCP scan flags
- -sI <zombie host[:probeport]>: Idlescan
- -sO: IP protocol scan
- -b <ftp relay host>: FTP bounce scan
比如要使用TCP SYN扫描,可以使用如下的命令:
nmap –sS -O 192.168.1.1/24
设置扫描条件
采用--osscan-limit这个选项,Nmap只对满足“具有打开和关闭的端口”条件的主机进行操作系统检测,这样可以节约时间,特别在使用-P0扫描多个主机时。这个选项仅在使用 -O或-A 进行操作系统检测时起作用。 如:
nmap -sS -O --osscan-limit 192.168.1.119/24
推测结果
从上面的扫描示例,我们也能看出,Nmap默认会对无法精确匹配的结果进行推测的。按官方文档的说法,使用--osscan-guess; --fuzzy选项,会使推测结果更有效,实际测试没有任何区别。
使用Xprobe2进行操作系统探测
Xprobe2是一款使用ICMP消息进行操作系统探测的软件,探测结果可以和Nmap互为参照。但是该软件目前公开版本为2005年的版本,对老的操作系统探测结果较为准确,新系统则无能为力了。 下面命令为xprobe2简单用
xprobe2 -v www.iprezi.cn
结果如下:
使用p0f进行操作系统探测
p0f是一款被动探测工具,通过分析网络数据包来判断操作系统类型。目前最新版本为3.06b。同时p0f在网络分析方面功能强大,可以用它来分析NAT、负载均衡、应用代理等。
p0f的命令参数很简单,基本说明如下:
- -f fname指定指纹数据库 (p0f.fp) 路径,不指定则使用默认数据库。
- -i iface 指定监听的网卡。
- -L 监听所有可用网络。
- -r fname 读取由抓包工具抓到的网络数据包文件。
- -o fname 附加之前监听的log文件,只有同一网卡的log文件才可以附加合并到本次监听中来。
- -d 以后台进程方式运行p0f ;
- -u user 以指定用户身份运行程序,工作目录会切换到到当前用户根目录下;
- -p 设置 –i参数指定的网卡为混杂模式;
- -S num 设置API并发数,默认为20,上限为100;
- -m c,h 设置最大网络连接数和同时追踪的主机数 (默认值: c = 1,000, h = 10,000).
- -t c,h 设置连接超时时间
下面使用如下命令进行测试:
p0f -i eth0 –p
上面命令的含义为监听网卡eth0,并开启混杂模式。这样会监听到每一个网络连接,部分结果摘录如下:
p0f监听结果1
p0f监听结果2
在p0f监听结果2图中,检测的结果我windows7或8,对比下nmap的结果为windows7,实际该机器系统为 windows7 sp1。
nmap检测结果
p0f监听结果3
在p0f监听结果3图中,捕获的数据是浏览器发送的请求数据,我们可以看到浏览器请求信息中“Windows NT 6.1; WOW64; Trident/7.0; rv:11.0”的字样,从这段UserAgent中,可以看出发出请求的系统为windows7 64位,IE11。
使用miranda进行操作系统探测
miranda工具是一个通过UPNP功能来探测主机信息的工具,并不限于探测操作系统。下面我们通过一个实例,演示如何使用miranda。 在终端输入如下命令:
miranda -v -i eth0
上面的命令是指定打开网卡eth0,返回结果如下:
miranda提示输入开启upnp的主机,现在我们不知道哪台主机开启了upnp,输入命令“msearch”,会自动搜索upnp主机,
接着我们会看到扫描到的upnp主机:
按 CTRL +C终止扫描,输入host list。
可以看到搜集的主机列表,然后使用host get [index]命令可以查看该主机的upnp设备列表。
使用host info [index]查看主机详细信息
从上图信息可以看到,这是一台TP-Link路由器。同样的方法,查看一台windows 7主机。
小结
本节大致罗列了操作系统识别的常用技能和典型东西。因为本书是实践性质的,所以没有对指纹识别技能做深入的讲解。 根据数据包延时重传技能的东西,笔者只知道RING和Cron-OS,可是这两款东西没有集成到Kali Linux 中,同时也好久没有更新,故没有做介绍。
0 评论