
Python 3で書かれたCVE-2019-9053向けの教育用PoCです。CMS Made Simple <= 2.2.9における時間ベースのブラインドSQLインジェクションです。このバージョンはCTF/ラボでの使用に合わせて調整されており、抽出時間を短縮するためのプリ設定済みプレフィックスとポルトガル語の説明メッセージが含まれています。
CVE-2019-9053 の教育的な Python 3 PoC です。CMS Made Simple <= 2.2.9 の time-based blind SQL Injection の脆弱性を利用します。
このバージョンは CTF/ラボでの使用向けに変更されています。抽出時間を短縮するための事前設定されたプレフィックスと、学生がエクスプロイトの仕組みを理解できるようにするポルトガル語での説明メッセージが含まれています。
このプロジェクトは、教育目的、管理されたラボ、CTF 環境のみを対象としています。
明示的な許可なく、第三者システムに対してこのコードを使用しないでください。
このリポジトリの作者は、この資料の不正使用について一切責任を負いません。
CVE-2019-9053 は、古いバージョンの CMS Made Simple に影響し、エンドポイントの m1_idlist パラメータを介して認証なしの SQL Injection を許可します。
/moduleinterface.php?mact=News,m1_,default,0
SQL クエリの応答はページに直接表示されないため、このエクスプロイトは time-based blind SQL Injection と呼ばれる技術を使用します。
このエクスプロイトは、条件が真の場合にデータベースが sleep(1) を実行するようなペイロードを送信します。
概念例:
AND (
SELECT sleep(1)
FROM cms_users
WHERE password LIKE '0c01%'
)
サーバーの応答が遅い場合、スクリプトはテストしたプレフィックスが正しいと判断します。
このようにして、以下のような機密情報を1文字ずつ再構築します:
この CTF バージョンでは、アクティビティ中に必要な時間を短縮するために、いくつかのプレフィックスがコード内に含まれています。
SQL Injection は、アプリケーションがユーザー制御のデータを適切な処理なしに SQL クエリ内に挿入するときに発生します。
この場合、クエリの結果が HTTP レスポンスに直接表示されないため、注入は blind です。
また、攻撃者がサーバーの応答時間を応答チャネルとして使用するため、time-based です。テストした条件が真の場合、データベースは sleep() で遅延を実行します。偽の場合、応答は通常どおり返ります。
簡略化した例:
Pergunta feita pelo exploit:
"O hash da senha começa com 0c01?"
Se sim:
O banco executa sleep(1), e a resposta demora.
Se não:
A resposta vem sem atraso perceptível.
このプロセスを1文字ずつ繰り返すことで、エクスプロイトはページ上に直接表示されなくてもデータベースの値を再構築できます。
salt は、ハッシュを生成する前にパスワードと一緒に使用される追加の値です。
このチャレンジでは、CMS Made Simple は次のようなロジックを使用します:
md5(salt + password)
例:
salt = 1dac0d92e9fa6bb2
password = exemplo123
ハッシュは次から計算されます:
1dac0d92e9fa6bb2exemplo123
salt は、事前計算されたテーブルを使った攻撃を困難にし、同じパスワードでも異なるコンテキストでは異なるハッシュを生成できるようにするために使われます。
それでも、md5(salt + password) は古くて脆弱なパスワード保存方法です。現代のシステムでは、以下のようなパスワード専用のアルゴリズムを使用する必要があります:
このバージョンは、実践的なアクティビティでの使用を容易にするために調整されています。
主な変更点:
チャレンジで使用される値:
Salt completo: 1dac0d92e9fa6bb2
Username: mitch
Email: [email protected]
Hash completo: 0c01f4468bd75d7a84c7eb73846e8d96
エクスプロイトに設定されたプレフィックス:
Salt prefix: 1dac0d92
Username prefix: mit
Email prefix: admin@
Hash prefix: 0c01f446
これらのプレフィックスは攻撃のロジックを削除するものではなく、ラボでのアクティビティに必要な時間を短縮するだけです。
poc-CVE-2019-9053/
├── exploit_ctf.py
├── requirements.txt
├── README.md
├── wordlist-example.txt
└── .gitignore
リポジトリをクローンします:
git clone https://github.com/SEU_USUARIO/poc-CVE-2019-9053.git
cd poc-CVE-2019-9053
仮想環境を作成します:
python3 -m venv .venv
仮想環境を有効にします:
source .venv/bin/activate
依存関係をインストールします:
pip install -r requirements.txt
requirements.txt ファイルには次が含まれている必要があります:
requests
termcolor
基本的な実行:
python3 exploit_ctf.py -u http://target/cms
ワードリストを使用してパスワードのクラックを試みる実行:
python3 exploit_ctf.py -u http://target/cms --crack -w wordlist-example.txt
スクリプトのヘルプを表示:
python3 exploit_ctf.py -h
wordlist-example.txt ファイルには次が含まれます:
wrongpassword
admin123
dieema123
password
123456
[+] Salt da senha encontrado: 1dac0d92e9fa6bb2
[+] Username encontrado: mitch
[+] Email encontrado: [email protected]
[+] Hash da senha encontrado: 0c01f4468bd75d7a84c7eb73846e8d96
[+] Senha encontrada: dieema123
エクスプロイトがパスワードのソルトとハッシュを抽出した後、ワードリストを使用して平文のパスワードを発見しようと試みることができます。
テストされるロジックは次のとおりです:
md5(salt + senha_candidata)
ワードリストの各パスワードについて、スクリプトはハッシュを計算し、データベースから抽出したハッシュと比較します。
概念例:
candidate_hash = md5("1dac0d92e9fa6bb2" + "dieema123")
結果が抽出したハッシュと一致すれば、パスワードが見つかったことになります。
Time-based SQL Injection は、各文字を複数のリクエストでテストする必要があるため、通常は遅いです。
このバージョンでは、以下を使用して時間を短縮しています:
それでも、時間は以下によって変わる可能性があります:
TIME_DELAY に設定された値。偽陽性または偽陰性が多すぎる場合は、コード内の TIME_DELAY の値を増やしてください。
CTF 向けに修正された Python 3 バージョン: Derick G. Andrighetti。
元々は Certimeter Group の Daniele Scanu によって公開された古い Python 2 の公開 PoC に基づいています。
教育目的での使用。
この資料は、学習、ラボでのデモンストレーション、CTF アクティビティを目的として作成されました。