setodaNote CTF Writeup (Web)
この記事は setodaNote CTF のWebジャンルのWriteupです。
- Body (30pts, 458solves)
- Header (50pts, 367solves)
- punipuni (80pts, 362solves)
- Mistake (100pts, 220solves)
- tkys_royale (120pts, 279solves)
- Estimated (120pts, 241solves)
- Mx.Flag (150pts, 171solves)
- Redirect (150pts, 181solves)
Body (30pts, 458solves)
サイトにアクセスして機密情報を見つけ出してください。という問題
問題のタイトルの通りHTMLの"Body"の中を適当に見てると、コメントでFLAGが書いてある。
flag{Section_9}
Header (50pts, 367solves)
Bodyに引き続き、サイトにアクセスして機密情報を特定してください。という問題。サイトの見た目はBodyと同じ。
Chromeの開発者ツールを起動して、問題のタイトルの通りHTTPレスポンスの"Header"を見るとFLAG
flag{Just_a_whisper}
punipuni (80pts, 362solves)
問題として出題されている文字列は、日本語ドメイン等で使われているPunycode。
https://www.punycoder.com/ などで変換する。(https://punycode.jp/ は .
が入ってると変換できないので注意が必要
xn--q6jaaaaaa08db0x8nc9t1b8fsviei84atb4i0lc
= フラグは、さん、さん、ピー、ユー、エヌ、ワイ。xn--q6jaaaaa03dpd4mb3jc5rpa0g9jpk07acadc.
= シー、オー、ディー、イー、よん、よん、です.xn--q6jylla3va3j6c8138a8eptvb303cxv4ft3o4ue63a
= カタカナ表記は半角英小文字に、xn--v8ja6aj2a3cri3ag4a2r6cx2a1rkk1272c7j4ajd4bmf0kjhg6rb.
= ひらがな表記は半角数字にしたものがフラグです.xn--q6j6gav1a0b2e1bh1ac2cl29ad7728kdjen6cz80dju6bqexchl9gel8b.
= なお、読点は区切り文字なので取り除いてください.
flag{33punycode44}
Mistake (100pts, 220solves)
サイトに不備があって機密情報が漏れてしまっているようなので、機密情報を特定せよという問題。サイトの見た目はBodyとHeaderと同じ。
「サイトに不備があって機密情報が漏れた」ということで、思い当たるよくある設定不備をソースのHTMLを見ながらいろいろ試してると、/web003/images/
や /web003/assets
がディレクトリリスティングが有効になっていることがわかった。
/images
にFLAGが置いてあった。
flag{You_are_the_Laughing_Man,_aren't_you?}
tkys_royale (120pts, 279solves)
問題サイトにアクセスするとログインフォームが出てくる。
ソースのHTMLを見てると、コメントに user:pass123
とあるのでこれでログインしてみると、You need to be logged in as admin to find the flag.
と書いてあるページが表示される。これでadminで入れば良さそうというのはわかった。
ログインフォームに脆弱性というとSQLインジェクションが一番に思い当たったので、"
と'
をパスワードに入れてみる。エラーが表示されたので、SQLインジェクションの脆弱性がありそう。
ユーザに admin
、パスワードに ' OR 1=1;#
を入れると、認証が突破できてFLAGが表示される。
FLAG
flag{SQLi_with_b1rds_in_a_b34utiful_landscape}
Estimated (120pts, 241solves)
問題ページにアクセスすると、ブログサイトが表示される。
いくつかページを見ていると、2021年06月03日にお詫びページが掲載されている。「昨日の記事について、掲載していた画像に公開すべきではない情報が含まれていたため当該記事を削除いたしました。」と書いてあるので、06月02日の画像がないかを探す。
他のブログページには画像が掲載されており、画像のURLは https://ctf.setodanote.net/web006/images/投稿した年月日+001b.jpg
というフォーマットになっている。
削除された画像は https://ctf.setodanote.net/web006/images/20210602001b.jpg
というURLにあると推測できるので、ここにアクセスしてみると削除されたはずの画像が見える。
画像はPCを操作する人の画像で、PCの画面の部分をズームしてよく見てみるとFLAGが書いてある。
flag{The_flag_wouldn't_like_to_end_up_in_other_peoples_photos}
Mx.Flag (150pts, 171solves)
アクセスすると以下のようなサイトが表示される。
開発者ツールで行われた通信を見ていると、/images/favicon.png
にアクセスしていた。
ソースコードを見ると <link rel="icon" type="image/png" href="images/favicon.png">
という形でfaviconを指定している。通常faviconは拡張子が.ico
のアイコンファイルが使用されるが、今回はPNGが使われていて少し不自然である。(一応、今回のようにtype属性を指定すればPNGもアイコンとして使えるらしいが…
どんな画像かpreviewで見てみると、画像は表示されないが薄く文字が何か見える。
ファイルを保存してfavicon.pngを画像ビューアで見ようとしたが見れなかったので、何か違うファイルであると考えた。テキストエディタで中身をみるとただのテキストファイルで、コメントを見るとFLAGが書いてあった。
flag{Mr_Flag_hiding_in_the_favicon}
Redirect (150pts, 181solves)
再現方法が不明なものの一部の訪問者から不審なサイトに飛ばされてしまうので、調査して侵害状況を把握してくださいというシナリオ。
調査するWebサイトにアクセスすると一見普通のサイトが表示されるが、ソースコードを見ると下の方に何やらscriptが埋め込まれている。
整形すると以下のようなコードになる。
!function(){ var ref = document.referrer; var domain = ref.match(/^http([s]?):\/\/([a-zA-Z0-9-_\.]+)(:[0-9]+)?/)[2]; if(domain == "www.google.com" || domain == "www.google.co.jp" ){ location.href = atob('aHR0cHM6Ly9jdGYuc2V0b2Rhbm90ZS5uZXQvd2ViMDA0L2JXRnNhMmwwLmh0bWw='); } }();
どうやら referがgoogleだった場合にリダイレクトするようになってるらしい。Redirect先はBase64でエンコードされているのでこれをデコードすると https://ctf.setodanote.net/web004/bWFsa2l0.html
というURLになる。
このURLにアクセスすると、いくつかのリダイレクトが行われて "Nice try!" と表示されるサイトに誘導される。
さすがに開発者ツールだと追うのがきつくなってきたので、ここでBurpSuiteを使って発生してるリクエストを見てみる。5回ほどのリダイレクトが行われて、"Nice Try" のページに辿り着いてることがわかる。
リダイレクトするコードを一つずつ見ていくと、"Nice Try" ページにリダイレクトされる直前のページで分岐がある。
!function() { var params = new URL(window.location.href).searchParams; if (params.get('callback') == 'getFlag') { location.href = 'https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/?' + params; }else{ location.href = 'https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/?' + params; } }();
このページヘのアクセス時のクエリストリングが ?callback=wantFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200
のようになってたので、callbackのパラメータをgetFlag
に変えることで別のページに飛ばすことができそう。
パラメータを変えて同じURLにアクセスしてみると、予想通り別のページにリダイレクトされてFLAGが表示された。
FLAG
flag{Analyz1ng_Bad_Red1rects}