
Framework C2 en ensamblador x64 sin archivos con pivoteo de protocolo ICMP/DNS de doble canal, ejecución directa de syscall e inyección de procesos basada en ptrace para ejecución sigilosa de comandos y exfiltración de datos.
________ ___ ___ ________ ________ _________ ________ ________
|\ ____\|\ \|\ \|\ __ \|\ ____\|\___ ___\ |\ ____\|\_____ \
\ \ \___| \ \ \\\ \ \ \|\ \ \ \___|\|___ \ \_| \ \ \___|\|____|\ \
\ \ \ __ \ \ __ \ \ \\\ \ \_____ \ \ \ \ \ \ \ ____\_\ \
\ \ \|\ \ \ \ \ \ \ \\\ \|____|\ \ \ \ \ \ \ \___|\____ \ \
\ \_______\ \__\ \__\ \_______\____\_\ \ \ \__\ \ \______\\_________\
\|_______|\|__|\|__|\|_______|\_________\ \|__| \|______\|_________|
\|_________|
Implante C2 sin archivos, en ensamblador x64 puro, que utiliza una arquitectura de doble canal (ICMP/DNS). Sin libc. Sin disco. Invisible para los hooks estándar de EDR.
⭐️ Si encuentras útil esta investigación, por favor considera darle una estrella para apoyar el desarrollo continuo
🚨 INVESTIGACIÓN TÉCNICA COMPLETA Y CÓDIGO FUENTE: Este repositorio es un resumen. Para obtener el desglose arquitectónico completo, los detalles de evasión de memoria W^X y la implementación de la VTable, visita la página oficial del proyecto: ICMP-Ghost Technical Breakdown
Ghost-C2 es un framework de comando y control escrito completamente en ensamblador Linux x64 puro, sin dependencias de libc. Cada operación se realiza mediante syscalls directas. No hay tablas de importación, artefactos del enlazador dinámico ni escrituras en disco.
Originalmente construido como un canal sigiloso ICMP sin procesar, la versión 3.6.2 introduce una arquitectura de Pivoteo de Protocolo de Doble Canal. Los operadores pueden cambiar sin problemas el canal de comunicación del implante entre sockets ICMP sin procesar silenciosos y túneles UDP DNS evasivos sobre la marcha. El implante reside exclusivamente en RAM, inyectado en un proceso del sistema en ejecución mediante un cargador personalizado basado en ptrace.
Este proyecto se construyó para explorar hasta dónde pueden llegar el sigilo en el espacio de usuario y la sincronización del estado de la red sin tocar el kernel.
┌─────────────────────────────────────────────────────────────┐
│ OPERATOR MACHINE │
│ │
│ ┌──────────────┐ │
│ │ client.asm │ ← Terminal UI: Prompt IP/Domain + Cmd │
│ │ (Operator │ Encrypts payload with Rolling XOR │
│ │ Console) │ State Sync: ICMP mode / DNS mode │
│ └──────┬───────┘ │
│ │ │
└──────────┼──────────────────────────────────────────────────┘
│ Channel 1: Raw ICMP (Stateless, Port-less)
│ Channel 2: DNS UDP Port 53 (Asymmetric)
┌──────────┼──────────────────────────────────────────────────┐
│ │ TARGET MACHINE │
│ ▼ │
│ ┌──────────────┐ ┌─────────────────────────────────┐ │
│ │ loader.asm │────▶│ sniff.asm (PIC) │ │
│ │ (Phantom │ │ Lives in RAM only │ │
│ │ Loader) │ │ inside host process │ │
│ └──────────────┘ └────────────────┬────────────────┘ │
│ │ │
│ 1. Scans /proc for target PID │ Listens ICMP/DNS │
│ 2. ptrace ATTACH │ Validates Auth │
│ 3. Force remote mmap (RW) │ Decrypts command │
│ 4. Inject PIC shellcode │ fork+execve │
│ 5. mprotect → RX │ memfd_create │
│ 6. Redirect RIP → shellcode │ Compress(DPCM-RLE)│
│ 7. ptrace DETACH → exits │ Encrypt & Frag. │
│ │ Sends Reply │
└─────────────────────────────────────────┼───────────────────┘
│ Encrypted Traffic
▼
[ client.asm ]
Receives & Validates
Decrypts Payload
Decompresses (Hybrid)
Reassembles & Prints
client.asm — Consola del OperadorEl terminal del lado del atacante. Maneja la interfaz de usuario, la gestión dinámica de memoria y la sincronización del estado del objetivo. Puede enviar paquetes como solicitudes de eco ICMP o consultas DNS TXT. Escucha respuestas fragmentadas, previene desbordamientos de búfer y reconstruye la salida. Incluye un módulo de "Reconexión Activa de Objetivo" para rescatar sesiones huérfanas.
sniff.asm — Agente Implante PICEl implante que se ejecuta en el objetivo. Compilado como un binario sin procesar (independiente de la posición, sin encabezados ELF) para poder ser inyectado en direcciones de memoria arbitrarias. Actualiza dinámicamente su VTable interna para cambiar entre la captura de paquetes ICMP y el enlace UDP DNS según los comandos de pivoteo del operador.
Phantom_Loader/loader.asm — Motor de InyecciónEl mecanismo de entrega. Escanea /proc, encuentra un proceso objetivo por su nombre de comm e inyecta el shellcode PIC en él mediante una máquina de estados ptrace de múltiples etapas. Sale limpiamente después de la inyección, sin dejar rastro.
Ghost-C2 v3.6.2 permite al operador intercambiar en caliente el protocolo de red sin perder el agente. Al enviar comandos de pivoteo específicos, las VTables tanto del Maestro como del Agente se sobrescriben dinámicamente:
!D (Pivotar a DNS): Ambos nodos cierran los sockets ICMP e inicializan la comunicación UDP Puerto 53. Ideal para evadir filtrados estrictos de Capa 3 mezclándose con el tráfico DNS corporativo.!I (Pivotar a ICMP): El Agente cierra los sockets UDP, elimina los enlaces de puerto y vuelve a la captura silenciosa de Raw Socket. Perfecto para el modo sigiloso "Fantasma".El motor de transmisión de datos de Ghost-C2 utiliza una capa híbrida de compresión y codificación altamente optimizada en ensamblador x86-64.
Cada paquete ICMP saliente está estructurado para ser indistinguible de un ping estándar de Linux:
struct timeval.iputils de Linux (0x10 a 0x1F) evade cortafuegos heurísticos básicos.Ambas direcciones están cifradas con una clave QWORD que se desplaza progresivamente. Esto mantiene la entropía de Shannon baja (a diferencia de AES, que puntúa ~8.0 y activa anomalías de DPI). El XOR rotatorio produce una entropía que parece datos ruidosos naturales. Sin constantes criptográficas, sin S-boxes, nada que YARA pueda detectar.
El implante ignora todos los paquetes ICMP donde ID + SEQ ≠ 45,000. El implante responde con paquetes donde ID + SEQ = 55,000. Esto evita confusiones con el eco del SO y filtra escáneres de internet o honeypots.
memfd_createLa salida de los comandos nunca toca el disco. La salida del shell se captura mediante un archivo RAM anónimo (memfd_create), nombrado [shm] para mezclarse con las asignaciones de memoria compartida legítimas en /proc/PID/fd.
Derrota las mitigaciones modernas del kernel que prohíben la memoria RWX. El cargador utiliza un enfoque de dos fases (mmap remoto con RW → Inyectar → mprotect remoto con RX). Ninguna página es simultáneamente W y X.
Todos los números de syscall se dividen en dos instrucciones para derrotar el análisis estático y los escáneres simples basados en grep.
Para mantener una estricta OPSEC, el agente de Ghost-C2 (sniff.asm) no utiliza configuraciones externas. Debes definir tu IP Maestra, Puerto y Dominio DNS Señuelo directamente dentro del código ensamblador antes de compilar e inyectar.
Abre sniff.asm y desplázate hasta el final del segmento .text. (Nota: Debido a que el agente es estrictamente Código Independiente de la Posición (PIC), no hay segmento .data. Todas las variables de configuración se almacenan en línea).
Modifica los siguientes valores para que coincidan con tu Servidor Maestro:
db 127, 0, 0, 1 por la IP de tu Maestro.dw 0xB414 (Puerto 5300) por tu puerto deseado en Orden de Bytes de Red (por ejemplo, 0x3500 para el Puerto 53).nasm -f bin sniff.asm -o shellcode.bin
python3 -c "data = open('shellcode.bin', 'rb').read(); lines = ['\tdb ' + ', '.join(f'0x{b:02x}' for b in data[i:i+12]) for i in range(0, len(data), 12)]; open('c2_payload.txt', 'w').write('\n'.join(lines))"
c2_payload.txt.xor.py y reemplaza el contenido de la variable raw_asm con tu shellcode copiado.python3 xor.py y copia la salida cifrada.loader.asm.c2_payload:.target db "cron", 10).nasm -f elf64 loader.asm -o loader.o
ld loader.o -o loader
Ejecuta en la máquina objetivo con privilegios de superusuario (sudo ./loader). El agente ahora se ejecuta completamente sin archivos.
Antes de compilar la Consola Maestra, debes asegurarte de que sus perfiles de escucha y objetivo coincidan con la configuración de tu Agente. Abre client.asm y navega hasta la sección .data.
Localiza master_bind_addr. Aquí es donde el Maestro escucha las balizas DNS entrantes.
Puerto UDP: Cambia dw 0xB414 para que coincida con el puerto al que tu Agente está enviando.
Nota: Esto debe estar en Orden de Bytes de Red. Para el Puerto 53, usa
0x3500.
Localiza target_addr. Este puerto se utiliza cuando realizas un Pivoteo DNS (!D) o usas el módulo de Reconexión.
Alineación de Puerto: Cambia dw 0xB414 para que coincida con el puerto UDP en el que el Agente está escuchando. Si estos puertos no coinciden, se producirá un (Punto Muerto) ya que el Maestro estará gritando al vacío.
Una vez configurada, ensambla y enlaza el Maestro:
nasm -f elf64 client.asm -o client.o
ld client.o -o client
Protip: Mantén siempre una "Hoja de Perfil" para tu operación. Si cambias el puerto a 0x3500 (Puerto 53) en sniff.asm, DEBES actualizar tanto master_bind_addr como target_addr en client.asm antes de que comience la operación.
Nota: La Consola del Operador requiere privilegios de superusuario para enlazar sockets sin procesar y el puerto UDP 53.
Para garantizar un acceso persistente y evitar la pérdida de sesión, siempre pivotea el Agente de vuelta al Modo ICMP (!I) antes de finalizar tu sesión de la Consola Maestra.
La Lógica: ICMP es el "Canal Dorado" de Ghost-C2: no tiene estado, es pasivo y siempre alcanzable a través de la IP del Objetivo.
El Riesgo: El modo DNS depende de la sincronización dinámica del puerto UDP. Si la Consola Maestra se cierra mientras está en modo DNS, el Agente permanece "atrapado" en un estado de escucha UDP. Restablecer la conexión requeriría conocer el puerto efímero específico del Agente, que se pierde al reiniciar el Maestro.
!I (Cambiar a ICMP)Ctrl+C (Salir del Maestro)Probado en un entorno de laboratorio controlado contra inspección de tráfico activa:
| Prueba | Resultado |
|---|---|
| Suricata v8.0.3 (conjunto de reglas Emerging Threats) | ✅ Evadido |
| Suricata v8.0.3 (reglas personalizadas de carga útil ICMP) | ✅ Evadido |
| Puerta de enlace DigitalOcean FRA1 | ✅ 100% de éxito de exfiltración |
| Alertas generadas durante ~25KB de exfiltración | 0 |
Ghost-C2 interactúa directamente con el kernel de Linux:
mprotectLa ausencia de un PTY es una decisión arquitectónica, no una limitación:
/dev/ptmx e ioctl que los EDR monitorean intensamente.Ghost-C2 es un implante de ejecución de comandos y exfiltración de hiper-sigilo. La interactividad sacrifica la invisibilidad por la conveniencia; este proyecto eligió la invisibilidad.
Por diseño, las solicitudes de extracción y los forks son estrictamente ignorados. La arquitectura de este proyecto es mantenida directamente por el autor. Si encuentras un error, un fallo lógico o tienes una sugerencia de funcionalidad, por favor abre un Issue. Mantenlo objetivo y técnico.
Ghost-C2 está construido con pasión, sudor y ensamblador x64 puro. Si este proyecto te ayudó a comprender la evasión de bajo nivel, el mimetismo de protocolos, o simplemente hizo más fluidas tus operaciones de red teaming, ¡considera apoyar el desarrollo!
👉 Conviértete en Patrocinador en GitHub
Ghost-C2 se desarrolla estrictamente con fines educativos, de ingeniería inversa e investigación de ciberseguridad autorizada.
A partir de la versión 3.6.1 en adelante, este proyecto está licenciado bajo la GNU Affero General Public License v3.0 (AGPLv3). Cualquier entidad que interactúe o modifique este software a través de una red debe divulgar su código fuente completo según lo exigido por la licencia. La explotación comercial o integración en plataformas de código cerrado/propietario está estrictamente prohibida.
Copyright (c) 2026 JM00NJ (commSync). Todos los derechos reservados.
El autor no es responsable de ningún uso ilegal o daño causado por esta herramienta. Úsala bajo tu propio riesgo.
| Syscall | Número | Uso |
|---|
sys_socket | 41 | Creación de socket ICMP/UDP sin procesar |
sys_recvfrom | 45 | Captura pasiva de paquetes ICMP/UDP |
sys_sendto | 44 | Transmisión de respuesta ICMP/UDP |
sys_bind | 49 | Enlace de puerto UDP DNS |
sys_memfd_create | 319 | Archivo RAM anónimo para salida |
sys_dup2 | 33 | Redirección de stdout/stderr |
sys_execve | 59 | Ejecución de comandos shell |
sys_fork | 57 | Aislamiento de procesos |
sys_ptrace | 101 | Inyección de procesos + anti-debug |
sys_getdents64 | 217 | Análisis del directorio /proc |
sys_mmap | 9 | Asignación de memoria remota |
sys_mprotect | 10 | Cambio de permisos W^X |