Cve-2017-14491
背景:
在2.78之前的dnsmasq中基于堆的缓冲区溢出允许远程攻击者通过精心设计的DNS响应导致拒绝服务(崩溃)或执行任意代码。
原理:
1.攻击者伪造成为dnsmasq的上游DNS服务器。
2.攻击者作为客户端向dnsmasq发送PTR请求,dnsmasq不存在相应PTR记录,便向上游DNS查询,然后获得PTR的查询结果缓存并应答客户端。
3.攻击者再次在客户端向dnsmasq发送PTR请求,dnsmasq便解析之前缓存的PTR记录,由于数据包的构建都在堆上,而且上游的恶意的PTR相应记录的大小超过了堆上分配的内存空间,最后造成了堆溢出。
分析:(详细分析见https://www.anquanke.com/post/id/87085)
第一个cache_insert函数执行后,后续的crec结构体中都把PoC中向前引用的name给完全解析扩展开,这样就一下增大了响应数据包的大小,造成后续的堆溢出
具体跟进add_resource_record函数,可以定位到rfc1035.c:1440行的do_rfc1035_name函数,该函数类似于一个copy操作,就是把解析的域名放入响应数据包的RDATA字段,由于解析域名后的数据包就扩展的很大,超出了分配的堆空间,所以造成了溢出
抓到的流量中
对应着报文格式
可知,rdata被填充为1024字节
复现:
1.伪造上游dns服务器
2.向攻击者控制的dns服务器启动dnsmasq转发查询
3.再次向dnsmasq发送请求,命中缓存
4.dnsmasq产生了溢出
上游服务器的回显
Poc分析:
主要关注作为伪造的上游服务器返回的内容
第一次响应返回
下一个响应
流量分析:
攻击者在客户端第二次发起PTR请求时
请求部分
Dnsmasq此时会用之前从上游服务器拿的ptr查询结果的缓存进行应答
这些数据正是poc中的填充