// 01
Reconocimiento
Lanzamos un escaneo exhaustivo con nmap sobre la IP objetivo 10.129.2.104, exportando resultados a XML para transformarlos luego en un reporte HTML con xsltproc.
-p- escanea los 65,535 puertos TCP. -sSCV combina SYN scan silencioso, scripts NSE por defecto y detección de versiones. -n desactiva resolución DNS y -Pn salta el host discovery previo. --min-rate=5000 acelera el escaneo a más de 5,000 paquetes por segundo, reduciendo el tiempo total a menos de un minuto.
// PUERTOS RELEVANTES
22/ssh — OpenSSH 6.7p1 Debian. Vector de acceso principal si obtenemos credenciales.
53/domain — dnsmasq 2.76. Servicio DNS interno, inusual en una máquina HTB típica.
80/http — lighttpd 1.4.35. Servidor web ligero, comúnmente usado en dispositivos embebidos.
32400/http — Plex Media Server. Servicio multimedia, sin relevancia directa para la explotación.
Transformamos el XML de nmap en un reporte HTML legible usando la hoja de estilos que viene incluida con nmap en /usr/share/nmap/nmap.xsl. Esto genera un archivo HTML con tabla de puertos y servicios muy útil para revisar resultados de forma visual.
// 02
WhatWeb
whatweb es una herramienta de fingerprinting web que identifica tecnologías, frameworks, servidores y cabeceras HTTP sin necesidad de navegar manualmente al sitio. Lo ejecutamos contra el puerto 80 para obtener más contexto sobre el servidor.
El resultado más llamativo es la cabecera x-pi-hole en la respuesta HTTP. Esta cabecera no estándar es característica de Pi-Hole, un bloqueador de anuncios a nivel de red que corre típicamente sobre una Raspberry Pi. Este dato es el punto de inflexión de toda la máquina.
// INFORMATION DISCLOSURE
La cabecera x-pi-hole revela que el servidor web es Pi-Hole. Pi-Hole se despliega casi exclusivamente sobre Raspberry Pi, hardware que históricamente usa credenciales por defecto bien documentadas: usuario pi, contraseña raspberry. Esta información pública es suficiente para comprometer el sistema si el administrador no las cambió.
// 03
Pi-Hole & Raspberry Pi
Con la cabecera x-pi-hole identificada, buscamos cuáles son las credenciales por defecto de Raspberry Pi. Las versiones del sistema operativo Raspberry Pi OS anteriores a 2022 (como la presente en Mirai, que data de 2017) incluyen credenciales hardcodeadas:
// CONTEXTO IoT
Mirai (el nombre es una referencia directa al botnet del mismo nombre de 2016) ilustra el vector de ataque IoT más extendido: credenciales por defecto nunca cambiadas. El botnet Mirai real comprometió millones de dispositivos (cámaras IP, routers, NVRs) exactamente de esta manera, construyendo una red de DDoS que llegó a 1.2 Tbps. Los dispositivos IoT suelen carecer de interfaz para cambiar credenciales, o los usuarios simplemente no lo hacen.
// 04
Acceso SSH
Con las credenciales identificadas, intentamos el acceso SSH. El servidor avisa en el banner que SSH está habilitado y la contraseña por defecto del usuario pi no ha sido cambiada — el propio sistema reconoce la debilidad y la anuncia, aunque nadie la corrigió.
// ACCESO OBTENIDO
Acceso como usuario pi en el host raspberrypi. El sistema confirma activamente la vulnerabilidad en el banner de login, pero el administrador nunca cambió las credenciales. Tenemos shell interactivo.
// 05
User Flag
La flag de usuario se encuentra en el escritorio del usuario pi, en ~/Desktop/user.txt. Navegamos al directorio y la leemos.
// 06
Escalada de Privilegios
El primer vector a comprobar siempre en una escalada de privilegios es sudo -l: qué comandos puede ejecutar el usuario actual con privilegios elevados sin necesidad de contraseña de root.
// SUDO NOPASSWD ALL
(ALL) NOPASSWD: ALL es la configuración sudo más peligrosa posible.
El usuario pi puede ejecutar cualquier comando como
cualquier usuario (incluyendo root) sin contraseña. Esto hace
la escalada trivial: un simple sudo su
nos da acceso root inmediato.
// 07
Forensics — USB Recovery
Al navegar a /root y leer root.txt, encontramos un mensaje inesperado: el archivo no contiene la flag sino una nota indicando que el archivo original fue eliminado accidentalmente de un USB stick. Este es el giro forense de la máquina.
Navegamos al directorio /media donde Linux monta dispositivos extraíbles. Encontramos el directorio usbstick montado. Al listar su contenido, hay dos archivos: damnit.txt y un directorio lost+found (estructura típica de sistemas de archivos ext).
// ARCHIVO ELIMINADO
El archivo root.txt fue eliminado del USB, pero en sistemas de archivos ext (ext2/3/4), borrar un archivo solo elimina la entrada del directorio y marca los bloques como disponibles — los datos raw permanecen en el dispositivo hasta que son sobreescritos. Con acceso root y el device file del USB, podemos leer directamente los bloques del dispositivo.
// 08
Root Flag — Data Recovery
Antes de leer el dispositivo raw, necesitamos saber su ruta en /dev.
df -lh muestra todos los sistemas de archivos montados con
su tamaño y punto de montaje. Buscamos el que corresponde a /media/usbstick.
El USB está montado desde /dev/sdb — un disco de 8.7 MB, con solo 93K usados. Con el device identificado, usamos strings para extraer todas las cadenas de texto legibles directamente del dispositivo raw, incluyendo datos de archivos borrados que todavía residen en los bloques del disco.
// ROOT FLAG RECUPERADA
3d3e483143ff12ec505d026fa13e020b — La flag de root estaba en los bloques
raw del dispositivo USB, invisible desde el sistema de archivos pero perfectamente
recuperable leyendo el device directamente. El comando strings
extrajo todas las cadenas imprimibles, incluyendo el contenido del root.txt eliminado.
| VULNERABILIDAD | COMPONENTE | IMPACTO |
|---|---|---|
| Information Disclosure | Header x-pi-hole | Revela tecnología y plataforma hardware |
| Default Credentials | SSH pi:raspberry | Acceso inicial al sistema completo |
| Sudo NOPASSWD ALL | sudoers config | Escalada de privilegios trivial a root |
| Data Remanence | USB ext filesystem | Recuperación de archivos supuestamente borrados |
// 09
Referencia de Comandos
- -p- — escanea los 65,535 puertos TCP
- -sS — SYN scan (sin completar handshake)
- -sC — ejecuta scripts NSE por defecto
- -sV — detecta versión de servicios
- -n — desactiva resolución DNS
- -Pn — omite host discovery
- --min-rate — mínimo de paquetes/segundo
- --open — muestra solo puertos abiertos
- -oX — exporta resultado a XML
- -v — modo verbose (más detalle)
- -a 3 — nivel de agresividad (1-4)
- --log-json — exportar a JSON
- -n <N> — longitud mínima de cadena (defecto 4)
- -t x — muestra offset hexadecimal
- -e s — codificación (s=single-byte)
- -l — solo sistemas de archivos locales
- -h — tamaños en formato humano (K, M, G)
- -T — muestra el tipo de filesystem
- --output — especificar archivo de salida
- --param — pasar parámetros a la hoja XSL
- -U <user> — listar permisos de otro usuario (como root)
- -k — invalidar timestamp de autenticación
// 10
Glosario
x-pi-hole es una firma
característica que identifica su presencia en un servidor web.
strings, foremost, scalpel o
photorec aprovechan esto para recuperar archivos eliminados leyendo
directamente el device file (/dev/sdb) en lugar del sistema de
archivos montado.
x-pi-hole revela la tecnología exacta del servidor,
lo que permite inferir la plataforma hardware subyacente (Raspberry Pi) y buscar
sus credenciales por defecto documentadas públicamente. Esta única cabecera fue
suficiente para trazar todo el vector de ataque inicial.
/etc/sudoers
permite a un usuario ejecutar comandos con privilegios elevados sin necesidad de
introducir contraseña. Cuando se combina con ALL (cualquier
comando como cualquier usuario), el resultado es que el usuario puede obtener
root instantáneamente con sudo su o sudo bash.
Esta configuración es común en Raspberry Pi por diseño (facilita la administración
remota sin contraseña), pero en un contexto de seguridad representa una escalada
de privilegios trivial una vez obtenido el acceso inicial.