Брутфорсим УЗ в SQL Server

by Alexey Knyazev 21. октября 2009 22:00

Полный перебор (или метод «грубой силы» от англ. brute force) — метод решения задачи путем перебора всех возможных вариантов. Сложность полного перебора зависит от количества всех возможных решений задачи.

Если пространство решений очень велико, то полный перебор может не дать результатов в течение нескольких лет или даже столетий.

 

Допустим у вас на сервере БД есть учётная запись (записи) с SQL-авторизацией и вам необходимо востановить её пароль, например вы забыли пароль SA, а другой УЗ с правами sysadmin-НЕТ. Либо нельзя, по каким либо причинам, менять пароль у УЗ, а доступ к данным под этим логином необходим. На этот случай предлагаю способ "грубой силы".

Для начала нам понадобится любой словарь с базой паролей, найти такие словари в интернете легко.

Я воспользовался архивом с паролями с ресурса http://www.passwords.ru/dic.php. Скачиваем один из словарей, например Big Dictionary - около 500 000 слов. Распаковываем архив в корень диска С:. На выходе папка c:\bigdict c 7 текстовыми файлами в формате length02-length08. Теперь с помощью функции OPENROWSET выведим все эти слова (BOL->OPENROWSET->E. Using the OPENROWSET BULK provider with a format file to retrieve rows from a text file):

SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length02.txt', 
      FORMATFILE = 'c:\format.txt') AS length02
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length03.txt', 
      FORMATFILE = 'c:\format.txt') AS length03
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length04.txt', 
      FORMATFILE = 'c:\format.txt') AS length04
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length05.txt', 
      FORMATFILE = 'c:\format.txt') AS length05 
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length06.txt', 
      FORMATFILE = 'c:\format.txt') AS length06 
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length07.txt', 
      FORMATFILE = 'c:\format.txt') AS length07
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length08.txt', 
      FORMATFILE = 'c:\format.txt') AS length08

 Формат выводимых данных задаётся в файле 'c:\format.txt', вот его текст:

10.0
1
1  SQLCHAR  0  15 "\r\n" 1  Pas SQL_Latin1_General_Cp437_BIN

Теперь "натравим" этот словарь на ХЕШи паролей, которые хранятся в master.dbo.syslogins с помощью функции PWDCOMPARE, которая умеет сравнивать хэш заданного слова с хэшем существующего пароля. На выходе получаем такой скрипт:

SELECT name, Pas FROM
(
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length02.txt', 
      FORMATFILE = 'c:\format.txt') AS length02
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length03.txt', 
      FORMATFILE = 'c:\format.txt') AS length03
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length04.txt', 
      FORMATFILE = 'c:\format.txt') AS length04
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length05.txt', 
      FORMATFILE = 'c:\format.txt') AS length05 
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length06.txt', 
      FORMATFILE = 'c:\format.txt') AS length06 
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length07.txt', 
      FORMATFILE = 'c:\format.txt') AS length07
UNION ALL    
SELECT 
      * FROM OPENROWSET(BULK N'C:\bigdict\length08.txt', 
      FORMATFILE = 'c:\format.txt') AS length08 
) p           
CROSS JOIN
master.dbo.syslogins 
WHERE
[password] IS NOT NULL AND 
--name='SA' AND 
PWDCOMPARE(Pas, [password])=1

Никаких гарантий на то, что вы с помощью именно этого словаря "угадаете" пароль-нет, но это не первый и не последний набор паролей, а кто ищет-тот всегда найдёт.

P.S.: Для более оперативного поиска имеет смысл значения из словарей "залить" в какую-нибудь таблицу, тем самым этот архив всегда будет у вас под рукой...на всякий случай ;)

Tags: ,

SQL Server

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading