
ハッキング完全初心者が行く!CTFイベント奮闘記
ハッキング初心者、社内CTFの第1回大会に参加する
出会い
こんにちは。SHIFTにてQAエンジニアをしています、山中です。
入社は2022年8月。入社して驚いたのは、社内イベントの多さでした。
オンライン勉強会だけでも何種類も。環境の変化に戸惑いながらも、色々とお知らせを見たり、時には参加してみたりもして、少しずつ会社の雰囲気に慣れてきた頃。社内のお知らせ一覧に、こんな記事が掲載されました。
【参加受付中】
賞金あり!社内CTFイベント~ SHIFT精鋭が作った難問に挑め!
セキュリティの精鋭が作った
この問題
解いてみろ!
(広告画像キャッチフレーズ引用)
……。
…………。
………………。
何事!?
挑戦的なキャッチフレーズ。
そこに添えられた「サイバーっぽい」広告画像。
何より、「賞金あり」という世界一魅力的な文字列。
そこに並ぶ「CTF」という謎の単語。
これが私と“CTF”という言葉との出会いでした。
「CTF」とは?
「CTF」とは何なのか?
お知らせの中には以下のような解説がありました。
「Capture The Flag(旗取りゲーム)」の頭をとってCTF。
専門知識や技術を駆使して隠されているFlag(答え)を見つけ出し、時間内に獲得した合計点数を競う情報セキュリティのハッキングコンテスト。
競い合うイベント形式のゲーム性も相まって近年盛り上がりを見せています。
……「ハッキング」? ハッキングって、あのハッキングでしょうか?
あの、よくドラマなどで見るハッキング? モニターを五、六台並べて何やら文字解析していたりする、あの?
よく耳にするけれど、決して身近ではないワード。まだシステムエンジニアという言葉すらあまり知らなかった頃に、ほのかに憧れを抱いていたあの文字びっしりのモニター、軽快なタイピングの音。それに関われるということでしょうか?
これは……これは、参加するしかないでしょう!
……と、いったような経緯で参加することになった社内CTFイベント。
「何かハッキングってかっこいいな」程度の感覚だった私が、どのくらい奮闘することが出来たのか。
その結果の前に、私がCTFイベントの問題の中で印象に残ったものをいくつかご紹介します。
問:秘密の部屋(25点)(正答者:72人)
ちなみに私はハリーポッターが大好きです。
ジャンルは「WEB」で、問題の内容は以下。
このCTFサイト「ctf.shiftinc.tools」には限られたユーザのみが知る「秘密の部屋」と呼ばれる場所があるらしい。
私は何とか秘密の部屋の手がかりとなるWebサーバの通信ログ(アクセスログ)を入手することができたが疲労困憊でもう動けない。
あなたにはログを託すので分析して秘密の部屋を見つけてほしい・・・
web_accesslog.txt
分かる。疲労困憊の時ってそうなりますよね。
問題に貼付されているテキストファイルを開いたところ、表示されたのが以下。

うわ、読みたくない。
サクラエディタで開きなおします。

多少マシ。少なくともURLが見やすくなりました。
結構力業ですが、ここから明らかに秘密の部屋ではないURLを、サクラエディタの正規表現と置換でゴリゴリ削っていきました。
まずは一行目。ここに記載されているURLに飛んだところ、イベントのトップページが表示されます。つまり、このURLはシロ。容疑者から外します。
サクラエディタでCtrl+Rで置換機能を起動。
「.*”消したいURL”.*\r\n」で、消したいURLの前後の文字と改行を削除して、シロのURLを行ごと削ります。

この作業を5回ほど繰り返したところ。

明らかに主張の激しいURLがいる。
ええ……いや、確かに依頼主、「秘密の部屋」って言っていましたけど。これ、もしかして、問いで当たりをつけて「secret」とかで検索掛けるのが正解だったのでしょうか。
とにかく、「secretroom」を自称するURLが見つかりました。
対象のURLに飛んだところ、表示されたのが以下。

よし、じゃあ、このGoを押下して終了ですね。
……駄目でした。何も起きません。
こういう時は、とりあえずソース表示すればいいのです。

既にソースで判明していますが、一応。
元のページで反転表示させたところ、しっかり表示されました。

問:ポケモンは好き?(10点)(正答者:93人)
問題の中でも特に目を引くタイトルの設問。ジャンルは「暗号」。
私はカメールが好きです。御三家は基本、水タイプを選びます。
劇場版ポケットモンスター 結晶塔の帝王 ENTEI、好きでした。
■注意
回答は大文字で!
Unknown.zip
私は裂空の訪問者のあの街に憧れを抱いているタイプの人間です。
圧縮ファイルが添えられたこの問題。ZIPの中にはPNGファイルが一つだけ。こちらも名前は「Unknown.png」。
そして、その内容は以下。

Unknownってそういうことか。
全28種の形態があることで有名なあのポケモン。
私がこの解読をしたのは、どの作品の思い出だったか。
なるほど、確かにこれは「暗号」ですね。久しぶりに全種類一覧と見比べながら解読していきました。楽しかったです。
そういえば、確かポケモンで、点字を解読させる作品があった覚えが。
これについては恐らく、ポケモンマスターの方々はご自身で解きたいと思うので、答えは割愛します。
ポケモンに詳しくないけど解きたい方は「ポケモン アンノーン」などで検索。ポケモンを知らない回答者には、問題とファイル名がヒントになっていた、ということでしょうか。ちなみに、回答は本ブログの本文内で使用されているアルファベット5文字です。
問:Excelでパスワード管理Ver.2(25点)(正答者:64人)
以前の管理方法ではExcel内部にシートの保護パスワードを入れてしまっていたが、今回は担当者内で口頭での共有に留めたためどこにも記録はされていない。これで万が一リストが流失してもパスワードは守られるはずだ
account_list2.xlsx
[1]
ジャンルは「その他」。これについては自分の備忘の為にもここに残しておきます。
Excelのエクセルシートにパスワードで保護が掛かっている場合に強制的に解除する方法です。
Excelを開くと、「pass」の表示が全て「*」埋めになっています。

セルをユーザー定義で「*」埋めにした上で、保護を掛けた模様。この保護を突破しないと、このユーザー定義を解除できません。保護を解除して、セルの設定をユーザー定義から文字列などに変更していきます。

今回は以下のサイトの方法を参照しました。
https://ascii.jp/elem/000/004/097/4097209/
まずは、Excelのコピーを取った上で、拡張子をファイル名変更で「.zip」に変更。

作成されたZIPファイルを展開して、内部へ。
「\xl\worksheets\sheet1.xml」をエディタで開きます。

エディタで開いたら、その中から「sheetProtection」を検索し、「sheetProtection」の直前の「<」から、「sheetProtection」の後に来る「/>」を探してその部分を削除します。

修正した後は戻しの作業。展開したファイル群を圧縮します。

圧縮して「.zip」のファイルにしたら、今度はその「.zip」を「.xlsx」に変更。作成したファイルを開くと、編集可能になりました。

セルの定義がユーザー定義になっているので、passの列全体を文字列表示にします。


ほとんどが数字のpassですが、その中で二つだけ、不審な記載が。

どうやら、下の文字列は「Base64」形式で加工(エンコード)されている状態のようです。なので、加工前に戻してあげます。今回は以下のサイトを使用。

このサイトで、先の文字列を入力し、デコード(加工されたものを元に戻す)をすると、「FLAG{……」形式の回答が出力されました。

問:HTTPでログインしてみた件(30点) (正答者:65人)
完全初対面の相手を攻略しました。その記念に記載。
HTTPのサイトはよく危険だと言われているけれど、ユーザIDとパスワードがないとアクセスできない会員制のWebサイトなら安全ではないのか。真相を確かめるべくHTTPのサイトでログインを試してみた。その時のログを添付する。
http_access_pcaplog.zip
ジャンルは「WEB」。圧縮されたファイルを展開すると「http_access_pcaplog.pcap」というファイルが。
……pcap。初めましてのファイル種別。何者。困った時のわわわ。
https://wa3.i-3-i.info/word11178.html
……内容は分かりました。分かりましたが、これを一体どうすれば。そもそもこれはエディタで開くのですか、何で開くのですか?
とりあえず問題に出てくる「http」とファイル種別の「pcap」を並べてGoogle検索してみます。すると、やたら出てくる文言「Wireshark」。あなたも何者? どうやらツールのようで、これを用いて解析をするらしい。
早速、インストール。インストール後、そのツールで例のpcapファイルを開いてみます。

……ええと。何が何やら。
まあ、ファイルは開けたのでいいでしょう。「Protocol」の列に「HTTP」とあるので、問いからしてこの「Protocol」の列に「HTTP」とあるものが答えに近いのかなと当たりをつけてみます。
Excelのようにフィルタを掛けられないかなと思い、「Protocol」をクリックしてみると、フィルタは掛けられませんでしたが、並び替えが出来ました。目的の「HTTP」がまとまったところに表示されます。

Infoの欄を見てみると、GET……から始まるものがたくさん、HTTP……から始まるものがたくさん。そして一つだけ、POST……から始まるものが。へえ。
恐らくこのPOSTが何か握ってそうな感じがしますが、後学の為に「post get 違い」でGoogle検索。以下のページがヒット。
GET/POSTはどのように使い分ける?
GETとPOSTのどちらの方式を使うか迷ってしまうかもしれませんが、基本的にはこのように覚えておけばOKです。
画面表示のために必要なパラメーターは「GET」
例)表示したい商品や動画のID、ページ番号など
ユーザーが画面に入力して送信するパラメーターは「POST」
例)ログインIDや個人情報など
その名の通り、
GETは、ページを「取得」するためのリクエスト
POSTは、情報を「送信」するためのリクエスト
ということですね。
本当はもっと複雑怪奇なワードのようですが、今回はとりあえず、上記の「ユーザーが画面に入力して送信するパラメーターは「POST」」さえ知ることが出来ればOK。
やはり当たりを付けたPOSTの行に、答えが含まれているようです。
しかし、それはそれとして、これはどう見るのでしょうか。Wiresharkで対象の行をクリック。特に変化無し。続いて、ダブルクリック。

新しい画面が表示されました。
画面の上半分を見ると色々折りたたまれているようなので、全て開いてみます。

クドウシンイチさんのパスワードが明かされました。 もろたで工藤。
問いの「HTTPのサイトはよく危険だと言われているけれど、ユーザIDとパスワードがないとアクセスできない会員制のWebサイトなら安全ではないのか」については「安全ではない」ということになります。会員制のWebサイトは確かに特定の情報を入れないと中には入れないですが、その情報は通信内容を通じて拾えてしまいます。外部からの傍受が有り得る為、パスワードなどを取り扱う場合には「HTTPのサイト」は「危険」であるという「真相」でした。(こういった場合はリクエストやレスポンスが暗号化されるHTTPS通信を使用する形になります)
問:波よ聞いてくれ(最終配点50点)(正答者:30人)
白状しますが、私、この問題については回答まで辿り着けませんでした。
ですが、非常に印象的だったので記しておきます。回答が分からない問題の話をされても困る……という方は、次の見出しまでスキップしてください。
ジャンルは「OSINT[2]」、問題の内容としては、以下。
CTF運営チームが2022/11/18の昼に放送されるとあるネットラジオ番組に出演するらしい。噂によるとそこでフラッグに関する重要な情報が告知されるとのことだ。しかもスコアは最大1000ポイントのダイナミックスコアリング形式となる。このチャンスを逃すな!
※ダイナミックスコアリング形式とは回答者の数によってスコアが変動する方式です。回答者が増えるほど獲得できるスコアが減少します。
なんと、毎週金曜日にオンライン配信されている社内ラジオとの連動問題。しかも、最大1000ポイントの大盤振る舞いです。
残念ながらリアルタイムの配信は視聴出来なかったので、アーカイブにて視聴。その時点で既に点数は700台とかだった記憶です。皆様、回答が早い……!
ラジオで示されたファイルを確認すると、中身はmp3。音声ファイルのようです。
そのmp3と同じ階層のreadmeテキストファイルには以下のような記述がありました。
この問題はFLAG{XXX}埋め込み形式ではありません。
■解答フォーマットについて
※半角英数小文字、スペースはハイフンに変換、日本語の場合は英語に変換
……なるほど。
この問題を解く頃にはもう気付いていたのですが、私、『FLAG{XXX}埋め込み形式』ではない問題が少々苦手です。そのままフラグが書いてあるわけではない。何かしらの、捻りがありそう。しかも日本語の場合は英語に変換。英語。英語、駄目なんですよ、英語。
早速、mp3ファイルを開いて聞いてみると、軽快なオールナイトニッポンのテーマ曲が。とりあえず、そのまま聞いてみます。が、当然、聞くだけで分かるはずもなく。
そこで、ラジオのアーカイブを見返したところ、以下のような文言が。
特別ヒント 音は普通聞くものだが、それ以外の方法で解析することができないだろうか
……ああ。
なるほど。
だから、問題タイトル……。
波よ聞いてくれ
音の波!
「音声 波形」「音声 波形 ツール」「音声 波形 オンライン」などでGoogle検索。以下のサイトがヒット。
https://audiomass.co/
早速mp3を読み込ませてみたところ、左右の波形が全く異なりました。

なるほど、これは。
左右で音が異なるようです。なので、L:左の音声をOFFに切り替え、再度、再生。
……ですが、私の力では、残念ながら、ここまで。
上記の方法で、R:右の音声は聞き取ることが出来ました。
私の耳に聞こえてきたのが、以下。
「flag is radio ヴヴェイヴ」
……? え、何て?
「flag is radio ヴヴェイヴ」
再度の申告になりますが。
英語、駄目なんですよ、英語。
恐らく、恐らく「wave」だと思うのです。問題のタイトルも波が云々と書いてありますし。でも、試しに『radiowave』をフラグとして入力しても開かない。
では、「name」? 『radioname』でも開かない。
それでは、「radio wave」という単語が示す何かなのでは? 検索を掛けます、この程度の英単語も分からないくらいには英語が駄目なので。ヒットしたのは「電波」。
ラジオで電波となると、周波数。これが某埼玉のFMラジオであれば「79.5」とかがフラグになるのでしょうが、このラジオは社内のオンライン配信。その電波となると。
……などと悩んだ辺りで、回答回数が14に上ってしまいました。この問題の回答制限は20回まで。追加のヒントもありません。
このままずっと挑戦しても回答回数を使い切ってしまうだけ、日を置いて閃いたら戻って来よう。そう思い、この問題から去って、結局イベント終了を迎えてしまいました。
ですが、各所との連動や、タイトル回収、そういったものが面白く、印象に残っています。音声ファイルはまだ手元にあるので、もう少しこねくり回して探ってみます。
結果発表
答えられない問題をいくつか抱えたまま、しかし思いのほか多くの問題のフラッグを手にして、CTFイベント期間終了を迎えました。
正直、回答数ゼロも覚悟していたので、手元に揃ったフラッグは素直に嬉しかったです。
そして、最終結果は……。
34位、430点!
最終参加者は133人だったので、なかなかの健闘だったのではないでしょうか。
ただ、1位の方の点数は785点なので、300点以上の点差が。これについては恐らく上に記載した「ダイナミックスコアリング形式」の問題を落としたことが大きいのかと思います。
それにしても、785点はすごい。上位の方のスコアを見たら、どうやらノーヒントで全問突破している様子。
実は本イベント、問いによってはヒントがついているのですが、ヒントを開けるにはスコアを5~10点ほど捧げなくてはなりません。
以下は私のスコアの途中経過ですが、ヒントを使うと線が一度下がるので、この遷移でヒントの使用有無が分かります。しかし、トップの方はこの「下がる」部分が無いか、極端に少ない。私も出来るだけヒントは開けないようにしていたのですが、それでも完全ノーヒントだと難しい問題もあり、しかも結局解けずにスコアを消費しただけで終わってしまう、などといったように、かなり苦戦しました。

イベント後、出題問題の問題別正答率が開示されました。以下がその様子です。

赤枠の箇所は、私が解けなかった問題です。Splunk関連は初級編②が突破できなかった為、中級編上級編は出題されず。その為、実際に着手の上で解けなかった問題は5問ということになります。この5問のうちの4問の配点が大きかったことと、ここを解くためにヒントを開けたことがなかなかの痛手でした。
ただ、全体の正答率が25%を切る問題以外は解けていたようです。これはなかなか喜ばしい結果。
冒頭で釣られた「賞金」からは遠い順位ではあったものの、頭を捻りながら謎を解いていくのは非常に楽しかったです。あの、フィクション作品越しにほんのり憧れていた姿に、少しは近づけたのではないでしょうか。
加えて、新しい出会いも色々ありました。普段の業務では触れることのないだろうツール、見ることのないファイル。今はお見掛けする機会はなくても、もしかすると今後、関わることがあるかもしれません。その際に、全くの初対面よりはスッと理解出来るのではないかと。
勉強としてもゲームとしても楽しめるCTF。次回の社内開催は、来年とのこと。今から非常に楽しみです。目指せ全問正解!
[1]
問の中の「以前の管理方法~」については、この問題の一つ前の問で出てきた内容。今回のブログでは割愛。
[2]
「OSINT」とは当イベントページの説明では以下のように記載されています。
『OSINT(オシント)とはOpen Source INTelligenceの略で、一般公開されている情報元からデータを収集したり、公開されているWebサービスを用いて情報分析する手法の一つ。ハッキングをするうえでOSINT力は非常に重要になってくる。』
執筆者:山中 千優
2022年8月にSHIFTに中途入社。
大学時代は文学部。システム関連未経験からシステム業界へダイブ。
前職ではソフトウェア開発を担当。SHIFT入社後は品質管理業務に奔走中。エンジニアを肩書きにしてはいるものの、正直コーディングは苦手。
冒頭の写真は、あしかがフラワーパークにて撮影。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/