免责声明
本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。
作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何责任。包括但不限于因使用本文所述技术而可能导致的法律诉讼、财产损失、隐私泄露或其他任何形式的责任。
在进行任何渗透测试或安全研究之前,请确保您已获得所有必要的授权,并遵守适用的法律和道德准则。未经授权的安全测试可能违反法律,并可能导致严重的法律后果。
本文中的内容仅供参考,不应被视为专业建议。在进行任何安全相关活动之前,建议咨询具有相应资质的专业人士。
作者保留对本博客文章的所有权利,并有权在未经通知的情况下进行修改或删除。
正文部分
一、前期准备
目标:实现 Docker 逃逸突破边界
环境搭建:
攻击机:Windows 10
Kali-2022(192.168.162.27)
靶机:Ubuntu 14.04 LTS ==> NAT:192.168.162.34、仅主机:192.168.183.128
Windows Server 2012 R2 ==> 仅主机:192.168.183.130
Windows 7 ==> 仅主机:192.168.183.129
机器说明:
WEB:Ubuntu 14.04 LTS
DC:Windows Server 2012 R2
PC:Windows 7
测试工具:
Burp Suite、Behinder、Railgun、Struts2漏洞检测工具、
二、探索发现阶段
2.1 主机发现
2.2 端口扫描
2.3 服务探测
根据 Nmap 扫描结果可以发现,Web 服务器开放了 22、2001、2002、2003 四个端口,其中 2001、2002、2003 端口都对应 HTTP 服务
2.3.1 识别 2001 端口的 Web 应用框架及版本
看情况这里是一个文件上传的地方,从标题可以看出应用框架是 Struts 2
2.3.2 识别 2002 端口的 Web 应用框架及版本
主页是一个 Tomcat 页面,使用工具扫描一下目录
没有发现什么过于敏感的目录
2.3.3 识别 2003 端口的 Web 应用框架及版本
一个 Web 端 MySQL 数据库管理页面,得到 MySQL 版本为 5.5.62,phpMyAdmin 版本为 4.8.1
三、入侵和感染阶段
3.1 检测 Struts 2 的 Web 应用漏洞并尝试利用
使用工具对服务地址进行检测,先进行目标信息配置,接着就验证漏洞
发现该服务存在远程代码执行漏洞,下面就对该漏洞进行利用
选择漏洞编号,搞好马子内容
上传马子
马子上传 OK,访问一下马子,没问题就用冰蝎进行连接
冰蝎连接马子
马子连接正常,不过这个 IPv4 看着怎么有点怪!?猜测是使用了云计算技术
3.2 检测 Tomcat 的 Web 应用漏洞并尝试利用
信息收集时发现这个 Tomcat 版本为 8.5.19,这个版本存在一个任意文件上传漏洞,下面进行任意文件上传漏洞测试
使用 bp 抓取任意数据包,修改数据包中的内容。改提交方式,添内容类型和马子内容。然后发包
状态码为 201,说明马子已经写入到 Web 服务器,下面验证一下马子
召唤冰蝎,连接马子
3.3 检测 phpMyAdmin 漏洞并尝试利用
服务探测时发现 phpMyAdmin 的版本为 4.8.1,经过查询,该版本的应用存在 CVE-2018-12613
目录扫描
发现有 db_datadict.php 这个文件,就用它进行包含,查看一下 /etc/passwd 中的内容
目前已经确定了该应用存在文件包含漏洞,接下来就利用 phpMyAdmin 执行 SQL 语句,将马子写入服务器。再写入马子之前,需要先了解执行的 SQL 语句会被记录在哪里——在 phpMyAdmin 中,执行的 SQL 语句会被保存在临时的 session 中,文件名就是 sess_ 拼接 session 值,并且临时文件一般情况下都在 /tmp 中。接下来就开始操作验证前面的想法,先执行一段查看当前目录路径的 SQL 语句
接下来获取 session 值
使用抓包的方式也可以获取到 Cookie,这里就不演示了,接下来使用文件包含漏洞包含这个临时文件
接下来就给服务器中写 webshell
select '<?php echo `echo "<?php eval(base64_decode(马子的base64内容));?>" > /var/www/html/shell.php`;?>';
访问马子
没报 404 就是成功,召唤冰蝎连马子
四、攻击和利用阶段
在冰蝎的网站列表中可以看到三个服务对应的操作系统都是 Linux 操作系统,然而,在接下来的操作过程中,还需要判断当前用户的权限以及 Web 服务是否运行在 Docker 容器内,因为在前面发现端口为 2001 的服务 IPv4 有点奇怪,所以不得不考虑服务是否部署并运行在 Docker 容器中
4.1 逃逸 Struts 2 容器
4.1.1 Struts 2 应用服务环境识别
查看当前用户权限
查找 .dockerenv 文件
.dockerenv 文件是 Docker 容器特有的文件,通常位于容器的根目录下,用于指示当前进程正在 Docker 容器中运行。那么就可以猜测该服务在容器中运行
4.1.2 Struts 2 应用 Docker 服务器逃逸
下面使用 cdk 对目标进行操作,cdk 是一个开源的 Docker 容器渗透工具包。上传 cdk 至目标服务器
由于获取到的是 root 权限,给文件加上执行权限,然后运行文件,对容器进行检测
检测之后发现当前容器使用 root 启动,尝试挂载根目录
挂载失败,换下一个服务接着测试
4.2 逃逸 Tomcat 容器
4.2.1 Tomcat 应用服务环境识别
查看当前用户权限
查找 .dockerenv
4.2.2 Tomcat 应用 Docker 服务器逃逸
上传 cdk,检测容器是否存在不安全配置和漏洞
发现当前容器也是以特权模式启动的,尝试将宿主机根目录挂载至 Docker 容器的某个目录中
发现挂载成功,挂载目录为 /tmp/cdk_BpmX2 目录,进去看看
拥有了宿主机的根目录,那么接下来就需要想着连接宿主机,在服务探测时发现宿主机开启了 22 端口的 SSH 服务,考虑写入 SSH 密钥来获取宿主机权限。使用 kali 生成一个 RSA 密钥对,将公钥写入目标,也就是宿主机的 /root/.ssh 目录下,然后使用私钥进行连接
生成密钥
查看公钥
将公钥写入目标
将私钥拷贝到装有 SSH 连接工具的服务器上,使用 SSH 连接工具进行连接,我这里使用的是MobaXterm
这样就算拿下了宿主机的控制权限,正常情况下到这里就可以了,不过为了完美一点,再把另一台服务器也拿下
4.3 逃逸 phpMyAdmin 容器
4.3.1 phpMyAdmin 应用服务环境识别
查看当前用户权限
这个权限有点尴尬,需要提权
查找 .dockerenv
4.3.2 phpMyAdmin 应用 Docker 服务提权
脏牛提权
上传文件
执行程序
查看 /etc/passwd 文件中是否存在 firefart 账号
很显然没有 firefart 账号,脏牛提权失败
4.4 配置内网代理
4.4.1 网络探测
现在已经获取到了宿主机的权限,接下来对宿主机的网络环境进行探查
宿主机存在两张网卡,与外部网络对接的是 eth0 网卡,那么 eth1 网卡对接的应该就是内网了
4.4.2 MSF 生成木马
上传木马至目标
配置监听器
添加路由
配置 SOCKS 5 代理
五、探索感知阶段
探测内网机器端口
导出为 Excel 表格
可以发现,内网有两台机器,192.168.183.129 和 192.168.183.130,其中 192.168.183.130 开放了 389 端口,猜测是域控服务器,因为一般情况下只有域控服务器才会开放 389 端口
六、传播阶段
根据内网探测的信息,192.168.183.130 开放了 445 端口,这大概是一个 Windows Server 服务器,先来看看存不存在 ms17-010 漏洞
发现目标机器存在 ms17-010 漏洞,并且发现目标主机的操作系统是 Windows Server 2008,那么下面就试一试
尝试利用漏洞
七、持久化和恢复阶段
未完……
标签:容器,边界,宿主机,漏洞,逃逸,马子,服务器,Docker From: https://blog.csdn.net/m0_74285177/article/details/144151331