チャレンジ一覧
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,価格,商品名
プロセスハンター - 隠されたプロセス
バックグラウンドで "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 コマンドで圧縮形式を確認できます
正規表現マスター - ログファイル解析
/app/access.log には数千件のアクセスログが記録されています。 この中から、IPアドレスが「192.168.1.」で始まり、かつステータスコードが404のエントリをすべて抽出してください。 条件: - IPアドレス: 192.168.1.xxx - ステータスコード: 404 - 該当する行数がフラグになります ヒント: grep と正規表現を使用してください
環境変数マスター - PATH Hijacking
/app/secret_bin ディレクトリに隠されたコマンド "getflag" があります。 しかし、このディレクトリはPATHに含まれていないため、直接実行できません。 2つの方法でこのコマンドを実行してください: 1. 絶対パスで実行 2. PATHに追加して実行 コマンドを実行するとフラグが表示されます。
Docker フォレンジック - コンテナ調査
Docker デーモンの無い環境で、イメージ `registry.internal/kinoco-billing-api:2.4.1` のメタデータを調べます。`/challenge/image_history.txt`(`docker history --no-trunc` 相当、新しいレイヤーが上)と `/challenge/image_config.json`(最終的な `Config.Env` と、古い順の `History[].created_by`)があります。この Dockerfile は `DB_ADMIN_PASSWORD` を `ENV` で何度も設定し直し、途中で一度だけ `python3 scripts/bootstrap_admin.py`(環境変数 `DB_ADMIN_PASSWORD` を読む)を実行し、最後に空で上書きしました。履歴にはフラグの形をした値がいくつもあります。フラグは、bootstrap_admin.py を実行した時点で有効だった `DB_ADMIN_PASSWORD` の値、つまりビルド順でそのRUNより前にある最後の `ENV DB_ADMIN_PASSWORD=...` の値です。それより前に上書きされた値、後に設定された値、別の変数の値、別のスクリプトにだけインラインで渡した値はおとりです。
Git履歴から削除されたAPIキーを探せ
/app/repo はGitリポジトリです。開発者がAPI_KEYを誤ってコミットし、後続コミットで削除しました。 通常のGit履歴から削除前の config.py を確認し、APIキーに含まれるフラグを見つけてください。
Linux-Capabilities. SUIDに頼らない権限昇格
このシステムでは特定のバイナリにLinux capabilitiesが付与されています。SUIDビットではなくcapabilitiesを使った権限昇格の手法を探してみましょう。
Linux-SUID悪用. findバイナリで権限昇格せよ
このシステムにはSUIDビットが付与された find コマンドのコピーがあります。GTFOBinsで知られる手法を使い、root権限のシェルを取得してください。
Linux-procメモリ. プロセスの環境変数を覗き見よ
バックグラウンドで動き続けるデーモンプロセスがあり、その環境変数の1つにフラグが設定されています。/procファイルシステムを使ってプロセスの情報を調べてください。
Linux-strace. システムコールを追ってファイルを暴け
標準出力にもファイルにも何も残さないバイナリが用意されています。このプログラムは隠しファイルから鍵を読み、メモリ上でフラグを復元して /dev/null へ書き込みます。straceでシステムコールを追跡し、どの引数にフラグが現れるかを突き止めてください。
Linux-競合状態. TOCTOUの隙を突いてroot権限のファイルを奪え
rootが定期的に実行するクリーンアップスクリプトには、チェックと処理の間に隙(TOCTOU)があります。シンボリックリンクをうまく使ってこの隙を悪用してみてください。
Python自動化 - REST API データ収集
コンテナ内で `http://127.0.0.1:8000/api/records?page=N` というページ送りのローカルAPIが動いています。`next` が `null` になるまで全ページを巡回し、`tag == "flag"` のレコードだけを集めてください。各レコードは `{"seq": <int>, "part": "<断片>"}` の形式で、`seq` の昇順に `part` を連結するとフラグになります。1ページ目だけではフラグは揃わず、`login`/`metric`/`order` などのレコードはおとりです。