记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

从源码角度对ntpd 栈缓冲区溢出漏洞(CVE-2014-9295)的分析

2014-12-24 23:45

分享到:

感谢匿名白帽子的投稿,以下内容供安全爱好者参考学习,本文获得投稿奖励500元,即将打入作者账户,投稿请发送邮件至 huangyuan#360.cn

近日,ntp官网放出了更新补丁:

http://support.ntp.org/bin/view/Main/SecurityNotice

共有6个漏洞4个CVE编号,均为Google Security Team 发现并提交的。

其中CVE-2014-9295包括了3个stack overflow:

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-9295

本文从源码角度分析下,这三个栈溢出分别是什么,能否利用提权。

注:文中参考有漏洞的旧版本为ntp-4.2.6p5

Buffer overflow in configure()

首先,有关configure()函数的栈溢出,官网描述如下:

t01d31fb18692ac507a.png

我们来看一下12月12日补丁的内容

http://bk1.ntp.org/ntp-dev/?PAGE=patch&REV=548acf55dxKfhb6MuYQwzu8eDlS97g

t0180bac9382d7cc886.png

在memcpy函数之前,增加了检查data_count是否大于remote_config.buffer长度的逻辑。

那就是说,补丁之前的这个memcpy是有可能发生溢出的。其目的地址remote_config.buffer是否位于栈中呢?

t01b242106304a5d6ac.png

此处位于ntp_config.h

remote_config的结构如上,buffer的大小是固定的,会在前面memcpy的复制中溢出。

但是remote_config的位置并不在栈中

t01406a9073ff68d656.png

同样位于ntp_config.h中被定义,remote_config是个全局变量,放在BSS段。

t01c81e2523d9fbb92d.png

这就不是栈溢出,BSS段溢出之后除了能改变全局变量结构数据,还不知道能造成什么其他破坏。

t01edc6a565d767742b.png

不过貌似它后面的全局静态数据被淹没了也没什么作为。

Buffer overflow in ctl_putdata()

同样,官网上的有关描述:

t015e6909a69cc0ce08.png

其对应的补丁

http://bk1.ntp.org/ntp-dev/?PAGE=patch&REV=548acdf3tUSFizXcv_X4b77Jt_Y-cg

t01ada83e889837f519.png

这个补丁很有意思,加了一个MIN的宏来取最小值,并且添加了currentlen来记录当前长度。

当然目的只有一个,避免后面memcpy的溢出,同时又保证内容全部被复制。

目的地址datapt是rpkt.data的指针,而rpkt的结构定义如下:

t013537420f18fdeae6.png

此处位于ntp_control.h

data数组的大小是固定的,在上面的memcpy中被溢出。

同样的,实例化的变量rpkt并未定义在函数中,而是在ntp_control.c的全局数据区

t01ef047800cf492e72.png

这个溢出,又不是溢出到栈中,还是BSS段的数据。

t01540414f1649af5e7.png

Buffer overflow in crypto_recv()

最后,我们来看这个crypto_recv()函数的溢出:

t0150f2198233831883.png

对应的补丁:

http://bk1.ntp.org/ntp-dev/?PAGE=patch&REV=548acc4dN1TbM1tRJrbPcA4yc1aTdA

t01a9024bc9b9b2a2d1.png

这个补丁就更好玩了,且细细看来。

补丁后的代码用cookiebuf这个在局部新malloc申请的堆块提供给RSA_private_decrypt()函数作为目的地址,保存结果,用完随即释放。

有关RSA_private_decrypt,它是openssl的库函数,参见:

https://www.openssl.org/docs/crypto/RSA_public_encrypt.html

t0172a123a7cbc54472.png

RSA_public_encrypt() encrypts the ‘flen’ bytes at ‘from’(usually a session key) using the public key ‘rsa’ and stores the ciphertext in ‘to’.‘to’ must point to RSA_size(rsa) bytes of memory.

也就是说,这第三个参数是要保存结果的buffer指针,一个字符串buffer ptr。

那,补丁之前呢,这个temp32是什么?

在ntp_crypto.c稍前面一点有定义:

t01332327abdb4a0f4b.png

这个temp32居然就是一个u_int32类型,然后在传递给RSA_private_decrypt()之前,被取地址,然后强制转换为u_char类型指针,如果RSA_private_decrypt()需要的目的地址超过一个字节大小,就溢出了。

这次的溢出点是否在栈中呢?

u_int32 temp32的定义就在crypto_recv()函数开头的地方,在函数内部!

t017ddea2ef80df2adb.png

终于,这最后一个溢出是栈溢出没错。

t0153773c43de889f9c.png

从上下文逻辑以及函数名来看,ntp服务器在处理cookie的RSA解密时,会触发到这个点。

当然,对于整个crypto_recv()函数的逻辑,有兴趣的同学可以自己逆向一下:

t0100ae2b55adeb65ce.png

Additional

多说几句有关调试的问题,漏洞所在的源码可在官方网站上下载:

http://archive.ntp.org/ntp4/

在configure的时候,默认即可包含上面前两个函数。但是默认情况下是不支持autokey的,这样编译出来的版本没有crypto_recv()函数,如果要打开autokey需要这样配置:

t015545968734e63214.png

make好之后编辑ntp.conf,有关ntp.conf的写法参见

https://wiki.archlinux.org/index.php/Network_Time_Protocol_daemon

仅仅为了调试的话,没必要安装ntp到系统目录,直接以root权限启动ntpd/ntpd即可

sudo ntpd/ntpd -c ~/Desktop/ntp.conf

加入-c参数制定ntp.conf文件的位置。

然后开启autokey以及配置密钥请参见官方文档:

http://www.ntp.org/ntpfaq/NTP-s-config-adv.htm#Q-CONFIG-ADV-AUTH-AUTOKEY

ntpd作为服务端,运行后会监听123端口,client既可以通过python ntplib访问,也可以通过编译目录下的ntpq/ntpq客户端来连接:

t0119b36ac4e323c8bc.png

Conclusion

本文分析了CVE-2014-9295对应的三个溢出,经验证,只有位于crypto_recv()函数中的溢出才是栈溢出。真是应了那句话“只要发一个包含恶意cookie的包,就可以拿下任意一台服务器”。

当然,溢出点在此,具体是否真的能触碰到这个点,是否真的能利用,是否真的稳定利用,还有待各位小伙伴继续研究下去。并且,只有ntp服务端开启了autokey功能crypto_recv()函数才会被编译进ntpd。

漏洞所在版本的源码在官网上有下载,方便研究。

对于安全厂商,以及所有的网管,请尽快升级ntp服务器,如非必要,还请关闭该服务。这不仅仅是被用来组成僵尸大军ddos别人家的设备的问题,您的设备真的有可能被搞。


小编科普:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化。

ntpd 栈缓冲区溢出漏洞CVE编号:CVE-2014-9295

发布日期:2014-12-19

更新日期:2014-12-23

受影响系统:

NTP NTPd <  4.2.8

描述:

CVE(CAN) ID: CVE-2014-9295

ntpd 4.2.8之前版本,在实现上存在多个栈缓冲区溢出漏洞,远程攻击者通过构造的数据包,可触发ntpd函数crypto_recv() (用autokey进行身份验证), ctl_putdata(), configure()缓冲区溢出,用ntpd进程的权限执行任意代码。

本文由 360安全播报 原创发布,如需转载请注明来源及本文地址。
本文地址:http://www.hackdig.com/?12/hack-16797.htm

知识来源: bobao.360.cn/learning/detail/165.html

阅读:307158 | 评论:0 | 标签:溢出 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“从源码角度对ntpd 栈缓冲区溢出漏洞(CVE-2014-9295)的分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

学习黑客技术,传播黑客文化

推广

工具

标签云