介是php-fpm (CVE-2019-11043)的一個(gè)漏洞利用,在某種配置下,,nginx+php-fpm的框架里,這個(gè)漏洞可以由外界觸發(fā),。這就意味著,,一個(gè)網(wǎng)頁用戶可能對這種配置的服務(wù)器實(shí)施遠(yuǎn)程命令執(zhí)行攻擊。(有前提條件,,看下文) ###這是啥漏洞 如果一個(gè)網(wǎng)站服務(wù)器運(yùn)行著nginx+php-fpm,,然后還有類似下面的配置: location ~ [^/]\.php(/|$) { ... fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass php:9000; ... } 而且,也沒有任何腳本是否存在的檢測(例如 `try_files`),,那么,,用這個(gè)工具你可能能黑掉有問題的機(jī)器。 ###完整的前提條件列表 1. Nginx + php-fpm, `location ~ [^/]\.php(/|$)`必須導(dǎo)向到php-fpm(可能正則表達(dá)式會 更嚴(yán)格) 2.`fastcgi_split_path_info`指令必須存在并且包含一個(gè)以 `^` 開頭且以 `$`結(jié)尾的正則表達(dá)式,,這我們就可以用一個(gè)新行的字符來突破它,。 3.必須通過`fastcgi_param PATH_INFO $fastcgi_path_info;`語句指定一個(gè)`PATH_INFO`變量。剛開始我們以為這一直都存在于`fastcgi_params`文件里,,但這是錯(cuò)誤的,。 4.不能有任何文件存在性檢測,例如`try_files $uri =404` 或者 `if (-f $uri)`。如果Nginx在FastCGI轉(zhuǎn)發(fā)前把請求丟給了不存在的腳本,,我們的請求就永遠(yuǎn)到不了php-fpm,,加上這個(gè)也是修補(bǔ)這個(gè)漏洞的最簡單方案。 5.這個(gè)利用只對PHP 7+有效,,但是這個(gè)漏洞也存在于更早的版本,。(看下面的關(guān)于php5) ###這難道不是幾年前就已知的漏洞了嗎? 很久之前,,php-fpm是不約束腳本的擴(kuò)展名的,,就是說形如`/avatar.png/some-fake-shit.php`的文件,php-fpm會把`avatar.png`當(dāng)做php文件來執(zhí)行,,這個(gè)問題在2010年左右就被修復(fù)了,。 現(xiàn)在這個(gè)漏洞不依賴文件上傳,在當(dāng)前的大多數(shù)版本都能利用(直到補(bǔ)丁被打上),。更重要的是,,這個(gè)利用更酷剌。 ###咋運(yùn)行 安裝
如果出現(xiàn)一些奇奇怪怪的編譯錯(cuò)誤,,先確保你的go版本要大于等于1.13,。以下面的命令執(zhí)行: phuip-fpizdam [url] (假設(shè)你已經(jīng)把 `$GOPATH/bin`變量丟到`$PATH`里去了,否則,要把路徑打全),,類似下面的輸出就是正常了:
這之后呢,,你就可以在任意的php url后面,添加`?a=<your command>`來執(zhí)行遠(yuǎn)程代碼了,。(你可能需要多試幾次才行) ###游樂場環(huán)境 如果你想重現(xiàn)這個(gè)問題或者想在本地玩玩這個(gè)漏洞利用,,介樣來: 1.克隆這個(gè)項(xiàng)目然后到reproducer目錄 2.創(chuàng)建docker鏡像:`docker build -t reproduce-cve-2019-11043 .`,這需要等比較長的時(shí)間,,因?yàn)樗匕裵hp的項(xiàng)目克隆回來并且還要編譯,。然鵝,如果你想debug這個(gè)利用代碼,,上述步驟會讓你更省力,。這個(gè)被修訂過的編譯是剛好沒被修補(bǔ)的版本。 3.啟動(dòng)一個(gè)docker 實(shí)例`docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043`. 4.現(xiàn)在你可以訪問http://127.0.0.1:8080/script.php了,,這目前是一個(gè)空文件,。 5.運(yùn)行利用程序: `phuip-fpizdam http://127.0.0.1:8080/script.php` 6.如果一切順利,你就可以這樣構(gòu)造url來執(zhí)行遠(yuǎn)程命令了,。 http://127.0.0.1:8080/script.php?a=id 多試幾次,,因?yàn)橹挥胁糠謕hp-fpm的worker進(jìn)程受影響而已。 ###關(guān)于PHP5 這個(gè)緩沖區(qū)下溢出漏洞也同樣存在于PHP5,,。然而呢,,我們這個(gè)漏洞利用需要用到一個(gè)保存FastCGI變量的優(yōu)化,, [_fcgi_data_seg]。這個(gè)優(yōu)化只存在于php7,,所以這次特別的漏洞利用只能在php7上運(yùn)行,。但可能有別的利用技術(shù)可以在php5上運(yùn)行呢。,。,。 ###申明 最開始的異常現(xiàn)象是由[d90pwn]在“真實(shí)世界CTF”大賽中發(fā)現(xiàn)的,。根本問題是(Emil Lerner)發(fā)現(xiàn)的,,還有設(shè)置php.ini參數(shù)的方式。最終的php.ini參數(shù)集是由[beched]發(fā)現(xiàn)的,。 最后,,下載: https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47553.zip 參考:github.com/neex/phuip-fpizdam HackerHub發(fā)布 | 轉(zhuǎn)載請注明出處 |
|