the_open_door
café
ESEN
← Volver al índice

Arbitrary read with 7-Zip @listfile

7-Zip (7z, 7za, 7zr) interpreta cualquier argumento que empiece por @ como un fichero de lista (@listfile): lee ese fichero y trata cada línea como el nombre de un fichero a añadir al archivo. Si uno de esos nombres no existe, 7-Zip lo vuelca como advertencia (<contenido> : No more files). Ese comportamiento convierte a 7-Zip en un lector de ficheros ajenos cuando podemos influir en sus argumentos.

Mecanismo

El escenario clásico: un cron de root ejecuta algo como 7za a backup.7z * en un directorio donde tenemos escritura. Al expandir el comodín *, el shell incluye cualquier fichero que casen, incluido uno que llamemos @x. 7-Zip ve el @ y lee x como lista; si además x es un enlace a un fichero de root, su contenido se filtra al log:

cd /directorio/escribible
touch @root.txt          # 7z lo vera como @listfile -> leera "root.txt"
ln -s /root/.ssh/id_rsa root.txt
# tras el cron (o al ejecutar el 7z privilegiado):
cat /ruta/al/backup.log  # -> "<contenido de /root/.ssh/id_rsa> : No more files"

Es el mismo principio que el abuso de comodines en tar (--checkpoint), pero aquí no se ejecuta código, se lee: cada línea del fichero apuntado se intenta abrir y su contenido cae en el mensaje de error. Filtrando línea a línea se recupera una clave privada, un shadow, una contraseña reutilizada.

Requisitos

Que 7-Zip se ejecute con más privilegios que los nuestros (cron de root, SUID o una regla sudo), que el directorio de trabajo sea escribible por nosotros (para plantar el @fichero y el symlink) y poder leer su salida (el log, o stdout si el sudo es interactivo). Filtra el contenido de un fichero, no da shell directa.

Cómo detectarlo. La creación de un fichero cuyo nombre empieza por @ y de un symlink hacia rutas sensibles (/root, /etc/shadow) en un directorio de trabajo de un cron privilegiado es la firma más limpia (Sysmon for Linux / auditd sobre creat/symlink). En los logs de la tarea, la aparición de líneas ... : No more files con contenido que parece una clave o un hash delata la fuga. Un 7z/7za invocado con comodín sin anclar en un script de root es el patrón a auditar.

Defensa. Evitar comodines sin anclar en scripts privilegiados (usar ./* o rutas explícitas, y -- para terminar las opciones), no ejecutar compresores sobre directorios escribibles por terceros, y no guardar secretos en ficheros legibles por el proceso que comprime. Es primo del abuso de comodines en tar y una forma de caza de credenciales por lectura arbitraria.

Herramientas7z

Máquinas donde se aplica

  • ZipperProving Grounds Practice