Introducción
La gestión remota de sistemas es un componente vital en la administración de infraestructuras tecnológicas. Los frameworks de comando y control (C2) son herramientas ampliamente utilizadas en áreas como pruebas de penetración, administración remota segura y automatización de tareas. Sin embargo, la mayoría de dichos frameworks existentes en el mercado suelen ser complejos, costosos o carecen de la flexibilidad necesaria para adaptarse a casos específicos.
En este artículo técnico detallado, aprenderás a desarrollar tu propio framework de comando y control seguro mediante el protocolo SSH, utilizando la biblioteca Paramiko en Python 3. Esta solución permite una interacción robusta y cifrada entre un servidor y un cliente (implant), con comunicación invertida para mayor sigilo y control.
Si buscas profundizar en temas de administración y seguridad, esta guía paso a paso te aportará los conocimientos clave para construir tu propia herramienta personalizada, entender las buenas prácticas y optimizar la comunicación remota de forma segura.
1. Fundamentos del protocolo SSH y su relevancia en C2
SSH (Secure Shell) es un protocolo de red que facilita la comunicación cifrada y autenticada entre un cliente y un servidor. Su uso está asociado a la administración remota segura, transferencia de archivos y tunelización de conexiones.
En el contexto de un framework C2, SSH garantiza que toda la información transmitida permanezca confidencial y protegida contra ataques de interceptación o manipulación, lo que lo convierte en una base ideal para construir sistemas de comando y control.
Principales características de SSH
- Cifrado de extremo a extremo: Protege datos sensibles durante la transferencia.
- Autenticación mediante claves o contraseñas: Asegura que solo usuarios legítimos accedan al sistema.
- Tunnelización segura: Permite encapsular tráfico de otros protocolos a través de un canal cifrado.
¿Por qué usar SSH en un framework C2?
- Seguridad crítica: Evita vulnerabilidades comunes de conexiones no cifradas como Telnet.
- Flexibilidad: Puede adaptarse para comunicación inversa y manejo de múltiples clientes.
- Disponibilidad: SSH es soportado en casi todos los sistemas operativos modernos.
2. Introducción a Paramiko: la biblioteca SSH para Python
Paramiko es una librería de Python que implementa el protocolo SSH2, ofreciendo funcionalidades para crear clientes y servidores SSH, realizar autenticación, ejecutar comandos remotos, y manejar conexiones seguras.
Utilizando Paramiko, podemos construir la infraestructura de un servidor SSH que controle implantes (clientes) y procese comandos, así como crear clientes que se conecten y respondan a los comandos.
Ventajas de elegir Paramiko
- Open source y ampliamente documentado: Gran comunidad y soporte.
- Compatible con Python 3: Facilita su integración en proyectos modernos.
- Modularidad: Permite manejar interfaces servidor-cliente personalizadas.
3. Arquitectura del framework C2 basado en SSH
A diferencia de los modelos tradicionales, en este diseño la comunicación se invierte: El servidor SSH actuará como centro de control, mientras que el cliente (implant) se conecta y espera instrucciones a través del canal establecido. La conexión es bidireccional, lo que permite enviar comandos y recibir resultados en tiempo real.
Esta estructura básica soporta uno a uno (cliente-servidor), pero puede extenderse para manejar múltiples implantes mediante programación adicional.
Componentes clave
- Servidor SSH: Escucha conexiones entrantes, autentica clientes, maneja sesiones y procesa comandos.
- Implante (cliente): Se conecta al servidor, ejecuta comandos recibidos y retorna resultados.
- Canal de comunicación: Independientemente cifrado, responsable de transmitir datos y comandos.
4. Preparación del entorno de desarrollo
Para desarrollar este framework, se recomienda utilizar Python 3 y un editor de código avanzado, como Visual Studio Code, que ofrece soporte para depuración y gestión de proyectos.
Herramientas y requisitos
- Python 3: Versiones 3.6 o superiores.
- Biblioteca Paramiko: Se instala vía pip con
pip install paramiko
. - Generador de claves SSH: Utiliza
ssh-keygen
para crear pares de claves RSA necesarias. - Permisos de red: Asegura que el firewall permita conexión al puerto configurado (por defecto 2222).
5. Generar claves SSH para autenticación
El cifrado en SSH se basa en un par de claves públicas y privadas que garantizan identidad y confidencialidad. Debemos generar estas claves con el comando estándar:
ssh-keygen -t rsa -b 4096 -f id_rsa -N ""
Esta instrucción genera una clave RSA de 4096 bits sin frase de contraseña, almacenando los archivos id_rsa
(privada) e id_rsa.pub
(pública).
La clave privada se ubicará en el directorio donde reside el servidor SSH y será utilizada para firmar las conexiones, mientras que la clave pública podrá distribuirse a los clientes en escenarios avanzados.

6. Desarrollo del servidor SSH con Paramiko
El servidor representa el corazón del framework, aceptando conexiones y gestionando la sesión SSH. En esta sección se detallan los pasos para configurarlo:
6.1. Estructura general y clases
Utilizamos la programación orientada a objetos para estructurar el servidor. Se define una clase que hereda de paramiko.ServerInterface
que implementará métodos para verificar la validez de canales y autenticaciones.
- check_channel_request: Acepta únicamente solicitudes de canales del tipo “session”.
- check_auth_password: Valida credenciales usuario/contraseña predefinidas.
6.2. Configuración del socket del servidor
Se crea un socket TCP que escucha en la dirección 0.0.0.0
(todas las interfaces) y puerto 2222. Se activa la opción para reutilizar la dirección y puertos para evitar conflictos en reinicios.
6.3. Inicialización y ciclo principal
En el bucle principal, el servidor acepta conexiones entrantes, inicia una sesión SSH, autentica, acepta un canal y comienza a recibir o enviar mensajes. La comunicación con el implante sucederá mediante el canal abierto.
6.4. Manejo de comandos y comunicación
El servidor establece un prompt personalizado para recibir comandos del operador y enviarlos al cliente implantado. A su vez, procesa la respuesta recibida y la muestra.
7. Desarrollo del implante (cliente SSH)
El implant es un script que corre en el sistema remoto, conecta al servidor SSH, espera comandos, los ejecuta y envía la salida de vuelta.
7.1. Importar librerías necesarias
paramiko
: Para gestionar la conexión SSH.subprocess
: Permite ejecutar comandos nativos de sistema y recuperar la salida.os
ygetpass
: Para interacción con sistema y usuario.socket
: Para obtener el hostname.shlex
: Facilita el procesamiento seguro de cadenas de comandos.
7.2. Establecimiento de conexión
Se define la IP, puerto, usuario y contraseña para conectar al servidor SSH. Se gestiona la política para aceptar hosts desconocidos sin errores, facilitando la conexión inicial.
7.3. Envío de mensaje de “check-in”
Al establecer la conexión, el implant envía un mensaje identificando el hostname y usuario actual, permitiendo al operador tener contexto inmediato sobre el cliente conectado.
7.4. Loop de ejecución de comandos
- Escucha de comandos recibidos por el canal SSH.
- Se decodifica el comando y verifica si es especial (e.g.,
exit
,cd
). - Para
cd
, cambia el directorio de trabajo y envía el path actual. - Para
exit
, termina la sesión limpiamente. - Para comandos generales, se ejecuta y se envían los resultados o errores al servidor.
8. Ejecución paso a paso: creación del servidor SSH
Se recomienda crear un archivo Python llamado ssh_server.py
y realizar la siguiente guía:
- Importar librerías:
paramiko
,socket
,os
. - Definir clase
SSHServer
: Implementar métodoscheck_channel_request
ycheck_auth_password
con credenciales de prueba. - Generar o cargar la clave privada RSA: utilizar variable global para el host key.
- Configurar socket: bindear a 0.0.0.0:2222, con opción SO_REUSEADDR activada.
- Bucle principal: aceptar conexiones y crear sesiones transport con Paramiko.
- Iniciar servidor SSH usando la clase custom y aceptar canales.
- Mostrar mensajes de control y esperar comandos a enviar.
9. Ejecución paso a paso: creación del Implante SSH
Crear archivo implant.py
y seguir estos pasos:
- Importar librerías: Paramiko, subprocess, os, getpass, socket, shlex.
- Configurar variables: IP, puerto, usuario, contraseña.
- Crear cliente Paramiko: configurar política de host key automática.
- Conectar al servidor y abrir sesión.
- Enviar mensaje inicial con hostname y usuario.
- Bucle principal: recibir comandos, procesar
cd
yexit
, ejecutar otros comandos y enviar resultados. - Manejo de excepciones y cierre de sesión.
10. Tabla comparativa: Framework C2 SSH vs Herramientas Conventionales
Características | Framework C2 SSH (Paramiko) | Herramientas convencionales (Metasploit, Cobalt Strike) |
---|---|---|
Seguridad | Cifrado fuerte con protocolo SSH y autenticación vía claves o password. | Varía según configuración; algunas usan cifrado propio o túneles. |
Flexibilidad | Altamente personalizable y adaptable al caso de uso. | Funcionalidades avanzadas integradas pero con menor personalización. |
Complejidad | Requiere conocimientos de Python y SSH, configuración manual. | Interfaces gráficas y scripts predefinidos con menor curva inicial. |
Costo | Gratuito, open source y sin licencias. | Puede ser costoso, especialmente versiones comerciales. |
Soporte y Comunidad | Comunidad de Python y Paramiko, abundante documentación. | Amplia comunidad, documentación y soporte comercial en algunas. |
11. Buenas prácticas para la implementación de un framework C2 SSH
- Manejo seguro de credenciales: No dejar passwords en texto plano, usar variables de entorno o archivos cifrados.
- Filtrar y validar los comandos permitidos: Para evitar ejecución no autorizada.
- Registro de actividad: Mantener logs auditables para supervisar accesos y acciones.
- Pruebas en entornos controlados: Validar funcionalidad antes de usar en entornos productivos.
- Actualización y mantenimiento: Mantener actualizadas las librerías y correcciones de seguridad.
12. Limitaciones y consideraciones
Si bien el framework propuesto es funcional y seguro, es importante tener en cuenta sus limitaciones:
- Soporta inicialmente una conexión cliente-servidor, la concurrencia requiere manejo adicional.
- No incluye mecanismos avanzados de evasión o persistencia típicos en frameworks profesionales.
- Depende del entorno Python y la correcta configuración del sistema operativo.
Estas limitaciones pueden ser abordadas mediante extensiones y mejoras progresivas según los objetivos.
13. Optimización y escalabilidad
Para escalar el framework hacia escenarios multi-implante o con mayor rendimiento, se pueden considerar:

- Implementar manejo de múltiples hilos o procesos para atender clientes simultáneamente.
- Incluir encriptación adicional o firmas digitales para mayor integridad.
- Desarrollar interfaz gráfica o consola de gestión centralizada.
- Automatizar despliegue y actualización del implant en sistemas objetivo.
14. Ejemplo práctico: Primer comando y respuesta
Una vez conectado el implant, el operador en el servidor puede enviar comandos simples, por ejemplo:
get users
: Ejecuta en Windowswmic useraccount list brief
para listar usuarios.cd ..
: Cambiar directorio y reflejar el cambio al prompt.exit
: Termina la sesión remotamente.
Los resultados serán reflejados en tiempo real en el terminal del servidor, facilitando la administración remota.
15. Consejos para personalización y ampliación
Algunos consejos para personalizar este framework de acuerdo a tus necesidades:
- Agregar autenticación basada en claves públicas para mayor seguridad.
- Integrar funciones para extracción de ficheros y uploads.
- Crear módulos para ejecutar scripts remotos, escalamiento de privilegios y persistencia.
- Mejorar la interfaz del servidor para manejo intuitivo de múltiples implantes.
- Asegurar el registro y trazabilidad de cada sesión.
¿Querés ver el paso a paso en código y entender de manera visual cómo conectar clientes y servidores SSH para control remoto? Este video te ofrece un tutorial práctico utilizando Paramiko y Python.
16. Palabras clave relacionadas y su importancia
Framework C2
Es la infraestructura que permite gestionar remotamente sistemas comprometidos o administrados a través de comandos que se ejecutan desde un centro de control. Entender este concepto es fundamental para desarrollar soluciones adaptadas a diferentes escenarios de red y seguridad.
Paramiko
Biblioteca Python que facilita la implementación del protocolo SSH. Conocer sus funciones y estructura permite crear clientes y servidores seguros y personalizados, fundamentales para el desarrollo de frameworks C2 seguros.
SSH
Protocolo seguro para comunicaciones cifradas en red, base esencial para el control remoto confidencial y la administración de sistemas de manera segura.
Implante
Es el programa que se ejecuta en el equipo objetivo, encargado de recibir las órdenes del servidor y ejecutar comandos. Su diseño debe ser minimalista, estable y sigiloso para garantizar la persistencia y funcionalidad.
Canal SSH
Vía de comunicación cifrada establecida entre cliente y servidor. Este canal es clave para intercambiar datos y controlar el flujo de información en el framework.
Clave RSA
Mecanismo de cifrado asimétrico esencial para la autenticación en SSH. Generar y administrar correctamente estas claves es una medida de seguridad esencial.
Autenticación
Proceso que valida la identidad de usuarios o máquinas intentando acceder a un sistema. En este proyecto, se utiliza autenticación por usuario y contraseña simple, aunque puede escalarse a métodos más seguros.
Socket
Elemento fundamental para la comunicación en red. Permite establecer conexiones TCP entre cliente y servidor, transportando datos a través de la red.
Subprocess
Módulo de Python que permite ejecutar comandos del sistema operativo y capturar su salida, crucial para dinamizar las órdenes y recibir resultados en el flujo C2.

Shell
Interfaz que permite ejecutar comandos directamente sobre el sistema operativo. Manejar la interacción con el shell del sistema objetivo es vital para el control y ejecución eficaz de tareas remotas.
Preguntas frecuentes (FAQ)
¿Qué hace que SSH sea seguro?
SSH cifra todos los datos transmitidos entre el cliente y el servidor, incluyendo contraseñas y comandos. Utiliza algoritmos criptográficos robustos como AES para cifrado simétrico y RSA o ECDSA para autenticación asimétrica, asegurando la confidencialidad e integridad de la comunicación. A diferencia de protocolos como Telnet, que transmiten datos en texto plano, SSH protege contra sniffing y ataques man-in-the-middle.
¿Cómo se garantiza la seguridad en una conexión mediante SSH?
Mediante un proceso de autenticación robusto, que puede ser por contraseña o por clave pública/privada, complementado con un canal cifrado que protege la transferencia de datos. La sesión SSH valida que ambas partes sean legítimas antes de permitir cualquier interacción, además de comprobar la integridad de los datos para evitar manipulaciones.
¿Cómo asegurarse de que el servidor SSH esté ejecutándose?
En sistemas Linux, se puede verificar con comandos como systemctl status ssh
o service ssh status
. En Windows, si OpenSSH está instalado, se revisa el estado del servicio sshd
en el panel de servicios o mediante PowerShell con Get-Service sshd
. Además, es vital que el puerto configurado (por defecto 22 o personalizado) esté abierto y escuchando.
¿Qué debo hacer si el servidor no acepta la conexión desde el cliente?
Verificar que las credenciales sean correctas, que el servidor esté en línea y escuchando en el puerto adecuado. Comprobar que no haya bloqueos por firewall o políticas de red y que las claves SSH estén configuradas correctamente.
¿Cómo manejar múltiples implantes conectados al servidor?
Se debe extender el servidor para manejar múltiples hilos o procesos que atiendan cada implante de forma concurrente, almacenando la información de cada cliente y permitiendo seleccionar a cuál enviar comandos.
¿Qué comandos son seguros para ejecutar en el implant?
Depende del entorno, pero se recomienda limitar los comandos a aquellos necesarios para la administración y recolección de información, evitando operaciones destructivas o riesgosas. Implementar filtros y validaciones es una buena práctica para evitar errores o abusos.
¿Cómo evitar que las conexiones sean detectadas en la red?
Usando puertos no estándar, cifrado fuerte y técnicas de evasión adicionales como las que ofrece la ofuscación del tráfico o la multiprotocolo. Sin embargo, esto debe hacerse conforme a políticas y ética establecidas.
¿Puedo usar claves públicas en vez de contraseñas para autenticar clientes?
Sí, usar autenticación basada en claves públicas es más segura y recomendada para entornos productivos. Esto implica generar un par de claves para cada cliente y distribuir la clave pública en el servidor.
¿Qué sucede si el implant recibe un comando no válido?
Mediante la implementación de excepciones en el código, se captura el error y simplemente se envía un mensaje vacío o un aviso al servidor, evitando que la conexión se interrumpa o caiga.
¿Cómo puedo detener la ejecución del implant de manera segura?
El implant está diseñado para detectar el comando exit
, que cierra la sesión SSH y termina el proceso limpiamente, evitando dejar conexiones abiertas o procesos colgados.
Conclusión
Este artículo te ha guiado a través de la creación detallada de un framework básico de comando y control seguro utilizando el protocolo SSH, la biblioteca Paramiko y Python 3.
La implementación propuesta combina seguridad, flexibilidad y comprensión profunda del flujo cliente-servidor invertido para un control efectivo y cifrado de equipos remotos. Además, proporciona una base sólida para ampliaciones futuras, ajustándose a tus necesidades específicas.

¿Querés mantenerte actualizado con las últimas tendencias en automatización, inteligencia artificial y transformación digital? Visitá nuestro blog de Código6 y descubrí guías, casos de éxito y noticias relevantes para potenciar tu empresa. Ingresá al blog y explorá los recursos más recientes.
Leave A Comment