DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】

  • A+
所属分类:安全文章

晏子霜@卫兵实验室

漏洞描述

基本信息

2020年7月15日,微软发布了一个关于DNS Server的安全补丁(CVE-2020-1350),其漏洞类型为远程代码执行,CVSS评分为10分,官方定义为可导致“蠕虫级”的危害,经安全研究院研究员的分析,该漏洞确实可实现在未授权情况下的远程代码执行,建议尽快安装相关安全补丁。

漏洞类型

后门/权限提升 远程代码执行

cve编号

CVE-2020-1350

厂商

Microsoft/Windows

设备型号

Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2008 for 32-bit Systems Service Pack 2 (Server Core installation)
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2012
Windows Server 2012 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation)
Windows Server 2016
Windows Server 2016 (Server Core installation)
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)

背景知识

DNS格式

  1. +---------------------+

  2. |Header|报文头

  3. +---------------------+

  4. |Question|查询的问题

  5. +---------------------+

  6. |Answer|应答

  7. +---------------------+

  8. |Authority|授权应答

  9. +---------------------+

  10. |Additional|附加信息

  11. +---------------------+

Header段是必须存在的,它定义了报文是请求还是应答,也定义了其他段是否需要存在,以及是标准查询还是其他。
Question段描述了查询的问题,包括查询类型(QTYPE),查询类(QCLASS),以及查询的域名(QNAME)。剩下的3个段包含相同的格式:一系列可能为空的资源记录(RRs)。Answer段包含回答问题的RRs;授权段包含授权域名服务器的RRs;附加段包含和请求相关的,但是不是必须回答的RRs。

DNS Header

DNS Header有12字节

报文头包含如下字段:

  1. 111111

  2. 0123456789012345

  3. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  4. | ID |

  5. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  6. |QR|Opcode|AA|TC|RD|RA| Z | RCODE |

  7. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  8. | QDCOUNT |

  9. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  10. | ANCOUNT |

  11. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  12. | NSCOUNT |

  13. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  14. | ARCOUNT |

  15. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

各字段分别解释如下:
ID 请求客户端设置的16位标示,服务器给出应答的时候会带相同的标示字段回来,这样请求客户端就可以区分不同的请求应答了。

  1. QR 1个比特位用来区分是请求(0)还是应答(1)。


  2. OPCODE 4个比特位用来设置查询的种类,应答的时候会带相同值,可用的值如下:


  3. 0标准查询(QUERY)


  4. 1反向查询(IQUERY)


  5. 2服务器状态查询(STATUS)


  6. 3-15保留值,暂时未使用



  7. AA 授权应答(AuthoritativeAnswer)-这个比特位在应答的时候才有意义,指出给出应答的服务器是查询域名的授权解析服务器。注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。


  8. TC 截断(TrunCation)-用来指出报文比允许的长度还要长,导致被截断。(TC 表示 UDP 长度大于512时截断并用 TCP 再次请求)


  9. RD 期望递归(RecursionDesired)-这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。


  10. RA 支持递归(RecursionAvailable)-这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。


  11. Z 保留值,暂时未使用。在所有的请求和应答报文中必须置为0


  12. RCODE 应答码(Response code)-4个比特位在应答报文中设置,代表的含义如下:


  13. 0没有错误。


  14. 1报文格式错误(Format error)-服务器不能理解请求的报文。


  15. 2服务器失败(Server failure)-因为服务器的原因导致没办法处理这个请求。


  16. 3名字错误(NameError)-只有对授权域名解析服务器有意义,指出解析的域名不存在。


  17. 4没有实现(NotImplemented)-域名服务器不支持查询类型。


  18. 5拒绝(Refused)-服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。


  19. 6-15保留值,暂时未使用。




  20. QDCOUNT 无符号16位整数表示报文请求段中的问题记录数。


  21. ANCOUNT 无符号16位整数表示报文回答段中的回答记录数。


  22. NSCOUNT 无符号16位整数表示报文授权段中的授权记录数。


  23. ARCOUNT 无符号16位整数表示报文附加段中的附加记录数。

Question

在大多数查询中,Question段包含着问题(question),比如,指定问什么。这个段包含QDCOUNT(usually 1)个问题,每个问题为下面的格式:

  1. 111111

  2. 0123456789012345

  3. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  4. ||

  5. | QNAME |

  6. ||

  7. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  8. | QTYPE |

  9. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  10. | QCLASS |

  11. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

字段含义如下:

  1. QNAME 域名被编码为一些labels序列,每个labels包含一个字节表示后续字符串长度,以及这个字符串,以0长度和空字符串来表示域名结束。注意这个字段可能为奇数字节,不需要进行边界填充对齐.

  2. QTYPE 2个字节表示查询类型,.取值可以为任何可用的类型值,以及通配码来表示所有的资源记录.

  3. QCLASS 2个字节表示查询的协议类,比如,IN代表Internet.

资源记录格式(Resource record)

应答,授权,附加段都共用相同的格式:多个资源记录,资源记录的个数由报文头段中对应的几个数值确定,每个资源记录格式如下:

  1. 111111

  2. 0123456789012345

  3. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  4. ||

  5. ||

  6. | NAME |

  7. ||

  8. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  9. | TYPE |

  10. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  11. | CLASS |

  12. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  13. | TTL |

  14. ||

  15. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

  16. | RDLENGTH |

  17. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|

  18. | RDATA |

  19. ||

  20. +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

各字段含义如下:
NAME 资源记录包含的域名
TYPE 2个字节表示资源记录的类型,指出RDATA数据的含义
CLASS 2个字节表示RDATA的类
TTL 4字节无符号整数表示资源记录可以缓存的时间。0代表只能被传输,但是不能被缓存。
RDLENGTH 2个字节无符号整数表示RDATA的长度
RDATA 不定长字符串来表示记录,格式根TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。

漏洞分析

在 DNS 报文中 Question 字段的 QTYPE 代表请求格式 选择 b”x00x18” 为(SIG) 资源格式记录

DNS!Wire_CreateRecordFromWire 函数根据 QTYPE 从 RRWireReadTable 函数表中调用不同的函数来实现功能

DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】

在 RRWireReadTable 表中 SigWireRead 函数存在整数溢出漏洞,如果成功利用即远程代码执行 并有可能变成蠕虫

DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】

在对该函数完全逆向后,唯一能触发整数溢出的地方就是 RR_AllocateEx 的第一个参数

该参数的计算方法为

Sig_Data_Ends - (_WORD)Sig_DoMainName + V_Size + 0x14

这一段的计算方式其实是这样的

UINT_16(Sig_Data_Ends - (_WORD)Sig_DoMainName)

首先两个指针相减 最后转换成16位的变量

接着才是 V_Size + 0x14

V_Size 的内容由函数 Name_PacketNameToCountNameEx 来确定

该函数主要功能为计算出 域名的长度 并将其保存在参数1中

根据逆向得出 V_Size 最大不能超过0xFF-2

因此 我们要发送的DNS请求 Length + 0x14 + 0xFF > 0xFFFF

默认情况下 DNS 协议使用 UDP 协议传输 UDP 最大传输大小为 512

但是在上面的 DNS 格式中 我们发现 如果给 DNS Header 中的 TC 置位为1 即可以 TCP 协议进行通信 TCP协议最大包长为 0xFFFF 这样 我们就可以利用整数溢出 来分配一个小的内存块 后面 MemCpy 时 复制操作覆盖到后面的块来进行漏洞利用

DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】

可以看到 创建了一个 0xf8 大小的 Heap

DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】


最后往 0xf8 大小的池中 Copy 0xFFC0 大小的内存 导致整数溢出

DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】

补丁信息

在 kb4565536中,DNS!SigWireRead 函数 添加了判断整数溢出的函数 防止 Signers Name 溢出

Demo演示


关于我们

DNS Server远程代码执行(CVE-2020-1350)【附DEMO视频】

人才招聘

安全研究工程师

工作地点:

1.杭州;


岗位职责:
1.安全攻防技术研究,最新web应用及中间件漏洞挖掘研究;
2.跟踪分析国内外的安全动态,对重大安全事件进行快速响应;
3.公司WAF等安全防护产品的规则编写,对已有的规则进行优化维护;
4.针对公司的产品,进行全面详细的安全测试评估。

任职要求:
1.了解常见的网络协议(TCP/IP,HTTP,FTP等);
2.熟练使用Wireshark等抓包工具,熟悉正则表达式;
3.掌握常见漏洞原理,有一定的漏洞分析能力;
4.具备php、python、java或其他相关语言编码能力;
5.对常见waf绕过有一定的基础经验;
6.具备一定的文档编写能力,具备良好的团队共同能力;
7.对安全有浓厚的兴趣,工作细致耐心。




感兴趣的小伙伴请联系Nike,或将简历投送至下方邮箱。(请注明来源“研究院公众号”,并附带求职岗位名称)

联系人:Nike
邮箱:[email protected]

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: