這篇簡單記錄了我第一次驗證別人poc(proof-of-concept)的過程。
poc就是驗證某個概念、原理,在資安領域講簡單一點就是去exploit。
前言
CVE-2015-7547 是glibc中的
getaddrinfo()
存在stack-based buffer overflow漏洞。這個漏洞其實從2015年就發現了,後來google和red hat的人一起研究並寫出了poc,表示這個漏洞有其嚴重性。漏洞主要發生在glibc 2.9版以後,查了一下發現我手邊的server全部中招。
比較完整的資訊可以參考:
CVE-2015-7547: Critical Vulnerability in glibc getaddrinfo
此時若 DNS Server 回應了惡意的 payload ,可以造成
getaddrinfo()
buffer overflow,利用這個漏洞來exploit client端的主機。驗證過程
先將 poc code clone下來,
$ git clone https://github.com/fjserna/CVE-2015-7547
其中 CVE-2015-7547-poc.py 是惡意的DNS Server code, CVE-2015-7547-client.c 是client端呼叫 getaddrinfo()
的code。我讓 CVE-2015-7547-poc.py bind 在本機的port 53,這需要root權限。如果 port 53 有其他服務(像是ubuntu有dnsmasq)請先將它disable再執行.py檔。
$ sudo ./CVE-2015-7547-poc.py
再來更改本機 nameserver 的設定,把原本的nameserver設定註解掉,改成指向本機端的DNS Server,讓本機的DNS query都向我們的惡意DNS Server查詢。
/etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
#nameserver 140.112.2.2
nameserver 127.0.0.1
最後,將 CVE-2015-7547-client.c 編譯成可執行檔並執行,就會發生seg fault了。
$ make
gcc -o CVE-2015-7547-client CVE-2015-7547-client.c
$ ./CVE-2015-7547-client
Segmentation fault (core dumped)
接著我會嘗試利用這個漏洞拿到shell,但好像沒那麼簡單XD,如果成功的話會再把payload貼上來。