vivo 网络端口安全建设技术实践
揭秘vivo互联网海量服务的研发之路 报名中👇
<img src="https://img.mryunwei.com/uploads/2023/11/20231105100418515.png">
<p>作者:vivo 互联网安全团队 - Peng Qiankun</p>
<p>随着互联网业务的快速发展,网络攻击的频率和威胁性也在不断增加,端口是应用通信中的门户,它是数据进出应用的必经之路,因此端口安全也逐渐成为了企业内网的重要防线之一,然而网络端口因其数量庞大、端口开放和关闭的影响评估难度大,业务影响程度高、以及异常识别技术复杂度高等特点给网络端口安全治理带来了一定挑战,如何对端口风险进行有效治理几乎是每个企业安全团队在攻击面管理工作中持续探索的重点项。</p>
<p>一、网络端口简介</p>
在网络空间中,标记一个服务资源实体最基本的两个要素就是IP和逻辑端口,二者构建服务资源实体的唯一标志符。
1. 常见的端口分布划分:
(1)知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
(2)动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
2. 另外,端口还会按照协议类型划分
(1)TCP端口
即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP服务的21端口,Telnet服务的23端口,SMTP服务的25端口,以及HTTP服务的80端口等等。
(2) UDP端口
即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。常见的有DNS服务的53端口,SNMP(简单网络管理协议)服务的161端口,QQ使用的8000和4000端口等等。
3. 常用的网络端口映射表
图1 常用网络端口映射表
<p>PS:更多详细端口规范可查阅:</p>
<p>http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml</p>
<p>二、端口利用方式</p>
2.1 基于传输层的资源耗尽攻击(DDoS)
该攻击是非常有效的利用小流量冲击大带宽的攻击手段,也是十分常见的攻击方式。其本质还是利用TCP协议的链接建立(三次握手)及链接关闭(四次挥手)阶段机制漏洞进行攻击,链接资源耗尽攻击方式主要分为以下几个类别:
(1) SYN flood
SYN flood是基于TCP协议产生的,它利用三次握手机制,制造多个半连接,消耗服务器的连接数。
图2 SYN flood 示意图
攻击者伪造源IP地址向服务器发送大量的SYN报文,请求建立三次握手。由于发送源IP是伪造的,所以服务器回应了SYN-ACK报文后,源IP并不会再继续回应ACK报文进行确认。这样服务器就会维持一个庞大的等待列表,不停地重试发送SYN-ACK报文,同时占用着大量的资源无法释放。这就导致,被攻击的服务器被恶意半连接占满,不再接受新的SYN请求,而合法用户无法完成三次握手建立TCP连接。另外,随着对抗技术的持续演进,攻击者通过肉鸡或Ddos服务发起大规模分布式真实IP集中进行资源耗尽攻击,此类攻击成功率更高。
(2)SYN-ACK Flood
通信双方通过三次握手建立一个TCP连接的过程中,SYN-ACK报文出现在第二次握手中,是用来确认第一次握手的。一方收到SYN-ACK报文后,首先会判断该报文是不是属于三次握手范畴之内的报文。如果都没有进行第一次握手就直接收到了第二次握手的报文,那么就会向对方发送RST报文,告知对方其发来报文有误,不能建立连接。SYN-ACK Flood攻击正是利用了这一点,攻击者利用工具或者操纵僵尸主机,向目标服务器发送大量的SYN-ACK报文,这些报文都属于凭空出现的第二次握手报文,服务器忙于回复RST报文,导致资源耗尽,无法响应正常的请求。
(3)ACK Flood
在TCP三次握手的过程中,ACK报文出现在第三次握手中,用来确认第二次握手中的SYN-ACK报文。ACK Flood攻击指的是攻击者利用工具或者操纵僵尸主机,向目标服务器发送大量的ACK报文,服务器忙于回复这些凭空出现的第三次握手报文,导致资源耗尽,无法响应正常的请求。
(4)FIN/RST Flood
TCP交互过程中还存在FIN和RST报文,FIN报文用来关闭TCP连接,RST报文用来断开TCP连接。这两种报文也可能会被攻击者利用来发起DDoS攻击,导致目标服务器资源耗尽,无法响应正常的请求。
(5)TCP connection Flood
TCP是面向连接的协议,通信双方必须保持连接状态,并且通过确认、重传、滑动窗口等机制,保证数据传输的可靠性和稳定性。攻击者利用TCP协议的上述特点,在TCP连接上做文章,利用TCP连接来消耗被攻击目标的系统资源。例如,攻击者与被攻击目标完成三次握手后,立刻发送FIN或RST报文,释放本端连接,同时快速发起新的连接,以此来消耗被攻击目标的系统资源,或者攻击者与被攻击目标完成三次握手后,发送很少的报文来维持连接状态,通过这种异常的TCP连接来消耗被攻击目标的系统资源。
2.2 基于应用层的资源耗尽攻击(cc)
CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。CC主要是用来消耗服务器资源的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的连接直至就网络拥塞,正常的访问被中止。以下介绍一些cc攻击的常用变种。
(1)基于HTTP-header慢速cc攻击
Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,每30秒才向服务器发送一个HTTP头部,而Web服务器再没接收到2个连续的rn时,会认为客户端没有发送完头部,而持续的等等客户端发送数据。
(2)基于HTTP-body慢速cc攻击
攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,发送了完整的HTTP头部,POST方法带有较大的Content-Length,然后每10s发送一次随机的参数。服务器因为没有接收到相应Content-Length的body,而持续的等待客户端发送数据。
(3)基于HTTP-read慢速cc攻击
客户端与服务器建立连接并发送了一个HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。抓包数据可见,客户端把数据发给服务器后,服务器发送响应时,收到了客户端的ZeroWindow提示(表示自己没有缓冲区用于接收数据),服务器不得不持续的向客户端发出ZeroWindowProbe包,询问客户端是否可以接收数据。
剖析其原理,本质上还是对任何一个开放了HTTP访问的服务器HTTP服务器,先建立了一个连接,指定一个比较大的content-length,然后以非常低的速度发包,比如1-10s发一个字节,然后维持住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。
2.3 基于端口发起的渗透测试
IP和端口作为应用暴露在公网的唯一入口,攻击者通常发起渗透测试的起点便是通过扫描目标IP上的开放端口来发现系统的漏洞、薄弱点或安全隐患。
往往服务器系统本身或引入的应用服务就具备一定的脆弱性,攻击者获取到目标服务器的端口列表后会逐一去比对自己的武器库进行漏洞利用尝试。
以下是整理的常见端口利用清单及攻击利用方式:
图3 常见的端口利用清单
<p>三、基于端口利用的案例</p>
<p>Equifax数据泄露案落幕:七亿赔款,索赔期限延长四年</p>
图4 EQUIFAX (图片来源:globalnews.ca)
2017年9月,Equifax系统遭到黑客攻击,导致超过1.45亿美国消费者的个人信息,以及1520万英国居民的记录和8000名加拿大用户的数据遭到泄露,其中包括姓名、地址、出生日期、身份证号、护照、驾照、信用卡等信息。事件曝光后,Equifax股票暴跌30%,相当于蒸发掉50亿美元市值,成为史上罕见大型数据泄露事件之一。2018年12月,美国国会众议院的政府改革暨监督委员会发布报告指出,因Equifax公司组织架构的缺陷,导致公司部门间的沟通失效,从而致使大量的关键系统补丁没有被及时开发,其中包括一个超19个月未做更新的漏洞。最终,黑客对Equifax进行了长达76天的攻击,先后265次从公司获取未被加密的数据。该事件最初是由于Equifax未修补针对Apache Struts的漏洞而导致的,攻击者利用该漏洞访问了Equifax的数据库,这个漏洞是通过开放的80端口进行攻击的。
<p>爱尔兰国家医疗保健局数据泄露事件</p>
图5 爱尔兰卫生部
(图片来源:https://www.sohu.com/a/480716983_121123851)
爱尔兰国家医疗保健局(HSE)是负责为爱尔兰居民提供医疗保健的机构。在2021年5月,该机构发生了一起数据泄露事件,影响到数百万个患者的个人信息。该事件起因于攻击者通过暴露的VPN服务端口进行攻击,成功登录了HSE的IT系统。接着,攻击者开始利用系统漏洞,并最终获取了HSE服务器的管理员权限。攻击者随后将一个WastedLocker勒索软件的恶意代码安装在服务器上,并要求赎金以释放数据。在攻击过程中,攻击者还利用了HSE的Exchange电子邮件系统,以及HSE员工用于管理患者信息的软件系统。这些系统中的漏洞使得攻击者能够访问和窃取大量患者的个人信息,包括姓名、出生日期、地址、电话号码、诊断信息和病历等。据称,该事件涉及到的患者数量达到了数百万。HSE在发现事件后,立即关闭了受影响的系统,并采取措施保护患者数据的安全。HSE还与执法部门和网络安全专家合作,以追查攻击者的身份和追回数据。截至目前,尚未有人或组织宣称对此次攻击负责。
<p>四、端口风险防护及治理实践</p>
4.1 端口风险防护
无论是Flood还是cc防护,一般都是借助一些安全设备及安全设备提供的策略定制能力,流量级的可以依靠运营商提供的抗D服务,如云盾、云堤,流量清洗服务等,面向应用层的攻击可以借助防火墙,WAF,NIDS等安全设备/节点提供的能力。无论是借助厂商还是自身建设抗D能力,都需要摸清企业所面临的资源耗尽风险,一方面理清基础架构的脆弱点,治理脆弱点;另一方面需要熟悉攻击利用原理,制定针对性策略来进行异常检测及攻击缓解。
这里简述一些对抗思路,例如上文提到SYN Flood攻击,其本质上是利用TCP建立链接的机制漏洞,只要持续发送建立链接请求,服务端就会进行响应同时在连接池里记录一条链接,那么依据该原理,防护思路就很明确了:
1. 对发起源进行主动认证
图6 主动认证示意图
<ol>
<li><p>当连续一段时间内去往目标服务器的SYN报文超过告警阈值后,抗DDoS设备启动源认证机制。源认证机制启动后,抗DDoS设备将会代替服务器向客户端响应带有正确确认序号的SYN-ACK报文;</p></li>
<li><p>如果这个源是虚假源,是一个不存在的地址或者是存在的地址但却没有发送过SYN报文,不会做出任何响应;</p></li>
<li><p>如果这个源是真实客户端,则会向服务器发送ACK报文,对收到的SYN-ACK报文进行确认。抗DDoS设备收到ACK报文后,将该客户端的源IP地址加入白名单。同时,抗DDoS设备会向客户端发送RST报文,要求重新建立连接;</p></li>
<li><p>后续这个客户端发出的SYN报文命中白名单直接通过。</p></li>
</ol>
2. 首包丢弃
图7 首包丢弃示意图
TCP的可靠性保证除了面向连接(三次/四次握手)之外,还体现在超时与重传机制。TCP协议规范要求发送端每发送一个报文,就启动一个定时器并等待确认信息;如果在定时器超时前还没有收到确认,就会重传报文。
首包丢弃功能就是利用了TCP的超时重传机制,Anti-DDoS系统对收到的第一个SYN报文直接丢弃,然后观察客户端是否重传。如果客户端重传了SYN报文,再对重传的SYN报文进行源认证,即反弹SYN-ACK报文,这样就可以大大减少反弹报文的数量。
混合使用,效果更佳
实际部署时,一般将首包丢弃和源认证结合使用。防御SYN Flood攻击时,先通过首包丢弃功能来过滤掉一些攻击报文,当重传的SYN报文超过告警阈值后,再启动源认证。这样就能够减少反弹的SYN-ACK报文的数量,缓解网络拥塞情况。对于虚假源攻击,尤其是对于不断变换源IP和源端口的虚假源攻击,可以达到最佳防御效果。
针对连接耗尽场景,其防御思路可以总结为以下内容:
针对此攻击会耗尽服务器的TCP连接资源的特点,对目的IP地址的新建连接速率和并发连接数分布进行统计,当新建连接速率或并发连接数大于阈值时,则触发对源IP地址的相应检查,当检查发现异常时,将异常源IP地址加入黑名单,切断其TCP流量。
<ul>
<li><p>源IP地址新建连接速率检查:启动源IP地址新建连接速率检查后,如果某个源IP地址在检查周期内发起的TCP新建连接数大于阈值,则将该源IP地址判定为攻击源。</p>
用于发现暴露在公网的站点、URL等Web资源是否存在漏洞。
用于发现线上业务是否使用了高危的Java依赖包。
用于发现公司服务器是否对公网开放了高危端口。
无论是依赖包扫描、端口扫描,都是通过创建扫描任务的形式来发起的,扫描任务分为立即扫描任务和定时扫描任务两种类型,用户可以创建立即扫描任务来一次性执行扫描,也可以创建定时任务来周期性执行扫描。
对于扫描出来的Web、依赖包和端口风险,系统能够对其处理状态进行管理,以便安全工程师对风险状态进行跟踪和处理。
对于扫描出来的Web、依赖包和端口风险,运营人员可对其创建工单,工单会对接到漏洞管理系统,通过漏洞管理系统的工单体系来对跟踪风险的处理进程。
Nmap是一款常用的网络发现和安全审计工具,支持多种扫描技术和扫描选项,可以快速扫描本地或远程计算机上的开放端口和服务。
Masscan是一款高速的端口扫描工具,可以在短时间内扫描数百万个端口,支持TCP和UDP扫描,适用于大规模网络扫描。
Zenmap是Nmap的图形用户界面(GUI)版本,可以方便地进行扫描选项配置和结果分析。
Angry IP Scanner是一款轻量级的端口扫描工具,支持多线程扫描和快速扫描本地网络和远程主机。
SuperScan是一款Windows平台上的端口扫描工具,支持TCP和UDP扫描、多线程扫描、服务版本识别等功能。
Unicornscan是一款高速的网络扫描工具,支持TCP、UDP、ICMP等多种扫描方式和扫描选项。
Netcat是一款多功能的网络工具,其中包括端口扫描功能,支持TCP和UDP扫描,可以快速扫描本地或远程计算机上的开放端口和服务。
从离线同步过来的每个小时的服务维度的多种策略计算结果
用于存放学习配置,包括各种策略的加解锁条件(偏离阈值+次数)、偏离告警条件(偏离阈值+次数,可以预留出来,告警下迭代做)
服务维度自定义的的策略集
记录各个服务节点的锁状态,偏离情况,策略生效时间等
部分策略拥有自己的目标机器/服务结算逻辑,该表用于存放目标范围,用于定时清理不在目标集的策略