LIMB
Вход Регистрация

тема

Обход DPI - методы маскировки трафика и обхода цензуры

Angust · · 0 ответов · 176 просмотров

Спойлер: ⚠️ Дисклеймер
Назначение материалов:



Все опубликованные материалы (включая статьи, примеры кода, описания техник, инструкции и демонстрации) предназначены исключительно для:




Образовательных целей
Повышения осведомленности в области информационной безопасности
Проведения исследований в контролируемых средах (например, в частных лабораториях или тестовых окружениях)
Разработки и улучшения инструментов защиты
Позиция автора относительно неправомерного использования:



Автор не поощряет, не поддерживает и не несет ответственности за любое незаконное или противоправное использование представленной информации, включая, но не ограничиваясь:




Созданием, распространением или использованием вредоносного программного обеспечения
Несанкционированным доступом к информационным системам, сетям или данным
Причинением вреда третьим лицам, организациям или инфраструктуре
Условия использования:



Все представленные техники и примеры могут использоваться только с явного письменного разрешения владельца соответствующих систем или в полностью изолированной лабораторной среде.



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



Отказ от ответственности автора:



Автор явно заявляет, что:




Не несет ответственности за последствия использования читателями представленной информации
Не гарантирует применимость материалов вне рамок исследовательских и образовательных целей
Оставляет за собой право удалять или изменять материалы, если их публикация может привести к неправомерному использованию
Подтверждение пользователя:



Настоящий дисклеймер распространяется на все публикации, размещенные автором, независимо от языка, платформы и страны доступа. Используя данный материал, пользователь подтверждает, что:




Действует исключительно в рамках законов своей страны и международных норм
Берет на себя полную ответственность за свои действия
Понимает, что данная публикация не является юридической консультацией
Рекомендация по юридической консультации:



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


Всем привет!
В этой статье рассмотрим  методы обхода Deep Packet Inspection (DPI) и систем цензуры. 



Теоретическая часть

Что такое DPI и зачем его обходить

Deep Packet Inspection (DPI) — это технология глубокого анализа сетевого трафика, которая проверяет не только заголовки пакетов, но и их содержимое. DPI позволяет провайдерам и цензорам:
  • Выявлять и блокировать определенные типы соединений (VPN, прокси)
  • Анализировать содержимое HTTP/HTTPS запросов
  • Блокировать доступ к определенным доменам и IP-адресам
  • Отслеживать активность пользователей
Зачем обходить DPI:
  • Доступ к заблокированным ресурсам
  • Защита приватности и анонимности
  • Обход цензуры и ограничений
  • Безопасность в небезопасных сетях
Как работает DPI

DPI системы анализируют трафик на нескольких уровнях:

  1. Анализ заголовков — проверка портов, протоколов, размеров пакетов
  2. Анализ содержимого — поиск ключевых слов, паттернов, сигнатур
  3. TLS fingerprinting — определение приложений по TLS handshake
  4. SNI inspection — анализ Server Name Indication в TLS
  5. Статистический анализ — выявление паттернов трафика
Методы обхода DPI

В этой статье рассмотрим следующие методы:

  1. DNS-over-HTTPS (DoH) — обход DNS блокировок
  2. SSH SOCKS туннель — маскировка трафика через SSH
  3. VPN туннелирование — WireGuard, OpenVPN, IKEv2
  4. Shadowsocks — легкий прокси с обфускацией
  5. TLS туннелирование — stunnel для шифрования трафика
  6. HTTP/2 и HTTP/3 — использование современных протоколов
  7. CDN маскировка — Cloudflare, domain fronting
  8. MTU манипуляции — изменение размера пакетов
  9. Обфускация статистических паттернов — маскировка трафика


Подготовка окружения

Установка необходимых инструментов

На 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
Установка Python библиотек:

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 серверов
Практическая реализация 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
Тестирование DoH для домена: google.com

[1] GET метод (Cloudflare):
IP адрес: 142.250.185.78

[2] POST метод (RFC 8484):
IP адрес: 142.250.185.78
Примечание: POST метод (RFC 8484) более надежен, так как DNS запрос находится в теле запроса, а не в URL, что затрудняет его анализ DPI системами.

Шаг 2: Тестирование альтернативных DoH серверов

Для повышения надежности рекомендуется использовать несколько DoH серверов. Google также предоставляет публичный DoH сервер:

Code:
angust@linux-pc:~$ python3 test_doh.py blocked-domain.com
Тестирование DoH для домена: blocked-domain.com
[1] GET метод (Cloudflare):
IP адрес: 192.0.2.1

[2] POST метод (RFC 8484):
IP адрес: 192.0.2.1
Важно: Если один DoH сервер заблокирован, можно использовать другой. Это повышает надежность обхода DNS блокировок.

Шаг 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"
{"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"}]}
Статус 0 означает успешный ответ. Поле data содержит IP адрес домена.



Метод 2: SSH SOCKS туннель — обход DPI через SSH

Что такое SSH SOCKS туннель

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

Преимущества:
  • Простота использования
  • Не требует дополнительного ПО на сервере
  • Работает через стандартные SSH соединения
  • Защищен шифрованием SSH
Недостатки:
  • Требует доступ к SSH серверу
  • SSH трафик может быть обнаружен через фингерпринты
  • Высокая задержка через дополнительное шифрование
Практическая реализация SSH SOCKS

Шаг 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>
Опция --socks5 указывает curl использовать SOCKS5 прокси. Для HTTPS запросов используется та же опция:


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
Недостатки:
  • Требует настройки сервера
  • Может быть заблокирован через порты
Практическая реализация WireGuard

Шаг 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
AllowedIPs = 0.0.0.0/0 означает, что весь трафик будет идти через VPN. Для split-tunneling можно указать конкретные сети.

Шаг 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
Примечание: latest handshake
 показывает время последнего рукопожатия. Если это значение большое, соединение может быть нестабильным.

Шаг 5: Проверка изменения IP

После подключения к VPN нужно проверить, что IP адрес изменился:


Code:
angust@linux-pc:~$ curl https://api.ipify.org
Code:
198.51.100.1
Важно: IP адрес должен соответствовать IP VPN сервера, а не вашему реальному IP.

Шаг 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 трафик
Недостатки:
  • Требует отдельного сервера
  • Может потребовать настройки клиента
Практическая реализация Shadowsocks

Шаг 1: Установка Shadowsocks клиента

На Linux установка выполняется через pip:

Code:
angust@linux-pc:~$ pip3 install shadowsocks

Шаг 2: Создание конфигурации

Создаем конфигурационный файл для Shadowsocks клиента:
Code:
angust@linux-pc:~$ cat > shadowsocks. << '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
}
EOF
Примечание: Метод 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
Шаг 4: Использование Shadowsocks

Использование 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
  • Простой в настройке
Недостатки:
  • Требует настройки сервера
  • Дополнительные накладные расходы
Практическая реализация stunnel

Шаг 1: Установка stunnel
Code:
angust@linux-pc:~$ sudo apt-get install stunnel4

Шаг 2: Создание конфигурации клиента

Создаем конфигурационный файл для stunnel клиента:

Code:
angust@linux-pc:~$ sudo nano /etc/stunnel/stunnel.conf
Содержимое:
client = yes
[ssh]
accept = 127.0.0.1:2222
connect = stunnel-server.example.com:443
Эта конфигурация создает TLS туннель от локального порта 2222 к серверу stunnel на порту 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]
Трафик будет зашифрован через TLS, что затрудняет его анализ DPI системами.



Комбинированные методы — максимальная эффективность

Комбинация 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"
Комбинация методов значительно повышает эффективность обхода DPI, так как защищает и DNS запросы, и HTTP/HTTPS трафик.



Обход TLS fingerprinting и SNI inspection

Что такое TLS fingerprinting

TLS fingerprinting — это техника определения приложений по характеристикам TLS handshake. DPI системы анализируют параметры TLS соединения (версия протокола, cipher suites, extensions) для идентификации приложений и обнаружения VPN/прокси.

Как работает TLS fingerprinting:
  • Анализ порядка cipher suites
  • Проверка TLS extensions
  • Анализ размера ClientHello
  • Проверка поддержки определенных протоколов
Практический обход TLS fingerprinting

Шаг 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
Контент получен: 15234 байт

Комбинация TLS fingerprinting маскировки с SOCKS прокси значительно повышает эффективность обхода DPI.

Что такое SNI inspection

Server Name Indication (SNI) — это расширение TLS протокола, которое передает имя сервера в незашифрованном виде во время TLS handshake. Это позволяет DPI системам анализировать SNI для блокировки определенных доменов еще до установления соединения.

Проблема SNI:
  • SNI передается в открытом виде
  • DPI системы могут читать SNI до шифрования
  • Блокировка происходит на этапе handshake
Практический обход SNI inspection

Шаг 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
Статус: 200
Заголовки: {'Content-Type': 'text/html', 'Server': 'cloudflare', ...}
Domain fronting работает только если оба домена находятся на одном CDN (например, Cloudflare). DPI система видит SNI для 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
[+] Успешно через cloudflare.com
Этот метод работает только если целевой домен действительно использует указанный 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)} байт")

angust@linux-pc:~$ python3 combined_bypass.pyСтатус: 200
Контент: 15234 байт
Комбинация методов (TLS fingerprinting маскировка + SNI обход + прокси) обеспечивает максимальную эффективность обхода DPI систем.




Дополнительные ресурсы




Спойлер: ⚠️ Дисклеймер
Назначение материалов:



Все опубликованные материалы (включая статьи, примеры кода, описания техник, инструкции и демонстрации) предназначены исключительно для:




Образовательных целей
Повышения осведомленности в области информационной безопасности
Проведения исследований в контролируемых средах (например, в частных лабораториях или тестовых окружениях)
Разработки и улучшения инструментов защиты
Позиция автора относительно неправомерного использования:



Автор не поощряет, не поддерживает и не несет ответственности за любое незаконное или противоправное использование представленной информации, включая, но не ограничиваясь:




Созданием, распространением или использованием вредоносного программного обеспечения
Несанкционированным доступом к информационным системам, сетям или данным
Причинением вреда третьим лицам, организациям или инфраструктуре
Условия использования:



Все представленные техники и примеры могут использоваться только с явного письменного разрешения владельца соответствующих систем или в полностью изолированной лабораторной среде.



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



Отказ от ответственности автора:



Автор явно заявляет, что:




Не несет ответственности за последствия использования читателями представленной информации
Не гарантирует применимость материалов вне рамок исследовательских и образовательных целей
Оставляет за собой право удалять или изменять материалы, если их публикация может привести к неправомерному использованию
Подтверждение пользователя:



Настоящий дисклеймер распространяется на все публикации, размещенные автором, независимо от языка, платформы и страны доступа. Используя данный материал, пользователь подтверждает, что:




Действует исключительно в рамках законов своей страны и международных норм
Берет на себя полную ответственность за свои действия
Понимает, что данная публикация не является юридической консультацией
Рекомендация по юридической консультации:



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



Подписывайся, чтобы не пропускать новые статьи!                                                                         ​
👍8 😮1 🤔1 😢1

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.