LINUX.ORG.RU

Как перехватить сетевые пакеты до их шифрования ?

 ,


0

3

Здравствуйте ! Сразу скажу - я новичок как в линуксе, так и в языке программирования Си. Я решил создать программу, отлавливающая сетевые пакеты, которые будут переданы по протоколу TLS (1.2), и заносить в лог открытый текст (plain text, не зашифрованный). То есть мне надо перехватить данные перед тем, как к ним будет применена функция шифрования. Я подумал, что мне поможет сниффер, решил написать сам (про Wireshark знаю). У меня получилось написать простой сниффер на чистом Си (без использования libpcap), я вижу передаваемые пакеты. В отношении HTTPS, я вижу пакеты с уже зашифрованными данными. Погрязнув в теории несколько недель, внезапно осознал, что таким способом получить пакеты до их шифрования не получится. Сейчас, мысли о решении данной проблемы клонят в сторону махинаций на уровне ядра. Извиняюсь, возможно вопрос очень глупый и я чего-то элементарного не понимаю, но как мне получить программный доступ к процессу, формирующего сетевые пакеты, до их шифрования ? Натолкните на man'ы, либо ссылками на эту тему. Честно говоря, мыслей никаких больше нету. В какую сторону мне копать? Целевая программа будет расположена только на моем компьютере, с правами root'а. Занимаюсь этим в качестве хобби. Желательно, чтобы решение можно было реализовать на чистом Си (любовь у меня с ним). Если поможет, у меня Gentoo GNU/Linux, ядро 3.10, английский знаю хорошо. Буду благодарен любой помощи.



Последнее исправление: cetjs2 (всего исправлений: 1)

Начни с понимания кто, где и когда шифрует.

sdio ★★★★★
()

Погрязнув в теории несколько недель, внезапно осознал, что таким способом получить пакеты до их шифрования не получится.

facepalm

это азы, детка.

мне надо перехватить данные перед тем, как к ним будет применена функция шифрования

NoWay. Это нужно получить права рута, и потом залезть в исходники того, что эти пакеты шифрует. Если тебе надо было несколько недель на изучения алфавита, то свои стихи ты сможешь писать лет через 5. Если будешь стараться конечно.

Удачи.

emulek
()

Сейчас, мысли о решении данной проблемы клонят в сторону махинаций на уровне ядра

Не поможет. TLS работает на уровне ядра, это раз. И на прикладном уровне модели TCP/IP, это два.

Расшифровать перехваченный трафик, даже владея секретными ключами сертификатов — невозможно. Такое свойство протокола называется «совершенная прямая секретность».

Понадобится каким-то образом вытаскивать либо секретные ключи Диффи-Хеллмана из памяти процесса, либо уже готовый ключ шифрования. Собсно, поэтому так все и всполошились из-за heartblead-атаки... Она, по крайней мере теоретически, позволяла как раз вытаскивать эти ключи, ну и секретный ключ сертификата.

Можно сварганить TLS-прокси, но тогда целевую программу нужно «убедить», что сертификат у прокси настоящий.

Но, в твоем случае, все предельно просто: подмени TLS-библиотеку, и будет тебе счастье: программа спокойно будет пихать незашифрованные данные. Но у такого подхода есть и минусы: только основных реализаций TLS — три, OpenSSL, GNUTLS, NSS (Mozilla, Google). Плюс еще, как минимум, пяток неосновных. Плюс еще активно пилимая reSSL, которая скорее всего станет одной из основных.

Macil ★★★★★
()

Примерная схема такова:

1. Если тебе известен закрытый ключ и он постоянный, и не используется forward secrecy (или же если используется forward secrecy, но ты легко можешь вытащить сессионный ключ), то тебе достаточно пассивного MitM. Т.е., просто дампишь пакеты и расшифровываешь. Здесь могут быть нюансы, например, ты должен начать мониторинг пакетов до установления соединения, чтобы отследить handshake и обмен общим секретным ключём. Если же используется ассиметричное шифрование, то таким образом ты сможешь расшифровывать только входящие данные.

2. Если пунк первый не подходит, то тебе надо организовать активный MitM. Почитай про Алису, Боба и Еву. Так вот, тебе нужно стать Евой. Так, чтобы Боб думал, что ты Алиса, а Алиса думала, что ты Боб. И подкинуть им свои подставные ключи. Но здесь могут быть проблемы с электронной подписью ключей (если речь идёт о браузерах, например).

В общем, читай, и задавай свои вопросы.

PreciousProtection
()
Ответ на: комментарий от Macil

Расшифровать перехваченный трафик, даже владея секретными ключами сертификатов — невозможно. Такое свойство протокола называется «совершенная прямая секретность».

Perfect Secrecy не везде используется, это стоит учитывать.

PreciousProtection
()
Ответ на: комментарий от emulek

Это нужно получить права рута

Как я и написал, программа будет выполнятся на моем компьютере с правами рута.

Если тебе надо было несколько недель на изучения алфавита, то свои стихи ты сможешь писать лет через 5

Ничего страшного, я никуда не тороплюсь.

thatskiptkid
() автор топика
Ответ на: комментарий от PreciousProtection

Если пунк первый не подходит, то тебе надо организовать активный MitM.

Получается, как тут писали выше (и мысли первоначально у меня были такие же) локальный MITM?

Понадобится каким-то образом вытаскивать либо секретные ключи Диффи-Хеллмана из памяти процесса, либо уже готовый ключ шифрования.

Мне больше это решение нравится, но куда копать конкретно что-то не понял.

thatskiptkid
() автор топика
Ответ на: комментарий от thatskiptkid

Как я и написал, программа будет выполнятся на моем компьютере с правами рута

Ну так пропатчи все библиотеки на своём компе и всё.

monk ★★★★★
()

Нужно через LD_PRELOAD подменять обёртками соответствующие библиотечные ф-ии приложения с нужным кодом записи, либо сразу их патчить нужными хуками. TLS вероятно готовится OpenSSLем

mashina ★★★★★
()

Сейчас, мысли о решении данной проблемы клонят в сторону махинаций на уровне ядра.

при чём тут вообще ядро? Шифрование внутри процесса происходит обычно. Берешь библиотеку TLS протокола, например OpenSSL, модифицируешь исходники, чтоб она перед шифрованием шифруемые данные куда-нибудь в файлик скидывала, и подменяешь системные библиотеки своей версией, после этого все программы, которые динамически с ней линкуются, будут выдавать свои данные. Это всё естественно только к локальным процессам применимо

Harald ★★★★★
()
Ответ на: комментарий от Harald

Ведь существует возможность сделать это без подмены/патчинга/собственной реализации либ ? Такие способы меня и заинтересовали. PreciousProtection и Macil дали мне хорошую наводку.

thatskiptkid
() автор топика
Ответ на: комментарий от thatskiptkid

Внутрь процесса всё равно лезть надо, неважно каким способом. Можно запускать процесс под отладчиком и отслеживать вызовы функций вроде SSL_write из OpenSSL и копировать передаваемые данные. Но для этого нужно знать, какие функции используются, т.е. знать основные TLS либы нужно

Harald ★★★★★
()
Ответ на: комментарий от thatskiptkid

ну наверное openssl более популярна, но там во всех либах по большому счёту 1-2 функции перехватывать надо, не больше

Harald ★★★★★
()
Ответ на: комментарий от Macil

Расшифровать перехваченный трафик, даже владея секретными ключами сертификатов — невозможно.

не совсем так. Владея ключом сертификата — невозможно расшифровать трафик, но можно осуществить подмену сервера. А вот владея ключом _клиента_ можно расшифровать трафик.

emulek
()
Ответ на: комментарий от thatskiptkid

Как я и написал, программа будет выполнятся на моем компьютере с правами рута.

тогда зачем тебе расшифровывать пакеты, если проще получить доступ к памяти процесса, и украсть информацию ДО того, как она будет зашифрована?

emulek
()
Ответ на: комментарий от thatskiptkid

существует возможность сделать это без подмены/патчинга/собственной реализации либ?

да. Но нужно ломать приложение, которое это всё отправляет. Т.е. происходит всё так:

1. создаётся массив байтов, который содержит сообщение

2. этот массив отправляется в библиотечную функцию (вот здесь посмотри: https://www.openssl.org/docs/crypto/crypto.html )

3. результат отправляется в Сеть

Получить данные ты можешь либо в (2) (хуком либы), либо в (1) (локально, имея права рута). В (3) делать тебе нечего.

emulek
()
Ответ на: комментарий от emulek

получить доступ к памяти процесса, и украсть информацию ДО того, как она будет зашифрована

Вот именно этим я и займусь скорей всего.

Но нужно ломать приложение, которое это всё отправляет. Т.е. происходит всё так:

Спасибо ! Изучу, опробую, звучит интересно.

thatskiptkid
() автор топика
Ответ на: комментарий от thatskiptkid

А ключи из памяти процесса реально ведь стянуть?

реально.

emulek
()
Ответ на: комментарий от anonymous

по существу как всегда тебе сказать нечего. Почему я не удивлён?

emulek
()
Ответ на: комментарий от thatskiptkid

Macil дали мне хорошую наводку

Ага, блин. Только вот забыл поставить «не» в нужном месте!

TLS не работает на уровне ядра, работает на уровне пользователя, т.е. любые махинации с ядром бесполезны.

И ведь никто не поправил... :(

Macil ★★★★★
()
Ответ на: комментарий от Macil

Все-таки я решил остановиться на перехвате библиотечных вызовов с помощью LD_PRELOAD.

thatskiptkid
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.