22, января, 2009
Хочу немного поговорить о шифровании mssql паролей передаваемых по сети.
Если не ошибаюсь, первым о слабом шифровании заговорил David Litchfield в своем труде Threat Profiling
Microsoft SQL Server
Вот что он пишет
Network Sniffing
When a user connects to an SQL Server and authenticates as an SQL login, as opposed to a
Windows NT/2000 user, their login name and password are sent across the network wire in what
is tantamount to clear text. The 'encryption' scheme used to hide the password is a simple bitwise
XOR operation. The password is converted to a wide character format, or UNICODE, and each
byte XOR'd with a constant fixed value of 0xA5. Of course, this is easy to work out because every
second byte of the 'encrypted' password on the wire 0xA5 and we know that the password is in
UNICODE with every second byte being a NULL and when any number is XOR'd with 0 (or
NULL) the result is the same: 0x41 xor 0x00 = 0x41, 0xA5 xor 0x00 = 0xA5.
This means that, provided one can run a network sniffer between the client and the SQL Server, it
is a trivial task to capture someone's authentication details and unXOR it to get the original
password back out. Once this has been done then of course access to the SQL Server can be
gained. This is perhaps one of the reasons why Microsoft recommend using Windows NT/2000
based authentication as opposed to SQL logins; the latter is extremely weak.
Для тех, кто не знает буржуйского переведу:
Пароль конвертируется в юникод и ксорится с 0xA5
На самом деле алгоритм немного другой:
1) Для каждого символа меняются старшие и младшие биты
2) Полученные данные ксорятся с 0xA5
На словах все элементарно, но, к сожалению, когда я искал готовую реализацию перехвата и расшифровки пароля, то ничего не нашел, а может плохо искал?
Поэтому разберемся сами с начала.
В качестве сниффера рекомендую использовать Packetyzer
Во-первых, он удобный в работе
Во-вторых, бесплатный и с открытыми исходниками
В-третьих, прекрасно понимает TDS протокол (именно он нам и нужен для перехвата данных)
Первым делом ловим пакет авторизации, он так и называется
TDS Login Packet

Смотрим структуру пакета
Packetyzer в удобном виде показывает смещение и длину всех элементов
Нас интересуют Username и Password

Итак, мы получили имя пользователя и криптованый пароль попробуем восстановить исходные данные по вышеописанному алгоритму, только в обратном порядке
На php это будет выглядеть примерно так
Ксорим символ с 0xA5
<?php
$t=decbin($simbol ^ 165);
?>
Обмен младших и старших битов символа для десятичной системы исчисления
<?php
bindec(10000 * ($t % 10000) + round($t / 10000));
?>
Для удобства я написал небольшую онлайн утилиту доступную здесь
Вводим в поле ввода хэш, нажимаем кнопку расшифровать, и получаем искомое.
Осталось авторизоваться, используя найденные нами
Имя: Admn
Пароль: Admin