01-数据库渗透流程与探测
目标:拿到目标 IP 后,快速定位数据库服务、识别版本、判断可利用面。本章是 02-MySQL渗透 到 07-MongoDB渗透 各章的总入口。
目录
一、渗透标准流程
flowchart LR A[信息收集] --> B[端口探测] B --> C[版本指纹] C --> D[弱口令爆破] D --> E[漏洞利用] E --> F[提权/getshell] F --> G[哈希提取/横向]
各阶段要点:
| 阶段 | 动作 | 产出 |
|---|---|---|
| 信息收集 | 域名、子域、旁站、云资产归属 | 目标 IP 列表 |
| 端口探测 | nmap 全端口 + 服务识别 | 开放端口与服务版本 |
| 版本指纹 | banner、nmap 脚本、报错信息 | 精确版本号 → CVE 匹配 |
| 弱口令 | hydra/medusa 在线爆破(见 [[08-口令破解与哈希提取 | 08章]]) |
| 漏洞利用 | 未授权访问、已知 CVE、认证后 RCE | 数据或 shell |
| 提权 | UDF/xp_cmdshell/COPY 等(各分章) | 系统权限 |
| 横向 | 哈希复用、dblink/openrowset、内网弱口令 | 扩大战果 |
二、主流数据库端口表
| 数据库 | 默认端口 | 协议 | 认证默认状态 |
|---|---|---|---|
| MySQL | 3306(X 协议 33060) | TCP | 需认证,但常配弱口令 |
| MSSQL | 1433(命名实例走 UDP 1434 动态端口) | TCP | sa 账户常被爆破 |
| Oracle | 1521(XE 有时 1522) | TNS/TCP | 多套默认账户 |
| PostgreSQL | 5432 | TCP | postgres 超管账户 |
| MongoDB | 27017(shard 用 27018+) | TCP | 老版本默认无认证 |
| Redis | 6379 | TCP | 默认无密码 |
| Memcached | 11211(UDP 同端口) | TCP/UDP | 无认证机制 |
| Elasticsearch | 9200(HTTP)/9300(传输) | TCP | 老版本无认证直出 |
三、nmap服务识别命令集
3.1 全端口扫描与服务识别
# 全端口 + 服务版本识别(外网首选,耗时较长)
sudo nmap -sV -p- -T4 --open -oN db_scan.txt <target>
# 只扫常见数据库端口,快速确认
sudo nmap -sV -p 1433,1521,3306,5432,6379,11211,27017,9200 -oN db_quick.txt <target>
# 操作系统指纹辅助判断
sudo nmap -sV -O -p 3306,6379,27017 <target>3.2 各库专用 NSE 脚本
# MySQL:基本信息、用户枚举、空口令检测
nmap -p 3306 --script mysql-info <target>
nmap -p 3306 --script mysql-enum <target>
nmap -p 3306 --script mysql-empty-password <target>
nmap -p 3306 --script mysql-databases --script-args mysqluser=root,mysqlpass=123456 <target>
# MSSQL:ping 探测、空口令、枚举
nmap -p 1433 --script ms-sql-info <target>
nmap -p 1433 --script ms-sql-empty-password <target>
nmap -p 1433 --script ms-sql-query --script-args 'ms-sql-username=sa,ms-sql-password=123456,ms-sql-query="select @@version"' <target>
# Oracle:TNS 版本、SID 枚举
nmap -p 1521 --script oracle-tns-version <target>
nmap -p 1521 --script oracle-sid-brute <target>
# PostgreSQL:版本与认证方式
nmap -p 5432 --script pgsql-brute <target>
# Redis / MongoDB / Memcached:未授权访问检测
nmap -p 6379 --script redis-info <target>
nmap -p 27017 --script mongodb-info <target>
nmap -p 11211 --script memcached-info <target>
# Elasticsearch
nmap -p 9200 --script http-title,http-jsonp-discovery <target>所有 login 类脚本命中凭据后,直接跳转 08-口令破解与哈希提取 的 hydra 命令集做批量验证。
四、版本指纹与CVE对应
拿到精确版本后查 CVE,典型高危对应:
| 数据库 | 版本区间 | 高危问题 | 利用章节 |
|---|---|---|---|
| Redis | < 5.0.5 | 主从复制 RCE 可用 | [[06-Redis渗透 |
| Redis | 4.x/5.x 且 Lua 沙箱存在缺陷 | CVE-2022-0543 沙箱逃逸 | [[06-Redis渗透 |
| MySQL | 5.x 全系 | UDF 提权路径成熟 | [[02-MySQL渗透 |
| MSSQL | 2005-2019 | xp_cmdshell/CLR 利用链 | [[03-MSSQL渗透 |
| PostgreSQL | 9.3-11(superuser 配置 COPY) | COPY TO PROGRAM RCE | [[05-PostgreSQL渗透 |
| PostgreSQL | 9.3-11.1 特定配置 | CVE-2019-9193 | [[05-PostgreSQL渗透 |
| MongoDB | < 3.6 默认无认证 | 未授权访问全库拖取 | [[07-MongoDB渗透 |
版本获取手段:
# MySQL:未登录时通过 banner 或报错
mysql -h <target> -u root -p # 登录后 SELECT version();
nc -nv <target> 3306 # 直接读 banner(部分版本回显)
# Redis:INFO server 字段含 redis_version
redis-cli -h <target> INFO server | grep redis_version
# MSSQL:banner 中直接带版本
nmap -p 1433 -sV <target>
# Elasticsearch:HTTP 根路径直接返回 version.number
curl -s http://<target>:9200/五、常见暴露原因
红队遇到的数据库暴露公网,绝大多数来自以下三类运维失误:
| 原因 | 典型形态 | 检测方法 |
|---|---|---|
| 云安全组全放行 | 入方向规则 0.0.0.0/0 放行 3306/6379 | 外网 nmap 直扫即见 |
| docker -p 端口映射 | docker run -p 6379:6379 把容器服务透出宿主机 | banner 常带容器特征,Redis info 中 os 字段为 Linux alpine |
| bind-address 监听错误 | MySQL bind-address = 0.0.0.0、MongoDB bindIp: 0.0.0.0、PostgreSQL listen_addresses = '*' | 能从外部建立 TCP 连接即为监听全网卡 |
| 内网穿透工具 | frp/nps 把内网库映射到公网 VPS | 延迟异常、IP 归属与业务不符 |
# 验证是否真的对外可达(本机发起连接测试)
nc -zv <target> 6379
curl -v telnet://<target>:3306六、shodan与fofa搜索语法
测绘平台用于资产发现与同类暴露面批量排查:
| 平台 | 语法 | 说明 |
|---|---|---|
| shodan | product:MySQL port:3306 country:CN | 按 product 过滤 |
| shodan | product:Redis version:3.2.0 | 锁定易受攻击版本 |
| shodan | "mongoDB" port:27017 | MongoDB 暴露 |
| shodan | product:"Elasticsearch" port:9200 | ES 直出 |
| fofa | port="3306" && protocol="mysql" | fofa 端口+协议组合 |
| fofa | protocol="redis" && country="CN" | Redis 批量 |
| fofa | app="ElasticSearch" && port="9200" | ES 组件名匹配 |
| hunter | web.protocol="redis" | 同类思路 |
| censys | services.port:6379 and services.service_name:REDIS | 英文生态补充 |
测绘结果仅作授权范围内资产梳理参考;对非授权目标发起任何连接测试均属违法。实战中优先用测绘确认自己客户的暴露面,再回到 nmap 做精确验证。
七、内网场景的数据库发现
进入内网后(已有一台立足点),数据库发现的重点从外网端口转向网段扫描与配置文件翻找:
# 内网快速扫库(从立足点发起,ICMP 存活 + 端口)
nmap -sn 10.0.0.0/24 -oG live.txt
nmap -sV -p 1433,1521,3306,5432,6379,27017 -iL live.txt
# 无 nmap 环境用原生工具探测
for p in 3306 6379 27017; do (echo > /dev/tcp/10.0.0.5/$p) 2>/dev/null && echo "$p open"; done| 发现渠道 | 命令/位置 | 说明 |
|---|---|---|
| Web 配置文件 | config.php、application.yml、web.config | 直接给出内网库地址与凭据 |
| 连接串搜索 | `grep -rE ‘jdbc | connectionstring |
| 域内 SPN | setspn -Q */MSSQL*、GetUserSPNs.py | 定位域内 MSSQL 服务账户 |
| ARP/路由信息 | ip route、arp -a | 判断可达网段 |
内网 MSSQL 的发现往往伴随 Kerberos 攻击面(服务账户口令请求破解),属于域渗透交叉内容,此处仅作定位提示。
返回 数据库安全 总目录