技術ネタを中心に、できるだけ自分から発信していくためのブログ。 いつか誰かの役に立ちますように。

防衛省サイバーコンテスト2023 (防衛省CTF) Writeup

先日 2023/8/6(日) に開催された、防衛省サイバーコンテスト2023に参加していた。 www.mod.go.jp

防衛省サイバーコンテスト2023ポスター

スコア

スコアグラフ

結果は260/560, 42位であった。あまり経験がないPWNとNWが、20点問題どころか10点問題も外しており、壊滅的であった。精進せねば…。

簡単なものしか解けていないが、どう考えたかを残しておく。

なお、謎のこだわりでヒントなしだったので、ちゃんとヒント見ておけばよかったと後悔している。

Welcome!

防衛省 サイバーコンテスト 2023 へようこそ!

この問題は、解答方法を確認するための問題です。 正解することで 10 ポイントが付与され、他の問題のヒントを取得できるようにもなります。

また添付ファイルは、問題用サーバーへの接続に必要な OpenVPN の設定ファイルとなります。 ダウンロード頂いた上、参加要領の手順に従って VPN 接続を行ってください。

ラグ:本コンテスト開催時の問い合わせ先メールアドレスは何でしょう?

  • 問い合わせ先のメールアドレスを指定形式で回答するだけ
  • flag{******@******}

CRYPT

Simple Substitution Cipher (10)

以下の暗号文を復号してください。

暗号文: synt{tA0iEFckNRiG}

  • シーザー暗号、13文字。

    • 13文字のものは、特にROT13と呼ばれるらしい。

シーザー暗号 - Wikipedia

解答: flag{gN0vRSpxAEvT}

Substitution Cipher (10)

暗号文は、以下の対応表(SubstitutionCipher.png)と鍵により暗号化されていますが、鍵の一部(1文字目、4文字目の?)が欠損しています。 暗号文から欠損している鍵を推測し、復号してください。

暗号文: Uckb uzzc jn gwdmayuzf fjoj ciz Xrhzpèaf xkyizt.ciz hubb kb ggcp{wIR2AuVebMyR}.

鍵: ?VC?

  • 添付されていた画像は、ヴィジュネル暗号の表であった。

ヴィジュネル暗号 - Wikipedia

  • 文の形態から、ggcp{...}がflag{...}であることは用意に推測できるため、ここを狙って、ggcpがflagになるような鍵を推測する。

    • 鍵はBVCJと推測。
  • しかしこれで復号化しても、Thit texu is eocryqted ... と、4文字目がズレている。

  • 理由不明ながら、èと記号を削除して、BVC Iを鍵として復号したところ、以下の文を得た。

    • This text is encrypted with the Vigenère cipher. the flag is flag{vNP2RtAcsLdP}.

解答: flag{vNP2RtAcsLdP}

Administrator Hash (NTLM hash) (20)

lsass.zip を展開(パスワード:P@ssw0rd123!)し、Administrator ユーザーの NTLM ハッシュ値を抽出してください。

  • LSASS.dbgを展開 (ESETのリアルタイムチェックに引っかかり、削除されたため、一時保護を切るハメに)

  • Windows SDKから、Debugging toolsをインストールし、WinDbgを使えるようにする

  • mimikatzを使ってクラッシュダンプファイルからパスワードを抜き取る

解答: flag{036dac4f519817e0f6ec28d80ab42205}

Administrator Password (20)

問題「Administrator Hash(NTLM hash)」で抽出したハッシュ値から、Administrator ユーザーのパスワードを推測してください。

  • hashcatでNTLM形式のパスワードクラックを行う。

hashcat - advanced password recovery

  • hashcat.exe -m 1000 NTLM_CTF.txt rockyou.txt

  • 036dac4f519817e0f6ec28d80ab42205: Ilovedoraemon39

解答: flag{Ilovedoraemon39}

Hash Extension Attack (30) 未回答

hash_extension.php 内で echo “same hash!!\n” を実行させるための、変数 hash, payload の値を求めて下さい。

  • hash('md5',$secret); #5ebe2294ecd0e0f08eab7690d2a6ee69, secret length 6.

    • これをhashcatで6文字探索すると、secret が該当する。

    • なので、secretadmin をハッシュ化した ea909ccfbf42c1d230f26167db4d4fdb と合わせて解答となるかと思ったが、NG。

  • ハッシュ伸長攻撃を行った場合の解答を求められていたとのこと。

ハッシュ関数の伸長攻撃 - BsBsこうしょう

FORENSICS

The Place of The First Secret Meeting (10)

会社 A が内部告発を受け、海外の競合会社 B へ機密情報の持ち出しが行われた可能性があると判明しました。 退職予定の従業員が、共有パソコンへの接続が禁止されている USB メモリを用いてデータを抜き出し、USB メモリを引き渡したという内容でした。 そこで従業員を問い詰め、小さな USB ストレージを回収し、そのイメージを保全しました。

USB メモリの中には画像ファイルが入っていました。この画像が取引場所の可能性があります。この画像について、城の名前ではなく大きく写っている建物の名前を特定してください。 建物の名前をヘボン式ローマ字表記したものがフラグです。

あなたはフォレンジックエンジニアとして各フラグを取得してください。添付の仮想ディスクイメージ(USB1.vhd)内にフラグがあります。※このイメージファイルは「The Deleted Confidential File」、「They Cannot Be Too Careful.」、「The Taken Out Secrets」の問題でも使用します。

解答形式:半角英小文字

  • VHDをマウントすると、中に1枚だけ画像が保存されている。その中に、ダイアパレス丸の内と書かれたビルが写っている。

    • ダイアパレス丸の内は、香川県高松市高松城すぐそばにあるビル。

    • 高松城の櫓のうち、この角度で写真が取れるのは艮櫓 (うしとらやぐら)。

艮櫓(太鼓櫓跡) | 高松城のガイド | 攻城団

解答: ushitorayagura

They Cannot Be Too Careful. (10)

USB メモリから復旧できた圧縮アーカイブファイルには、パスワード保護がかかっていました。このパスワードを特定してください。

  • EaseUsで削除ファイルを復旧。重要.zipが見つかった。

    • zipはパスワードがなくともファイル一覧が見れる。中に flag{Archive_file_was_deleted}.txt があるが、本問題の答えとしては不正解。
  • John the ripper (zip2john) にかけるも、そのままではだめ。ファイル名をtest.zipに変更すると、以下の通りハッシュが出た。

X:\John_The_Ripper\run>zip2john test.zip test.zip/□d□v/ is not encrypted! test.zip/□d□v/flag{Archive_file_was_deleted}.txt:$zip2$030d1fa896dd4317c87e1686d922ee2e96a884e0*9eb41e52f9450213e138$/zip2$:□d□v/flag{Archive_file_was_deleted}.txt:test.zip:test.zip ver 2.0 test.zip/□d□v/ is not encrypted, or stored with non-handled compression type ver 5.1 test.zip/□d□v/flag{Archive_file_was_deleted}.txt is not encrypted, or stored with non-handled compression type ver 5.1 test.zip/重要/要求提供的文件清单.pdf is not encrypted, or stored with non-handled compression type

  • $zip2$*0*3*0*d1fa896dd4317c87e1686d922ee2e96a*884e*0**9eb41e52f9450213e138*$/zip2$ をhashcatで復号したものが答え。

    • $zip2$*0*3*0*d1fa896dd4317c87e1686d922ee2e96a*884e*0**9eb41e52f9450213e138*$/zip2$: oshiro

解答: oshiro

The Deleted Confidential File (20)

圧縮アーカイブファイルとして持ち出されたデータは、USB メモリから削除されていた可能性があります。データの復旧を行い、その内容を調査してください。

  • 上記zip内にあるテキストファイル名が答え

解答: flag{Archive_file_was_deleted}

Their Perpetration (20)

直接データを取得したと考えられる端末の保全を行いました。調査対象のアーティファクトを解析し、持ち出しに使用された USB メモリのシリアルナンバーを特定してください。 なお、シリアルナンバー「04018636913bcb4e1152」のデバイスは保全の際に用いたものです。 シリアルナンバー「04018636913bcb4e1152」のデバイスは保全の際に用いたものです。

  • VHDをマウントすると、Windowsの一部ファイルが表示される。主にLogsが調査対象。

    • Logs\Microsoft-Windows-Kernel-PnP%4Configuration.evtx 内、6/9のログに、04018636913bcb4e1152が含まれるデバイスの接続履歴あり。

      • バイス USB\VID_0781&PID_5597\ 04018636913bcb4e1152 3c3619b97f7094101cc7c3cf1947c90945770597187c92c300000000000000000000a7dd3bb2ff836a18975581076b2a89a9 が構成されました。
    • 2日前の6/7に、同じログ形式で、別のUSBが接続された形跡が残っていた。

      • バイス USB\VID_0781&PID_5597\ 0401396c0881735a013c 2ebddb72f6dd948bcdd22763fdca255eb87ffa1db86fbe750000000000000000000098f9511800037a18975581076b2aa021 が構成されました。

解答: 0401396c0881735a013c

The Taken Out Secrets (30) 未回答

パスワードがかかっていた圧縮アーカイブファイルの中には、機密情報リストが書かれている PDF ファイルが入っていました。 この PDF ファイルを解析しフラグを取得してください。

  • pdf内のテキストから、 flag{pdf__is_ が見つかる。

  • pdfをpeepdfで分解すると、末尾にBase64形式のURLが存在。これをデコードして、 _payload__delivery_ が見つかる。

  • 最後の1個は、pdf内の画像にステガノグラフィーで埋め込まれていたとのこと。画像抽出までは行っていたので、残念。

peepdf を使って攻撃コードの入ったPDFを解析してみた|kawalog

NW

Transfer (10) 未回答

「10.10.10.21」のサーバーは「example.com」ドメインの権威 DNS サーバーです。 このサーバー上に機密情報(フラグ)が隠されていますので、特定して回答してください。

  • nslookupにこだわってしまったのが敗因。

    • nmapでポートスキャンすればよかったらしい。

Nmap リファレンスガイド (Man Page)

  • もしくは、digでBINDのバージョンを調べられるので、これを使えば良かったらしい。

奥が深いDNSサーバーとdigコマンド - Qiita

Analysis (20)

あなたは組織内で発生した情報セキュリティインシデントを調査しています。 社内で攻撃の踏み台とされた端末(10.200.200.15)から外部宛の通信を調査しています。 プロキシログ(proxylog.txt)から不審なサーバ(C&C サーバ)宛へのログを見つけて、接続先の IP アドレスを特定してください。

  • テキストをExcelに放り込んでオートフィルターをかけ、怪しい行をあぶり出した。

    • 2023/4/7 12:26 119970 10.200.200.15 TCP_TUNNEL/200 8099213 CONNECT amazon_co_jp.ipa-info.net:22 HIER_DIRECT/2.57.80.99

解答: flag{2.57.80.99}

Enumeration (20) 未回答

「10.10.10.22」のサーバーにインストールされているソフトウェア(Postfix)のバージョンを特定し、回答してください。

  • telnetで接続してもバージョンは出てこない。お手上げ。

    • nmapでTCPのポートスキャンしても出てこず、UDPでポートスキャンすると、161 (SNMP) が空いていたとのこと。

    • snmpwalkという、指定したOID以下の情報をすべて表示するコマンドがあるので、それを使って虱潰しすればよかった。

Ladder (30) 未回答

あなたはペネトレーションテストを行うホワイトハッカーです。ペネトレーションテスト対象組織の社内ネットワークに侵入できました。 引き続き、対象サーバー「10.10.10.23」を調査し、機密情報(フラグ)を見つけてください。

  • むり。お手上げ。

    • これも、Nmap UDPでポートスキャンをすると、161 (SNMP) が空いていたとのこと。

    • しかしSNMPのコミュニティという時点で、お手上げ。SNMPの用語自体は知ってても、アクセス方法がわからないんじゃだめですね。

SNMPコミュニティ名(SNMPコミュニティストリング)とは - 意味をわかりやすく - IT用語辞典 e-Words

Programming

Regex Exercise (10)

たくさんの偽のフラグに混ざった本物のフラグを見つけてください。本物のフラグは

  1. Regexp
  2. "!!" を含む3文字
  3. 数字2けた
  4. "S" で始まる5文字以上の英単語
  5. 一の位が "8" の数値

がこの順番で並んだものです。

  • RegExp.!![0-9][0-9]S の時点で4つに絞れたので、あとは面倒だったので全チェック。

解答: flag{Regexp:!!15Splendid159156098}

Mimic Unicode (20)

mimic.txt の文字列内に隠されているフラグを見つけてください。

  • UTF-8で、ゴゴゴゴゴゴゴゴゴゴ…とずっと並んでいるテキストファイル。

    • バイナリエディタで見ると、ゴ (E3 82 B4) と、 コ(E3 82 B3) + ゛ (E3 82 99) が混ざって並んでいる。

    • ゴを0, コ゛を1と置き換えて並べ、8個1組で区切ると、ピッタリ区切れる。

    • このオクテットをASCIIにデコードしたものが答え

解答: flag{Un1c0de_N0rma|1z@t10n}

LFSR Period (20) 未回答

次の多項式で表される長さ20ビットの線形帰還シフトレジスタ(LFSR)に、初期値 0x70109 を与えた場合の周期(もう一度 0x70109 が現れるまでのシフト回数)を10進整数で答えてください。

x20 + x15 + x11 + 1

  • LFSRをC++で書いてみるも、解答にたどり着けず。フィボナッチLFSRとガロアLFSRどちらかも不明であったこともあり、うまく行かず。単にプログラミングスキルが低い…

Grayscale Matrix (30) 未回答

3個のファイルに記された数値からなる行列からフラグを復元してください。

  • ピンとこず、パス。

    • LUP分解という行列演算を使えとのこと。今は理解する元気がない。

LU分解 - Wikipedia

PWN

この手の問題は、ghidraという逆コンパイラツールを使うべし。やる前に知りたかった…。

Ghidra - Wikipedia

Auth (10) 未回答

ログイン機能を作ってみました。By C 言語ルーキー

対象 IP アドレス:ポート:10.10.10.15:1001

  • 対象プログラム(ELF)はダウンロードできた。WSL2 Ubuntu上で、chmod +xして、適当な中身のflag.txtを同じフォルダに置いて実行すれば、ローカルで実験できた。

  • ELFファイルを見る限り、gets()のバッファオーバーフローであろうことは推測できた。User: admin, Password: (バッファオーバーフロー) とすればよいのはわかったが、はてどうしたものか…。

    • 推測通りオーバーフローさせればよかったが、いまいちバッファの並び順まで含めた推測が外れていた。

Festival (10)

祭りだ!祭りだ! flag を購入してね。

対象 IP アドレス:ポート:10.10.10.15:1002

  • そのままではflagは高くて買えない。intの桁あふれ(オーバーフロー)で、Balanceを巨額にしてやればよい。

    • 初期Balanceは1000

    • 4 (Yakisoba 500) を 9000000000 個買う、等。

flag{gwAZLDpEHAg6}

Parrot (20) 未回答

僕はオウム。なんでも繰り返し言うよ。

対象 IP アドレス:ポート:10.10.10.15:1003

  • バグらせる文字列を突っ込めばいいのは分かったが、はて?

    • 書式文字列攻撃でよかったとのこと。flag.txtから読んだテキストが buf 内に保存されており、そこを参照させる形 (今回なら %7$s ) にすればいい。

書式文字列攻撃 - Wikipedia

Shock (20) 未回答

ショッカーを倒せ!

  • Shockedされました。

    • かつてbashにあった問題、Shellshockを題材にした問題だった。恥ずかしながら当時そこまで気にしてませんでした…。

ShellShockの衝撃 -- バグの舞台裏

Noprotect (30) 未回答

flags 関数呼び出し忘れちゃった。

  • パス。

    • gets()関数のバッファオーバーフロー攻撃で、リターンアドレスをflags()関数のアドレスに書き換えれば良かったとのこと。

Trivia

ググればいい。サービス問題。

Threat (10)

コンピューターシステムを侵害し、身代金を目的としてデータを暗号化したり、アクセスをブロックしたりするマルウェアは何ですか。

解答: ランサムウェア

Behavior (10)

エージェントを使用してエンドポイント上のふるまいを検知し、異常な活動を検出し、攻撃に対する即座な応答を可能にするエンドポイントセキュリティ技術は何ですか。

解答: EDR (Endpoint Detection and Response)

Inventor (10)

RSA 暗号の R の由来になった人物は誰でしょうか?ラストネームをお答えください。

  • ロナルド・リベスト(R)、アディ・シャミア(S)、レオナルド・エーデルマン(A)

解答: リベスト

RSA暗号 - Wikipedia

WEB

Basic (10)

情報セキュリティ担当のジョナサンは、退職者が利用していたパソコンの通信ログを確認していたところ、Basic 認証でアクセス制限がかけられているhttp://10.10.10.6/Aw6dfLUM/ へアクセスしていることが判明しました。

提供したパソコンの通信ログ(Basic.pcapng)を確認して認証情報を探し出してください。 フラグはその Basic 認証でのログイン後のページにあります。

  • Wiresharkで読む。

    • 何回かUnauthorizedになって、最後にOKになったパケットのBasic認証をデコードすれば良い。

解答: flag{d0AqEPxpZpnf}

Discovery (10)

ゲーム会社に勤めているジョナサンが管理しているサイト( http://10.10.10.6/Wg6LQhmX/ ) 配下のディレクトリに、機密情報(flag)が記載されたテスト用の html ファイルが公開されていると連絡を受けました。 ジョナサンはサイトにあるリンクたどって該当ファイルを見つけ出そうとしましたが、うまくいきませんでした。 攻撃者はどのようにして機密情報(flag)を見つけだしたのでしょうか? あなたは機密情報(flag)を見つけ出し記載されたフラグを確認してください。

  • GoBusterで、URLのブルートフォース攻撃を行う。

    • kali linuxに標準で含まれている、dirb/common.txtを使用したところ、games/フォルダを発見。

    • さらに、dirb/vulns/cgis.txt を使用したところ、admin.htmlが存在し、そこに記載されていた。

解答: flag{L1h$ZL-!-,es}

Bypass (20)

上司のクリストファーはセキュリティ会社に脆弱性診断の依頼をした際、アンケートフォーム( http://10.10.10.7/46am9tjb/ ) に、クロスサイトスクリプティングの脆弱性が検出されたと報告を受けました。 このページでは JavaScript を実行されないように対策をとっているため、納得できてないようです。 上司はあなたに JavaScript を実行できるか確認するようにお願いしてきました。 以下のような alert 関数を実行できればフラグが表示されます。

<script>alert(1)</script>

  • javascriptで入力エラー検知しているため、javascriptを無効にしてしまえばいい。

  • Age欄だけ判定が甘い。"をquot;に変換しそこねている。

  • scriptという文字を削除する処理を行っているが、scrscriptiptと書けば、一度scriptを削除してもscriptが残って有効になってしまう。

  • javascript無効で、 >alert(1)</scrscriptipt> とAge欄に入力してフォーム送信する。

    • F12ツール内では、alert(1)が、alert("Congratulations!") に置き換わっていた。

解答: flag{dfvK#L-]BF?M}

Spray (20) 未回答

人事部のマネージャーをしているジェシカは、社内ポータルサイト http://10.10.10.7/mpk5tdbu で推測が容易なパスワード、 password か 123456789 のいずれかを利用している従業員がいると報告を受けた。どの従業員が推測可能なパスワードを利用しているか突き止めてください。フラグは、そのユーザーでログインしたページにあります。

以下のアカウントを利用して従業員のアカウント情報を確認してください。

ログイン画面:http://10.10.10.7/mpk5tdbu/

id:user1

PW:diejuthdkfi14

従業員は100名登録されており、従業員情報は上記のアカウント情報でログイン後、http://10.10.10.7/mpk5tdbu/prof/ で確認ができます。

  • ログインして100人全部見たが、怪しそうな人は見つからず。user1~user100なのかとおもうも、ハズレ。ギブアップ。

    • IDはuser2やuser3ではなく、メールアドレスの@の前だったらしい。それを100人分リストアップして、パスワードスプレー攻撃を実施すればよかったとのこと。

Location (30) 未回答

社内情報システム部でエンジニアをしているマイケルは、 Web サーバー http://10.10.10.8/ 内の機密情報(flag.txt)にアクセスされないようにセキュリティ対策を施して万全の体制をとっていましたが、ダークウェブに機密情報(flag.txt)が漏洩していると報告を受けました。

マイケルが実施したセキュリティ対策は以下の通りです。

  • ID とパスワードでの認証

  • 多要素認証

  • 一般ユーザーと管理者で表示できるページを分けている

  • 機密情報(flag.txt)にはアクセス制限をかけている

下記のフラグ確認用のアカウント(一般ユーザー)を利用して、 flag.txt を探し出してください。

ID: test

PW: password

  • とっかかり見つからず。パス。

    • ラジオボタンをどちらも未選択にしてログインするのが取っ掛かりだった。しかしその後の解法をちょっと読んでもよく分からない。後で読んでも理解できるだろうか。

終わりに

ある種の謎解きゲームとして、全体的に楽しめた。しかし、まだまだ知識不足は否めない。

現状のトレンドを考えると、オンラインの攻撃手法/防御手法については特によく学んでおかねばと、強く感じる1日だった。