Cve-2019-16928 Exim 堆溢出分析

上一个exim的rce还没写出来exp又出了新的rce, 听说是360的师傅在研究上个漏洞的时候发现的orz, 我什么时候也能这么强

看了下漏洞详情, 是发送ehlo消息的时候附带的数据可以导致堆溢出, 发现者给出了PoC

尝试写一下exp

我们先在本地编译一个可以调试的exim, 为了方便之前的SNI的研究, 所以接着用之前的4.92.1版本, 在官网拖下来4.92.1.tar.gz并解压, 修改以下配置:

安装依赖:

libdb5.3-dev, libpcre3, aptitude, libssl-dev

aptitude install libpcre3-dev

之后make生成Makefile文件

修改Makefile文件来启用源码调试

然后sudo make install

调试模式启动exim: /usr/exim/bin/exim -bd -d-receive

我这里选择用gef进行调试, gef有个堆分析功能很好用, gdb需要用sudo来启动

exp抄了一下之前的off-by-one的exp, 后来发现用smtplib更方便一点

首先连接服务器

from smtplib import *
s = SMTP("192.168.190.150", 25)

之后在gdb里对进程attach, 因为exim对每一个连接开一个新的进程, 进程号可以在exim的调试窗口看到

然后发送上面PoC里的填充:

s.ehlo("A"*11264)

可以看到触发了内存错误

在gdb中看一下堆的情况:

发现有一个unsorted bin被我们溢出到了size字段, 导致内存错误

看一下这个unsorted bin

测试一下exim的堆构造方式, 当客户端连接到服务器时, 堆布局如下