Статьи

Дешифрування паролів до облікових записів в MSSQL

Деякий час назад я написав статтю про дешифрування паролів для пов'язаних серверів. Використовуючи ту ж саму техніку, можлива дешифрування паролів облікових записів SQL-сервера. Я трохи модифікував попередній скрипт, призначений для розшифровки паролів, а саме поміняв місцезнаходження зашифрованих паролів. В результаті вийшов оновлений Powershell-скрипт для розшифровки паролів облікових записів.

Автор: Antti Rantasaari

Деякий час назад я написав статтю про дешифрування паролів для пов'язаних серверів ( https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/ ). Використовуючи ту ж саму техніку, можлива дешифрування паролів облікових записів SQL-сервера. Я трохи модифікував попередній скрипт, призначений для розшифровки паролів, а саме поміняв місцезнаходження зашифрованих паролів. В результаті вийшов оновлений Powershell-скрипт для розшифровки паролів облікових записів.

Зауваження ті ж самі, що і при розшифровці паролів для пов'язаних серверів. Погана новина в тому, що для дешифрування потрібні привілеї сисадміна (sysadmin) SQL-сервера і локального адміністратора Windows-сервера. З іншого боку, якщо зловмисник володіє правами адміністратора, то потенційно зможе розшифрувати більшість збережених паролів. Так що не слід зберігати безгоспні облікові записи в базі даних, і не наділяти непотрібними правами ті облікові записи, які використовуються для доступу до зовнішніх ресурсів.

Облікові записи SQL-сервера

Microsoft SQL Server дозволяє додавати облікові записи в базу даних. Подібні акаунти, зазвичай представляють собою комбінацію імені користувача та пароля, можуть використовуватися для доступу до ресурсів, що знаходяться поза SQL-сервера. Одна обліковий запис може використовуватися декількома користувачами.

Простий приклад - використання облікового запису проксі-сервера. Під час запуску xp_cmdshell за замовчуванням використовуються права службового облікового запису SQL-сервера (SQL Server service account). Однак обліковий запис проксі-сервера можна настроїти так, що збережена процедура xp_cmdshell використовувала менш привілейований аккаунт операційної системи, а не службовому обліковому записі, часто наділену розширеними повноваженнями.

Коли облікові записи зберігаються в базу SQL-сервера, паролі шифруються за допомогою оборотного алгоритму шифрування (щоб не виникало ніяких проблем при використанні цих акаунтів). Отже, стає можливим розшифровка паролів, чому, власне, і присвячена ця стаття.

Де зберігаються паролі

MSSQL зберігає паролі до облікових записів в таблиці master.sys.sysobjvalues. Я зміг з'ясувати місцезнаходження зашифрованих паролів після перегляду опису представлення master.sys.credentials за допомогою наступного запиту:

SELECT object_definition (OBJECT_ID ( 'sys.credentials'))

Компанія Microsoft дає досить розмите опис таблиці master.sys.sysobjvalues: «Таблиця є в кожній базі даних і зберігає значення загальних властивостей для кожного запису. На кожне властивість передбачено окремий рядок таблиці ». Таблиця master.sys.sysobjvalues містить величезну кількість інформації. У властивостей, що мають відношення до облікових записів, в колонці valueclass знаходиться значення 28. Зашифровані паролі зберігаються в колонці imageval з valclass = 28 і valnum = 2.

Малюнок 1: Рядки, що мають відношення до зашифрованих облікових записів

До таблиці master.sys.sysobjvalues ​​можна отримати доступ тільки за допомогою виділеного адміністративного з'єднання (Dedicated Administrative Connection, DAC) (більш докладно про DAC написано в http://technet.microsoft.com/en-us/library/ms178068%28v=sql.105%29.aspx ).

Алгоритм шифрування в MSSQL

Основні моменти, що стосуються шифрування в MSSQL, описані в статті https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/ . У двох словах: паролі шифруються за допомогою головного ключа служби (Service Master Key, SMK), який можна отримати, використовуючи DPAPI (Data Protection Application Programming Interface).

розшифровка паролів

Залежно від версії MSSQL-сервера паролі шифруються за допомогою алгоритму AES (MSSQL 2012+) або 3DES (MSSQL 2008 і більш ранні версії). Паролі, що зберігаються в таблиці sys.sysobjvalues ​​в колонці imageval, перед дешифруванням повинні бути злегка оброблені (тим же самим способом, що паролі зв'язкових серверів). Після парсинга паролі можна розшифрувати за допомогою SMK.

Розшифровка паролів за допомогою powershell-скрипта

Трохи модифікована версія «Get-MSSQLLinkPasswords.psm1» з передбачуваним ім'ям «Get-MSSQLCredentialPasswords.psm1» автоматизує розшифровку паролів. Скрипт знаходиться тут https://github.com/NetSPI/Powershell-Modules/blob/master/Get-MSSQLCredentialPasswords.psm1

Скрипт повинен бути запущений локально на MSSQL-сервері (оскільки DPAPI вимагає доступу до локального машинному ключу). Користувач, що запускає скрипт, повинен мати привілеї адміністратора (sysadmin) до всіх екземплярів бази даних (потрібно для DAC-з'єднання) і локального адміністратора Windows-сервера (для доступу до байтів з ентропією в реєстрі). Крім того, якщо включений контроль облікових записів користувача (User Account Control, UAC), скрипт повинен бути запущений від імені адміністратора.

Нижче показаний алгоритм роботи скрипта.

1. Ідентифікація всіх примірників MSSQL на сервері.

2. Створення DAC-з'єднання до кожного примірника.

3. Вибірка зашифрованих паролів з таблиці master.sys.sysobjvalues ​​(колонка imageval) для кожного екземпляра.

4. Отримання головного ключа служби (Service Master Key, SMK) з таблиці master.sys.key_encryptions (рядки зі значеннями key_id рівним 102). Отримання версії SQL-сервера, зашифрованою як LocalMachine, на основі колонки thumbprint.

5. Витяг значення ентропії з реєстру за адресою HKLM: \\ SOFTWARE \ Microsoft \ Microsoft SQL Server \ [instancename] \ Security \ Entropy.

6. Використання отриманої інформації для дешифрування SMK.

7. Визначення алгоритму шифрування (AES або 3DES), який використовувався для шифрування SMK, на основі версії SQL-сервера і довжини SMK-ключа.

8. Дешифровка паролів за допомогою SMK.

9. У разі успіху скрипт відображає розшифровані паролі.

Приклад роботи скрипта:

PS C: \> Get-MSSQLCredentialPasswords | out-gridview

Малюнок 2: Результат роботи скрипта

Скрипт був протестований на MSSQL 2008 і 2012.

Новости


 PHILIP LAURENCE   Pioneer   Антистресс   Аромалампы   Бизнес   Игры   Косметика   Оружие   Панно   Романтика   Спорт   Фен-Шуй   Фен-Шуй Аромалампы   Часы   ЭКСТРИМ   ЭМОЦИИ   Экскурсии   визитницы   подарки для деловых людей   фотоальбомы  
— сайт сделан на студии « Kontora #2 »
E-mail: [email protected]



  • Карта сайта