Как решить такую задачу "Чтение зашифрованного траффика"

Тема в разделе "WASM.BEGINNERS", создана пользователем LastNoob, 6 июл 2020.

  1. LastNoob

    LastNoob Member

    Публикаций:
    0
    Регистрация:
    28 янв 2018
    Сообщения:
    80
    Приветствую, спасибо, что зашли, так как-то спокойней, буду благодарен за советы.
    Итак, суть проблемы такова, у меня на пк есть программа, которая отправляет зашифрованные пакеты, прочитать которые сниффером не удается. Не удается потому, что они зашифрованы, судя по всему SSL протокол, это видно в wireshark.
    Однако, dns запрос отправляется открыто и мне даже удалось выделить домены, используемые в передаче пакетов. Да, это не сложно, но уже на пути к цели.
    В файле hosts переписал адреса этих доменов на свой локальный, развернул на нем сервер, слушающий запросы, с SSL сертификатом, конечно же, но не родным. В общем, программа зависла, видимо, есть валидация сертификата.

    Попытка с другой стороны - искал сетевые функции из Import Table, нашел разноименные как HttpSendRequest (A, W, ExA и тд.) Расставил на все bpt, ни один не сработал. Подумал, подумал, в итоге нашел функции, работающие с сокетами, а именно Recv & Send, поставил bpt, сравнил с акулой, идентично, вот только на обоих этапах данные зашифрованы. Функция срабатывает 3 раза (recv) 0x10, 0x150+, 0x50+ размер буффера, стало быть флаг Sync, Обмен ключей и тд.

    Пробовал поставить bpt на функцию, которая вызывает подфункцию, обрабатывающую recv - получаю остановку постоянно, даже, когда пакеты не летят.

    Пробовал ставить bpt на отправляемый кусок данных, точнее на его часть, сам пакет формируется из нескольких полей, на одно из таких полей и поставил, в итоге запутался, копируется неимоверное количество раз, пробовал через CheatEngine отловить вызовы, получилось немало, посмотрел каждый, не очень походит на то, что ищу, даже сказал бы, что совсем не походит. Может быть копирует поле или преобразует в ASCII, а потом упаковывает его и bpt на поле просто бессмыслен.

    Также нашел в памяти программы строку, начинающуюся с
    -----BEGIN PUBLIC KEY-----
    Так понял, приватный ключ rsa, подменил его, программа зависла. Но найти Private Key не удалось, либо он хранится как-то иначе, может не как plaintext, а массив байт и тд. Утилитой String вытащил все строки, регулярным выражением поискал строки по длине +/- 30 символов, ключ не найден.
    Было бы самое удобное это извлечь ключ из программы и просто отдать его в wireshark, но вот найти приватный ключ не смог, так понимаю, публичный нужен чтобы зашифровать данные, а приватный - чтобы расшифровать. Но эта идей пока что наиболее подходящая с моей точки зрения, мб не прав.
    Какие идеи у вас приходят в голову? буду раз советам.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Его там скорее всего нет, потому, что никто в здравом уме не будет хранить приватные ключи. Допустим, что это публичный ключ сервера, то есть клиент может передавать данные серверу. Для передачи данных клиенту от сервера, клиент просто генерирует себе ключевую пару и публичный ключ отправляет серверу.
    --- Сообщение объединено, 6 июл 2020 ---
    Попробуй поставить Rohitab Api Monitor и прологировать все сетевые апи.
    --- Сообщение объединено, 6 июл 2020 ---
    Была какая то программа, которая выступала как митм прокси и нормально логировала ссл, толи Fiddler, толи еще какая то.
     
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    После срабатывания бряка на recv, в котором что-то пришло, бряк надо ставить на буфер, принявший данные. Приготовься к тому, что данные будут стотыщмильенов раз скопированы в другие буферы и только потом один из них будет обработан. Поскольку речь про RSA, вероятней всего используется какая-то известная криптографическая библиотека (openssl например), в том числе в виде длл (libeay32.dll), можно неплохо сократить себе механическую работу ставя бряки сразу на нужные криптографические функции.
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Правильно Rel написал, ставь API монитор и смотри через какие API идет работа. Зная эту информацию уже дальше видно будет что делать.

    Приватные ключи обычно хранятся зашифрованными (CryptoAPI, CNG).
     
  5. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Напомнило, как я лаунчер Дниваловский "реверсил" - уперся в нехватку 5-ти ХБП+БПМ....:lol:
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Может и генерятся, а может и хранятся, но как бы приватный ключ клиента не поможет вскрыть данные, который клиент отправляет серверу. Если на клиенте хранится приватный ключ сервера в каком-либо виде, то скажите мне, что за софт, я им гневное письмо в саппорт напишу, мол что они крипту профакапили чуть более чем полностью.
    --- Сообщение объединено, 6 июл 2020 ---
    Если клиент только под венду, то проще им на cryptoapi было сделать, хотя криптоапи вроде не принимает из коробки DER/PEM форматы ключей (бегин паблик кей), так что вполне может быть и openssl.
     
  7. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Я имею в виду при создании пары ключей в CryptoAPI/CNG приватный ключ шифруется сессионным ключом. К примеру при вызове функции CryptExportKey вторым параметром как раз и передается этот ключ. Чтобы потом получить приватный ключ в чистом виде нужно этим сессионным ключом пройтись по буферу.
     
  8. LastNoob

    LastNoob Member

    Публикаций:
    0
    Регистрация:
    28 янв 2018
    Сообщения:
    80
    Да, Fiddler, Burp Suit, однако сетрификат ведь не установить в программу обычным способом, в браузере есть такая функция, а вот в исследуемой - нет, только если как-то его обнаружить?

    Думал об этом, искал функции по названию Encrypt/Decrypt, затем Cert, у вас не найдется названий функций, которые теоретически могли бы выполнять эту роль?
    Это и мешает работать, они копируются настолько часто, что уже не хватает внимания на каждый вызов.

    Стоит попробовать, благодврю


    Аххахаха, ну... Все же если так, то ведь необходимо как-то расшифровать принимаемое сообщение, а расшифровка возможна только при наличии приватного ключа, может быть он не серверный, а клиентский?
    Хотя, немного запутался чет. Wireshark принимает приватные ключи, значит, мог бы, наверное, расшифровать, если указать путь к ключу.

    О, а есть названия этой функции? Было бы неплохо извлечь ключ из процесса и загрузить в акулу.

    PS
    Надо немного отдохнуть, порой сложно остановиться, внимательность в ноль.
     
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.000
    RSA это экспоненциальное модулирование, как бы в openssl ни было реализовано то или иное применение RSA, пройти мимо функции BN_mod_exp() оно точно не может. Это сама суть алгоритма, все остальное - посредники перед ней. Если посмотреть в иде граф xrefs to на ее, можно в этом убедиться.
     
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Это все не нужно я думаю. Посмотри какими API у тебя отправляются данные на сервер. Расшифровывать ничего не нужно, просто брать данные до шифрования, я так понимаю они и нужны.
     
  11. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    приватный на их серваче == из проги надо щимить паблик ки и дешифровать им запросы от сервача. впрочем, не совсем ясно, что ты этим добиться хочешь.
    --- Сообщение объединено, 6 июл 2020 ---
    попытка митм-а при правильном подходе будет щимиться бодро :grin::good3:
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Не совсем понимаю, если приложение просто идет по хттпс, то там в фидлере только галочку поставить: https://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/DecryptHTTPS
    --- Сообщение объединено, 7 июл 2020 ---
    Чего? Клиент простт серверу посылает публичный ключ, а приватный держит при себе.
    --- Сообщение объединено, 7 июл 2020 ---
    Расшифровывать данные публичным ключом? Это что-то новое.
     
  13. LastNoob

    LastNoob Member

    Публикаций:
    0
    Регистрация:
    28 янв 2018
    Сообщения:
    80
    Вот именно... Так не получится.
    К слову, нашел предположительно отправляемый блок данных. Может быть можно попробовать зашифровать этот блок публичным ключом и проверить догадку, сверив с кадром из акулы...


    Так ведь для decrypt надо иметь ключ... И ключ именно приватный...
    Публичным можно только зашифровать посылаемое сообщение. Может я и не прав.
    Если я правильно понял, fiddler будет подменять сертификат. Но вот не любит софт чужие сертификаты.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Я честно говоря смутно помню, последний раз, когда я мониторил хттпс приложение, я вроде просто ставил эту галочку и галочку игнорирования ошибок сертификатов и все работало. Попробуй, вероятно это от софта зависит, если софт будет проверяет наличие конкретного сертификата у сервера, то видимо необходимо будет данные на более ранней стадии получить.
     
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    проверка подписи именно так и делается == каждая команда мб подписана, дабы аппа знала, что именно сервач её послал.
    а зачем сертификаты подменять? нужно вытащить все ключи из аппа и на их основе лепить митм.
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Причем тут подпись? Сам же предлагал на публичном ключе расшифровывать. А это, знаете ли, откровенный бред.
    --- Сообщение объединено, 8 июл 2020 ---
    Если аппа сделана нормально (ну то есть не расшифровывает на открытых ключах например), то она не будет иметь захардкоженных приватных ключей. По хорошему ключевая пара должна генериться либо на сеанс связи, либо при первом запуске приложения и где-то храниться в зашифрованном виде.
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    ну-так это те же яйца, только в профиль и даже хУжей == на ЧУЖОЙ машине генерится пара и где-то должна храниться опять же на ЧУЖОЙ машине :grin: уж лучше тогда ключи хардкорно зашить в апп + там могут быть серии таких ключей и их сохранность уЖО имеет более высокий уровень в силу необходимости их вытягивать реверсом. тут дажЪЪ лучшей не рса пользовать, а симметрик (рса же хорош в качестве ложной цели) :)
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Вообще то нет, если ключи генерятся, то ты не можешь ничего расшифровать перехватывая траффик (не сидя на машине клиента). В противном случае, имея семпл программы, хотя бы в одну сторону ты можешь полностью читать все пересылаемые данные.
     
  19. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    в данной теме речь идёт о читах (так понимаю) и ТС ковыряет аппку для контроля её трафика. ежли более глобально, то митм может сугубо силовым способом пахать == либо махинька будет хавать левый серт и тем самым получит доступ в сеть, либо ПОнХ такими красивыми :)
     
  20. LastNoob

    LastNoob Member

    Публикаций:
    0
    Регистрация:
    28 янв 2018
    Сообщения:
    80
    К сожалению, не удалось управиться до сих пор. Времени было потрачено не мало, вот досада.
    Если кто-то может управиться с этой задачей и показать мастерство, при этом объяснив, в чем мои ошибкии пишите в пм $.