Torsten
Опытный user
- Регистрация
- 7 Ноя 2021
- Сообщения
- 961
- Реакции
- 114
ввиду того, что так называемая россия - страна свободная и демократическая, в ней практикуются блокировки vpn протоколов
а нам с вами, как свободным людям, приходится им противостоять
поэтому в этой статье мы рассмотрим обфускацию wireguard трафика самым примитивным способом
великий китайский, конечно, обойти так не выйдет, там нужен кардинально иной подход, но для ркн сие действо в самый раз
примечание
так как живу я не в россии, гарантировать работоспособность чего-либо не могу
однако, на момент написания статьи, текущая реализация была проверена на нескольких подопытных кроликах с разными провайдерами
стоит отметить, что статья написана из под линуксов и применима только к ним. ещё, возможно, к семейству bsd
что там у других фашистсих ос - я не знаю. и знать не хочу
самодельная обфускация wireguard была выбрана по двум причинам:
во-первых он быстрее и легковеснее, нежели что-то сфокусированное на обходе блокировок
во-вторых это полноценный vpn, со всеми его преимуществами
анатомия блокировок
многие наслышаны о технологии dpi - глубокого анализа пакетов
без её использования блокировки достаточно просты, например блокировки доменов по dns - подмена настоящего ip-адреса сайта на подконтрольных правительству dns-серверах, либо же блокировки по ip
но уже с её использованием, просторы становятся безграничными - с трафиком можно делать всё, на что хватит фантазии и здравого смысла:
начиная подменой ответа уже от неподконтрольных dns-серверов, заканчивая выборочной блокировкой сессий, на основе анализа зашифрованных данных нейронной сетью и подтверждения догадок ии попытками установить соеденение
любые блокировки протоколов выше транспортных по модели osi относятся ко второй категории, включая наш wireguard
перейдем к практике
расписывать как поднимать wireguard пару не буду, статья у нас не об этом
запускаем wireshark, будем смотреть трафик и думать о возможных способах выявления нашего протокола
думать, в общем-то, долго не пришлось - сразу видим фиксированный размер пакета инициации хендшейка, 4 одинаковых байта в начале, криптоданные в середине и 16 нулей в конце
что-ж, с этим разобрались. самое тривиальное решение - обфусцировать весь наш wireguard трафик, чем мы и займемся
патчить будем wireguard-go, в кернелспейс без должной сноровки лезть очень опасно, к тому же компиляция этого добра - удовольствие сомнительное
добываем исходники:
git clone --depth 1 https://git.zx2c4.com/wireguard-go
сейчас наша задача - найти две функции, через которые идет вся отправка и получение данных, дабы в дальнейшем встроить туда обфускацию
если над архитектурой программы поработал хоть сколько-то смыслящий в этом деле человек - такие функции должны найтись
и правда! после нехитрых манипуляций с грепом нашлись SendBuffers в device/peer.go для отправки и RoutineReceiveIncoming в device/receive.go для получения
добавим в них вызовы к нашим, пока еще не созданным, функциям, передав буффер:
теперь самое интересное - обфускация. создаем файл device/obfuscation.go, пишем туда её логику, например банальный xor по ключу
здесь может быть все что угодно, абсолютно любой поточный шифр
компилируем:
go build
вуаля! в итоге получаем непонятный для dpi протокол. wireshark, разумеется, тоже распознать ничего не может
обмен пакетами идет, пиры друг друга понимают:
такие махинации можно провернуть с любым другим протоколом, если исходный код его реализации есть в открытом доступе
а нам с вами, как свободным людям, приходится им противостоять
поэтому в этой статье мы рассмотрим обфускацию wireguard трафика самым примитивным способом
великий китайский, конечно, обойти так не выйдет, там нужен кардинально иной подход, но для ркн сие действо в самый раз
примечание
так как живу я не в россии, гарантировать работоспособность чего-либо не могу
однако, на момент написания статьи, текущая реализация была проверена на нескольких подопытных кроликах с разными провайдерами
стоит отметить, что статья написана из под линуксов и применима только к ним. ещё, возможно, к семейству bsd
что там у других фашистсих ос - я не знаю. и знать не хочу
самодельная обфускация wireguard была выбрана по двум причинам:
во-первых он быстрее и легковеснее, нежели что-то сфокусированное на обходе блокировок
во-вторых это полноценный vpn, со всеми его преимуществами
анатомия блокировок
многие наслышаны о технологии dpi - глубокого анализа пакетов
без её использования блокировки достаточно просты, например блокировки доменов по dns - подмена настоящего ip-адреса сайта на подконтрольных правительству dns-серверах, либо же блокировки по ip
но уже с её использованием, просторы становятся безграничными - с трафиком можно делать всё, на что хватит фантазии и здравого смысла:
начиная подменой ответа уже от неподконтрольных dns-серверов, заканчивая выборочной блокировкой сессий, на основе анализа зашифрованных данных нейронной сетью и подтверждения догадок ии попытками установить соеденение
любые блокировки протоколов выше транспортных по модели osi относятся ко второй категории, включая наш wireguard
перейдем к практике
расписывать как поднимать wireguard пару не буду, статья у нас не об этом
запускаем wireshark, будем смотреть трафик и думать о возможных способах выявления нашего протокола
думать, в общем-то, долго не пришлось - сразу видим фиксированный размер пакета инициации хендшейка, 4 одинаковых байта в начале, криптоданные в середине и 16 нулей в конце
что-ж, с этим разобрались. самое тривиальное решение - обфусцировать весь наш wireguard трафик, чем мы и займемся
патчить будем wireguard-go, в кернелспейс без должной сноровки лезть очень опасно, к тому же компиляция этого добра - удовольствие сомнительное
добываем исходники:
git clone --depth 1 https://git.zx2c4.com/wireguard-go
сейчас наша задача - найти две функции, через которые идет вся отправка и получение данных, дабы в дальнейшем встроить туда обфускацию
если над архитектурой программы поработал хоть сколько-то смыслящий в этом деле человек - такие функции должны найтись
и правда! после нехитрых манипуляций с грепом нашлись SendBuffers в device/peer.go для отправки и RoutineReceiveIncoming в device/receive.go для получения
добавим в них вызовы к нашим, пока еще не созданным, функциям, передав буффер:
теперь самое интересное - обфускация. создаем файл device/obfuscation.go, пишем туда её логику, например банальный xor по ключу
здесь может быть все что угодно, абсолютно любой поточный шифр
компилируем:
go build
вуаля! в итоге получаем непонятный для dpi протокол. wireshark, разумеется, тоже распознать ничего не может
обмен пакетами идет, пиры друг друга понимают:
такие махинации можно провернуть с любым другим протоколом, если исходный код его реализации есть в открытом доступе