Skip to content

Instantly share code, notes, and snippets.

@kurgm
Last active May 17, 2026 06:38
Show Gist options
  • Select an option

  • Save kurgm/f9fb8f04fb3b5ec6db878b0cb3124e3e to your computer and use it in GitHub Desktop.

Select an option

Save kurgm/f9fb8f04fb3b5ec6db878b0cb3124e3e to your computer and use it in GitHub Desktop.

Writeup for The Sandbox

これは Daily AlpacaHack B-SIDE の 2026-05-04/07 の 問題 The Sandbox の writeup です。

問題設定

  • /flag-(md5 hash of the flag).txt にフラグがあり,root が所有しパーミッションは 400 である
  • /app/app.py の Flask アプリケーションが root ユーザーで動いている
  • /app ディレクトリ自体は root ユーザーが所有し,パーミッションは 1777 である
  • Flask アプリケーションのエンドポイント:
    • GET /
      • クエリパラメータ id を受け取る
      • runs/{id}/main.pyruns/{id}/result.txt の内容を読んでテンプレートに埋め込んで返す
        • この際 O_NOFOLLOW をつけて open するので,読み取り対象のファイルがシンボリックリンクであると失敗する
    • POST /
      • フォームから code を受け取る
      • UUIDv4 の id を生成し, runs/{id} ディレクトリを作成し runs/{id}/main.pycode を書き込む
      • nobody ユーザーとして python runs/{id}/main.py を実行する
      • 標準エラーか標準出力を runs/{id}/result.txt に書き込む(root ユーザーとして)
      • /?id={id} にリダイレクトする

解法

Step 1. フラグファイル名を特定する

/ は 755 であるから nobody ユーザーで実行していてもフラグのファイル名は特定できる。

以下を code として POST する:

import os
os.system("ls -l /flag-*.txt")
-r-------- 1 root root 17 May 17 05:52 /flag-3876917cbd1b3db12e39587c66ac2891.txt

しかしパーミッションが 400 であるため nobody ユーザーでフラグファイルの内容を読むことはできない。

Step 2. シンボリックリンクを作成する

/app は 1777 であるから nobody ユーザーで実行していても /app 直下にシンボリックリンクを作成できる。

ルートディレクトリ / を指すシンボリックリンクを /app/static に作成する。

以下を code として POST する:

import os
os.system("ln -s / static")

(カレントディレクトリは /app であるため, static/app/static に作成される)

Step 3. ファイルを読む

Flask ではモジュールの隣に static ディレクトリを作るとアプリケーションの /static で利用可能になる1

どうやら static がディレクトリへのシンボリックリンクでも機能するようで,今回 Step 2. で行った設定では GET /static/** でルートディレクトリ配下のファイルの内容を Flask 経由で root ユーザーの権限で読むことができる。

フラグファイル名は Step 1. で特定してあるので,ブラウザで /static/flag-3876917cbd1b3db12e39587c66ac2891.txt にアクセスするとフラグが表示される。

Alpaca{REDACTED}

Footnotes

  1. https://flask.palletsprojects.com/en/stable/quickstart/#static-files

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment