中年DNS Server远程代码执行漏洞分析-SIGRed( 二 )
本文插图
漏洞– CVE-2020-1350
函数:dns.exe!SigWireRead漏洞类型:整数溢出导致基于堆的缓冲区溢出
dns.exe 为每种受支持的响应类型实现解析功能 。
本文插图
Wire_CreateRecordFromWire:RRWireReadTable被传递给RR_DispatchFunctionForType函数处理
本文插图
RRWireReadTable支持响应的类型
支持的响应类型之一用于SIG查询 。 根据Wikipedia:”SIG查询是在SIG(0) (RFC 2931)和TKEY (RFC 2930)中使用的签名记录,RFC 3755指定RRSIG作为在DNSSEC内使用的SIG的替代品 。 ”
让我们来看一下由Cutter生成的反汇编:dns.exe!SigWireRead SIG响应类型的处理函数:
本文插图
RR_AllocateEx通过以下公式计算传递给第一个参数:
[Name_PacketNameToCountNameEx result] + [0x14] + [The Signature field’s length (rdi–rax)] 签名字段的大小可能会有所不同 , 因为它是SIG响应的主要payload 。
本文插图
R根据RFC 2535的SIG资源记录的结构
正如你在下面的图片中看到 , RR_AllocateEx希望其参数在16位寄存器中传递 , 因为它只使用rdx的dx部分和rcx的cx部分 。
这意味着 , 如果我们可以使上述公式输出的结果大于65,535字节(16位整数的最大值) , 则会出现整数溢出 , 从而导致分配比预期的小得多 , 这可能会导致基于堆的缓冲区溢出 。
本文插图
比较方便的是 , 这个分配的内存地址作为memcpy的目标缓冲区传递 , 从而导致基于堆的缓冲区溢出 。
本文插图
从中分配的缓冲区RR_AllocateEx被传递到中memcpy
总而言之 , 通过发送一个包含较大(大于64KB) SIG记录的DNS响应 , 我们可能会导致一个基于堆的缓冲区溢出 , 溢出大约64KB 。
触发漏洞
现在我们能够让受害者DNS服务器查询我们的DNS服务器 , 我们已经有效地将其转换为客户端 。 我们可以让受害者DNS服务器询问我们的恶意DNS服务器特定类型的查询 , 并分别用匹配的恶意响应请求 。
我们认为触发此漏洞所需要做的只是使受害DNS服务器向我们查询SIG记录 , 然后用一个很长的签名(length >= 64KB)回复它一个SIG响应 。 我们失望地发现DNS超过UDP的大小限制为512字节(如果服务器支持EDNS0 , 则为4,096字节) 。 无论如何 , 这都不足以触发漏洞 。
但是 , 如果有合理的理由让服务器发送一个大于4,096字节的响应 , 会发生什么呢?例如 , 一个很长的TXT响应或可以解析为多个IP地址的主机名 。
DNS截断-但等一下 , 还有更多!
根据DNS RFC 5966:“在没有EDNS0(DNS 0扩展机制)的情况下 , 任何需要发送超过512字节限制的UDP响应的DNS服务器的正常行为是截断响应 , 使其符合该限制 , 然后在响应头中设置TC标志 。 当客户端收到这样的响应时 , 它将TC标志作为一个指示 , 指示它应该通过TCP重试 。 ”
推荐阅读
- 中年美国寸土寸金,为何要在纽约建立林则徐广场?原因很简单
- 中年北斗系统发言人答封面新闻:北斗定位精度最好可达1点几米
- 中年检测设备行业政策及环境
- 中年元春回府省亲为何会在夜晚进行?原来其中大有文章
- 中年北斗三号全球服务可用性达99%以上,全球范围定位精度优于10米
- 锁定|起底电信诈骗“杀猪盘”:锁定中年女性,先培养感情再骗钱
- 中年做了几道硬菜,孩子们的胃口很大,可以无限量地吃
- 中年你吃火锅,我吃火锅底料——做的川味慢烤牛肋排
- 教育|每一位中年女性,都是“乘风破浪的姐姐”
- 时尚@人到中年,一味扮嫩早就行不通了,这几个颜色才时尚高级
