MaidakeCTF2019 writeup Misc編
Miscのwriteupです。
- Welcome[10]
- Hex[50]
- Strong line[150]
- Turtle speed[200]
- A walking cat[200]
- Condensed image[200]
- Let's Janken[200]
- Picked up document[200]
- MD5[300]
- What's color?[400]
- Teleport[500]
- Vertical reading[500]
- Very Mosaic[500]
- まとめ
Welcome[10]
問題文のFlagをそのまま入力するだけ。
Flag:MaidakeCTF{Maidake_mountain_villa_is_rich_in_nature_and_the_best}
Hex[50]
見ての通り16進数です。
4d 61 69 64 61 6b 65 43 54 46 7b 48 65 78 61 64 65 63 69 6d 61 6c 5f 6e 75 6d 62 65 72 73 5f 61 72 65 5f 66 72 65 71 75 65 6e 74 6c 79 5f 75 73 65 64 5f 69 6e 5f 74 68 69 73 5f 69 6e 64 75 73 74 72 79 7d
変換するだけ。
こういうのはCyberChefが便利ですね。
Flag:MaidakeCTF{Hexadecimal_numbers_are_frequently_used_in_this_industry}
Strong line[150]
強い線。
一瞬モールス信号かと思った方もいるのではないでしょうか。
実はそう思わせるためにわざわざスライダーを用意しました。
スライダーの値を大きくするとバーコードになります。
私たちが普段見かけるバーコードはJANというもので、13桁か8桁の数字しか含まれません。
しかし数字だけだとFlagは表現できないので、英数字記号を表現できるCODE128を採用しました。
QRコード読み取りアプリで優秀なものはCODE128を含むバーコードも読めたりするので、解ける人はサクッと解ける問題でした。
Flag:MaidakeCTF{We_can_use_alphanumeric_symbols_in_code128}
Turtle speed[200]
イライラしそうなくらい遅く流れるモールス信号を解読する問題です。
なお右クリックとF12は無効化されています。
とはいえ、ソースを確認する方法なんていくらでもあります。
右上からデベロッパーツールを起動したり、URLの先頭に「view-source:」を付けるとか。
今回の場合はctrl+Aでもいけます。
モールス信号を取ってこれればあとは解読するだけです。
とは言うものの、解読で苦労した方は多いのではないでしょうか。
多くのサイトは英字しか解読できず、記号が文字化けしてしまったり表示されなかったり。
ぶっちゃけ記号が解読できなくても英字さえ読むことができれば手動で補完してしまえばいいだけの話なのでとくに問題はありません。
ちなみにCyberChefではモールス信号も解読できます。
Flag:MAIDAKECTF(PEOPLE_WHO_CAN_UNDERSTAND_MORSE_CODE_JUST_BY_SOUND_ARE_AMAZING)
なお、この問題では括弧が「()」でも「{}」でも通るようにしてあります。
ご丁寧に「MaidakeCTF」に書き変えた方も通ります。
結構色々なパターンで通るようにしましたがFail率が圧倒的に高くなってしまいました。
A walking cat[200]
歩く猫。
problem.sb3という多くの方にとっては見覚えのない拡張子のファイルです。
分からないときはggりましょう。
Scratchのプロジェクトで使用される拡張子のようです。
ということでScratchでこのファイルを読み込んでみます。
実行してみると猫がFlagをしゃべり始めます。
どうみてもASCIIなので一文字ずつ変換してあげればFlagの完成です。
Flag:MaidakeCTF{I_want_to_keep_cat}
※writeupを書くために実際に解いていたらFlagが「MaidCTFake{I_want_to_keep_cat}」になっていました。申し訳ありません。
Condensed image[200]
めっちゃ切り替え早いgifにしたろと思って最速の設定作ったはずでしたが、環境によっては頑張れば目視でも読み取れる始末。
正攻法は分割することで、方法自体はいくつもあります。
手軽なのは良い感じのサイトで分割してもらうことでしょうか。
自力でプログラムを各場合はこんな感じで。
Flag:MaidakeCTF{gif_has_more_than_one_picture_concatenated}
Let's Janken[200]
じゃんけんしようぜ。
かなり怪しげな時計があります。
察しのいい方はすぐに現在時刻がじゃんけんの手に関係があることが分かるかと思います。
アルゴリズムはソースを見てjavascriptを読めば分かります。
ちなみにここでも右クリックとF12は禁止です。
CPの手が決まるのはこの部分です。
// 現在時刻を取得 var nowTime = new Date(); // 秒数だけ抽出 temp_hand = Math.floor(set2fig(nowTime.getSeconds()) / 20); // 秒数によってCPの手を選択する if (temp_hand == 0) { cp_hand = "goo"; } else if (temp_hand == 1) { cp_hand = "choki"; } else if (temp_hand == 2) { cp_hand = "par"; }
現在時刻を20で割り、その値が0のときはグー、1のときはチョキ、2のときはパーを出すようになっています。
つまり、
00~20秒 → パーで勝ち
21~40秒 → グーで勝ち
41~59秒 → チョキで勝ち
となります。
しかし単純に勝つだけではFlagは貰えません。
とにかく勝ち続けなければなりません。
では何勝すればいいのかとなるわけですが、こちらもソースに書いてあります。
// 連勝数が1000を越えたらflagをゲット if (victory >= 1000) { $.post('flag.php', victory).done(function(data) { document.getElementById("flag").innerHTML = data; }); } else { document.getElementById("flag").innerHTML = "<font style=\"font-size: 2rem; color: #FF0000;\">"+victory+"</font>連勝中です。"; }
なんと1000連勝です。手作業だと気が遠くなる数字ですね。
もちろん秒数に注意しながら手作業で1000回連打すればFlagは貰えますが、正攻法ではありません。
実は連勝数はcookieに保存してあります。
// cookieに記録されている連勝数を取得 var victory = parseInt(document.cookie.split("=")[1]);
なのでcookieの値を改ざんし、その状態でじゃんけんに勝てばいいだけです。
cookieのvictoryの値を1000以上に設定します。
勝つとFlagが表示されました。
別解として、curlコマンドなどでcookieをセットしてflag.phpにアクセスする方法もあります。
ちなみに元ネタはケイスケホンダです。
Flag:MaidakeCTF{button_mashing_is_not_the_right_solution}
Picked up document[200]
書類を拾いました。
まずはfileコマンド。
証明書なので中身を確認します。
openssl req -in flag -text -noout
OにFlagが書いてあります。
Flag:MaidakeCTF{Are_you_understanding_how_the_certificate_works?}
MD5[300]
何のMD5なのか答える問題です。
問題文にもある通り普通はMD5の特定は困難なものですが、ヒントにKancolle Engineに答えがあるとあります。
先にKancolle Engineを解いていた人は察するかと思います。
Kancolle EngineでSQLインジェクションすることでデータベース内の艦娘のMD5が全て取得することができます。
これをもとにMD5を調べて艦娘の名前を送信するプログラムを書きます。
実行するとこんな感じになります。
Flag:MaidakeCTF{CTF_may_hide_hints_for_other_issues}
What's color?[400]
何色?
flag.csvを見てみると数字がたくさん並んでいます。
タイトルで察してほしいところですが、これらの数字はRGB値を表しています。
場合によってはRGB値のほかに透過度も含まれていることがありますが、多くの場合255で固定なので見ればだいたい分かります。
方針としては、1ピクセルごとにRGB値を設定して画像を作成するだけです。
プログラムはこんな感じ。
BMWのX1とともにカラフルなFlagが現れます。
ちなみにBMWに深い意味は一切ありません。良さげな写真を探しているときに目に入ったから選んだだけです。
Flag:MaidakeCTF{Let's_convert_it_to_an_image_if_you_know_that_it_is_an_RGB_value}
Teleport[500]
テレポート。
MaidakeCTFで一番のサービス問題です。
アクセスしてみると緯度経度の表示とともにAccess deniedと弾かれてしまいます。
緯度:32.7526235
経度:129.8495163
この座標が示す場所はどこか調べてみましょう。
まさか稲佐山に行かないといけないのか、と思った方もいるかもしれません。
当然そんなことはせずにFlagは得られます。
方法はいくつかあります。
一番簡単なのはchromeのデベロッパーツールでセンサーの値を弄ることでしょうか。
デベロッパーツールの右上からMore tools>Sensorsから設定できます。
座標を設定してページをリロードするとFlagが表示されます。
他にはスマホのGPSを偽装できるアプリを使ってみるとか。
スマホのエミュレータとかでやる方法もあります。
Flag:MaidakeCTF{Falsifying_coordinates_is_surprisingly_easy}
Vertical reading[500]
縦読み。
緯度経度が52個あります。なんだかFlagの長さっぽいですね。
まずは1個めの「44.8847548,-93.2222825」がどこなのか調べます。
ミネアポリス・セントポール国際空港
ここで察する人は察するかもしれませんが、ほとんどの人はよく分からないはずなので2個目3個目も調べていきます。
26.5928022,127.2393831(2個目)
粟国空港
19.7188342,-155.0416866(3個目)
ヒロ国際空港
どんどん調べていくと、11個目(32.8304705,129.9858201)がこんな場所を示しています。
かっこちゃん
MaidakeCTFだけで10文字ですからかっこちゃんはつまり{ です。
さらに調べていくと15個目(35.6613608,139.706406)が株式会社アンダーバーです。
まさか各座標が示している場所の頭文字?と思われた方、惜しいです。
実際、3文字目にあたるはずのヒロ国際空港が i になりません。
ところで皆さん、空港コードというものをご存知でしょうか。
空港名を英字3文字で表しているやつです。羽田空港ならHNDとか。
それらも全て集めたやつがこちらになります。
あとは頭文字を縦読みするだけです。
Flag:MAIDAKECTF{THE_AIRPORTS_ARE_ASSIGNED_A_AIRPORTS_CODE}
Very Mosaic[500]
めっちゃモザイク。
クソ問と言われても仕方ないかもしれません。
めっちゃモザイクのかかった画像が渡されます。
おそらくモザイクを除去できればFlagが出てくることは分かるかと思います。
この問題はHidden Flagと同じで、適当なサイトを探し出さないといけません。
qiita.com
Hidden Flagが解かれるのは意外と早かったのでこれもすぐ解かれるだろうなと思っていたら中々解かれませんでした。
このページのモザイクを除去するプログラムにかければいいだけの話なのですが、1回だけでは除去できません。
タイトルの通りめっちゃモザイクがかかっているのです。
何十回かモザイクを除去するプログラムを書きましょう。
50回モザイクを除去するとめっちゃかわいい時雨と共にFlagが現れます。
Flag:MaidakeCTF{The_cuteness_of_the_Shigure_is_sinful}
まとめ
CTFでは見かけないような問題をつくることにこだわりました。おかげでセキュリティ要素がほとんどありません。
個人的に前から作りたいと思っていたものが作れたので気にしないことにします。