2007年5月24日星期四

[Tips]DNS RPC漏洞备忘Tips

by axis
2007-04-27
http://www.ph4nt0m.org

其实网上的分析很全了,我这里把我自己的exp中几个点记一下,也许会帮到某些人。

更多的内容可以参考metasploit,或者是milw0rm上的几个exp。

首先这个有漏洞的函数可以有很多rpc函数调用到。metasploit用的是extractQuotedChar().

网上也有用 DnssrvQuery() 的。

我用的方法是调用DnssrvQuery()

调用这个的时候,badchar是: 0x00以及数字0-7
也就是说badchar是:0x00 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37

好像metasploit上的那个exp也是需要过滤数字0-7的。

因为有/GS保护,所以需要采用覆盖seh的方式来利用。在这里由于dep的原因,覆盖seh的跳转地址有些不同,比如在dep开启的情况下,就不能跳转到语言区,与系统dll。但有些dll是可以跳转的,atl.dll就在这个范围内。而且atl.dll正好是没有/safeseh保护的。

由于是溢出的是大于1024的一个随机端口,如果dns server服务重启次数比较多,那么这个端口就会越来越大。我在公网上发现很多端口到开到了3000多,估计是被人溢出次数太多了。

要不挂服务其实很简单,ExitThread就可以做到了。

关于端口复用,有几种方式都可以实现。
最简单的是hook RPC函数。
如果是构造原始数据包发送的情况,那么也可以通过寻找当前socket来达到复用的目的。
当然也可以用hook recv。

我用的hook recv的情况,在这里2000和2003还有点不同。
对于53端口,2003直接hook ws2_32.dll里的recv就可以了。而2000,则是先调用了wsock32.dll里的recv,然后该recv去调用ws2_32.dll里的WSARecv.


漏洞触发方式都是一路覆盖到了栈底,保证seh接管流程。对于2000的情况,使用pop/pop/ret的跳转地址,也是可以跳到shellcode去的。

通过SMB的方式利用漏洞是需要验证的(445端口),而通过TCP的方式利用,则是可以匿名的(随机端口).

没有评论: