DNS Server远程代码执行漏洞分析-SIGRed(CVE-2020-1350)( 二 )
本文插图
漏洞– 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截断-但等一下 , 还有更多!
推荐阅读
- 北京日报客户端|远程居家办公报酬咋算?北京法官详解疫情下的劳动争议
- 市场|套路太深!商贩竟能远程遥控电子秤“凭空”增重,警惕你身边有没有!
- 痛心!疫情致全球970万儿童永久失学 5亿儿童无法获得远程学习机会
- 周到|上海的电竞馆究竟有多牛 配备4K转播车、顶级远程制作技术
- 科技生活快报澳洲电信遭遇DNS攻击 多地网络崩溃
- 产业气象站 “5G+工业互联网”典型应用系列报道|5G集装箱远程控制装卸提升港口竞争力
- 远程控制“5G+工业互联网”典型应用系列报道|5G集装箱远程控制装卸提升港口竞争力
- 懂车之道|宝马推手机远程启动,每天车闻:雷诺上半年亏损600亿
- 中华小神兵|中东美军躲入地下,伊朗寄希望于拜登当选!远程配合拜登搞特朗普
- 驱动中国 超好用的免费远程控制软件推荐!-灰鸽子!满帧30帧!全功能免费!
