div.main {margin-left: 20pt; margin-right: 20pt}Как я ломал The Bat!, или пароли вампира. Автор:Vovan aka L0ki (loki@infantry.com) ICQ: 59946949
После огромного количества хвалебных статей "о лучшем мэйлере
всех времен и народов" во всевозможных изданиях я набрал пару ведер
увесистых булыжников и буду бомбить ими загаженный летучими мышами
огород RIT Labs. И пусть не обижаются. В любой бочке меда обязана
быть одна (но большая) ложка г... эээ-э-э, дегтя.
Пролог
Ты не задумывался: сколько людей пользуются The Bat!-ом? (Вся
редакция Х юзает только The Bat! - прим. ред.) Сколько народу
скачивает его с ritlabs.com и громко вопит в fido7.ru.crack: "Дайте
мне кряк к Бату!", создают трафик astalavista.box.sk и других
поисковых машин?
Много! По словам SideX`а, их добрая треть, а то и половина
читателей Х. Удобная вещь: быстро бегает, места мало занимает,
наворотов и прибамбасов немеряно. А у тебя, случаем, не Бэт мэйлером
работает? И о чем в нем пишешь? А переписочку где хранишь? Где
обычно? И не боишься? А-а-а, пароль поставил! Ну, погоди, погоди...
Проверим, как ты умеешь хранить тайны...
А началось все с мелочи. Решил как-то разок проверить: можно ли
Бату доверять на хранение духовные ценности (CityCat'овский
eat.dodbar). Поставил пароль. Дай, думаю, посмотрю: а чего он там
делает-то с паролем? Посмотрел. Не прошло и пяти минут, как была
написана программка (простейшая, на Паскале), показывающая пароль
любого запароленного ящика. Но обо всем по порядку.
Итак, слово обвиняемому - Бату Вампировичу:
"Работая с The Bat!, Вы можете закрыть ваш почтовый ящик паролем,
так что никто не сможет прочитать Ваши письма без Вашего
разрешения".
Ну да! Так уж и никто! Разрешения еще спрашивать!
Надрежем лобовую кость...
Напомню, что все письма Bat! хранит в файлах, (он их называет
базами писем) с расширением .MSB. С них-то я и начал. Сохраняю один
из них (ну, например, Inboxmessages.msb) без пароля на ящике с
именем ORIG.MSB, потом установил пароль на ящик (его можно было даже
не запоминать - настолько нетрудно оказалось его оттуда достать) и
сохранил этот же файл с именем CRYPT.MSB.
Сравниваю зашифрованный и незашифрованный .MSB-файл, зорким оком
замечаю такие вещи:
1) размер файла не изменился (хороший признак, однако);
2) изменился кусок в заголовке файла (а что же там лежит?);
3) зашифрованное тело письма (а какой смысл хакать пустой
файл?).
При этом последовательности символов в оригинальном письме
повторяются и в зашифрованном виде. Имеем явно не блочный шифр, т.к.
он из повторяющихся строк на выходе ТАКОЕ вытворяет - мать родная не
узнает. Да и не подстановочный тоже - в нем строка из одинаковых
символов (приличной длины - см. рисунок) на выходе может возникнуть
только чудом. Причем с той же позиции. И одинаково во всех письмах.
Но другими символами. Допиваю утренний кефир, отставляю чашку в
сторону... АГА! ПОПАЛСЯ! Возникла правомерная мысль, что передо мной
обыкновенный заезженный XOR по одному байту. И это действительно
он!
Ну вот! Теперь он и тебя посчитал!
Значение, которым XORится файл, зависит от пароля. Нужны
доказательства? Мне в лом их копать: очень не хочется
дизассемблировать EXE мега в 3 длиной. Или перебирать сотни три
паролей. Поэтому здесь начинается то, что буржуйские криптологи
называют "Known text attack", т.е. "атака по известному тексту" -
имеем оригинальный текст, имеем полученный текст, знаем алгоритм -
получаем ключ.
Но не зря же имеется два файла - с паролем и без. Поскольку в
результате бесчеловечных издевательств было выяснено, что ВСЕ
(непустые) Bat!овские MSB-файлы ВСЕГДА (неясно зачем) заканчиваются
парой символов CR-LF (перевод строки). Выяснение значения, которым
производится XOR, упрощается до неприличия.
Беру последний байт файла и устраиваю ему XOR по значению 10 (LF,
если кто забыл). Вижу последовательности в заголовке файла (с 13
байта) и пройдусь по ней XOR'ом с тем же значением. Спешите видеть!
Вот оно - Pascal'евская (0-й байт - длина) строка с паролем. Вот
так! Пароль наш!
Получаю значение, которым зашифрован файл. Так можно расшифровать
все письма в этом файле. Судя по всему, Bat! из вводимого пароля
вычисляет значение, потом им расшифровывает лежащий в .MSB пароль и
сравнивает его с введенным. Схема очень даже хорошая, надежная, вот
только всю эту красоту и идиллию портит катастрофически неудачный
(просто лажовый) алгоритм шифровки. Уж очень он у них простой.
Создателей нехватило ни на какой более-менее приличный блочный шифр.
Даже не блочный. Да любой. Caesar или Viginere (а еще круче - DES)
заставили хотя б задуматься (на пару минут, часов, дней, недель - в
зависимости от сложности алгоритма). А так... детский лепет.
Эпилог
"Если у Вас уже имеется пароль для ящика, Вы можете ввести пустую
строку в качестве пароля - после этого ящик будет не защищен".
А пароль уже имеется... Вперед!
Кстати, зашифрованный таким хитрым образом пароль лежит в КАЖДОМ
.MSB-файле в ящике (а на кой, собственно, в каждом?).
"Заметьте, что почта в ящике шифруется, если Вы устанавливаете
пароль. На случай, если Вы забудете пароль, запишите его
где-нибудь".
Ага, на крепких лбах товарищей программистов-авторов Батона. Там
ему самое место. Не, ни фига - лбов на всех не хватит. Скидай
рубаху, на спине писать будем!
Далее начинается самое интересное. Теперь можно идти к товарищу
за комп, стаскивать все его ящики, если тебе интересна его
переписка, и не опасаться наличия пароля, на который он по глупости
понадеялся. Понятно, что его любовные письма к подружке по чату
Mashulen'ke вряд ли принесут тебе хоть малейшую пользу (можно
подумать, ты не знал, что Mashulen'ka - это вот тот небритый урод из
соседнего подъезда), но там может быть нечто полезное для тебя -
подписки, аккаунты, присланные сервером при регистрации. Мало ли что
может там быть? Тут тебе и халявный Инет, купленные шеллы, пароли от
других почт... не оберешься добра, короче.
А теперь - Киндер-Сюрприз для Самых Находчивых! В интегрированной
в The Bat! звонилке может храниться и login с password'ом - вдруг
The Bat! у юзера сам дозванивается и почту забирает. Хранится не в
реестре, а рядом с .MSB - в каталоге ящика, в account.cfg, кажется.
Вот вам еще и Инет на халяву! А ведь хотели просто почту
почитать...
Самые нервные, наверное, сейчас завопят: "А нам что же делать"? А
вам, дорогие мои, настоятельно рекомендуется не хранить пароли где
ни попадя и пользоваться PGP. ПЖП с Батом прекрасно интегрируется. А
главное - старайтесь пореже пускать за свой комп посторонних, даже
хорошо вам знакомых. У меня один хорошо знакомый (ака посторонний)
за две минуты гиговый винт умудрился прошерстить, пока я чайник
ходил ставить (правда, ничего важного не нашел - для этого у меня
Kremlin установлен - DES, IDEA, CAST, 3DES и другие официальные
лица), а после моего прихода незамедлительно схлопотал в ухо и
больше так не делал. :) Так что следите, гоните всех. Это ведь
персональный компьютер, а не коллективная игрушка.
P.S. Гонорар за публикацию статьи автор перечисляет фирме
RIT Labs на покупку книги Bruce Scheier "Applied Cryptography".
А вот и заветный листинг нового монстра для выбивания паролей из
вампира.
program Bat_Hack;
var SourceFile: file of byte;
ch: char;
c: byte;
XOR_Value: byte;
PasswordLength: byte;
count:longint;
begin
assign (SourceFile, paramstr(1));
reset (SourceFile);
seek (SourceFile,filesize(SourceFile)-1);
read (SourceFile,c);
{Читаем последний байт файла}
{Этот байт - LF XORен по XOR_Value}
XOR_Value := (c xor 10);
{Находим XOR_Value}
seek (SourceFile,13);
read (SourceFile,c);
{Это длина пароля XORенная по XOR_Value}
PasswordLength := (c xor XOR_Value);
{Находим длину пароля}
if PasswordLength = 0 then
{Вдруг пароль не установлен}
begin
writeln ('No password !');
{не судьба...}
exit;
end;
for count := 1 to PasswordLength do
{Находим пароль}
begin
read (SourceFile,c);
write (chr (c xor XOR_Value));
end;
writeln;
close (SourceFile);
end.
|