网络侦察技术之主动扫描探测(二)
2024-8-14 10:55:3 Author: mp.weixin.qq.com(查看原文) 阅读量:6 收藏

一.  前言

在《网络侦察技术之主动扫描探测(一)》中,我们将主动扫描探测分为发现、识别和爬取三大阶段,并详细介绍了发现阶段的各种端口扫描技术。本文主要讲述了识别和爬取阶段的关键技术,包括协议服务识别、操作系统识别以及banner抓取等内容。

二.  协议识别

通过发现阶段,我们得到了目标网段的存活主机,以及这些主机上开放的端口列表,识别阶段就是识别这些开放端口所运行的协议和产品,以及主机的操作系统信息。

2.1

协议端口号匹配

通常,协议(或服务)和端口号是存在对应关系的,例如80端口通常是HTTP协议,443端口通常是HTTPS协议,53端口通常是DNS协议等。IANA 【1】定义了服务名称和端口号的对应关系。如图1,Linux系统中/etc/services文件也存储了这种对应关系。所以一种简单的方式是通过端口号直接匹配相应的协议和服务,这种方法仅对使用标准端口的服务有效,能处理大多数情况,但是对于使用非标准端口的协议会识别出错。

1 /etc/services文件

2.2

Nmap协议指纹库

Nmap提供了一个用于协议识别的指纹库【2】,该指纹库包含350种以上协议的大约3000条模式匹配。通过向目标端口发送对应的探测包,然后对响应消息匹配相应的模式(正则表达式)从而确定协议和服务类型以及产品,甚至版本号。

图2 nmap协议指纹库

该协议指纹库主要由Probe指令、Softmatch指令和Match指令构成,此外,还包括一些辅助性指令。

Probe指令指明了探测包的具体内容。

语法如下:

Probe <protocol> <probename> <probestring> [no-payload]

示例如下:

Probe TCP GetRequest q|GET / HTTP/1.0\r\n\r\n|

上述示例中,探测包的名字为GetRequest,使用TCP协议向目标端口进行探测,探测包的内容用q||界定范围(q||),上述探测包的内容为'GET / HTTP/1.0\r\n\r\n'。

Softmatch指令提供了一个正则表达式匹配响应报文,但是仅能识别服务类型,而无法识别版本信息。

语法如下:

softmatch <service> <pattern>

示例如下:

softmatch ftp m/^220 [-.\w ]+ftp.*\r\n$/i

上述示例中,softmatch指令用pattern(格式为m/[regex]/[opts])的正则表达式匹配响应报文,匹配成功则判定为ftp服务,其中pattern中的m//用于界定范围,i为选项,表示忽略大小写匹配。

match指令类似softmatch指令,其不仅能识别服务,还能识别产品和版本信息。

语法如下:

match <service> <pattern> [<versioninfo>]

示例如下:

match ftp m/^220.*Welcome to .*Pure-?FTPd (\d\S+\s*)/ p/Pure-FTPd/ v/$1/ cpe:/a:pureftpd:pure-ftpd:$1/

比如,上述match指令,匹配成功的产品为Pure-FTPd,版本号通过正则表达式的括号符提取。

Nmap使用该指纹库对某个端口进行协议识别的大致流程如下:

    1. Nmap检查该端口是否是要排除的端口之一,这些端口为9100到9107,这些是打印机监听的常用端口,版本检测扫描可会使打印机执行打印操作,故被排除。

    2. 进行TCP三次握手。

    3. 三次握手成功相当于执行了NULL probe,这个时候有很多协议会在第三次握手返回文本信息,其中包含协议的指纹,这些文本信息叫做banner信息,比如FTP可能会返回220 FTP version 1.0 Current users: 0。SSH可能会返回SSH-2.0-OpenSSH_8.9p1 Ubuntu-3。Nmap大概有3000个NULL probe指纹,如果能直接通过返回的banner信息得到协议类型和版本号,则被称为完全匹配,如果仅能识别协议类型而不能识别版本号,则被称为软匹配,需要发送更多探测包进行深度探测。nmap会向目标端口发送对应的probe,因为每个协议通常都会对应一组常用端口列表,比如web服务列表为:80-85,8000-8010,8080-8085,通过端口推测协议,然后用该协议对应的probe进行探测。

    4. 三次握手失败则进行udp探测。

三.  操作系统识别

3.1

基于TCP/IP协议栈探测的方法

此方法利用了不同操作系统在实现TCP/IP协议栈时的细微差异。比如,不同操作系统的ICMP回显响应报文的TTL初始值是不同的,在Windows 系统TTL 值初始值会设定为 127,Linux 系统 TTL 值初始值设定为 64。图3是向两个主机发送的ICMP探测结果,由于互联网中IP报文会经过的路由器数量通常不会超过 32 个,所以可以推测出111.204.7.26的操作系统为Windows,而110.242.68.66的操作系统为Linux。

图3 不同操作系统的ICMP实现差异

但事实上,Nmap识别操作系统的方式十分复杂。为了利用尽可能多的实现差异确保操作系统识别的准确率,Nmap会向目标机器的开放和未开放端口发送最多可达16个TCP、UDP和ICMP探测包,这些探测包头部的各个字段字段会被设置特定的值并依照某种特定顺序发送,然后得到响应报文。Nmap会从这些响应报文中提取出数十个属性(比如上述ICMP回显响应报文的TTL就是其中之一)并对它们计算分析,然后组合成指纹,通过nmap-os-db指纹数据库匹配确定操作系统的类别和版本。关于Nmap具体实现细节,感兴趣的读者可以参考Nmap官文手册。

3.2

基于开放端口模式

通常可以通过目标主机开放的端口列表来判断该主机的操作系统,比如微软的Windows系统通常会开放135( Microsoft RPC 服务)、139(NetBIOS Session Service)和445端口(Microsoft-DS 服务),而Linux系统通常会开放22(SSH)和631端口(Internet Printing Protocol)。但是这种方式并不可靠,所以Nmap并没有实现这个功能。

图4 Windows系统常见端口

3.3

基于漏洞利用脚本

有些版本的操作系统存在漏洞,利用漏洞的poc或者exp对目标系统进行测试可以缩小目标操作系统的范围。比如,MS17-010(永恒之蓝)漏洞影响包括Windows Vista、7、8、8.1、10以及多个版本的Windows Server(2003、2008、2012、2016)。如果目标系统启用了SMB,则可以利用这个漏洞进行测试。不过由于补丁的存在,所以这个方法也不是很可靠。

3.4

基于TCP重传时间

不同版本的操作系统在实现TCP的重传等待时间是不一致的,可以通过向目标开放端口发送SYN报文,然后忽略返回的SYN/ACK报文或者用RST作为回应,此时目标主机多次重新发送SYN/ACK报文,通过分析重传时间可以区分的操作系统。但是由于速率慢、丢包、延迟会影响结果等问题,Nmap并未实现该方法。

3.5

基于IP分片识别

IP分片是当IP数据包超过网络的最大传输单元(MTU)时,将其分成较小的片段,以便通过网络传输。在接收端,这些片段会被重新组装成原始数据包。不同操作系统在处理IP分片时可能会有不同的实现细节,这些细微差异可以作为指纹来识别操作系统,比如,可以通过分片头部字段和分片重组超时时间的差异区分不同的操作系统。不过,由于许多防火墙和其他中间设备对网关上的流量进行分片重组,所以该方法识别出来的操作系统可能并非目标主机的,Nmap也并未实现该方法。

四.     资源爬取

资源阶段的主要任务是获取目标系统的详细资源信息,以便为后续的分析和利用提供基础数据,包括但不限于banner信息、SSL证书信息,网页内容等。

4.1

banner信息

Banner信息是指在网络服务的初始连接阶段,服务端返回给客户端的标识信息。这些信息通常包含服务的名称、版本、操作系统信息以及其他与服务相关的细节。事实上,在使用Nmap协议指纹库进行协议识别时,通过发送NULL probe在识别协议服务的同时就已经拿到了banner信息。banner信息通常有2种触发形式:1.发送NULL Probe,即完成TCP三次握手后,目标服务主动发送banner信息;2需要使用特定格式的Probe,比如HTTP协议,需要构造GET请求获得。

在不确定目标端口协议时,通过Telnet、Netcat连接目标端口完成三次握手可以拿到第一类banner。在确定目标端口为HTTP协议时,可以通过Curl、Wget工具获取web服务的banner信息。

Zgrab2是一个专门用于高速banner抓取工具,go语言实现,支持常见20多种协议(如HTTP、SSH、FTP)的banner抓取,用户可自定义扩展。Zgrab2并不提供协议识别能力,用户在进行banner抓取前需要指定目标端口和对应的协议。

4.2

SSL证书信息

某些目标端口使用SSL协议,SSL证书中包含着目标很多信息,比如网站的域名和子域名。Nmap自身不提供直接获取SSL证书的功能,但是可以通过调用外部脚本来实现。nmap --script ssl-cert -n。也可以使用openssl命令获取目标端口证书信息:openssl s_client -connect:443 -showcerts

4.3

特定资源

当目标端口被识别成某一个特定协议时,攻击者想要从该协议获取除banner信息外更多的信息,则需要精心构造特定的报文进行获取。

比如,http协议作为互联网最为主流的协议,其提供了很多丰富的信息。比如网页的icon图标,通常位于<link rel="icon" href="...">标签中,能够帮助识别网站;icp备案信息,通常会显示在页面底部或在``标签中,可用于组织机构识别;某些JavaScript和CSS文件,可能有助于分析网站的功能和潜在漏洞;抓取robots.txt文件和sitemap.xml文件,可以了解站点的结构和爬取规则。通过curl和wget命令可以得到指定页面的html文件,而使用一些python爬虫库,如BeautifulSoup,可以提取网页中的指定元素和内容。

其他的协议也可能存在一些攻击者感兴趣的信息,比如对于一些存在未授权访问的RTSP摄像头,可以构造一个DESCRIBE请求获取流的元数据。

五. 使用建议

对于小批量目标的协议识别、操作系统识别和资源爬取,Nmap 工具可以完全满足需求。Nmap 不仅可以进行协议和操作系统的识别,还支持通过 NSE 引擎进行更复杂的任务,如构造任意协议的报文,并且提供了大量的社区脚本供用户使用。Nmap的协议识别和操作系统识别命令非常简单:nmap -sV,nmap -O。NSE脚本的调用命令也非常简单,下图使用了http-enum脚本枚举目标站点的子目录。

图5 Nmap NSE脚本调用

在处理大量目标时,直接使用 Nmap 的扫描速率可能较低。建议首先使用端口号协议匹配技术来快速筛选目标,然后利用 Zgrab2 来抓取标准端口的 banner 信息和其他信息。这一过程通常能够覆盖大部分使用标准端口的目标。对于剩下的非标准端口,可以使用 Nmap 的指纹库来确定协议并进一步抓取 banner 信息。

六. 总结

本文简要介绍了主动扫描探测的识别和爬取两个阶段所涉及的相关技术原理和工具,包括协议服务识别、操作系统识别以及banner抓取等技术。虽然涵盖了多种技术方法,但主要内容依然是Nmap的技术原理,彰显了其在网络扫描探测领域的绝对地位。

参考文献

[1]. https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

[2]. https://github.com/nmap/nmap/blob/master/nmap-service-probes

[3]. [Nmap: the Network Mapper - Free Security Scanner](https://nmap.org/)

[4]. zmap/zgrab2: Fast Go Application Scanner (github.com)

[5]. https://www.secrss.com/articles/34443

内容编辑:创新研究院 张承万

    责任编辑:创新研究院 舒展

本公众号原创文章仅代表作者观点,不代表绿盟科技立场。所有原创内容版权均属绿盟科技研究通讯。未经授权,严禁任何媒体以及微信公众号复制、转载、摘编或以其他方式使用,转载须注明来自绿盟科技研究通讯并附上本文链接。

关于我们

绿盟科技研究通讯由绿盟科技创新研究院负责运营,绿盟科技创新研究院是绿盟科技的前沿技术研究部门,包括星云实验室、天枢实验室和孵化中心。团队成员由来自清华、北大、哈工大、中科院、北邮等多所重点院校的博士和硕士组成。

绿盟科技创新研究院作为“中关村科技园区海淀园博士后工作站分站”的重要培养单位之一,与清华大学进行博士后联合培养,科研成果已涵盖各类国家课题项目、国家专利、国家标准、高水平学术论文、出版专业书籍等。

我们持续探索信息安全领域的前沿学术方向,从实践出发,结合公司资源和先进技术,实现概念级的原型系统,进而交付产品线孵化产品并创造巨大的经济价值。

长按上方二维码,即可关注我


文章来源: https://mp.weixin.qq.com/s?__biz=MzIyODYzNTU2OA==&mid=2247497639&idx=1&sn=e3052bdef3073e4361818746ba1e729b&chksm=e84c5178df3bd86e3a2c29856b90daac54e717167981c52df8c3b456816366b237de9b8a27d0&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh