作者:Hcamael@知道創宇404實驗室
英文版本:https://paper.seebug.org/1024/
前段時間meh又挖了一個Exim的RCE漏洞,而且這次RCE的漏洞的約束更少了,就算開啟了PIE仍然能被利用。雖然去年我研究過Exim,但是時間過去這麼久了,所以這次復現還是花了大量時間在熟悉Exim源碼上。
本次漏洞復現的過程中,踩了好多坑,實際復現的過程中發現堆塊的實際情況無法像meh所說的那樣的構造,所以在這部分卡了很久(猜測是因為環境不同的原因),之後決定先理解meh利用的大致思路,然後自己根據實際情況對堆塊進行構造,雖然過程艱難,但最終基本算是成功了。
復現環境搭建
本次使用的環境和上次大致相同, 首先去github上該漏洞的patch commit
然後把分支切換到上一個commit
$ git clone https://github.com/Exim/exim.git
$ git checkout 38e3d2dff7982736f1e6833e06d4aab4652f337a
$ cd src
$ mkdir Local
Makefile仍然使用上次那個:
$ cat Local/makefile | grep -v "#"
BIN_DIRECTORY=/usr/exim/bin
CONFIGURE_FILE=/usr/exim/configure
EXIM_USER=ubuntu
SPOOL_DIRECTORY=/var/spool/exim
ROUTER_ACCEPT=yes
ROUTER_DNSLOOKUP=yes
ROUTER_IPLITERAL=yes
ROUTER_MANUALROUTE=yes
ROUTER_QUERYPROGRAM=yes
ROUTER_REDIRECT=yes
TRANSPORT_APPENDFILE=yes
TRANSPORT_AUTOREPLY=yes
TRANSPORT_PIPE=yes
TRANSPORT_SMTP=yes
LOOKUP_DBM=yes
LOOKUP_LSEARCH=yes
LOOKUP_DNSDB=yes
PCRE_CONFIG=yes
FIXED_NEVER_USERS=root
AUTH_CRAM_MD5=yes
AUTH_PLAINTEXT=yes
AUTH_TLS=yes
HEADERS_CHARSET="ISO-8859-1"
SUPPORT_TLS=yes
TLS_LIBS=-lssl -lcrypto
SYSLOG_LOG_PID=yes
EXICYCLOG_MAX=10
COMPRESS_COMMAND=/usr/bin/gzip
COMPRESS_SUFFIX=gz
ZCAT_COMMAND=/usr/bin/zcat
SYSTEM_ALIASES_FILE=/etc/aliases
EXIM_TMPDIR="/tmp"
然後就是編譯安裝了:
$ make -j8
$ sudo make install
啟動也是跟上次一樣,但是這裡有一個坑點,開啟debug,輸出所有debug信息,不開debug,這些都堆的布局都會有影響。不過雖然有影響,但是只是影響構造的細節,總體的構造思路還是按照meh寫的paper中那樣。
本篇的復現,都是基於只輸出部分debug信息的模式:
$ /usr/exim/bin/exim -bdf -dd
# 輸出完整debug信息使用的是-bdf -d+all
# 不開啟debug模式使用的是-bdf
漏洞復現
因為我覺得meh的文章中,漏洞原理和相關函數的說明已經很詳細,我也沒啥要補充的,所以直接寫我的復現過程
STEP 1
首先需要構造一個被釋放的chunk,但是沒必要像meh文章說的是一個0x6060大小的chunk,只需要滿足幾個條件: