freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

思科Snort Modbus OT预处理器DoS漏洞分析
2022-08-29 15:25:20
所属地 北京

Snort是一款开源入侵防御系统(IPS),基于预定义的规则集执行协议分析、内容搜索和匹配流量包,以此发现恶意网络活动并为用户生成告警。Snort预处理器在处理Modbus流量时存在整数溢出缺陷而导致拒绝服务漏洞,未授权的攻击者可利用此漏洞造成Snort进程挂起,停止流量检测而实现拒绝服务。

Part1 漏洞状态

漏洞细节漏洞POC漏洞EXP在野利用

Part2 漏洞描述

此漏洞是由于处理Modbus流量时出现整数溢出造成的。攻击者可以通过受影响的设备发送精心设计的Modbus流量来利用此漏洞。成功的利用可能允许攻击者导致Snort进程挂起,从而导致流量检查停止。

‍漏洞名称思科Snort Modbus OT预处理器DoS漏洞
CVE编号CVE-2022-20685
漏洞类型DoS
漏洞等级7.5 高危
受影响版本小于Snort 2.9.19的2.x版本小于Snort 3.1.11.0的3.x版本
公开状态公开
时间线2021年11月2日 CVE分配2022年1月19日 公告发布

Part3 漏洞

分析Snort中包含的一些预处理器有ARP、DNS、SSH和一些OT协议,例如MODBUS/DNP3。Snort的默认配置(snort.conf):

v2-148a4787f52f9df3fba6550dbd65b8ba_720w.jpg

Modbus预处理器属性的snort规则示例:

v2-34ad25636ff672161848dda610cb0647_720w.jpg

Modbus写文件记录命令(0x15)用于将多组文件寄存器写入Modbus服务器。每个文件最多可包含10,000条记录,地址为十进制0000到9999或0x0000到0x270F。写文件记录Modbus命令允许写入多组参考。用含有7个字节和数据的独立“子请求”字段定义每个组:引用类型:1字节(必须指定为6);文件号:2字节;文件内起始记录号:2字节;要写入的记录长度:2字节;要写入的数据:每个寄存器2个字节的数据。要写入的寄存器数量与请求中的所有其他字段相结合,不得超过Modbus协议数据单元(PDU)的允许长度,即253个字节。

以下是写文件记录Modbus命令请求的摘要:

v2-d83b2bca0d380a6142d3bd6410b8a743_720w.jpg

SnortModbus预处理器使用modbus_decode.c中的ModbusCheckRequestLengths函数来计算每个数据包的预期大小。通过while循环遍历数据包中的所有组,以此计算总记录长度。

v2-19f79280e239487411c12b8312760239_720w.jpg

tmp_count参数使用来自packet->payload的值进行初始化,并根据payload_length参数表示有效载荷中剩余的字节数。设置tmp_count后进入一个while循环,退出条件为bytes_processed<tmp_count。此时tmp_count=10,且在循环期间恒定不变。因此只要bytes_processed小于10,while循环会一直继续。

while循环中,bytes_processed受record_length参数的影响,该参数由Modbus有效负载中的两个字节组成。record_length参数的类型为uint16_t,其值来自用户控制的Modbus有效负载,bytes_processed也是uint16_t,计算方法是record_length*2+子请求标头大小,即7。

v2-5982fd7864583ce36cc3c3029e47eb10_720w.jpg

但是,乘法的结果可能超过最大uint16_t大小,从而溢出值。

例如:

记录长度=0xfffe

MODBUS_FILE_RECORD_SUB_REQUEST_SIZE=7

bytes_processed=7+(2*0xfffe)

在此示例中,bytes_processed将为0x20003,即:

0000000000000010|0000000000000011

在二进制中,当结果转换为uint_16t时,保留低16位,这意味着bytes_processed将为0000000000000011,即3。如果bytes_processed为3,while循环将继续执行。

新的record_length值将从由用户控制的有效负载中获取,来自特定的偏移量,该偏移量部分受bytes_processed值的影响。由于可以使用整数溢出错误完全控制bytes_processed的值,因此可以制作有效负载,使新计算的record_length将是任由攻击者选择的数字。

如果读取到record_length的下一个值是0xfffb,那么bytes_processed将按如下方式计算:

bytes_processed=bytes_processed+MODBUS_FILE_RECORD_SUB_REQUEST_SIZE+2*record_length

bytes_processed=3+7+2*(0xfffb)=0

进入下次while循环时,bytes_processed还将是0,因此Snort将一直执行此循环,直到进程被终止。在不停执行循环的状态下,Snort不会处理新的数据包,也不会发出警报。

Part4 总结

Snort Modbus OT 预处理器中用来计算每个数据包大小的函数ModbusCheckRequestLengths存在整数溢出漏洞,未授权的攻击者能够远程向易受攻击的系统发送精心制作的数据包,从而触发无限while 循环并创建拒绝服务条件。Part5修复建议

1.升级到2.9.19或3.1.11.0及以上版本。

2.由 Firepower 管理中心 (FMC) 管理的 FTD 软件,可以禁用 Modbus 预处理器以缓解此漏洞的攻击向量。

# 渗透测试 # 工控安全 # 漏洞分析 # 网络安全技术
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录