CCCPaste

sni_override.py

# sni_override_simple.py
# Mitmproxy addon: Перехватывает SNI от клиента и подменяет его 
# для исходящего соединения, если он есть в карте.

from mitmproxy import ctx, tls
import traceback

# ---------------- CONFIG ----------------
SNI_MAP = {
    "api.glebins.ru": "new-sni.target.example",
    "glebins.ru": "fake.glebins.ru",

    # "scontent-hel3-1.cdninstagram.com": "scontent-hel3-1.aaaaaaaaaaaa.com",    
    # "static.cdninstagram.com": "bbbbbbbbbbb.com",
    "cdn": "nqw",
    "instagram": "a",

    "fb": "pl",
    "facebook.com": "b.com",

    "youtube": "google",
    "yt": "nt",
    "googlevideo": "google" # q4flrnel
}

# https://scontent-hel3-1.cdninstagram.com
# ----------------------------------------

class SniOverride:
    def __init__(self):
        # Приводим все ключи в SNI_MAP к нижнему регистру при загрузке
        self.sni_map_lower = {k.lower(): v for k, v in SNI_MAP.items()}
        ctx.log.info(f"SniOverride loaded. Mappings: {self.sni_map_lower}")

    def tls_clienthello(self, data: tls.ClientHelloData):
        try:
            client_sni = data.client_hello.sni
            
            if not client_sni:
                ctx.log.debug(f"[tls_clienthello] Клиент не отправил SNI.")
                return

            client_sni_lower = client_sni.lower()
            ctx.log.info(f"[tls_clienthello] Перехвачен SNI клиента: '{client_sni}'")

            i = 0
            for sni_to_change, target_sni in self.sni_map_lower.items():
                if sni_to_change in client_sni_lower:
                    if target_sni != "*":
                        sni_to_take = client_sni_lower if i == 0 else data.context.server.sni
                        data.context.server.sni = sni_to_take.replace(sni_to_change, target_sni)
                    
                    i += 1

                    if i == 3:
                        break
            
            if client_sni != data.context.server.sni and data.context.server.sni != None:
                with open("my_file.txt", "a") as file:
                    file.write(f"[tls_clienthello] client SNI: '{client_sni}' -> SNI for server '{data.context.server.sni}'\n")
                ctx.log.warn(f"[tls_clienthello] ПОДМЕНА: SNI клиента '{client_sni}' -> SNI для сервера '{data.context.server.sni}'")
            else:
                ctx.log.info(f"[tls_clienthello] SNI клиента '{client_sni}' не в карте. Пропускаем.")

        except Exception as e:
            ctx.log.error(f"[tls_clienthello] Ошибка: {e}\n{traceback.format_exc()}")

addons = [SniOverride()]