freeBuf
主站

分类

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

特色

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

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

CVE-2021-31166:http协议栈远程代码执行漏洞
安帝Andisec 2023-02-14 13:59:32 223270
所属地 北京

Internet Information Services (IIS) 是一种灵活、可扩展、安全且可管理的 Web 服务,用于托管 Web 上的静态和动态内容。IIS 支持各种 Web 技术,包括 HTML、ASP、ASP.NET、JSP、PHP 和 CGI。此功能通过称为 http 协议栈 ( http.sys ) 的内核模式设备驱动实现。此驱动程序负责解析 http 请求并对客户端响应。

漏洞出现在http.sys内,未授权的攻击者可以构造恶意请求包攻击目标服务器,成功利用该漏洞的攻击者可导致目标服务器蓝屏,或执行任意代码。

漏洞状态

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

漏洞描述

‍漏洞名称

CVE-2021-31166 http协议栈远程代码执行漏洞

CVE编号CVE-2021-31166
漏洞类型释放重引用(UAF)
漏洞等级9.8高危(CRITICAL
公开状态公开
漏洞描述http.sys内部分链表管理不当,导致出现UAF漏洞。
时间线2021-5-11  NVD发布
受影响版本

未安装的KB5003173补丁的

Windows 10 2004/20H2

Windows Server 2004/20H2

影响范围

未安装的KB5003173补丁的

Windows 10 2004/20H2

Windows Server 2004/20H2

分析环境:

Win10 20H2(19042.928)

漏洞分析

通过PoC触发该漏洞,靶机蓝屏。

蓝屏信息为KERNEL_SECURITY_CHECK_FAILURE。

KERNEL_SECURITY_CHECK_FAILURE在发生于ring0时,为执行中断int 29h时出现,该中断在Windows8中被添加,用于快速的抛出异常,在sdk中,被声明为__fastfail。

分析DUMP,调用栈可见异常出现在UlFreeUnknownCodingList函数内,该函数由UlpParseAcceptEncoding调用,接下来对这两个函数进行分析。

查看UlpParseAcceptEncoding函数伪代码,在函数内首先会通过UlpParseContentCoding,循环处理http请求标头Accept-Encoding内的值,确认其中内容是否为受支持或为无效字符串。

如字符串无效,便在UlpParseAcceptEncoding函数内链接到,UnknownCodingList循环双链表。

若要进入漏洞执行流程,需要UlpParseContentCoding函数返回特定值0xC0000225,如返回值满足要求,在UnknownCodingList内包含链接并符合条件的情况下,会将UnknownCodingListHead与Requst内结构体进行链接。

链接完毕后,如UlpParseContentCoding的返回值v5小于0,跳转到LABEL_33,调用UlFreeUnknownCodingList函数,释放传入链表的结点。

在该函数内,符合条件的情况下,会将链表内的结点释放。

在此过程中,执行至__fastfail的条件为,UnknownCodingList->Flink->Flink->Blink不等于UnknownCodingList->Flink或UnknownCodingList->Flink->Blink->Flink不等于UnknownCodingList->Flink。

对该函数下断点,断下后UnknownCodingList链表如下:

在第一次循环时,不会达成此条件,UnknownCodingListFlink->Flink被释放。

在第二次循环时,还会进行此判断,因UnknownCodingList->Flink已被释放,UnkownCodingList->Flink->Flink->Blink的指向已被修改,但此处还是会引用UnknownCodingListHead,导致执行至__fastfail。

此时的UnknownCodingList链表:

导致BSOD的原因如上文分析,但如果想进入触发漏洞的流程,需要UlpParseContentCoding函数返回0xC0000225。分析PoC可以看到,Accept-Encoding字段内容经过特殊构造,由受支持的字符、无效的字符、空格和","构成。

返回0xC0000225的情况有两种,使用该PoC时,传入的非制表符,非空格后的字符为",",便可使UlpParseContentCoding返回0xC0000225,执行触发漏洞流程。

此漏洞已经于补丁KB5003173内修复,通过对UnknownCodingList链表重置,避免了此问题发生。

修复建议

安装KB5003173或后续汇总补丁。

# 漏洞 # 渗透测试 # 网络安全 # 漏洞分析
本文为 安帝Andisec 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
安帝Andisec LV.7
北京安帝科技有限公司
  • 113 文章数
  • 30 关注者
安帝科技:OT网络安全破局之思考系列(二)
2023-09-04
OT网络安全术语辨析:弹性vs健壮性
2023-08-31
安帝科技-OT网络安全破局之思考系列(一)
2023-08-21
文章目录