Извлечение SSL/TLS ключей из работающей программы

Discussion in 'Реверсинг' started by Sunchey, 28 Jan 2017.

  1. Sunchey

    Sunchey New Member

    Joined:
    29 Sep 2015
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте.
    Я парсю протокол общения программы-клиента с сервером. Протокол идет в обертке TLS 1.0 (TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)).
    Можно ли как-то извлечь Pre-Master key, или Master key, или сам ключ шифрования сессий из работающей программы, чтобы была возможность расшифрования канала?
    Соответственно, доступ к клиентской программе и машине у меня полный. Возможно ли выдернуть секреты из оперативной памяти?
    Или может есть механизмы, отождествляющие этапы шифрования в дизассемблированном листинге? Хотя в реверсе я не особо силен.

    Уж очень не хотелось бы в данном случае заниматься MitM-атакой, хотелось бы расшифровывать траффик вчистую.
     
  2. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Приложения под какую ось? Если под win, то хукай вызовы сообщения, которое передается на шифрования - имена стандартных функции известны под все распространненые либы. Опять же для win есть к примеру EchoMirage, который именно так и перехватывает ssl трафик.
     
    Sunchey likes this.
  3. Sunchey

    Sunchey New Member

    Joined:
    29 Sep 2015
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Да, приложение под Windows. Я правильно понимаю, что по SSL не много вариантов готовых реализаций для использования в С++? Видимо, набор ограничивается OpenSSL, CryptoAPI? Поглядев испортируемые dll, нашел среди прочих wininet.dll, wsock32.dll и ssleay32.dll.
    Каким образом средствами в С/С++ можно отследить вызовы функций из библиотеки в чужом процессе?

    EchoMirage, как я понял, может расшифровать всю сессию, а возможно ли использовать эти данные на лету сниффером? Т.к. SSL-сессии не статичны, возникают и исчезают, для каждой свой ключ.
     
  4. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Вот тут почитай - http://reverseengineering.stackexch...17/extracting-https-packets-before-encryption. Можешь еще пересобрать OpenSSL, в которой будеш сохранят все на диск, и подсунуть ssleay32.dll приложению.
    Она и делает это на лету, с возможностью прервать процесс(верней поток). Запусти и посмотри, скорей всего, это, что тебе надо.
     
    Sunchey likes this.
  5. Sunchey

    Sunchey New Member

    Joined:
    29 Sep 2015
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Попробовал запустить 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 не может перехватить пакеты из-за установленного пакера приложения?
     
  6. Sunchey

    Sunchey New Member

    Joined:
    29 Sep 2015
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Такой вариант очень интересен, только приложение осуществляет контроль целостности. В самом начале сервер присылает клиентской программе 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 строка, хотя она тут тоже не просто так =)
     
  7. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    чет у вас какие-то хардкорные методы.
    1) Меняем библы на свои/патчим
    2) Фиксим CRC(сервак чекает целостность по CRC32, изменить проще некуда)
    3) Пьем чаек, радуемся)

    p.s.: для подделки CRC32 я люблю юзать плагин от PEiD'a - CRC32 v1.0 by Gelios, но уверен есть множество других автономных тулз
     
    Sunchey and seosimf like this.
  8. Sunchey

    Sunchey New Member

    Joined:
    29 Sep 2015
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Не очень понял этот пункт.

    Там, как я понял, клиентом вычисляется CRC32 от файла библиотеки и сравнивается с приведенной CRC32 в присланном с сервера update.xml для данного файла. Кстати, я ведь правильно понимаю, что поле CheckSum в опциональном PE заголовке в данном случае ни при чем? В библиотеке оно установлено в 0x0.
    У Криса Касперски нашел хорошую статью про подмену CRC32: https://www.evilfingers.com/publications/research_RU/CRC32-reverse.pdf. Чтож, буду пересобирать эти dll-ки и менять их чек-сумму. Главное, чтобы размер в итоге не превышал того, что был, т.к. по размеру тоже идет контроль.
    Спасибо за советы =)
     
    #8 Sunchey, 31 Jan 2017
    Last edited: 31 Jan 2017
  9. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Тогда подгоняй размер своих библиотек под оригинал, отрезай 4 байта и делай подмену CRC32 дописыванием 4 байтов. В общем возьми PEiD, поставь вышеуказанный плагин и посмотри как он работает.
     
  10. rrurrer

    rrurrer New Member

    Joined:
    29 Oct 2015
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Я бы сделал не так - с помощью хекс редактора ищутся константы для SHA или AES алгоритмов - ставим бряк на чтение к этой памяти - выходим на адреса инициализации и (де)криптовки потокового шифра - ставим бряк на первый вызов инита ключа AES - и мы имеем сеансовый ключ которым можно будет расшифровать заснифанные пакеты. Как то так.
     
  11. Ruslan365c

    Ruslan365c Member

    Joined:
    16 Aug 2016
    Messages:
    41
    Likes Received:
    17
    Reputations:
    0
    ключ шифрования сессий генерируется при каждом запуске программы если речь идет об разовой сессии то скорее всего можно вытащить из озу в шестнадцатеричном коде