首页
社区
课程
招聘
[原创]CVE-2020-1350分析与复现
发表于: 2020-7-24 22:14 10485

[原创]CVE-2020-1350分析与复现

2020-7-24 22:14
10485

前言

CVE-2020-1350是微软在2020年7月修复的DNS协议相关漏洞,CVSS给出了高达10分的评分。漏洞发现的细节最初由CheckPoint进行纰漏,

随后FSecureLabs@maxpl0it研究员给出了相关POC脚本,我会在文末给出相关链接。

本文主要在肝完checkpoint的文章的基础上,通过[4][5]两篇文章的启发,使用POC进行漏洞分析和复现。

测试环境:Win Server2019+Win Server2016

本文原文地址:7a9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6j5i4c8#2M7X3^5K6y4g2)9J5k6h3y4G2L8g2)9J5c8U0t1H3x3U0m8Q4x3V1j5H3y4#2)9J5c8U0t1@1i4K6u0r3x3U0l9J5x3o6l9%4x3U0c8Q4x3X3b7I4i4K6u0r3i4K6t1K6L8h3!0J5k6b7`.`.

漏洞原理

根据checkpoint的描述,以及对相关补丁的diff后,找到漏洞函数为

dns.exe! SigWireRead

在IDA中查看其流程如下所示:

伪代码如下:

可以看到在申请内存函数RR_AllocateEX的参数中,第一参数v9+v13+20表示分配大小,其值由

[Name_PacketNameToCountNameEx result] + [0x14] + [signature’s length (rdi–rax)] 决定。当此值结果在CX和DI寄存器中传递,而16位寄存器最大值为65535,当上数值结果大于65535时,将发生溢出,而真正申请到的数据是比要申请的大小小的多。

而后续我们可以看到存在memcpy拷贝函数,那么,可能存在由整数溢出的导致基于堆的缓冲区溢出。


DNS协议和数据包

格式如下:

Header表示DNS数据头,Question表示查询区,Answer表示应答区,后两个为认证区和附加区。

Header部分始终存在。大小为12字节,包含以下字段

ID:同一查询和应答对应相同的16位ID;

QR:一位代表查询(0)或者应答(1);

TC:指定此消息由于长度大于传输通道上允许的长度而被截断。在DNS协议中,默认采用的传输层协议为用户数据报协议(UDP),但UDP传输的DNS数据包限制最大为512B,并不足以触发漏洞。而此标志位是漏洞触发的关键,当其被设置为1是,在应答时,表示通知客户端,数据量比较大,让客户端用TCP重发一次查询请求,而基于TCP的DNS数据包大小可大于512字节。

查询区主要由域名、类型和类构成。

比较有趣的是域名的构成是分段式的len+str的形式:

eg:对于完整的一个域名,5c2N6%4N6%4i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3@1`.,需要14个字节:

0 1 2 3 4 5 6 7 8 9 10 11 12 13
\3 w w w \5 b a i d u \3 c o m


规定域名段的长度不能超过63个字节,所以表示域名段长度的字节最高两位没有用到,因此另有用途。

(1)当最高两位为00时,表示以上面的形式的传输

(2)当最高两位为11时,表示将域名进行压缩,该字节去掉最高两位后剩下的6位,以及后面的8位总共14位,指向DNS数据报文中的某一段域名,相当于一个指针。如0xc00c, 表示从DNS正文(UDP payload)的偏移offset=0x0c处所表示的域名。

(3)混合表示:以073N6%4N6%4i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3@1`.为例,假设该域名位于DNS报文偏移0x20处,可能的用法有:

a、0xc020:表示完整域名a70N6%4N6%4i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3@1`.

b、0xc024:从完整域名的第二段开始,指代baidu.com

c、0x016dc024:0x01表示后面跟的size大小1,0x6d表示字符m,所以0x016d表示字符串"m",第二段0xc024指代baidu.com,因此整段表示m.baidu.com


SIG资源记录

在漏洞函数中,当读取SIG类型响应包才回进入触发流程,因此有必要了解下其结构。

RFC2535官方文档中,对SIG资源记录的概括如下:

The SIG or "signature" resource record (RR) is the fundamental way that data is authenticated in the secure Domain Name 
System (DNS). As such it is the heart of the security provided.The SIG RR unforgably authenticates an RRset [RFC 2181] 
of a particular type, class, and name and binds it to a time interval and the signer's domain name.  This is done 
using cryptographic techniques and the signer's private key. The signer is frequently the owner of the zone from which 
the RR originated. The type number for the SIG RR type is 24.

其格式如下:


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

最后于 2020-7-25 17:20 被Saturn35编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (5)
雪    币: 7
活跃值: (4336)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
2
膜师傅
2020-7-25 13:00
0
雪    币: 4904
活跃值: (1440)
能力值: ( LV9,RANK:246 )
在线值:
发帖
回帖
粉丝
3
0x2l 膜师傅
刚入门,师傅带带我
2020-7-25 17:17
0
雪    币: 12981
活跃值: (7759)
能力值: ( LV13,RANK:590 )
在线值:
发帖
回帖
粉丝
6
不错
2020-7-27 12:32
0
游客
登录 | 注册 方可回帖
返回