工作来源
USENIX Security 2022
工作背景
无状态扫描技术在不利用操作系统网络协议栈的情况下,发送手动构造的 TCP SYN 数据包,类如 Mirai。如果想知道比端口开放更多,需要二阶段扫描。
数据包包头值与常见操作系统的网络协议栈不同的,如 TTL 值不同,认为是非常规的数据包。常见操作系统对 TCP 的 TTL 会设置较低,但近年来 TTL 大于 200 的数据包越来越多,已经接近八成。
在世界上各地都是这样的,不是一个个体现象:
通过网络望远镜发现的 40% 以上的常规 SYN 数据包都集中在部分端口(443、3389、1433)上,而非常规 SYN 数据包会分散在各种服务的端口。
在所有非常规数据包中,有 5% 的 IP ID 设置为 54321,即 Zmap 使用的默认值。
在二阶段扫描中,如 SYN Cookie 等编码方案可以将响应数据包与初始探测匹配上,这样的扫描方式降低了对内存的要求,可以进行更大范围的扫描。Mirai 就是使用这种扫描方式的典型代表,而且非常规的 SYN 数据包与二阶段扫描通常与恶意行为有关。
最初 Mirai 发送的 TCP 数据包的序列号为目标 IP 地址,而不是随机的 32 位整数。此类数据包在 2016 年 9 月明显增加。
最初 Mirai 使用 64 作为固定的 TTL 值,后续的变种也使用了更高的 TTL 值。下图为常见的 Mirai 流量的 TTL 分布:
其他恶意软件则整合了 Mirai 的功能,但又去掉了相同的指纹。
存在以下三个特征之一就是非常规 SYN 数据包:
① TTL 大于 200 ② 没有 TCP 选项 ③ IP ID 为 54321
扫描数据包分类如下所示,使用 SYN-ACK 响应 SYN 数据包,远端主机可以静默不回复/回复 RST/回复 SYN-ACK/完成 TCP 握手。
下图显示了二阶段扫描在所有扫描的占比,大概有三分之一。
工作设计
整体逻辑如下所示:
其系统架构为:
Router 使用 libtrace 并行处理数据包,通过一致性哈希将数据包发送到分片池中,确保相同 IP 地址的数据包能够被路由到相同的分片。分片决定将哪些数据包转发给 Broker,Broker 连接到多个 Scamper 进程。Scamper 处理好后交由 Decoder 将确认的扫描写入硬盘,除了日志还包括数据包本身。
Spoki 对 TCP SYN 消息用 TCP SYN ACK 响应、对 ACK 消息用 RST 响应、忽略所有其他的 TCP 数据包。
网络望远镜只能用于被动测量,二阶段扫描不可见。设计 Spoki 响应接收到的 TCP SYN 包,诱发二阶段扫描。在根据源地址与时间范围关联,将无状态扫描与后续探测串联起来。与此同时,Spoki 会限制常规数据包和非常规数据包的速率,不会响应所有的数据。
第一阶段和第二阶段间隔的时间不能超过十分钟,必须保持响应的及时。首先实验观测如果五秒内不做出响应,会丢失 45% 的完整握手。其次避免产生异常被攻击者察觉。
工作准备
利用最大的 IPv4 网络望远镜,监听超过 1200 万的 IP 地址,峰值流量超过 83.4M/分钟。与位于美国、欧洲和大洋洲的网络望远镜、一个亚洲 ISP 和一个欧洲 IXP展开合作。
在 C++ Actor Framework 作为并发库的基础上,利用 C++ 编写了 Spoki,项目开源在 https://spoki.secnow.net/。
工作评估
功能性测试
功能性测试使用 Ubuntu 20.04.1 LTS 作为服务器,带有两个 AMD EPYC 7702 64 核处理器和 512GB 内存。
最大数据包速率为 1Mpps(UCSD 网络望远镜在 2021 年年初大约 800kpps TCP),各部分情况如下所示:
每秒能处理大约 25 万个数据包,峰值流量需要四个分片协同处理。实际上,在应对大流量时 I/O 压力极大,为分散 I/O 压力将一条消息发送给 Probing 一条消息发送给 Logging。这样单个分片处理能力达不到 25 万,总共需要再翻一倍达到八个。
Scamper 每秒可以处理 2 万次扫描请求,峰值流量需要部署 50 个 Scamper 实例进行处理。峰值流量下,基本上能达到响应速度为 0.08 毫秒。
大规模部署
-
在美国使用的机器有 8 个核心和 16GB 的 RAM,程序的 CPU 使用率在 5% 到 15% 之间,需要约 2GB 虚拟内存。
-
在欧洲使用的机器有 16 个核心和 32GB 的 RAM,程序的 CPU 使用率在 10% 到 20% 之间,需要约 2GB 虚拟内存。
排除了知名的扫描项目的流量,如(BinaryEdge、Censys、Kudelski、Rapid7、 security.ipip、Shadowserver 和 Shodan)以及用于测量研究类的 IP 地址,这样可以清理掉 1.21% 的二阶段扫描、3.44% 的非常规 SYN 数据包、8.43% 的常规 SYN 数据包。
第一阶段和第二阶段之间的时间延迟如下所示,75% 都会在不到一秒(美国)三秒(欧洲)返回。
扫描
从来源看,二阶段扫描在时间和特定端口上特别集中:
从目的看,也是具有清晰模式的:
一阶段扫描和二阶段扫描都会进行垂直扫描,但二阶段扫描更看重水平扫描。
访问次数最多的服务端口如下所示,大约有 30% 的二阶段扫描目标是 Telnet 服务。
在欧洲,15% 在扫描 1433 端口,攻击者在尝试攻击 SIMATIC 的漏洞。10% 在扫描 7547 端口,攻击者在尝试攻击 TR-069 漏洞。在美国,4567 端口比较受攻击者关注,这是 Verizon Actiontec 路由器 Web 服务的端口。
十六年来,二阶段扫描越来越多。
事件
以下是发现相关事件的情况:
-
没有 ACK 的时候就投递的 Payload 竟然有相当的比例,可能是丢包了否则无法解释。
-
大约 70% 的扫描在无 Payload 的情况下访问 23 端口,可能是通过 Telnet 协议抓取 Banner。
-
Payload 中 ASCII 占据主导地位,欧洲的 HEX 占比更多。
根据 NetAcuity Edge 的数据将源 IP 定位国家/地区。在欧洲,来自乌克兰和俄罗斯的扫描很多。而在美国,来自美国自己和中国台湾的扫描居多。
AS 的分类依靠 CAIDA 的 AS 分类数据,占比最高的是传输和访问服务提供商。
Payload
Spoki 在美国收集了 190905 个 Payload,在欧洲收集了 166035 个 Payload。其中,41% 和 38% 都是 ASCII 的。
下图描述了每个 Payload 长度的不同前缀的数量,在 12 个字节(GET / HTTP/)、31 个字节后(GET / HTTP/1.1rnHost:IP.AD.DR:PORT)明显产生了区别。
根据 Payload 中的共同点得到如下观察,最多的就是 HTTP GET 请求。
和 GreyNoise 等情报来源进行了交叉比较。URLhanus 重合 3% 的源地址、7.6% 的事件;MalwareWorld 重合 4.6% 的源地址、16.06% 的事件;BlockIP 重合 6.9% 的源地址、30.6% 的事件;DataPlane sshclient 重合 3.9% 的源地址、13.4% 的事件;DataPlane sipquery 重合 2.8% 的源地址、15.6% 的事件。GreyNoise 判定欧洲收集的 Payload 有 56% 是恶意的,美国收集的 Payload 有 70% 是恶意的。
Downloader
Downloader 下载的很多都是 arm7,在欧洲占到 44% 在美国占到 58%。之后是 mpsl、le.bot.arm7 和 viktor.mips。
按照 URL 下载文件,一小时内成功率略低于 50%,可能是配置陈旧。且 1% 的 URL 是错误的。在 2021 年的四个月内,下载了 12319 个可执行文件,哈希去重后存在 250 个文件。
文件中 70% 是 32 位 ELF 文件,67% MSB MIPS,26% LSB ARM,5% LSB MIPS,1% LSB Intel 80386。上传到 VirusTotal 中,18% 的样本是良性样本、65% 的样本是旧样本、17% 的样本是新样本。三分之二的样本被认为是木马,8% 被认为是 Downloader,且 58.8% 的被引擎标记为 Mirai。
全球视野
来自欧洲的网络望远镜数据中,前十个前缀中有六个与网络望远镜位于同一个 /16 块地址中。
在欧洲的 IXP 上观测,也仍然有很大比例是来自本地的扫描。但在亚洲的 ISP 上就没有发现类似的经验,这可能是仅存在于欧洲的现象。
工作思考
易受攻击的设备在互联网上暴露的话,几个小时之内就会被攻击者发现。对公网的暴露还是要慎重,收窄攻击面是很重要的,攻击者实际上很快就能够发现并且发起攻击。
近期斩获美国国防部 3000 万美元(约合 1.9 亿人民币)大单的 GreyNoise 就是深耕全球范围扫描与漏洞利用行为的监测,GreyNoise 认为通过对各种噪音的过滤可以将告警减少四分之一甚至更多,这样可以提高分析人员的效率并且能够更快地发现新兴威胁。
可以配置 IDS 规则来发现非常规 SYN 数据包的扫描:
pass tcp $HOME_NET any <- $EXTERNAL_NET any (msg:"IRREGULAR SYN"; flags:S,12; ttl:>199; tcp.hdr; bsize:20; xbits:set,ir_syn,track ip_pair,exipre 10;sid:1;)
alert tcp $HOME_NET any <- $EXTERNAL_NET any (msg:"TWO PHASE SCANNER"; flags:S,12; ttl:<200; tcp.hdr; bsize:>20; xbits:isset,ir_syn,track ip_pair,sid:2;)
原文始发于微信公众号(威胁棱镜):在野无状态扫描的综合研究