"Resume esta alerta de Wazuh y dime si es importante."
"Eres analista Blue Team. Alerta: <json> Acciones a ejecutar: 1. kill_sessions(src_ip) 2. change_password(user) 3. message_and_kill (honeypot) Analiza 4-6 líneas: secuencia, impacto, hardening."
# agent.py · prompt + ask_claude() _PROMPT_BRUTE_SUCCESS = """ Eres el analista Blue Team del CTF AI Defender. UN ATACANTE ACABA DE CONSEGUIR ACCESO SSH... ACCIONES QUE SE VAN A EJECUTAR INMEDIATAMENTE: 1. Enviar mensaje al terminal del atacante 2. Terminar su sesión SSH activa (kill_session) 3. Rotar la contraseña del usuario comprometido """ def ask_claude(prompt: str) -> str | None: r = subprocess.run( ["claude", "-p", prompt], capture_output=True, text=True, timeout=60) return r.stdout.strip() if r.returncode == 0 else None
action_kill_sessions · log PIDs terminadosaction_change_password · log nueva pwdaction_message_and_kill · honeypot trazadolog(EJECUTADO, ...) · huella obligatoriadef action_change_password(container: str, user: str) -> bool: new_pass = _random_password() r = subprocess.run( ["docker", "exec", container, "bash", "-c", f"echo '{user}:{new_pass}' | chpasswd"], capture_output=True, text=True, timeout=10) # Audit trail — no opcional if r.returncode == 0: log("EJECUTADO", f"Contrasena de '{user}' rotada en {container}", GREEN) log("NUEVA PASS", new_pass, YELLOW + B) return True log("ERROR", f"chpasswd: {r.stderr.strip()}", RED) return False
def print_claude_response(response: str): print(f"\n{MAGENTA}{'·'*64}{R}", flush=True) for line in response.splitlines(): print(f" {WHITE}{line}{R}", flush=True) print(f"{MAGENTA}{'·'*64}{R}\n", flush=True) # Pipeline · respond_brute_success() log("CLAUDE", "Consultando analista Blue Team...", MAGENTA + B) response = ask_claude(prompt) if response: print_claude_response(response) # REASON visible log("ACCION", "Rotando contrasena...", MAGENTA) action_change_password(agent_name, user) # EJECUCION
| Patrón | Anti-patrón | Regla |
|---|---|---|
| 01 · Decisión, no resumen | Prompt "resume esto" | Diseña el menú de acciones en el prompt. El LLM analiza, no improvisa. |
| 02 · Action loop con audit | Fire & forget | Toda acción reversible o trazable. El log es parte de la acción. |
| 03 · Explicabilidad | Caja negra | CLAUDE → REASON → ACCION → EJECUTADO en el mismo stream. Replayable. |