MRAPassRecovery

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by yuran666666, 16 Nov 2010.

  1. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Здraствуйте!

    Продолжая тему небезызвестного Gar|k, который немало "сделолол для хевиблексимфоспид-митолу в свои годы", ковырнем наконец-то как можно больше версий мейл агента (все что сможем найти) на предмет алгоритмов шифрования паролей как от почтовых ящиков, так и записей ICQ, в близлежащем будущем, если кому то будет особо интересно, даже разберем, а то и усовершенствуем рековерилку, которая будет "грабить корованы" для нашей с вами радости да и просто чоб было!;)

    ;#########################################################################
    Предупреждение!! Mail.ru не одобряет эту статью. Вы узнали всю правду о нас, и за это вы умрёте!
    ;#########################################################################

    Итак, чтобы не удручать вас всякими унылыми скринами отладчиков, дизассемблеров и хекс-редакторов, просто будем читать буквы и запоминать кому интересно, ок?
    Кому не интересно сканировать буквы, можете сразу заняться чем нибудь полезным
    goto download_soft ;кому не интересно
    Поехали!

    Пароли хранятся зашифрованными в ветках реестра
    HKEY_CURRENT_USER\Software\Mail.Ru\Agent\magent_logins - у версий ниже 5.2
    HKEY_CURRENT_USER\Software\Mail.Ru\Agent\magent_logins2 - от 5.2 до 5.6 включительно
    HKEY_CURRENT_USER\Software\Mail.Ru\Agent\magent_logins3 - начиная с 5.7
    маленькая особенность версий ниже 5.2 заключается в том, что в ключе представлены записи в виде двоичного параметра (пароля) с именем ключа-логином почты (в версиях выше уже идут подключи, а не параметры). Это связано с тем, что тогда еще агент не поддерживал айсикью и не было надобности содержать еще и запись уина с паролем, а они, как мы увидим дальше, тесно связаны логином почты с которым запускаются.
    Начиная с версии 5.2 мейл ввел поддержку протокола icq о безопасности данных авторизации которого не беспокоится и по сей день. Сумрачным гением создателей программы тут же была придумана новая ветка реестра magent_logins2, в которой вы уже будете лицезреть подключи с именами почтовых ящиков. В данных подключах, собственно, можем также видеть одни сплошные двоичные параметры с именами:
    - " ####password " – имя параметра зашифрованного пароля почты(не менялось пока ни разу);
    -"ICQ:00х#хххххххх"- вместо иксов – порядковый номер записи уина и сам уин- в параметре – зашифрованный пароль данного уина.
    В версии 5.7, последней пока что, добавили тристапиццот новых смайлов, перекрасили по дефолту в синий (что какбэ намекает) и в виде небольшого бонуса – хеширование пароля мейла мд5 алгоритмом (да, теперь именно с хешем происходит сравнение на сервере!- никаких открытых паролей в пакетах авторизации).

    Ну и наверное для чего это вообще я тут все пишу, да. Алго шифрования. Самую древнюю версию, которую мне удалось скачать с оффсервера – 5.0. Я видел самописные проги, которые работают с каким то ну очень уж старым протоколом mra и отправляют какой то усеченный пакет авторизации(без 200 байт лютой непонятной фигни в хвосте пакета). Они сейчас не работают – похоже предыдущие версии просто уже не поддерживаются серверами мейла, так что искать их и разбирать шифрование в них мы не будем. Вообщем начиная с 5.0 алго таков:
    1. Взять зашифрованный пароль от почты из соответствующей ветки реестра;
    2. Взять ключ шифрования для симметричного (ключ шифровки и расшифровки един) алгоритма blowfish. О файле ключа чуть подробнее:
    -локация данного ключа не менялась ещё ни разу, находится он тут: C:\Documents and Settings\%username%\Application Data\Mra\Update\ver.txt;
    - размер 56 байт, атрибуты: архивный, скрытый, системный;
    -создается после установки и первичного запуска агента ну или просто если его оттуда кто-то добрый удалил, заполняется случайными данными;
    -блокируется запущенным агентом (оный просто держит его дескриптор у себя и никому не дает).
    3. С помощью алгоритма бловфиш расшифровать поблочно пароль добытый из реестра. (поблочно то есть по 8 байт-ключ состоит из трех блоков – 24байта).

    Если все сделано правильно, на выходе получим пароль от почтового ящика (первые 8мь байт таки не пароль, а маленькая структурка вторые 4 байта которой – длина пароля) или MD5 хеш в бинарном виде в случае версии 5.7.
    Далее еще осталось ICQ. Что ж, закончим это:
    1. У нас есть расшифрованный пароль от ящика, идем далее в ключе реестра принадлежащем данному логину-если нет более двоичных параметров, то нет и icq записей, если же есть, то;
    2. Приводим пароль в Unicode вид;
    3. Вычисляем MD5 хеш полученного пароля;
    4. На выходе получаем 16 байт хеша, каждые 4 из которых необходимо "вывернуть наизнанку", то есть поменять старшинство байт в двойном слове (в случае версии 5.7 пункты 2, 3, 4 пропускаем);
    5. Из этих 16 байт хеша путем копипастинга делаем еще таких 2,5 следом за первыми(то есть нам нужен опять же массив из 56 байт для алгоритма blowfish, состоящий из этого повторяющегося хеша)
    6. Полученным массивом юзая все тот же blowfish расшифровываем так же поблочно пароль из бинарного ключа реестра

    На выходе нас будет ждать уже готовый пароль от ICQ записи в юникоде.

    И, дабы не прослыть голословным, выкладываю программу и её исходный текст, производящей все вышеописанное.

    Внимание! При запущенном мылоогенте для доступа к ver.txt файлу юзается драйвер режима ядра, вшитый в тело программ – поддерживает только 2195 и 2600 билды вендов, тобишь соответственно w2k и xp, желающим допилить прилагается недоразобранный дизассемблированный и пересобранный исходник драйвера, розумеецо на оссембрюле, для компеляции данного шеллкодеса – лезть на васм за kmdkit (там ядерные инклуды и либы для масма, а также примеры имеются(все дружно скажем спасибо дяде Four-F)). Также программка, приводящая бинарный файл к последовательности db для приинклуживания в исходный фаел.

    Найдете ошибки и баги в работе программы – пишите, исправлю

    :download_soft
    recovery
     
    #1 yuran666666, 16 Nov 2010
    Last edited: 16 Nov 2010
    4 people like this.
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Листаю исходник...
    Твой код не будет работать на win98, Vista, 7 и если венда установлена не на диск C.
    Простое и красивое решение
    Code:
    char path2ver[MAX_PATH];
    ExpandEnvironmentStringsA("%Appdata%\\Mra\\Update\\ver.txt",path2ver,sizeof(path2ver));
     
    _________________________
    1 person likes this.
  3. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Спасибо за комментарий.

    Фиксы:
    1. вычисление местоположения вендов(адын хрен по своему;) быдлокодеры торжествуэ!!!11);
    2. был срыв крыши при отсутствии пароля на ящик и присутствии айсикью пароля, а теперь нет. Если нет пароля-никакой инфы теперь выводиться вообще не будет.

    Файл:
    Proj.asm
     
    #3 yuran666666, 19 Nov 2010
    Last edited: 19 Nov 2010
  4. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Небольшое дополнение.
    Чтобы не юзать драйвер(совместимость с билдами вендов которого оставляет желать лучшего), разобрал и перерисовал на ассемблер процедурку для поиска хендла занятого файла и копирования файла себе.

    Описание процедуры:
    FindHandleReadFile proc ProcessId:dword, FileName:dword, copybuf:dword,sizecopybuf:dword

    - ProcessId – если знаем, лучше сразу сказать процедуре ид процесса, занявшего файл ибо поиск быстрее значительно будет;
    - FileName-адрес строки, заканчивающейся нулём с имени занятого файла внутри (например "ver.txt"-так и запишем);
    - copybuf-адрес буфера, в который скопируется файл;
    - sizecopybuf-сколько байт копировать от начала файла.

    Минусы:
    -поддержка функции NtQuerySystemInformation не гарантируется М$, я посмотрел на семерке х32 – все работало;
    -если процесс держащий хендл захочет поработать со своим файлом, то может быть что-то и нехорошее.. с ReadFile было бы точно тк позиция считывания\записи одна для всех прцоессов имеющих дублированный хендл. С меппингом не тестил на конфликты, если кто то знает по теме – отпишитесь, не сочтите за труд

    Новый исполняемый файл программы+исходники в которых делались поправки

    Бонус: длл, кторую вы можете абсолютно невозбранно вызывать в своих проектах (на ваш страх и риск конечно же:) ) по вышеописанному прототипу для копирования занятых файлов+example с данной длл+исходники всего этого

    Все тут