中年DNS Server远程代码执行漏洞分析-SIGRed( 六 )
如您所见 , 我们在ntdll!LdrpValidateUserCallTarget上崩溃了 。 这个函数负责作为CFG的一部分验证目标函数指针 。 我们可以看到被验证的指针(rcx)是完全可控的 , 这意味着我们成功地覆盖了某个函数指针 。 我们看到崩溃的原因是函数指针被用作全局位图表的索引 , 每个地址有“allowed” / “disallowed”位 , 而我们的任意地址导致从表本身的未映射page读取 。
要利用这个漏洞在绕过CFG的同时实现远程代码执行 , 我们需要找到提供以下功能的原因:write- where(精确地覆盖栈上的返回地址)和infoleak(泄漏内存地址) 。
信息泄漏
为了实现Infoleak(信息泄露)原语 , 我们利用溢出破坏了DNS资源记录的元数据 , 而它仍在缓存中 。 然后 , 当再次从缓存中查询时 , 我们可以泄漏相邻的堆内存 。
WinDNS的堆管理器
WinDNS使用Mem_nualloc函数动态分配内存 。 此函数管理自己的内存池 , 以用作高效缓存 。 对于不同的分配大小 , 有4个内存池(0x50、0x68、0x88、0xA0) 。 如果请求的分配大小大于0xA0字节 , 则默认为HeapAlloc , 它使用本地Windows堆 。 堆管理器为内存池header分配额外的0x10字节 , 其中包含元数据 , 包括缓冲区的类型(已分配/空闲)、指向下一个可用内存块的指针、用于调试检查的cookie等 。 堆管理器以单链表的方式实现它的分配列表 , 这意味着块的分配顺序与它们被释放的顺序相反(LIFO) 。
Write-What-Where
为了实现“Write-What-Where”原语 , 我们通过破坏chunk的header(元数据)来攻击WinDNS堆管理器 , 实际上就是破坏freelist 。
在freelist被破坏后 , 下次我们尝试分配大小合适的任何内容时 , 内存分配器都会为我们分配我们选择的内存区域作为”Malloc-Where”原语 。
为了绕过CFG , 我们希望该内存区域位于堆栈上 , 由于信息泄漏 , 我们希望知道它的位置 。 一旦我们在堆栈上有了写能力 , 我们就可以将返回地址改写为我们想要执行的地址 , 有效地劫持执行流程 。
必须指出的是 , 默认情况下 , DNS服务在前3次崩溃时重新启动 , 这增加了成功利用的机会 。
总结
这个高度的漏洞已经被微软承认 , 并为其分配CVE-2020-1350 。
我们相信这个漏洞被利用的可能性是很高的 , 因为我们在内部找到了利用这个漏洞所需的所有原语 。 由于时间限制 , 我们没有继续利用这个漏洞 , 但是我们相信其他的攻击者能够利用它 。 成功利用此漏洞将产生严重影响 , 因为通常可以找到未修补的Windows域环境 , 尤其是域控制器 。 此外 , 甚至一些互联网服务提供商(ISP)可能将其公共DNS服务器设置为WinDNS 。
我们建议用户修补受影响的Windows DNS服务器 , 以防止利用此漏洞 。
作为临时的解决方法 , 在打补丁之前 , 建议将DNS消息(通过TCP)的最大长度设置为0xFF00 , 这样可以消除此漏洞 。 您可以通过执行以下命令来实现:
reg add ""HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDNSParameters"" /v ""TcpReceivePacketSize"" /t REG_DWORD /d 0xFF00 /f net stop DNS && net start DNS 披露时间表
- 2020年5月19日 – 向Microsoft提交的初步报告 。
- 2020年6月18日 – Microsoft发布了此漏洞的CVE-2020-1350 。
- 2020年7月9日 – Microsoft承认该问题是一个可修复的严重漏洞 , CVSS评分为10.0 。
- 2020年7月14日 – Microsoft发布了补丁 。
推荐阅读
- 中年美国寸土寸金,为何要在纽约建立林则徐广场?原因很简单
- 中年北斗系统发言人答封面新闻:北斗定位精度最好可达1点几米
- 中年检测设备行业政策及环境
- 中年元春回府省亲为何会在夜晚进行?原来其中大有文章
- 中年北斗三号全球服务可用性达99%以上,全球范围定位精度优于10米
- 锁定|起底电信诈骗“杀猪盘”:锁定中年女性,先培养感情再骗钱
- 中年做了几道硬菜,孩子们的胃口很大,可以无限量地吃
- 中年你吃火锅,我吃火锅底料——做的川味慢烤牛肋排
- 教育|每一位中年女性,都是“乘风破浪的姐姐”
- 时尚@人到中年,一味扮嫩早就行不通了,这几个颜色才时尚高级
