Здравствуйте. Я парсю протокол общения программы-клиента с сервером. Протокол идет в обертке TLS 1.0 (TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)). Можно ли как-то извлечь Pre-Master key, или Master key, или сам ключ шифрования сессий из работающей программы, чтобы была возможность расшифрования канала? Соответственно, доступ к клиентской программе и машине у меня полный. Возможно ли выдернуть секреты из оперативной памяти? Или может есть механизмы, отождествляющие этапы шифрования в дизассемблированном листинге? Хотя в реверсе я не особо силен. Уж очень не хотелось бы в данном случае заниматься MitM-атакой, хотелось бы расшифровывать траффик вчистую.
Приложения под какую ось? Если под win, то хукай вызовы сообщения, которое передается на шифрования - имена стандартных функции известны под все распространненые либы. Опять же для win есть к примеру EchoMirage, который именно так и перехватывает ssl трафик.
Да, приложение под Windows. Я правильно понимаю, что по SSL не много вариантов готовых реализаций для использования в С++? Видимо, набор ограничивается OpenSSL, CryptoAPI? Поглядев испортируемые dll, нашел среди прочих wininet.dll, wsock32.dll и ssleay32.dll. Каким образом средствами в С/С++ можно отследить вызовы функций из библиотеки в чужом процессе? EchoMirage, как я понял, может расшифровать всю сессию, а возможно ли использовать эти данные на лету сниффером? Т.к. SSL-сессии не статичны, возникают и исчезают, для каждой свой ключ.
Вот тут почитай - http://reverseengineering.stackexch...17/extracting-https-packets-before-encryption. Можешь еще пересобрать OpenSSL, в которой будеш сохранят все на диск, и подсунуть ssleay32.dll приложению. Она и делает это на лету, с возможностью прервать процесс(верней поток). Запусти и посмотри, скорей всего, это, что тебе надо.
Попробовал запустить Echo Mirage, может я не так его использую, но пакеты по 443 порту в его логе все также шифрованные. Проверил на rar/zip содержимое, но в логах нигде таких констант не нашел. Как я понял, используется OpenSSL, присутствуют библиотеки libeay32.dll и ssleay32.dll. Только описываются они в 14-й записи в DATA_DIRECTORY, которая в hiew обозначается как Delay Import, и, соответственно, в списке стандартной таблицы импорта (Import Table) не значатся. Список импортируемых функций по этим библиотекам в hiew также не приводится, только ординалы. Также PEiD говорит, стоит защита ACProtect 1.4. Почитал про пакер, вручную доп. секции .perplex не нашел, хотя структуры таблицы импорта и таблицы отложенного импорта (Delay Import) ссылаются на "мусор", а не на стандартные описания импортируемых библиотек. Возможно, что Echo Mirage не может перехватить пакеты из-за установленного пакера приложения?
Такой вариант очень интересен, только приложение осуществляет контроль целостности. В самом начале сервер присылает клиентской программе update.xml, где расписывает все задействованные элементы программы, размеры файлов и их CRC32. Вот фрагмент: <PACK type="full" file="ssl.pkg" size="602278" crc="1831713075"> <FILE file="libeay32.dll" size="1252352" crc="1314803618" /> <FILE file="ssleay32.dll" size="326144" crc="478475352" /> </PACK> Этот пакет теоритически можно подменять на лету - он идет по открытому каналу, но вот если dll-ки я нашел, то файл ssl.pkg на машине отсутствует, и я просто не знаю, к чему относится 1 строка, хотя она тут тоже не просто так =)
чет у вас какие-то хардкорные методы. 1) Меняем библы на свои/патчим 2) Фиксим CRC(сервак чекает целостность по CRC32, изменить проще некуда) 3) Пьем чаек, радуемся) p.s.: для подделки CRC32 я люблю юзать плагин от PEiD'a - CRC32 v1.0 by Gelios, но уверен есть множество других автономных тулз
Не очень понял этот пункт. Там, как я понял, клиентом вычисляется CRC32 от файла библиотеки и сравнивается с приведенной CRC32 в присланном с сервера update.xml для данного файла. Кстати, я ведь правильно понимаю, что поле CheckSum в опциональном PE заголовке в данном случае ни при чем? В библиотеке оно установлено в 0x0. У Криса Касперски нашел хорошую статью про подмену CRC32: https://www.evilfingers.com/publications/research_RU/CRC32-reverse.pdf. Чтож, буду пересобирать эти dll-ки и менять их чек-сумму. Главное, чтобы размер в итоге не превышал того, что был, т.к. по размеру тоже идет контроль. Спасибо за советы =)
Тогда подгоняй размер своих библиотек под оригинал, отрезай 4 байта и делай подмену CRC32 дописыванием 4 байтов. В общем возьми PEiD, поставь вышеуказанный плагин и посмотри как он работает.
Я бы сделал не так - с помощью хекс редактора ищутся константы для SHA или AES алгоритмов - ставим бряк на чтение к этой памяти - выходим на адреса инициализации и (де)криптовки потокового шифра - ставим бряк на первый вызов инита ключа AES - и мы имеем сеансовый ключ которым можно будет расшифровать заснифанные пакеты. Как то так.
ключ шифрования сессий генерируется при каждом запуске программы если речь идет об разовой сессии то скорее всего можно вытащить из озу в шестнадцатеричном коде