好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

setodaNote CTF writeup [Web]

これは、2021/8/21~2021/9/4の期間で開催された、setodaNote CTFの Web 分野のwriteupです。全体writeupはこちら

tech.kusuwada.com

Body (30)

作成中のサイトに機密情報が含まれてしまっているようです。サイトにアクセスして機密情報を見つけ出してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。

https://ctf.setodanote.net/web001/

f:id:kusuwada:20210904225547p:plain:w400

こんなおしゃれなページが。下にもおしゃれなCTFガイドが続いています。
タイトルがbodyだし、「内面を見ろ」と言っているので、ソースを確認します。
flag形式の確認のとろこに、flagがコメントで書いてありました。

<p>特に指定がない限りフラグは flag{<!-- *** flag{Section_9} *** -->} という形式をとります。</p>

Header (50)

作成中のサイトを管理しているサーバに問題があり、機密情報が漏洩しているようです。サイトにアクセスして機密情報を特定してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。

https://ctf.setodanote.net/web002/

指定されたページに飛びます。またおしゃれなページです。文言が変わっています。

ボディの強さだけで勝てるとは限りません。ときには頭で勝負することも必要です。

今回はソースには書かれていなかったので、問題のタイトルよりresponseのheaderにかかれていそう、ということでcurlでresponseのheaderもとってみます。

$ curl -v https://ctf.setodanote.net/web002/
*   Trying 104.21.74.222...
* TCP_NODELAY set
* Connected to ctf.setodanote.net (104.21.74.222) port 443 (#0)
~(中略)~
* Connection state changed (MAX_CONCURRENT_STREAMS == 256)!
< HTTP/2 200 
< date: Sat, 28 Aug 2021 14:44:42 GMT
< content-type: text/html
< last-modified: Tue, 17 Aug 2021 03:42:18 GMT
< x-setodanotectf-flag: flag{Just_a_whisper}
< permissions-policy: interest-cohort=()
~(略)~

flag降ってきてました👍

puni_puni (80)

近所の子供から「ぷにぷにこーどあげるね」と1枚の紙を手渡されました。見ると子供の字とは思えない正確な書体で英数字がびっしりと書き込まれています。これはいったい。そう聞こうとしましたが、紙に意識を取られた一瞬のうちにその子供はいなくなっていました。

紙に書かれた文字列を解析し、フラグを入手してください。フラグは得られた文字列を flag{} で囲んで答えてください。例えば flag が得られた場合は flag{flag} と入力します。

xn--q6jaaaaaa08db0x8nc9t1b8fsviei84atb4i0lc xn--q6jaaaaa03dpd4mb3jc5rpa0g9jpk07acadc. xn--q6jylla3va3j6c8138a8eptvb303cxv4ft3o4ue63a xn--v8ja6aj2a3cri3ag4a2r6cx2a1rkk1272c7j4ajd4bmf0kjhg6rb. xn--q6j6gav1a0b2e1bh1ac2cl29ad7728kdjen6cz80dju6bqexchl9gel8b.

このxn--から始まる記法は、ググってみると Internationalized domain name(IDN)という、ドメインに漢字、アラビア文字、キリル文字、ギリシア文字なども使えるようにする仕組みだそうです。Punycodeというのが標準化されているとのことで、タイトルともマッチします。

オンラインコンバーターがPunycode converter (IDN converter), Punycode to Unicode 🔧に用意されていたので、こちらで変換していきます。

フラグは、さん、さん、ピー、ユー、エヌ、ワイ、 シー、オー、ディー、イー、よん、よん、です. カタカナ表記は半角英小文字に、 ひらがな表記は半角数字にしたものがフラグです. なお、読点は区切り文字なので取り除いてください.

おー、すごい。日本語に変換されました。ということでflagは flag{33punycode44}

Mistake (100)

作成中のサイトに不備があると外部から指摘を受けています。どうやら機密情報が漏れてしまっているようです。サイトにアクセスして機密情報を特定してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。

http://ctf.setodanote.net/web003/

またおしゃれページが出てきます。今回のtopの文言は

ここではすべてがオープンです。たどればきっと探し物も見つかります。

また、ソースにこんなことも書かれています。

<p>特に指定がない限りフラグは flag{<!-- Webserver directory index? -->} という形式をとります。</p>

/index.html/index.phpでファイルリストが露出しているのかな?と推測して色々見てみたけど出てこず。
でもこの線は間違ってそうにない。
そういえば、imageが全部 /image/ ディレクトリにあるな、ということで /images/ をpathに入れると、imageのリストが出てきました!

f:id:kusuwada:20210904224958p:plain:w400

ここにある pic_flag_is_here.txt を開くと、flagが書いてありました👍

tkys_royale (120)

んー、このサイトには重大な脆弱性があります。そう切り出してきた相手の姿にあなたは言葉が出ません。それは音信不通となっていた後輩の生き写し。聞きたいことが山ほどありますが、まずはサイトの脆弱性を修正しなければなりません。サイトを解析し、脆弱性を特定してください。

以下のサイトにアクセスしてフラグを得てください。

https://ctf.setodanote.net/web005/

またかっこいいサイトです。今度はログインフォームが全面に出ています。

f:id:kusuwada:20210904225033p:plain:w400

SQL injectionの香りがしたので、まずは簡単な"adminでログインする"ためのクエリをuser入力フォームに入れます。

admin'--(パスワードは空)

これでadminとしてログインできたようで、flagが出てきました!

f:id:kusuwada:20210904225100p:plain:w400

Estimated (120)

組織の関連サイトを監視している部署から「どうやら局長ブログで機密情報が漏洩しているようだ」と連絡が入りました。一部SNSで言及されているものの、幸いにしてまだ広まってはいないようです。なんとか穏便にすませたい上司に配慮し、被害を最小にすべくサイトを調査し漏洩している機密情報を特定してください。

以下のサイトにアクセスしてフラグを得てください。

https://ctf.setodanote.net/web006/

こんどはおしゃれな局長のブログが出現。このCTFのWeb問、みんなお洒落だな〜。

f:id:kusuwada:20210904225145p:plain:w400

色々眺めていると、左メニューの記事一覧に不穏なタイトルが。

f:id:kusuwada:20210904225159p:plain:w400

この記事の中身を見てみると

昨日の記事について、掲載していた画像に公開すべきではない情報が含まれていたため当該記事を削除いたしました。

とのこと。この画像、怪しい。
他の記事の写真を見てみると、大きい写真のpathルールが images/YYYYMMDD###b.jpg となっていることがわかったので、お詫び記事の前日の画像を images/20210602001b.jpg と予想してみるとあたり。
PC画面が映し出されており、拡大するとflagが書いてありました。

f:id:kusuwada:20210904225240p:plain:w400

Mx.Flag (150)

旗から手紙が届きました。

親愛なる貴方へ

こうして貴方に手紙を送るのは初めてですね。
実はとてもうまく隠れることができたので、嬉しくなりこのような手紙を送ることにしました。

どうか私を見つけてくれますか?

以下のサイトにアクセスしてフラグを得てください。

https://ctf.setodanote.net/web007/

なにこれかわいい。
サイトに行くと、問題文が英語で書かれてた。シンプル。

タイトルの Mx. 気になって調べてみたところ

Mxは、主にイギリスで使われる英語における敬称の一つで、相手の性別を特定しないものである。通常はミックス([mɪks] MIKS)やマックス([mʌks] MUKS)のように発音されるが、エムエックス([ɛmˈɛks] em-EKS)と発音されることもある

from: Mx (敬称) - Wikipedia

知らなかった!イギリスいるけど知らなかった!!
他のCTFに問題で出ていたMr. Robotという映画にかけたタイトルで/robots.txtを参照させるやつを連想したので探してみたけど、特に成果なし。ほか、ディレクトリトラバーサルも試してみたけど何もなし。
とてもシンプルなサイトなので、CookieやXSSもなさそう。通信を再度眺めてみると、そういえばfaviconのリンクまで用意してあって取りに行っているのに壊れてて開けてないっぽい。
リンクを指定してファイルをDLして中身をlessで見てみたら、flagがありました!

$ less favicon.png
// flag{Mr_Flag_hiding_in_the_favicon}
console.table({place: "favicon.png", png: "false", flag: "true", Look: "me"});

Redirect (150)

組織の関連サイトを監視している部署から「どうやら会長ブログが何らか侵害を受けてしまっているようだ」と連絡が入りました。再現方法が不明なものの、一部の訪問者から不審なサイトに飛ばされてしまうという指摘がされているようです。上司は休暇で不在ですが特に支障はありません。被害を最小にすべくサイトを調査し侵害状況を把握してください。

以下のサイトにアクセスしてフラグを見つけ出してください。

https://ctf.setodanote.net/web004/

こんどは会長のブログ。

f:id:kusuwada:20210904225324p:plain:w400

またお洒落だ。
タイトルと問題文からして、どこかにredirectされてしまうらしい。

ソースを表示してみると、最後にこんな怪しい行が。

<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=');}}();</script>
    </body>
</html>

base64 decodeしてみると、https://ctf.setodanote.net/web004/bWFsa2l0.htmlと URLになったので飛んでみます!

f:id:kusuwada:20210904225353p:plain:w400

おや。どうやらredirectされてしまったらしい。挙動を確認しつつcurlコマンドで一つずつトライしてみます。

$ curl https://ctf.setodanote.net/web004/bWFsa2l0.html
<!DOCTYPE HTML>
<html>
  <head>
    <title>start</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        if(Array.from(params).length > 0){
          location.href = 'https://ctf.setodanote.net/web004/bm9mbGFn/?'+params;
        }else{
          location.href = 'https://ctf.setodanote.net/web004/bWFsa2l0.html?callback=wantFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200';
        }
      }();
    </script>
  </head>
  <body>
    <p>Find out the flag.</p>
  </body>
</html>

お、飛ばし先が分岐してる!bm9mbGFnはbase64 decodeするとnoflag,bWFsa2l0malkit。上のnoflagの方にアクセスしてみると、次へのリンクを貰った。

$ curl https://ctf.setodanote.net/web004/bm9mbGFn/
<html>
  <head>
    <title>Next</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        location.href = 'https://ctf.setodanote.net/web004/bmV4dG5leHQ/?'+params
      }();
      </script>
  </head>
  <body>
  <p>No flag here. Go to next.</p>
  </body>
</html>

次に行きなさいとのこと。

$ curl https://ctf.setodanote.net/web004/bmV4dG5leHQ/
<html>
  <head>
    <title>Next-Next</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        location.href = 'https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/?'+params
      }();
      </script>
  </head>
  <body>
  <p>No flag here too. Go to next.</p>
  </body>
</html>

また次。

$ curl https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/
<html>
  <head>
    <title>Branching point</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !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;
    }
      }();
      </script>
  </head>
  <body>
  <p>You need the correct parameters to get the flag.</p>
  </body>
</html>

callbackパラメータを入れて、次の指定先にアクセスしてみます。

$ curl https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/?callback=getFlag
<html>
  <head>
    <title>GO!GO!GO!</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        var callback = params.get('callback');
        var data1    = params.get('data1');
        var data2    = params.get('data2');
        var data3    = params.get('data3');
        var data4    = params.get('data4');
        if (callback == 'getFlag' && data1 == "2045" && data2 =="0907" && data3 == "BiancoRoja" && data4 =="1704067200") {
          location.href = 'https://noisy-king-d0da.setodanote.net/?'+params;
    }else{
      location.href = 'https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/hint.html?'+params;
    }
      }();
      </script>
  </head>
  <body>
  <p>Yes! Go to next.</p>
  </body>
</html>

よさそう。更に入れるべきパラメータが増えました。条件式のとおりに入れて、次にアクセスします。

$ $ curl "https://noisy-king-d0da.setodanote.net/?callback=getFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200"
<!DOCTYPE html>
<body>
  <h1>Nice work!!</h1>
  <p>flag{Analyz1ng_Bad_Red1rects}</p>

フラグゲット٩(๑❛ᴗ❛๑)尸