チャレンジ一覧
Python自動化 - Base64の一括デコード
起動のたびに作られる data.txt(約150行)の各行は Base64 です。1行ずつデコードし、結果が "b64:" で始まるときは、残りをさらに Base64 デコードします(何段か続く行があります)。デコードできない行(壊れた Base64、文字として読めないバイト列)は飛ばしてください。最後に "frag[i/8]=xxxx" の形になった行が本物の断片で、"old-frag[...]" や "test-frag[...]" などはおとりです。本物の断片の xxxx(4文字)を i の昇順につないだ32文字が答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - CSV売上データの抽出
起動のたびに作られる data.txt は売上 CSV(transaction_id,date,product_id,amount,status,ref,notes)です。amount が 10000 以上、status が completed(大文字・小文字も含めて完全一致)、product_id が SEC- で始まる、の3条件をすべて満たす取引は複数あります(条件を1つだけ満たさない紛らわしい行がたくさん混ざっています)。それらの ref 列を transaction_id の昇順に並べて '-' でつないだものが答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - JSONユーザーデータの検索
起動のたびに作られる JSON の data.txt({"users": [...]})を調べます。各ユーザーは id, name, email, role, active, token を持ちます。role が "admin"(完全一致)、active が true、email に "@secret.com" を含む、の3条件をすべて満たすユーザーは複数います(条件を1つだけ満たさない紛らわしいユーザーがたくさん混ざっています)。それらの token を id の昇順に並べて '-' でつないだものが答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - アクセスログの解析
起動のたびに作られる data.txt(約1300行)は Web サーバーのアクセスログです。192.168.1.100 のアクセスだけを取り出してください(192.168.1.10 や 192.168.1.101 など、似た IP のおとりが混ざっています)。この IP は "GET /notes?part=N&data=XXXX" で12個の断片を送っていますが、ステータスが 200 の行だけが有効で、404 や 500 は失敗した送信なので数えません。有効な data(4桁の16進)を part の昇順(時刻順ではありません)につないだ48文字が答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - パスワードハッシュのクラック
起動のたびに乱数で作られる data.txt(SHA-256 ハッシュ値の一覧)と wordlist.txt(小文字英数字4文字のトークン800語)を調べます。data.txt の各行は、おとり sha256(word)(word は wordlist.txt の1語)か、本物の断片 sha256("{i}:{chunk}")(i は 0 始まりの断片番号、chunk は wordlist.txt の1語)です。本物の行だけを見つけて i の昇順に chunk をつなぐと、24文字の答えになります。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Web-11. 社員ポータルへのSQLインジェクション侵入
KinoGadget社の社内向け「社員アクセスポータル」は、レガシーな認証システムで動いています。開発者が動的SQLクエリを直接組み立てていると噂されており、管理者アカウントとして侵入できるか試すことになりました。
Web-12. BlogSearchの反射型XSS
BlogSearchはブログ記事を検索できる簡単な検索エンジンです。検索クエリが結果ページにそのまま(エスケープされずに)埋め込まれます。フラグは、サイト管理者のブラウザだけが持つセッションCookie(session_flag)に入っています。反射型XSSのURLを作り、ページ下の「管理者に報告」から管理者に開かせて、管理者のCookieを /report?c=... に送らせてください。送られた値は /loot で読めます。
Web-13. ImageVaultのファイルアップロード回避
ImageVaultはJPG・PNG・GIF画像をアップロードできる画像ホスティングサービスです。ファイルの検証がファイル名の末尾だけを見ているとしたら、どんな不正なファイルが通ってしまうでしょうか。
Web-14. ネットワーク診断ツールのコマンドインジェクション
このアプリはホスト名を入力するとpingを実行してくれる診断ツールです。入力したホスト名がそのままシェルコマンドに渡されているとしたら、何が起きるでしょうか。
Web-15. UserProfile ServiceのIDOR
UserProfile ServiceはユーザーIDを指定してプロフィール情報を取得できるAPIを提供しています。自分のID以外を指定した場合にアクセス権のチェックが行われているか確認してみましょう。
Web-16. CHIMERA研究ラボの弱いJWT秘密鍵
社員ポータルへの侵入で見つけた手がかりから、隔離された研究ラボシステム「CHIMERA」の存在が判明しました。このシステムはJWTで認証しており、開発者が推測しやすい秘密鍵で署名している疑いがあります。
Web-17. FileShareのパストラバーサル
FileShareは共有フォルダ内のファイルを一覧・ダウンロードできるアプリです。ダウンロードエンドポイントに渡すファイル名パラメータが検証されているか確認してみましょう。
Web-18. コンタクトフォームのXXE攻撃
このコンタクトフォームは入力内容をXMLに変換してサーバーへ送信し、サーバー側でパースした結果を表示します。XMLパーサーの設定次第では思わぬファイルが読めてしまうかもしれません。
Web-19. 銀行アプリのCSRF送金
このバンキングアプリではログイン中のユーザーが送金操作を行えます。別サイトから送金リクエストを送らせることができないか、CSRF対策の有無を確認してみましょう。
Web-20. URL FetcherからのSSRF
このURL Fetcherサービスはユーザーが指定したURLの内容を取得して表示します。サーバーが到達できる内部専用サービスにまでリクエストを送らせることができないか確認しましょう。
テキスト処理の達人 - sed & awk
/app/data.csv にはCSVデータが保存されています。 以下の処理を行ってください: 1. 2列目(価格)が1000以上の行のみを抽出 2. 3列目(商品名)に含まれる "_" をスペースに置換 3. 1列目(ID)の先頭に "PROD-" を追加 処理後のデータの最初の行に含まれる商品名がフラグです。 フォーマット: ID,価格,商品名
プログラミング - Bashジョブログの解析
/challenge/jobs.log は、コンテナの起動のたびに乱数で作り直される夜間バッチの実行ログです。1行が1回のジョブ実行で、key=value の欄が空白で区切られています。job が archive で status が ok の行だけを選び、part の番号順に value(16進文字列を逆順にしたもの)を元に戻してつなぎ、16進デコードしてアーカイブトークン(英小文字と数字)を求めてください。そのトークンを python3 challenge.py '<トークン>' に渡すと、正しいときだけフラグが表示されます。
プログラミング - PINの総当たり
/challenge/vault.json は、コンテナの起動のたびに乱数で作り直される金庫の記録です。salt(16進文字列)と、pin_hash = sha256(salt + pin)(salt と6桁の pin を文字列のまま連結して UTF-8 にしたもののハッシュ)が入っています。000000 から 999999 までを総当たりして pin_hash に一致する6桁の PIN(先頭の 0 も含む)を見つけ、python3 challenge.py '<PIN>' に渡してください。正しいときだけフラグが表示されます。
プログラミング - ハッシュ検証と復号
起動のたびに乱数で作られた証拠ファイル artifact-manifest.json を解析します。artifact(artifact_00 から artifact_09)ごとに複数のレコード(name・sha256・data)があり、正しいのは data を Base64 デコードした SHA-256 が sha256 欄と一致する1件だけです。正しいレコードの中身を SHA-256(name) のダイジェストで XOR 復号し、artifact 番号の順につないだ40文字(小文字英数字)が答えです。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。
プログラミング - バイナリTLVの解析
/challenge/capture.bin は、コンテナの起動のたびに乱数で作り直される独自形式のバイナリです。先頭4バイトは KBIN、続いて TLV レコード(type 1バイト、length 2バイト(ビッグエンディアン)、value)が並び、type 0x7F(長さ 0)が終端です。type 0x10 と 0x20 の value はそのまま、それ以外の value は各バイトを 0x5A で XOR して格納されています。type が 0x42 のレコードの value を、ファイルの中の順番どおりに取り出して 0x5A で XOR し、つないだトークン(英小文字と数字)を python3 challenge.py '<トークン>' に渡してください。正しいときだけフラグが表示されます。
プロセスハンター - 隠されたプロセス
バックグラウンドで "secret_service" という名前のプロセスが動作しています。 このプロセスを見つけて以下の情報を取得してください: 1. プロセスID (PID) 2. 実行ユーザー 3. コマンドライン引数 コマンドライン引数にフラグが含まれています。 ヒント: ps, pgrep, top などのコマンドを使用
ログ解析 - 侵入者を見つけろ
/app/auth.log には認証ログが記録されています。 不審なアクティビティを検出してください: - 1時間以内に10回以上ログイン失敗しているIPアドレスを特定 - そのIPアドレスからの最初の失敗ログインのタイムスタンプを取得 ログフォーマット: [YYYY-MM-DD HH:MM:SS] Failed login from IP_ADDRESS フラグの形式: そのタイムスタンプの日付と時刻を _ でつなぎ、KINOCO{} で囲みます(例: [2025-01-02 03:04:05] → KINOCO{2025-01-02_03:04:05})。
圧縮の迷宮 - 多重圧縮ファイル
/app/flag.tar.gz は多重に圧縮されたファイルです。 解凍していくと、次の圧縮ファイルが出てきます: flag.tar.gz → flag.tar → flag.zip.bz2.gz → flag.zip.bz2 → flag.zip → flag.txt すべて解凍してflag.txtの内容を取得してください。 ヒント: file コマンドで圧縮形式を確認できます
正規表現 - 一度だけ出現する黄金の記号
data.txt から KINO-数字4桁-英大文字4文字の記号をすべて抽出し、一度だけ出現する値を challenge.py に入力してください。正解時に起動時注入 FLAG が表示されます。