BoardLight
Executive summary — BoardLight exposes only SSH and an Apache server hosting a static corporate site, but the domain leaked on that page leads to a hidden vhost running Dolibarr ERP/CRM 17.0.0 protected by factory credentials (
admin:admin). From there, CVE-2023-30253 — a case-sensitive anti-PHP filter — grants code execution aswww-data. A reused database password opens SSH access to the system user, and a SUID binary belonging to a desktop window manager that had no business being on a server (CVE-2022-37706) hands over root. No single link is sophisticated on its own; the chain is, because every step depends on the previous one.
| Platform | Hack The Box |
| Operating system | Linux (Ubuntu 20.04 LTS) |
| Difficulty | Easy |
| Status | Retired |
| Target IP | 10.129.231.37 |
Attack map
[80] board.htb — static corporate site, leaks the internal domain
│ vhost fuzzing -> crm.board.htb (hidden, same 302 response size)
▼
[80] crm.board.htb — Dolibarr ERP/CRM 17.0.0
│ factory credentials admin:admin -> administrative session
▼
[RCE] CVE-2023-30253 — Website module's anti-PHP filter is
│ case-sensitive (blocks <?php but not <?PHP)
▼
[www-data]
│ conf.php leaks the DB password, reused as the SSH
│ password for the system user larissa
▼
[SSH] larissa (user.txt)
│ enlightenment_sys (SUID root, v0.23.1) — CVE-2022-37706,
│ command injection via an unsanitized ";" in the path
▼
[ROOT] SUID copy of bash -> root.txt
1. Reconnaissance
ping -c 2 -W 3 10.129.231.37
64 bytes from 10.129.231.37: icmp_seq=1 ttl=63 time=35.5 ms
64 bytes from 10.129.231.37: icmp_seq=2 ttl=63 time=35.6 ms
A TTL of 63 is a free hint: Linux initializes TTL at 64, Windows at 128. 63 = 64 minus one network hop (the VPN gateway). Before scanning a single port, the target is already known to be Linux and one hop away.
nmap -p- --min-rate 5000 -T4 -Pn -oN nmap-allports.txt 10.129.231.37
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Not shown: 65226 closed tcp ports (reset), 307 filtered tcp ports (no-response)
Only two ports. That narrows the search space immediately: the entry point has to be on port 80, since SSH without prior credentials isn't a realistic way in.
nmap -sCV -p22,80 -Pn -oN nmap-services.txt 10.129.231.37
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Those OpenSSH and Apache versions are exactly what Ubuntu 20.04 LTS ships, and neither has a known practical pre-auth RCE. The vector isn't going to be the service, but whatever application runs on top of it.
curl -s -i -m 15 http://10.129.231.37/ | head -50
The response is a static commercial template, but the internal links use index.php, not .html: there's an active PHP interpreter even though the content looks entirely static. A feroxbuster run over the site only confirms more pages from the same template (about.php, contact.php...), and its contact forms have an empty action="" and inputs with no name attribute: purely decorative, they submit nothing to any backend. A dead end — but the dead end is the finding. Once the served content runs out, what's left to explore isn't more content, it's more hostnames.
grep -oiE '[a-z0-9._-]+\.(htb|com|local|net)' index.html | sort -u
board.htb
info@board.htb
The internal domain board.htb shows up in the page footer, in a contact email. Apache supports name-based virtual hosts: the same IP can host several distinct sites depending on the request's Host: header. Any other hosted site stays invisible until its name is guessed.
ffuf -u http://10.129.231.37/ -H "Host: FUZZ.board.htb" \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt \
-mc all -fs 15949 -t 60
-fs 15949is the essential option. When Apache gets aHost:it doesn't recognize, it doesn't error out: it serves the default vhost. Twenty thousand unfiltered requests would all return HTTP 200 with the same 15,949-byte page — pure noise. Filtering by that exact size, only genuinely different responses survive.
crm
A single real vhost: crm.board.htb. With no sudo on the attacking box to edit /etc/hosts, it's reached with curl's --resolve, which forces DNS resolution at the request level without touching the system:
curl -s -i --resolve crm.board.htb:80:10.129.231.37 http://crm.board.htb/ | head -30
Set-Cookie: DOLSESSID_3dfbb778014aaf8a61e81abec91717e6f6438f92=...
<meta name="author" content="Dolibarr Development Team">
<title>Login @ 17.0.0</title>
Three independent fingerprints confirm the target: the DOLSESSID_* cookie, the <title> literally publishing the version, and the ?version=17.0.0 parameter on static assets. Confirmed: Dolibarr 17.0.0.
Resumen ejecutivo — BoardLight expone solo SSH y un Apache con una web corporativa estática, pero el dominio filtrado en esa web lleva a un vhost oculto con Dolibarr ERP/CRM 17.0.0 protegido con credenciales de fábrica (
admin:admin). Desde ahí, CVE-2023-30253 — un filtro anti-PHP que distingue mayúsculas de minúsculas — da ejecución de código comowww-data. Una contraseña de base de datos reutilizada por SSH abre paso al usuario del sistema, y un binario SUID de un gestor de ventanas de escritorio que nadie debería haber instalado en un servidor (CVE-2022-37706) entrega root. Ningún eslabón por separado es sofisticado; la cadena entera lo es porque cada paso depende del anterior.
| Plataforma | Hack The Box |
| Sistema operativo | Linux (Ubuntu 20.04 LTS) |
| Dificultad | Easy |
| Estado | Retired |
| IP objetivo | 10.129.231.37 |
Mapa del ataque
[80] board.htb — web corporativa estática, filtra el dominio interno
│ fuzzing de vhosts -> crm.board.htb (oculto, mismo tamaño de respuesta 302)
▼
[80] crm.board.htb — Dolibarr ERP/CRM 17.0.0
│ credenciales de fábrica admin:admin -> sesión administrativa
▼
[RCE] CVE-2023-30253 — filtro anti-PHP del módulo Website sensible a
│ mayúsculas (bloquea <?php pero no <?PHP)
▼
[www-data]
│ conf.php filtra la contraseña de la BD, reutilizada como
│ contraseña SSH del usuario del sistema larissa
▼
[SSH] larissa (user.txt)
│ enlightenment_sys (SUID root, v0.23.1) — CVE-2022-37706,
│ inyección de comandos vía ruta con ";" no neutralizada
▼
[ROOT] copia SUID de bash -> root.txt
1. Reconocimiento
ping -c 2 -W 3 10.129.231.37
64 bytes from 10.129.231.37: icmp_seq=1 ttl=63 time=35.5 ms
64 bytes from 10.129.231.37: icmp_seq=2 ttl=63 time=35.6 ms
Un TTL de 63 es una pista gratuita: Linux inicializa el TTL a 64, Windows a 128. 63 = 64 menos un salto de red (el gateway de la VPN). Antes de escanear un solo puerto ya sabemos que el objetivo es Linux y está a un salto de distancia.
nmap -p- --min-rate 5000 -T4 -Pn -oN nmap-allports.txt 10.129.231.37
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Not shown: 65226 closed tcp ports (reset), 307 filtered tcp ports (no-response)
Solo dos puertos. Eso reduce el espacio de búsqueda de inmediato: el vector de entrada tiene que estar en el 80, porque SSH sin credenciales previas no es una vía realista.
nmap -sCV -p22,80 -Pn -oN nmap-services.txt 10.129.231.37
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Esas versiones de OpenSSH y Apache son exactamente las que empaqueta Ubuntu 20.04 LTS, y ninguna de las dos tiene un RCE preautenticación conocido. El vector no va a ser el servicio, sino la aplicación que corre encima.
curl -s -i -m 15 http://10.129.231.37/ | head -50
La respuesta es una plantilla comercial estática, pero los enlaces internos usan index.php, no .html: hay un intérprete PHP activo aunque el contenido parezca completamente estático. Un feroxbuster sobre el directorio solo confirma más páginas de la misma plantilla (about.php, contact.php...), y sus formularios de contacto tienen action="" vacío y sin atributo name en los inputs: son decorativos, no envían nada a ningún backend. Callejón sin salida — pero es el callejón el que importa: cuando el contenido servido se agota, lo que queda por explorar no es más contenido, son más nombres de host.
grep -oiE '[a-z0-9._-]+\.(htb|com|local|net)' index.html | sort -u
board.htb
info@board.htb
El dominio interno board.htb aparece en el pie de página, en un correo de contacto. Apache soporta vhosts basados en nombre: la misma IP puede alojar varios sitios distintos según la cabecera Host: de la petición. Cualquier otro sitio alojado permanece invisible hasta que adivinemos su nombre.
ffuf -u http://10.129.231.37/ -H "Host: FUZZ.board.htb" \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt \
-mc all -fs 15949 -t 60
-fs 15949es la opción imprescindible. Cuando Apache recibe unHost:que no reconoce, no da error: sirve el vhost por defecto. Las 20.000 peticiones de un fuzzing sin filtro devolverían HTTP 200 con la misma web de 15.949 bytes — puro ruido. Filtrando por ese tamaño exacto solo sobrevive lo que responde algo distinto.
crm
Un único vhost real: crm.board.htb. Sin permisos de sudo en la máquina atacante para editar /etc/hosts, se accede con --resolve de curl, que fuerza la resolución a nivel de petición sin tocar el sistema:
curl -s -i --resolve crm.board.htb:80:10.129.231.37 http://crm.board.htb/ | head -30
Set-Cookie: DOLSESSID_3dfbb778014aaf8a61e81abec91717e6f6438f92=...
<meta name="author" content="Dolibarr Development Team">
<title>Login @ 17.0.0</title>
Tres huellas independientes confirman el objetivo: la cookie DOLSESSID_*, el <title> que literalmente publica la versión, y el parámetro ?version=17.0.0 de los recursos estáticos. Confirmado: Dolibarr 17.0.0.
This content is Root Access only. Everything else on the site — the free tier, the whole public library — stays open.
See Root Access plansNo account? Create one free then upgrade from your console.
Este contenido es solo para Root Access. Todo lo demás del sitio — el nivel gratuito, toda la biblioteca pública — sigue abierto.
Ver planes de Root Access¿Sin cuenta? Crea una gratis y luego mejora desde tu consola.