在企业内部安全建设中,很重要的一项工作便是针对资产做攻击面梳理,问题包括但不限于有哪些资产(IP),开放了哪些端口,使用了什么服务协议、应用程序、版本号等,以及是否存在漏洞。资产库的梳理不能只停留在CMDB(资产管理系统),而需要结合端口扫描、协议识别等网络空间测绘技术对内网资产进行实时测绘,从而获取到真实、全面的资产测绘信息。
资产测绘的第一步,是利用自研或开源工具(如zmap、masscan等)针对关注目标范围进行端口开放扫描。随后便会进入本文讨论的主题——如何针对端口进行协议识别。
本文将从腾讯企业IT安全团队在办公网资产测绘的实践出发,围绕端口协议识别原理、协议识别能力持续建设思路和衡量识别效果的重点指标三个话题展开详细讨论。
1. 通过探测报文进行协议识别
通常应用程序会默认使用某个固定端口号,但通过端口号直接映射协议是不准确的。因此,在通过端口扫描发现开放的TCP/UDP端口后,需要向其发送探测报文(Probe),并对响应(Response,也称为Banner)进行解析识别,从而确定具体的服务协议。
笔者了解到在fofa内部,通过响应类型的区别对协议进行了三种分类:
A类协议:需要发送正确的request包,服务器才会返回response;
B类协议:主动返回response,无需请求;
C类协议:发送request,即使格式不对也会返回错误信息的response;
延用这个思路,以由易到难的顺序对常见探测报文进行举例说明。
1.1 空探测报文
探测B类协议,建立连接后不用发送任何信息,等待远程直接回复即可。以典型的ssh协议为例,通过netcat建立TCP连接。
$ nc 192.168.1.1 22
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8
从返回的Banner可得知,协议为ssh,应用软件为OpenSSH,应用版本号7.2p2,操作系统为Ubuntu。
1.2 HTTP协议探测报文
在C类协议中,最为常见的便是http协议,发送最简单的HTTP请求进行探测。
$ echo "GET / HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n" | nc localhost 80
HTTP/1.1 200 OK
Server: nginx/1.21.1
Date: Mon, 06 Sep 2021 13:54:53 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 06 Jul 2021 14:59:17 GMT
Connection: keep-alive
Accept-Ranges: bytes
Welcome to nginx! ...
...
Thank you for using nginx.
通过返回的Banner信息,可以确认这是一个http协议,web服务器为nginx,版本为1.21.1。通过head中的title属性,甚至还可以得知该Web页的标题为“Welcome to nginx!”。
实际上,除了识别出协议本身外,是否能从banner中提取更多属性数据是识别能力的另一个重要维度,如获取应用软件信息、版本信息、中间件信息、操作系统等等。
1.2.1 提取更多属性
以etcd应用为例,该应用默认通过2379端口提供HTTP API服务。当访问根路径时,返回的是不带其他特征信息的404 Not Found。
$ echo "GET / HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n" | nc localhost 2379
HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Mon, 06 Sep 2021 14:30:29 GMT
Content-Length: 19
404 page not found
我们可以了解到这是一个http协议的服务。但如果对该应用多一分了解,可以知道访问/version路径时,etcd应用将会返回应用名称及版本好。从下面返回的Banner信息可以得知,应用为“etcdserver”,版本号为3.3.11。
$ echo"GET /version HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n" | nc localhost2379
HTTP/1.1200 OK
Content-Type: application/json
Date: Mon,06 Sep202114:32:13 GMT
Content-Length:45
{"etcdserver":"3.3.11","etcdcluster":"3.3.0"}
1.2.2 https证书信息探测
对于https站点来说,通过其证书信息还可以进一步挖掘更多有价值的信息。在下面的例子中,可以通过证书信息了解到站点所在国家、省、市以及所属公司。
$openssl s_client -connect qq.com:443
CONNECTED(00000006)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verifyreturn:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert Secure Site CN CA G3
verifyreturn:1
depth=0 C = CN, ST = Guangdong Province, L = Shenzhen, O = Shenzhen Tencent Computer Systems Company Limited, CN = roll.news.qq.com
verifyreturn:1
---
Certificatechain
0s:/C=CN/ST=Guangdong Province/L=Shenzhen/O=Shenzhen Tencent Computer Systems Company Limited/CN=roll.news.qq.com
i:/C=US/O=DigiCert Inc/CN=DigiCert Secure Site CN CA G3
1s:/C=US/O=DigiCert Inc/CN=DigiCert Secure Site CN CA G3
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
---
1.3 二进制协议探测报文
在A类协议中,最具有挑战的便是对二进制协议的识别,需要发送正确的“握手“信息,远程服务器才会返回。以libvirtd应用为例,服务默认监听在16509端口上,通过virsh工具可以进行远程连接。
virsh -c qemu+tcp://localhost:16509/system
通过wireshark对连接过程网络流量进行观察,发现在通过virsh工具建立连接时都会进行以下tcp交互。
#发送TCP Data(以十六进制表示)
\\x00\\x00\\x00\\x38\\x20\\x00\\x80\\x86\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x0e\\x71\\x65\\x6d\\x75\\x3a\\x2f\\x2f\\x2f\\x73\\x79\\x73\\x74\\x65\\x6d\\x00\\x00\\x00\\x00\\x00\\x00
#返回TCP Data(以十六进制表示)
\\x00\\x00\\x00\\x1c\\x20\\x00\\x80\\x86\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00
基于此思路,便在不用深入了解协议细节前提下,实现了针对libvirtd协议的基础识别。
2. 协议识别能力的持续建设
探测报文的丰富性和质量决定了协议识别的最终效果,腾讯企业IT安全团队采取了先引入和借鉴开源软件的识别规则作为协议规则库的基础,再通过后续运营持续建设的策略。
2.1 nmap
许多有协议识别需求的软件,甚至通过直接集成nmap的方式来提供协议识别能力。目前nmap拥有针对1300+个协议的一万多条识别规则,可以从nmap源代码中获取到这些规则(https://raw.githubusercontent.com/nmap/nmap/master/nmap-service-probes)。
2.2 Wireshark
Wireshark作为一个被动的网络协议分析工具,并不能直接用于端口协议探测目的。但如果能在捕获客户端流量时解析出协议类型,便可从源代码中提取协议的相应识别规则。除此外,在社区中还有分享众多协议的流量样本,借助这些样本可以进一步节省搭建应用环境的耗时。
2.3 漏洞扫描器
在漏洞扫描器中,对于给定的扫描目标,往往会对其先进行应用类型或应用版本的确认,随后才会执行利用代码。因此,参考漏洞扫描工具的POC代码,可以借鉴从中提取出协议/应用等解析规则。
以exploit-db上针对elasticsearch CVE-2021-22145的漏洞POC为例,POC中尝试获取目标应用版本以判断目标是否受漏洞影响。因此可以获取到针对elasticsearch应用版本的解析规则。
2.4 未知协议的处理
如果仅基于实时数据做协议识别,那么测绘节点的实时扫描性能将很快成为整体识别效率的瓶颈。因此,当对目标端口发送一些常见探测报文并得到回复后,无论是否能识别,都应该把banner信息保存下来。
这样可以满足这几方面的需求:
当新增、更新协议匹配规则后,可以使用离线banner完成快速标记;
支持基于banner信息的内容检索需求;
便于后续针对未知banner进行规则建立工作;
2.5 指纹库的长期建设
当借助开源社区拥有了基础的协议识别能力后,将需要思考:网络协议千千万万且持续增加,应该对哪些协议指纹进行优先建设?
在腾讯企业IT安全团队的实践中,我们通过以下维度来综合考虑规则建设优先级:
当威胁情报系统检测到重点应用POC被公布时,针对相关协议进行指纹建设;
借助基线安全能力,提取出了主机进程监听端口信息,将之与外部扫描发现的开放端口数据进行关联,根据进程名频次排名进行指纹建设;
针对未识别banner文本进行聚类计算,根据分类数量排名进行指纹建设;
3. 衡量识别效果的重点指标
在内网资产测绘场景中,无论是采用第三方产品还是自研,都有一些核心指标是建设过程中需要重点关注的。腾讯企业IT安全团队建设办公网资产测绘的出发点是为了辅助对漏洞的收敛工作,因此,建设过程中就重点围绕着如何辅助漏洞收敛工作更快、更全、更准去打造测绘能力。
扫描节点的网络区域覆盖率
在内网环境中,不同的网络区域间可能有不同的网络策略,甚至是完全网络隔离。因此为了提高扫描结果准确率,针对每个网络区域部署单独扫描节点是有必要的。
高危应用协议的识别率
漏洞治理工程中需要快速获取受相关漏洞影响的资产列表。对于历史爆出过高危漏洞的组件,它们是在攻防对抗中的高危攻击面,因此这部分组件的协议识别率就尤为重要。
未知协议的快速标记机制
协议识别是需要持续性建设的工作,当一个出现新的高危漏洞POC爆发时,对于未知协议能否快速完成指纹提取和协议的标记,这将影响到评估漏洞影响资产范围时的整体耗时。
协议识别的漏报率与误报率
漏报往往是由于应用不同版本拥有不同握手格式造成的,这就要求进行指纹提取时需要注意目标应用是否有多个流行的版本,并针对不同版本的漏报情况;
误报往往产生于匹配规则过于简单,这就要求编写的协议指纹匹配规则需要具有足够的准确性,最好基于离线数据做一次误报率测试,再上线正式系统。
4. 结语
本质上来讲,网络空间测绘就是一个情报工具,在安全建设资源有限情况下,企业安全团队应该围绕自身的安全需求去打磨系统——如果想收敛未知资产,那么就优先和CMDB联动起来,让发现的未知资产能快速管控起来;如果想收敛资产漏洞,那么就应该围绕POC去建立对应的协议识别和漏洞扫描流程。
如此,虽然在全面性上不一定能追上商业产品,但客观上业务真实存在的安全风险可以得到有效收敛。期望本篇腾讯企业IT安全团队在内网空间测绘场景上的实践,可以为读者朋友们带来参考与启发。
声明:本文来自腾讯IT技术,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。