Skip to content
Go back

防衛省サイバーセキュリティコンテスト2023に参加しました

2023年8月6日に開催された防衛省サイバーセキュリティコンテスト(通称防衛省CTF)に参加しました。

防衛省CTFは一般的なCTFとは少し異なり、以下のような特徴があります。

また、今まで一切のwriteupが禁止されていて謎に満ちていた防衛省CTFですが、今回初めてwriteupが許可されるようになりました。ここにwriteupを書き残したいと思います。

結果は、1問を解き切ることができず、またptを消費するヒント機能を積極的に使用し、498ptを獲得し5位でした。5位までは防衛省のウェブサイトに掲載されるそうなので、少し楽しみにしています。一方で、例年防衛省CTF関連のウェブサイトは消えてしまう(次年度ので上書きされてしまう?)そうなので、少し寂しいです。

成績優秀者につきましては、上位5名のハンドルネーム又はお名前を防衛省ウェブサイトに掲示することを予定しています。

以下は出題された問題と、簡潔なwriteupです。

Table of Content

Writeup

Welcome

Welcome! openvpnのconfig fileを配布するための問題でした。

CRYPT: Simple Substitusion Cipher

ROT13でした。

CRYPT: Substitusion Cipher

ヴィジュネル暗号でした。

CRYPT: Administrator Hash(NTLM hash)

Windows Defenderに消されるmimikatzを何とかインストールして、提供されたファイルからNTLMハッシュを抽出しました。

CRYPT: Administrator Password

上で抽出したNTLMハッシュをhashcatで復元しました。パスワードリストとしてrockyou.txtを使用しました。

CRYPT: Hash Extension Attack

https://github.com/iagox86/hash_extender を使ってhash extensionしました。

FORENSICS: The Place of The First Secret Meeting

渡された画像の建物の名前を答えろという問題でした。Google Lenseで撮ったら ushitorayagura だということがわかりました。(何度か flag{ushitorayagura}で通らなくて苦戦していました。)

FORENSICS: They Cannot Be Too Careful

ゴミ箱の中に、暗号化されたzipファイルがありました。zipファイルに含まれているファイル名は暗号化されておらず、ファイル名がフラグでした。

FORENSICS: The Deleted Confidential File

暗号化されたzipファイルを、rockyou.txtを使用してパスワードのブルートフォースして復号しました。ツールはzip2johnとhashcatを使用しました。

FORENSICS: Their Perpetration

Windowsのイベントログみたいなファイルがたくさん提供され、その中から接続したUSBメモリのシリアルナンバーを特定するという問題でした。問題文中に、04018636913bcb4e1152は別のUSBだという注意書きがあったので、その文字列でgrepして近くにあった別のシリアルナンバーを入力したら正解でした。

FORENSICS: The Taken Out Secrets

復号したzipファイルに含まれているpdfを解析してフラグを探すという問題でした。フラグは3つのパートに分かれていて、1. pdfのテキストとして載ってました 2. pdf内の画像からstegsolveで抽出しました 3. pdfのURL objectをbase64 decodeしました。

NW: Transfer

dig version.bind CHAOS TXT @DNS をしたらなぜかフラグを得ることができました。問題タイトルからしてZone Transferっぽかったので dig axfr example.com @10.10.10.21 をしたらそれっぽいzoneが返ってきたので、この辺りにあるだろうと悩んで一時間以上費やしました。ミスリーディングでした。

NW: Analysis

与えられたログファイルから不審なログの接続先IPアドレスを答えろという問題でした。目grepで怪しいのがあったのでそのIPを答えたら正解でした。

NW: Enumeration

サーバーで動作しているpostfixのバージョンを答えろという問題でした。ヒントを開けたらSMTPプロトコルを使って解けませんとのことだったので、snmpを使ったらpostfixのバージョンが返ってきました。一番ヒントが有意義な問題だったかもしれません。

NW: Ladder

解けませんでした。。。NWというよりかは、ペネトレっぽかったです。

PROGRAMMING: Regex Exercise

!!を含む3文字,数字2けた,Sで始まる5文字以上の英単語, 一の位が “8” の数値のものを抽出できる正規表現をchatgptに依頼し、grepしました。

PROGRAMMING: Mimic Unicode

ゴゴゴゴゴ…と書かれたファイルが提供された。コ+゛の2種類が混在しているので、それぞれ0と1に符号化してASCIIとしてデコードしてフラグを得ました。ASCIIでprintableな文字なら1で始まるはずがないという推測をすると、どちらを0に割り当てるかの選択を高い確率で当てることができます。

PROGRAMMING: LFSR Period

x^20 + x^15 + x^11 + 1 という多項式で表される20bitの線形帰還シフトレジスタ(LFSR)に、初期値 0x70109 を与えた場合の周期を答えるという問題でした。pythonで泥臭く実装し、ループを回して初期状態に戻ってくるまでの周期を解答しました。

PROGRAMMING: Grayscale Matrix

L.txt, U.txt, P.txtという3つのファイルが提供されて、それぞれは256256の小数が載っています。numpyで読み込める見た目をしていたので、PL*Uという行列積を計算して画像表示をしたところフラグを得られました。

PWN: Auth

userとpasswordを入力して、一致していたらflagを出力するというもの。gets関数で入力を受け付けているため、password入力のバッファオーバーフローでログイン状態をtrueに書き換えてフラグ。

PWN: Festival

手持ち1000円で、1000000000円のFlagを買うという問題。残額が32bit uintで管理されているので、2147483648(=2**32/2)をちょっと超えるくらいの買い物をすると整数値オーバーフローで手持ちが増えるので、それでFlagを買えました。

PWN: Parrot

入力した内容をそのまま出力してくれるというもの。printfのFSBっぽいと思って%pを入力したらアドレスが返ってきたので、文字列が入っていそうなアドレスを探し、%sで表示したらフラグが入っていました。

PWN: Shock

入力した内容を環境変数にセットしてv.4.3.0のbashをsystem関数で起動するプログラムが動いていました。shellshockを利用してshellを実行して、flag.txtを出力しました。唯一shellが取れる問題でした。

PWN: Noprotect

flags関数呼び出し忘れちゃった。という問題文。BOFでリターンアドレスをflags関数にしました。

TRIVIA: Threat

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

TRIVIA: Behavior

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

TRIVIA: Inventor

RSA 暗号の R の由来になった人物は誰でしょうか?ラストネームをお答えください。
> リベスト
カタカナで答えさえるのがしっくりきませんでした。

WEB: Basic

pcapファイルが渡され、Basic認証のあるページへアクセスしてくださいという問題でした。pcapをwiresharkで開き、display filterに httpを入力し、200を返しているリクエストを探しました。

WEB: Discovery

URLが与えられ、どこかのディレクトリにflagがあるという問題でした。dirsearchを使ってgameというディレクトリがあることがわかり、そこから更にdirsearchをするとadmin.htmlというファイルがあることがわかりました。

WEB: Bypass

アンケートフォームが実装されたweb appでXSSできますか?という問題でした。テキスト入力欄が複数ありましたが、それらはちゃんとエスケープされていてXSSできないようになっていました。しかしブラウザ上では数値しか入力できない入力欄がサーバー側でエスケープされないので、そこに <script>alert()</script>を入力すると <>alert()</> という出力されました。script という文字が消えているので、ただの文字列置換だと推測し、<scrscriptipt>alert()</scrscriptipt> を入力したところフラグが表示されました。

WEB: Spray

社内のポータルにログインし、脆弱なパスワードを使用している社員を特定してくださいという問題でした。ID: user1の認証情報を渡されており、それでログインすると100人の全従業員情報が見えるようになります。そこからemailを抽出し、@以前がIDだろうと推測し、それぞれに対してpassword or 123456789でログインを試行することで脆弱なパスワードを使用している従業員が特定できました。そのid, passwordでログインすることでフラグを得られました。

WEB: Location

web appに2段階認証を実装したという問題でした。提供された一般ユーザーのID/PWでログインし、2段階認証の選択肢を指定するparameterを削除するとそれをスキップしてログインができます。ログイン成功時のレスポンスでJWTがcookieにセットされるが、JWTの署名アルゴリズムとしてなぜかNoneがサポートされていました。JWTの中身を{uesr: admin, ip: 127.0.0.1}に書き換え、flag.txtが取得できました。

感想

昨年は参加していないのですが、昨年より問題が良くなったという意見をSNSで見かけました。世界的なCTFと比較すると難易度はかなり易しく、Guessが必要な問題も多いため、CTF上級者には物足りない内容なのではないかと感じました。

広く浅く知っていてある程度の経験に基づく推測ができるような私にとっては、問題が解ける実感をたくさん得られて楽しいCTFでした。


Share this post on:

Previous Post
LINE CTF 2021 [Web] doublecheck
Next Post
LINE CTF 2023 [Web] Memento - Author’s writeup