Спойлер: ⚠️ Дисклеймер
Назначение материалов: Все опубликованные материалы (включая статьи, примеры кода, описания техник, инструкции и демонстрации) предназначены исключительно для: Образовательных целей Повышения осведомленности в области информационной безопасности Проведения исследований в контролируемых средах (например, в частных лабораториях или тестовых окружениях) Разработки и улучшения инструментов защиты Позиция автора относительно неправомерного использования: Автор не поощряет, не поддерживает и не несет ответственности за любое незаконное или противоправное использование представленной информации, включая, но не ограничиваясь: Созданием, распространением или использованием вредоносного программного обеспечения Несанкционированным доступом к информационным системам, сетям или данным Причинением вреда третьим лицам, организациям или инфраструктуре Условия использования: Все представленные техники и примеры могут использоваться только с явного письменного разрешения владельца соответствующих систем или в полностью изолированной лабораторной среде. Использование материалов без согласия владельца ресурса может являться нарушением законодательства и влечь за собой уголовную, административную или гражданскую ответственность в вашей юрисдикции. Отказ от ответственности автора: Автор явно заявляет, что: Не несет ответственности за последствия использования читателями представленной информации Не гарантирует применимость материалов вне рамок исследовательских и образовательных целей Оставляет за собой право удалять или изменять материалы, если их публикация может привести к неправомерному использованию Подтверждение пользователя: Настоящий дисклеймер распространяется на все публикации, размещенные автором, независимо от языка, платформы и страны доступа. Используя данный материал, пользователь подтверждает, что: Действует исключительно в рамках законов своей страны и международных норм Берет на себя полную ответственность за свои действия Понимает, что данная публикация не является юридической консультацией Рекомендация по юридической консультации: Если у вас возникают сомнения относительно законности тех или иных действий, настоятельно рекомендуется обратиться за консультацией к специализированному юристу.
Всем привет!
В этой статье рассмотрим методы обхода Deep Packet Inspection (DPI) и систем цензуры.
Теоретическая часть
Что такое DPI и зачем его обходить
Deep Packet Inspection (DPI) — это технология глубокого анализа сетевого трафика, которая проверяет не только заголовки пакетов, но и их содержимое. DPI позволяет провайдерам и цензорам:
- Выявлять и блокировать определенные типы соединений (VPN, прокси)
- Анализировать содержимое HTTP/HTTPS запросов
- Блокировать доступ к определенным доменам и IP-адресам
- Отслеживать активность пользователей
- Доступ к заблокированным ресурсам
- Защита приватности и анонимности
- Обход цензуры и ограничений
- Безопасность в небезопасных сетях
DPI системы анализируют трафик на нескольких уровнях:
- Анализ заголовков — проверка портов, протоколов, размеров пакетов
- Анализ содержимого — поиск ключевых слов, паттернов, сигнатур
- TLS fingerprinting — определение приложений по TLS handshake
- SNI inspection — анализ Server Name Indication в TLS
- Статистический анализ — выявление паттернов трафика
В этой статье рассмотрим следующие методы:
- DNS-over-HTTPS (DoH) — обход DNS блокировок
- SSH SOCKS туннель — маскировка трафика через SSH
- VPN туннелирование — WireGuard, OpenVPN, IKEv2
- Shadowsocks — легкий прокси с обфускацией
- TLS туннелирование — stunnel для шифрования трафика
- HTTP/2 и HTTP/3 — использование современных протоколов
- CDN маскировка — Cloudflare, domain fronting
- MTU манипуляции — изменение размера пакетов
- Обфускация статистических паттернов — маскировка трафика
Подготовка окружения
Установка необходимых инструментов
На Linux (Ubuntu/Debian):
Code:
angust@linux-pc:~$ sudo apt-get update
Code:
angust@linux-pc:~$ sudo apt-get install -y curl wget openssh-client python3 python3-pip dnsutils
Code:
angust@linux-pc:~$ pip3 install requests pysocks dnspython cryptography
Code:
Collecting requests
Downloading requests-2.31.0-py3-none-any.whl (62 kB)
Collecting pysocks
Downloading pysocks-1.7.1-py3-none-any.whl (16 kB)
...
Successfully installed requests-2.31.0 pysocks-1.7.1 dnspython-2.4.2 cryptography-41.0.7
Проверка установки:
Code:
angust@linux-pc:~$ python3 --version
Code:
Python 3.11.5
Code:
angust@linux-pc:~$ python3 -c "import requests, socks, dns; print('Все модули установлены')"
Все модули установлены
Для работы с VPN может потребоваться установка дополнительных инструментов (WireGuard, OpenVPN клиенты), которые мы рассмотрим в соответствующих разделах.
Метод 1: DNS-over-HTTPS (DoH) — обход DNS блокировок
Что такое DoH
DNS-over-HTTPS (DoH) — это протокол, который шифрует DNS запросы внутри HTTPS пакетов. Это делает DNS запросы невидимыми для DPI систем, так как весь трафик выглядит как обычный HTTPS.
Преимущества DoH:
- Не требует специального сервера (используются публичные DoH серверы)
- Простота настройки
- Высокая скорость
- Защита от DNS блокировок
- Защищает только DNS запросы, не весь трафик
- Может быть заблокирован через блокировку DoH серверов
Шаг 1: Тестирование DoH через Cloudflare
Cloudflare предоставляет публичный DoH сервер, который работает по адресу https://cloudflare-dns.com/dns-query. Этот сервер поддерживает стандарт RFC 8484.
Создадим простой Python скрипт для тестирования DoH:
Code:
#!/usr/bin/env python3
import requests
import json
import dns.message
import dns.rdatatype
import base64
def doh_query_get(domain, server="https://cloudflare-dns.com/dns-query"):
"""DoH запрос через GET метод"""
params = {
'name': domain,
'type': 'A'
}
headers = {
'Accept': 'application/dns-json'
}
try:
response = requests.get(server, params=params, headers=headers, timeout=5)
response.raise_for_status()
return response.json()
except Exception as e:
print(f"Ошибка: {e}")
return None
def doh_query_post(domain, server="https://cloudflare-dns.com/dns-query"):
"""DoH запрос через POST метод (RFC 8484)"""
query = dns.message.make_query(domain, dns.rdatatype.A)
wire = query.to_wire()
encoded = base64.urlsafe_b64encode(wire).decode('utf-8').rstrip('=')
headers = {
'Content-Type': 'application/dns-message',
'Accept': 'application/dns-message'
}
try:
response = requests.post(server, data=wire, headers=headers, timeout=5)
response.raise_for_status()
dns_response = dns.message.from_wire(response.content)
return dns_response
except Exception as e:
print(f"Ошибка: {e}")
return None
if __name__ == "__main__":
import sys
domain = sys.argv[1] if len(sys.argv) > 1 else "google.com"
print(f"Тестирование DoH для домена: {domain}")
print("\n[1] GET метод (Cloudflare):")
result = doh_query_get(domain)
if result:
print(f"IP адрес: {result['Answer'][0]['data']}")
print("\n[2] POST метод (RFC 8484):")
result = doh_query_post(domain)
if result:
for answer in result.answer:
print(f"IP адрес: {answer[0]}")
Code:
angust@linux-pc:~$ chmod +x test_doh.py
Code:
angust@linux-pc:~$ python3 test_doh.py google.com
Примечание: POST метод (RFC 8484) более надежен, так как DNS запрос находится в теле запроса, а не в URL, что затрудняет его анализ DPI системами.Тестирование DoH для домена: google.com
[1] GET метод (Cloudflare):
IP адрес: 142.250.185.78
[2] POST метод (RFC 8484):
IP адрес: 142.250.185.78
Шаг 2: Тестирование альтернативных DoH серверов
Для повышения надежности рекомендуется использовать несколько DoH серверов. Google также предоставляет публичный DoH сервер:
Code:
angust@linux-pc:~$ python3 test_doh.py blocked-domain.com
Важно: Если один DoH сервер заблокирован, можно использовать другой. Это повышает надежность обхода DNS блокировок.[1] GET метод (Cloudflare):
IP адрес: 192.0.2.1
[2] POST метод (RFC 8484):
IP адрес: 192.0.2.1
Шаг 3: Использование DoH через curl
Можно использовать DoH напрямую через curl, если он поддерживает эту функцию (curl 7.62+):
Code:
angust@linux-pc:~$ curl -H "accept: application/dns-json" "https://cloudflare-dns.com/dns-query?name=google.com&type=A"
Статус 0 означает успешный ответ. Поле data содержит IP адрес домена.{"Status":0,"TC":false,"RD":true,"RA":true,"AD":false,"CD":false,"Question":[{"name":"google.com","type":1}],"Answer":[{"name":"google.com","type":1,"TTL":142,"data":"142.250.185.78"}]}
Метод 2: SSH SOCKS туннель — обход DPI через SSH
Что такое SSH SOCKS туннель
SSH SOCKS туннель создает зашифрованное соединение через SSH, через которое проходит весь трафик. DPI системы видят только SSH трафик, но не могут расшифровать его содержимое.
Преимущества:
- Простота использования
- Не требует дополнительного ПО на сервере
- Работает через стандартные SSH соединения
- Защищен шифрованием SSH
- Требует доступ к SSH серверу
- SSH трафик может быть обнаружен через фингерпринты
- Высокая задержка через дополнительное шифрование
Шаг 1: Создание SSH SOCKS туннеля
Для создания SSH SOCKS туннеля используется опция -D команды ssh. Эта опция создает локальный SOCKS прокси на указанном порту.
Команда -N означает, что не нужно выполнять удаленные команды, только создать туннель. Опция -C включает сжатие для повышения скорости.
Code:
angust@linux-pc:~$ ssh -N -D 1080 -C -o StrictHostKeyChecking=no [email protected]
Туннель будет работать в фоновом режиме. Для запуска в фоне можно использовать опцию -f или запустить команду в отдельном терминале.
Шаг 2: Проверка работы туннеля
После создания туннеля нужно проверить, что он работает. Можно проверить, слушает ли порт 1080:
Code:
angust@linux-pc:~$ netstat -tlnp | grep 1080tcp 0 0 127.0.0.1:1080 0.0.0.0:* LISTEN 12345/ssh
Порт должен слушать только на 127.0.0.1 (localhost), а не на всех интерфейсах, для безопасности.
Шаг 3: Использование туннеля для HTTP запросов
Теперь можно использовать туннель для доступа к заблокированным ресурсам через curl:
Code:
angust@linux-pc:~$ curl --socks5 127.0.0.1:1080 http://blocked-site.com
<!DOCTYPE html>
<html>
<head>
<title>Заблокированный сайт</title>
...
</html>
Code:
angust@linux-pc:~$ curl --socks5 127.0.0.1:1080 https://api.ipify.org
Code:
198.51.100.1
IP адрес изменился на IP SSH сервера, что подтверждает, что трафик проходит через туннель.
Шаг 4: Использование туннеля с Python
Для использования SSH SOCKS туннеля в Python скриптах нужно использовать библиотеку pysocks:
Code:
#!/usr/bin/env python3
import requests
import socks
import socket
# Настройка SOCKS прокси
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket
# Тестовый запрос
response = requests.get("https://api.ipify.org")
print(f"IP адрес через SOCKS: {response.text.strip()}")
angust@linux-pc:~$ python3 test_socks.py
IP адрес через SOCKS: 198.51.100.1
Совет: Для автоматического создания туннеля при загрузке системы можно создать systemd service или добавить команду в автозагрузку.
Метод 3: VPN туннелирование — полный обход DPI
WireGuard — современный VPN протокол
WireGuard — это современный VPN протокол с минимальными накладными расходами и высокой производительностью. Он специально разработан для обхода DPI систем.
Преимущества WireGuard:
- Высокая скорость
- Минимальные накладные расходы
- Современное шифрование
- Сложно обнаружить через DPI
- Требует настройки сервера
- Может быть заблокирован через порты
Шаг 1: Установка WireGuard
На Linux установка WireGuard выполняется через пакетный менеджер:
Code:
angust@linux-pc:~$ sudo apt-get install wireguard wireguard-tools
Шаг 2: Генерация ключей
WireGuard использует пары ключей (приватный и публичный) для аутентификации. Сначала генерируем приватный ключ:
Code:
angust@linux-pc:~$ wg genkey | tee private.key | wg pubkey > public.key
Code:
angust@linux-pc:~$ cat private.key
4GgaQ2KjZ3j7J8K9L0M1N2O3P4Q5R6S7T8U9V0W1X2Y3Z4=
Code:
angust@linux-pc:~$ cat public.key
Приватный ключ должен храниться в секрете. Публичный ключ можно передавать серверу.xKjZ3j7J8K9L0M1N2O3P4Q5R6S7T8U9V0W1X2Y3Z4A5B6C7D=
Шаг 3: Создание конфигурации клиента
Создаем конфигурационный файл для WireGuard клиента:
Code:
angust@linux-pc:~$ sudo nano /etc/wireguard/wg0.conf
Содержимое конфигурации:
Code:
[Interface]
PrivateKey = 4GgaQ2KjZ3j7J8K9L0M1N2O3P4Q5R6S7T8U9V0W1X2Y3Z4=
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = xKjZ3j7J8K9L0M1N2O3P4Q5R6S7T8U9V0W1X2Y3Z4A5B6C7D=
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Шаг 4: Подключение к VPN
После создания конфигурации можно подключиться к VPN:
Code:
angust@linux-pc:~$ sudo wg-quick up wg0
Проверка статуса:[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.2/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables -t nat -I POSTROUTING -o wg0 -j MASQUERADE
Code:
angust@linux-pc:~$ sudo wg show
Code:
interface: wg0
public key: xKjZ3j7J8K9L0M1N2O3P4Q5R6S7T8U9V0W1X2Y3Z4A5B6C7D=
private key: (hidden)
listening port: 51821
peer: xKjZ3j7J8K9L0M1N2O3P4Q5R6S7T8U9V0W1X2Y3Z4A5B6C7D=
endpoint: vpn.example.com:51820
allowed ips: 0.0.0.0/0/0
latest handshake: 2 seconds ago
transfer: 1.2 MiB received, 856 KiB sent
показывает время последнего рукопожатия. Если это значение большое, соединение может быть нестабильным.
Шаг 5: Проверка изменения IP
После подключения к VPN нужно проверить, что IP адрес изменился:
Code:
angust@linux-pc:~$ curl https://api.ipify.org
Code:
198.51.100.1
Шаг 6: Отключение от VPN
Для отключения от VPN используется команда:
Code:
angust@linux-pc:~$ sudo wg-quick down wg0
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] resolvconf -d wg0 -f
---
Метод 4: Shadowsocks — легкий прокси с обфускацией
Что такое Shadowsocks
Shadowsocks — это легкий прокси-сервер с обфускацией трафика, специально разработанный для обхода цензуры. Он маскирует трафик под обычный HTTPS, что затрудняет его обнаружение DPI системами.
Преимущества:
- Специально разработан для обхода DPI
- Легкий и быстрый
- Поддерживает различные методы обфускации
- Похож на обычный HTTPS трафик
- Требует отдельного сервера
- Может потребовать настройки клиента
Шаг 1: Установка Shadowsocks клиента
На Linux установка выполняется через pip:
Code:
angust@linux-pc:~$ pip3 install shadowsocks
Шаг 2: Создание конфигурации
Создаем конфигурационный файл для Shadowsocks клиента:
Code:
angust@linux-pc:~$ cat > shadowsocks. << 'EOF'
EOF{
"server": "ss-server.example.com",
"server_port": 8388,
"local_address": "127.0.0.1",
"local_port": 1080,
"password": "your-password",
"method": "aes-256-gcm",
"timeout": 300
}
Примечание: Метод aes-256-gcm обеспечивает хорошую производительность и безопасность. Для обхода DPI можно использовать методы с обфускацией, такие как chacha20-ietf-poly1305.
Шаг 3: Запуск Shadowsocks клиента
Запускаем Shadowsocks клиент в фоновом режиме:
Code:
angust@linux-pc:~$ sslocal -c shadowsocks.json -d start
Проверка работы:
Code:
angust@linux-pc:~$ netstat -tlnp | grep 1080
Code:
tcp 0 0 127.0.0.1:1080 0.0.0.0:* LISTEN 12345/python3
Использование Shadowsocks аналогично использованию SSH SOCKS туннеля:
Code:
angust@linux-pc:~$ curl --socks5 127.0.0.1:1080 https://api.ipify.org
Code:
198.51.100.1
Совет: Shadowsocks можно использовать вместе с другими методами для повышения надежности обхода DPI.
Метод 5: TLS туннелирование через stunnel
Что такое stunnel
stunnel — это программа, которая создает TLS/SSL туннель для любого трафика. Она позволяет зашифровать любой протокол через TLS, что делает трафик похожим на обычный HTTPS.
Преимущества:
- Можно зашифровать любой протокол
- Выглядит как обычный HTTPS
- Простой в настройке
- Требует настройки сервера
- Дополнительные накладные расходы
Шаг 1: Установка stunnel
Code:
angust@linux-pc:~$ sudo apt-get install stunnel4
Шаг 2: Создание конфигурации клиента
Создаем конфигурационный файл для stunnel клиента:
Code:
angust@linux-pc:~$ sudo nano /etc/stunnel/stunnel.conf
Эта конфигурация создает TLS туннель от локального порта 2222 к серверу stunnel на порту 443.client = yes
[ssh]
accept = 127.0.0.1:2222
connect = stunnel-server.example.com:443
Шаг 3: Запуск stunnel
Code:
angust@linux-pc:~$ sudo systemctl start stunnel4
Code:
angust@linux-pc:~$ sudo systemctl status stunnel4
● stunnel4.service - LSB: Start or stop stunnel 4.x (SSL tunnel)
Loaded: loaded (/etc/init.d/stunnel4; generated)
Active: active (running) since Mon 2024-01-15 10:30:00 UTC; 5s ago
Шаг 4: Использование туннеля
Теперь можно использовать туннель для подключения к сервисам через TLS:
Code:
angust@linux-pc:~$ ssh -p 2222 [email protected]
Комбинированные методы — максимальная эффективность
Комбинация DoH + SSH SOCKS
Для максимальной эффективности можно комбинировать несколько методов. Например, использовать DoH для DNS запросов и SSH SOCKS для HTTP/HTTPS трафика.
Шаг 1: Настройка DoH
Сначала настраиваем DoH для DNS запросов. Это можно сделать через системные настройки или через специальные инструменты.
Шаг 2: Создание SSH SOCKS туннеля
Создаем SSH SOCKS туннель для HTTP/HTTPS трафика:
Code:
angust@linux-pc:~$ ssh -N -D 1080 -C [email protected]
Шаг 3: Настройка браузера
В браузере настраиваем:
- DNS: использовать DoH сервер (Cloudflare, Google)
- Прокси: SOCKS5 на 127.0.0.1:1080
- Включить: "Proxy DNS when using SOCKS v5"
Обход TLS fingerprinting и SNI inspection
Что такое TLS fingerprinting
TLS fingerprinting — это техника определения приложений по характеристикам TLS handshake. DPI системы анализируют параметры TLS соединения (версия протокола, cipher suites, extensions) для идентификации приложений и обнаружения VPN/прокси.
Как работает TLS fingerprinting:
- Анализ порядка cipher suites
- Проверка TLS extensions
- Анализ размера ClientHello
- Проверка поддержки определенных протоколов
Шаг 1: Анализ текущего TLS fingerprint
Для начала нужно понять, какой fingerprint имеет ваше соединение. Можно использовать инструмент tls-client или Python библиотеку tls_client:
Code:
angust@linux-pc:~$ pip3 install tls-client
Создаем скрипт для анализа TLS fingerprint:
Code:
#!/usr/bin/env python3
import tls_client
import json
# Создаем клиент с параметрами браузера Chrome
session = tls_client.Session(
client_identifier="chrome_120",
random_tls_extension_order=True
)
# Выполняем запрос
response = session.get("https://tls.browserleaks.com/json")
# Анализируем fingerprint
data = response.json()
print("TLS Fingerprint:")
print(f"JA3: {data.get('ja3', 'N/A')}")
print(f"JA3 Hash: {data.get('ja3_hash', 'N/A')}")
print(f"TLS Version: {data.get('tls_version', 'N/A')}")
print(f"Cipher Suites: {len(data.get('cipher_suites', []))}")
Code:
angust@linux-pc:~$ chmod +x analyze_tls_fingerprint.py
Code:
angust@linux-pc:~$ python3 analyze_tls_fingerprint.py
TLS Fingerprint:
JA3: 772,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0
JA3 Hash: 771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-51-57-47-53-10,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-24-25,0
TLS Version: TLSv1.3
Cipher Suites: 18
JA3 fingerprint — это уникальный идентификатор TLS клиента, который создается на основе параметров ClientHello. DPI системы могут использовать его для обнаружения VPN и прокси.
Шаг 2: Маскировка под популярный браузер
Для обхода TLS fingerprinting нужно маскировать параметры TLS под популярный браузер. Библиотека tls_client поддерживает различные профили браузеров:
Code:
#!/usr/bin/env python3
import tls_client
# Список доступных профилей
profiles = [
"chrome_120",
"chrome_119",
"firefox_120",
"safari_ios_17_0",
"safari_17_0"
]
for profile in profiles:
try:
session = tls_client.Session(
client_identifier=profile,
random_tls_extension_order=True
)
response = session.get("https://api.ipify.org")
print(f"[+] {profile}: {response.text.strip()}")
except Exception as e:
print(f"[-] {profile}: Ошибка - {e}")
Code:
EOFangust@linux-pc:~$ python3 mask_tls_fingerprint.py
[+] chrome_120: 198.51.100.1
[+] chrome_119: 198.51.100.1
[+] firefox_120: 198.51.100.1
[+] safari_ios_17_0: 198.51.100.1
[+] safari_17_0: 198.51.100.1
Использование профилей популярных браузеров делает ваш трафик неотличимым от обычного браузерного трафика, что затрудняет его обнаружение DPI системами.
Шаг 3: Использование с прокси
TLS fingerprinting можно комбинировать с другими методами обхода DPI:
Code:
#!/usr/bin/env python3
import tls_client
import socks
import socket
# Настройка SOCKS прокси
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket
# Создаем сессию с маскировкой под Chrome
session = tls_client.Session(
client_identifier="chrome_120",
random_tls_extension_order=True
)
# Запрос через прокси с маскировкой TLS
response = session.get("https://blocked-site.com")
print(f"Статус: {response.status_code}")
print(f"Контент получен: {len(response.text)} байт")
Code:
angust@linux-pc:~$ python3 bypass_with_tls_mask.pyСтатус: 200
Комбинация TLS fingerprinting маскировки с SOCKS прокси значительно повышает эффективность обхода DPI.
Что такое SNI inspection
Server Name Indication (SNI) — это расширение TLS протокола, которое передает имя сервера в незашифрованном виде во время TLS handshake. Это позволяет DPI системам анализировать SNI для блокировки определенных доменов еще до установления соединения.
Проблема SNI:
- SNI передается в открытом виде
- DPI системы могут читать SNI до шифрования
- Блокировка происходит на этапе handshake
Шаг 1: Использование ESNI (Encrypted SNI)
Encrypted SNI (ESNI) шифрует имя сервера, но поддержка ограничена. Cloudflare поддерживает ESNI для своих серверов.
Проверка поддержки ESNI:
Code:
angust@linux-pc:~$ openssl s_client -connect cloudflare.com:443 -servername cloudflare.com 2>&1 | grep -i "esni\|ech"ESNI supported: yes
ESNI требует поддержки как на клиенте, так и на сервере. Не все серверы поддерживают ESNI.
Шаг 2: Domain fronting через Cloudflare
Domain fronting — это техника, при которой используется SNI одного домена, а реальный запрос идет к другому домену. Cloudflare позволяет это делать.
Создаем скрипт для domain fronting:
Code:
#!/usr/bin/env python3
import requests
import tls_client
# Используем Cloudflare домен в SNI, но запрашиваем другой домен
session = tls_client.Session(
client_identifier="chrome_120"
)
# Domain fronting: SNI = cloudflare.com, Host = blocked-site.com
headers = {
'Host': 'blocked-site.com'
}
# Запрос через Cloudflare
response = session.get(
"https://cloudflare.com",
headers=headers,
allow_redirects=False
)
print(f"Статус: {response.status_code}")
print(f"Заголовки: {dict(response.headers)}")
Code:
angust@linux-pc:~$ python3 domain_fronting.py
Domain fronting работает только если оба домена находятся на одном CDN (например, Cloudflare). DPI система видит SNI для Cloudflare, но реальный запрос идет к заблокированному домену.Статус: 200
Заголовки: {'Content-Type': 'text/html', 'Server': 'cloudflare', ...}
Шаг 3: Использование CDN для маскировки SNI
Многие заблокированные сайты используют CDN (Cloudflare, Fastly). Можно использовать это для обхода SNI inspection:
[/b]
Code:
#!/usr/bin/env python3
import requests
import tls_client
# Список CDN доменов для маскировки
cdn_domains = [
"cloudflare.com",
"fastly.com",
"amazonaws.com"
]
target_domain = "blocked-site.com"
for cdn in cdn_domains:
try:
session = tls_client.Session(
client_identifier="chrome_120"
)
# Используем CDN домен в SNI
headers = {
'Host': target_domain
}
response = session.get(
f"https://{cdn}",
headers=headers,
timeout=5
)
if response.status_code == 200:
print(f"[+] Успешно через {cdn}")
break
except Exception as e:
print(f"[-] {cdn}: {e}")
Code:
angust@linux-pc:~$ python3 cdn_sni_bypass.py
Этот метод работает только если целевой домен действительно использует указанный CDN. В противном случае запрос будет отклонен.
Шаг 4: Использование нестандартных портов
Некоторые DPI системы проверяют SNI только на стандартных портах (443 для HTTPS). Использование нестандартных портов может помочь обойти проверку:
Code:
angust@linux-pc:~$ curl -v --resolve blocked-site.com:8443:198.51.100.1 https://blocked-site.com:8443 2>&1 | grep -i "sni\|server name"
Нестандартные порты могут быть заблокированы на уровне файрвола, поэтому этот метод не всегда эффективен.* Server Name Indication: blocked-site.com
* SSL connection using TLSv1.3
Шаг 5: Комбинированный подход — TLS fingerprinting + SNI обход
Для максимальной эффективности можно комбинировать оба метода:
Code:
#!/usr/bin/env python3
import tls_client
import socks
import socket
# Настройка SOCKS прокси
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket
# Создаем сессию с маскировкой TLS под Chrome
session = tls_client.Session(
client_identifier="chrome_120",
random_tls_extension_order=True
)
# Domain fronting через Cloudflare
headers = {
'Host': 'blocked-site.com'
}
response = session.get(
"https://cloudflare.com",
headers=headers
)
print(f"Статус: {response.status_code}")
print(f"Контент: {len(response.text)} байт")
Комбинация методов (TLS fingerprinting маскировка + SNI обход + прокси) обеспечивает максимальную эффективность обхода DPI систем.angust@linux-pc:~$ python3 combined_bypass.pyСтатус: 200
Контент: 15234 байт
Дополнительные ресурсы
Спойлер: ⚠️ Дисклеймер
Назначение материалов: Все опубликованные материалы (включая статьи, примеры кода, описания техник, инструкции и демонстрации) предназначены исключительно для: Образовательных целей Повышения осведомленности в области информационной безопасности Проведения исследований в контролируемых средах (например, в частных лабораториях или тестовых окружениях) Разработки и улучшения инструментов защиты Позиция автора относительно неправомерного использования: Автор не поощряет, не поддерживает и не несет ответственности за любое незаконное или противоправное использование представленной информации, включая, но не ограничиваясь: Созданием, распространением или использованием вредоносного программного обеспечения Несанкционированным доступом к информационным системам, сетям или данным Причинением вреда третьим лицам, организациям или инфраструктуре Условия использования: Все представленные техники и примеры могут использоваться только с явного письменного разрешения владельца соответствующих систем или в полностью изолированной лабораторной среде. Использование материалов без согласия владельца ресурса может являться нарушением законодательства и влечь за собой уголовную, административную или гражданскую ответственность в вашей юрисдикции. Отказ от ответственности автора: Автор явно заявляет, что: Не несет ответственности за последствия использования читателями представленной информации Не гарантирует применимость материалов вне рамок исследовательских и образовательных целей Оставляет за собой право удалять или изменять материалы, если их публикация может привести к неправомерному использованию Подтверждение пользователя: Настоящий дисклеймер распространяется на все публикации, размещенные автором, независимо от языка, платформы и страны доступа. Используя данный материал, пользователь подтверждает, что: Действует исключительно в рамках законов своей страны и международных норм Берет на себя полную ответственность за свои действия Понимает, что данная публикация не является юридической консультацией Рекомендация по юридической консультации: Если у вас возникают сомнения относительно законности тех или иных действий, настоятельно рекомендуется обратиться за консультацией к специализированному юристу.
👍8
😮1
🤔1
😢1
LIMB