Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TLS ClientHello fake packet generator #665

Merged
merged 1 commit into from
Oct 6, 2024

Conversation

RknMustDie512
Copy link
Contributor

@RknMustDie512 RknMustDie512 commented Sep 25, 2024

Добавил опцию --fake-with-sni имя_домена, позволяющую генерировать и отправлять фейковый пакет ClientHello с заданным в параметре SNI.
Помогает пробивать некоторые сервера Гугла, если подставлять SNI от незаблокированного гуглового домена.
Избавляет от портянок --fake-from-hex, который некоторые велосипедисты уже даже через PowerShell зачем-то пытаются генерировать полностью случайными, не понимая исходного смысла от этого пакета.
Генерируемый пакет аналогичен по структуре, наборам шифров и расширениям тому, что используется в Firefox 130, потому по фингерпринту заблочить его не получится, не сломав при этом Firefox, случайные поля внутри пакета (Session ID, ключи для DHE, фейковый ECH) генерируются случайно при каждом запуске GoodbyeDPI, не позволяя Роскомнадзору зафингерпринтить их.
С маскировкой под Chrome чуть сложнее, там TLS-расширения перетасовуются в случайном порядке, что усложнит код, потому пока что так.

@ValdikSS
Copy link
Owner

Не уверен, что наличие ECH extension по умолчанию — хорошая идея. Предлагаю убрать ECH, возможно сделав его опциональным дополнительным параметром.
А так — LGTM.

@Decavoid
Copy link

Не уверен, что наличие ECH extension по умолчанию — хорошая идея. Предлагаю убрать ECH, возможно сделав его опциональным дополнительным параметром. А так — LGTM.

Все браузеры (chrome, yandex, edge) отправляют encrypted_client_hello. Если его не отправлять, то ркн сделает фильтр - если нет ech, то дропать.

@ValdikSS
Copy link
Owner

Он отправляется только в том случае, если сайт (домен) поддерживает ECH, коих совсем немного, относительно всех доменов в интернете.
Это довольно нетипичный extension на текущий день.

@Decavoid
Copy link

image
На скрине только assets.msn.com не имеет ech, остальные пакеты имеют ech.

@SagePtr
Copy link

SagePtr commented Sep 26, 2024

Он отправляется только в том случае, если сайт (домен) поддерживает ECH, коих совсем немного, относительно всех доменов в интернете. Это довольно нетипичный extension на текущий день.

На сегодняшний день - типичный, популярная троица современных браузеров (Chrome, Edge, Firefox) отправляет ECH независимо от наличия в DNS-записи и на сервере, остальные браузеры не проверял. Если поддержки со стороны сайта нет - то данные в ECH лепятся от балды. Из статьи с Cloudflare:

While itself just an extension, the risk of ECH exposing (or introducing!) similar bugs is real. To combat this problem, ECH supports a variant of GREASE whose goal is to ensure that all ECH-capable clients produce syntactically equivalent ClientHello messages. In particular, if a client supports ECH but does not have the corresponding ECH configuration, it uses GREASE. Otherwise, it produces a ClientHello with real ECH support. In both cases, the syntax of the ClientHello messages is equivalent.

@Decavoid
Copy link

Скомпилил, проверил, работает (ютуб и другие сайты).
Теперь я могу заменить мой старый длинный конфиг:

goodbyedpi.exe -f 1 -e 1 --set-ttl 4 --reverse-frag --max-payload --fake-from-hex 16030102510100024d0303e8924e8aee2828c2ecf500574594b4e646488ba23933576db19161627739e4cf20509655eebac0de55438dbd77d3e830bdc020e5c7d6c19a6cc706e316ca4704dc00208a8a130113021303c02bc02fc02cc030cca9cca8c013c014009c009d002f0035010001e44a4a0000000b000201000010000e000c02683208687474702f312e3100000013001100000e7777772e676f6f676c652e636f6d446900050003026832002d000201010033002b00290a0a000100001d002087a721c0dc43fca3a41604a1bfcb69b8af4fa17ae5251f1f7cd59e476ecd1a2afe0d011a0000010001770020f7f4ee830f619bcab0a5514be210ce27b9c76a8622d7a0cf8157d8ed55607f7500f09ba8854102d311a652eb3072402b08c85633915eb6bb524d54298e06721cb173921d47333b80c067c404dcfa40ecea993ae2d3f16a2f5ce913a060e6d2f38d4a25229de3a9f76bf9596e51c90ee7cf622862fecdc25745c7fec47210106a3f520c7e5e0cd5b42246c6c38ce17e9d1b257cb249bf498c5b7f1f82a4afc5862ef0ca987429387d3cef472bc0170134bb04ae980c3108db31cb74cd6b1770e82622001464f28f2b4a77281299cab7dbc13cf328df2dc700cdae3937528c251309b57a0082e1695f9d07ca405f24508e9d362cb1d444321d12e7c35be0bb0589a8c5b0d18b15e43a828b1ebdd398fa4c3f3b001b0003020002000500050100000000000a000a00080a0a001d00170018ff01000100002300000017000000120000000d0012001004030804040105030805050108060601002b0007068a8a03040303dada000100 --blacklist ..\russia-blacklist.txt --blacklist ..\russia-youtube.txt

на новый с --fake-with-sni www.google.com, более короткий

goodbyedpi.exe -f 1 -e 1 --set-ttl 4 --reverse-frag --max-payload --fake-with-sni www.google.com --blacklist ..\russia-blacklist.txt --blacklist ..\russia-youtube.txt

@Decavoid
Copy link

goodbyedpi.exe (x86_64) для желающих потестить. Скомпилено в windows с отключенной либой libssp.
Размер: 102400 байт

Хеши файла goodbyedpi.exe:
MD5: C25B01DE6D5471F3B7337122049827F6
SHA-1: 90A8D3C8424D0F391555771AC2F709012A4EC2E1

goodbyedpi-fake-with-sni.zip

@johnnyd-78
Copy link

johnnyd-78 commented Sep 28, 2024

@Decavoid Огромное спасибо!

UPD: Работает отлично, проверил с разными доменами вместо гугла и на разных сайтах с TLS 1.2
Оставил по приколу вместо имя_домена rt.ru ))

@sansergs
Copy link

sansergs commented Sep 28, 2024

@Decavoid спасибо!

Работает, и кстати без дополнительных фейковых пакетов и флагов fake-gen.

@johnnyd-78
Copy link

johnnyd-78 commented Sep 28, 2024

и кстати без дополнительных фейковых пакетов и флагов fake-gen

Проверил. У меня без --fake-gen 3 --fake-resend 2 ютуб отрубился (

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

@sansergs
Copy link

А не, с фейком от гугла заработал

У меня работает и без дополнительных фейковых пакетов, но субъективно в ними всё же лучше. Быстрее начинается воспроизведение роликов и первая подгрузка всего интерфейса сайта.
В любом случае всем спасибо!

@SagePtr
Copy link

SagePtr commented Sep 28, 2024

goodbyedpi.exe (x86_64) для желающих потестить. Скомпилено в windows с отключенной либой libssp. Размер: 102400 байт

Ещё можно напрямую скачать артефакты из автоматического билда, собираемого при каждом пуше и пулреквесте: https://github.com/ValdikSS/GoodbyeDPI/actions/runs/11042716687?pr=665

@johnnyd-78
Copy link

johnnyd-78 commented Sep 28, 2024

У меня работает и без дополнительных фейковых пакетов

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

Если кто без реги на гитхабе и нужна версия х86 - то вот
goodbyedpi_x86_0411a42.zip
Хэши файла goodbyedpi.exe
MD5: A3131EABBF518EC6D8ED6DCA8BF112E6
SHA-1: 47BDDC1050A83BDCA15DC00597537D478576E7CE

WinDivert обновлять не надо - он не менялся.

@RealFoxes
Copy link

RealFoxes commented Sep 28, 2024

Спасибо за PR, без него никакие параметры ранее не работали, как только запустил с такими параметрами заработало
-f 1 -e 1 --set-ttl 4 --reverse-frag --max-payload --fake-with-sni www.google.com
Самара. Билайн

UPD: Работает только с отлюченым Kyber

@TheGallad
Copy link

Confirmed.
Downloaded from artifacts (because goodbyedpi-fake-with-sni.zip) file is detected as malicious by my Chrome browser).
Work with -f 1 -e 1 --set-ttl 4 --reverse-frag --max-payload --fake-with-sni www.google.com
Tested on Rostelecom, Tomsk, Russia.

@johnnyd-78

This comment was marked as off-topic.

@postmasta

This comment was marked as off-topic.

@camelos

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@dudehoptoad

This comment was marked as off-topic.

@dudehoptoad

This comment was marked as off-topic.

@OlMat77

This comment was marked as off-topic.

@sansergs

This comment was marked as off-topic.

@WandererSt

This comment was marked as off-topic.

@sansergs

This comment was marked as off-topic.

@RknMustDie512
Copy link
Contributor Author

RknMustDie512 commented Oct 1, 2024

Но даже если нужен "рандомный" fake-from-hex и по каким-то причинам НЕ подходит сгенеренный --fake-with-sni, то хотя бы первые байты надо НЕ генерить случайно, а оставлять 160301FFFF01FFFFFF0, ну и возможно последние. Чтобы пакет был похож на ClientHello (подробнее тут конечно подскажут, те кто добавлял функционал fake-with-sni и автор).

Это минимальный синтаксически правильный ClientHello с заданным, но пустым SNI. Полностью он выглядит так:
1603010035010000310303[...random 32 bytes...]000000000009000000050003000000
Некоторые поля, обозначающие размер данных после заголовка, по какой-то причине заменены на FF, может быть, из-за того, что они игнорируются DPI, а может быть, каким-то образом его обманывают:
160301FFFF01FFFFFF0303[...random 32 bytes...]000000000009000000050003000000
[...random 32 bytes...] = случайные 32 байта (64 символа [0-9A-F]), в сумме получается 58-байтовый пакет.

@johnnyd-78

This comment was marked as off-topic.

@johnnyd-78 johnnyd-78 mentioned this pull request Oct 1, 2024
Closed
1 task
@SagePtr

This comment was marked as off-topic.

@johnnyd-78
Copy link

johnnyd-78 commented Oct 1, 2024

@sansergs Это не придумалось, это на форуме программы в этой теме пользователем написалось ) А вот и он, кстати. Там же, ближе к концу написано, что сначала идет, что потом. В разных вариациях.

Не нужны, уже несколько дней как. DPI научились этот мусор игнорить и искать SNI за его пределами. И находить. И блокировать. А SNI из --fake-with-sni они пока принимают за реальный, больше ничего не проверяют и пропускают пакет.

Фейк-ген генерирует несколько байтов фейка, 00 - всего один байт. Некоторым этого бывает достаточно. Как уже написали выше - дело в кол-ве пакетов, предшествующих реальному, с реальным SNI (он идет последним в любом случае)
frag-by-sni режет реальный SNI, затрудняя его обнаружение и блокировку. В итоге последний пакет с реальным SNI превращается в 2 пакета.

@johnnyd-78
Copy link

протестил... сработало, страница ютуба открылась почти мгновенно, но загрузка видео 26 секунд

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

@WandererSt

This comment was marked as off-topic.

@sansergs

This comment was marked as off-topic.

@SagePtr

This comment was marked as off-topic.

@iturnes

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@Arondy

This comment was marked as off-topic.

@sansergs

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@sansergs

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@Freeznet59

This comment was marked as off-topic.

@Top0wl

This comment was marked as off-topic.

@OkuuFumo

This comment was marked as off-topic.

@KirLeo

This comment was marked as off-topic.

@dudehoptoad

This comment was marked as off-topic.

@dudehoptoad

This comment was marked as off-topic.

@OkuuFumo

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@SagePtr

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@dudehoptoad

This comment was marked as off-topic.

@johnnyd-78

This comment was marked as off-topic.

@ValdikSS
Copy link
Owner

ValdikSS commented Oct 6, 2024

Выглядит хорошо, работает хорошо, спасибо!

@ValdikSS ValdikSS merged commit 810aef6 into ValdikSS:master Oct 6, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.