
Framework C2 em Assembly x64 sem arquivos com pivô de protocolo ICMP/DNS de canal duplo, execução direta de syscall e injeção de processo baseada em ptrace para execução furtiva de comandos e exfiltração de dados.
________ ___ ___ ________ ________ _________ ________ ________
|\ ____\|\ \|\ \|\ __ \|\ ____\|\___ ___\ |\ ____\|\_____ \
\ \ \___| \ \ \\\ \ \ \|\ \ \ \___|\|___ \ \_| \ \ \___|\|____|\ \
\ \ \ __ \ \ __ \ \ \\\ \ \_____ \ \ \ \ \ \ \ ____\_\ \
\ \ \|\ \ \ \ \ \ \ \\\ \|____|\ \ \ \ \ \ \ \___|\____ \ \
\ \_______\ \__\ \__\ \_______\____\_\ \ \ \__\ \ \______\\_________\
\|_______|\|__|\|__|\|_______|\_________\ \|__| \|______\|_________|
\|_________|
Implant C2 fileless, puro Assembly x64, utilizando uma arquitetura de Canal Duplo (ICMP / DNS). Zero libc. Zero disco. Invisível para hooks padrão de EDR.
⭐️ Se você considera esta pesquisa útil, por favor, considere dar uma estrela para apoiar o desenvolvimento contínuo
🚨 PESQUISA TÉCNICA COMPLETA & CÓDIGO FONTE: Este repositório é um resumo. Para a análise arquitetural completa, detalhes de evasão de memória W^X e implementação da VTable, visite a página oficial do projeto: ICMP-Ghost Technical Breakdown
Ghost-C2 é um framework de comando e controle escrito inteiramente em Assembly puro x64 Linux, sem dependências de libc. Cada operação passa por chamadas de sistema diretas. Não há tabelas de importação, artefatos de linker dinâmico ou gravações em disco.
Originalmente construído como um canal stealth bruto de ICMP, a versão 3.6.2 introduz uma arquitetura de Pivô de Protocolo de Canal Duplo. Operadores podem alternar perfeitamente o canal de comunicação do implante entre ICMP Raw Sockets silencioso e DNS UDP Tunneling evasivo em tempo real. O implante vive exclusivamente na RAM, injetado em um processo do sistema em execução através de um loader personalizado baseado em ptrace.
Este projeto foi construído para explorar o quanto a stealth em espaço de usuário e a sincronização de estado de rede podem chegar sem tocar no kernel.
┌─────────────────────────────────────────────────────────────┐
│ MÁQUINA DO OPERADOR │
│ │
│ ┌──────────────┐ │
│ │ client.asm │ ← Terminal UI: Prompt IP/Domain + Cmd │
│ │ (Console do │ Criptografa payload com XOR Rotativo │
│ │ Operador) │ Sincronização de Estado: modo ICMP │
│ │ │ / modo DNS │
│ └──────┬───────┘ │
│ │ │
└──────────┼──────────────────────────────────────────────────┘
│ Canal 1: ICMP Raw (Sem estado, Sem porta)
│ Canal 2: DNS UDP Porta 53 (Assimétrico)
┌──────────┼──────────────────────────────────────────────────┐
│ │ MÁQUINA ALVO │
│ ▼ │
│ ┌──────────────┐ ┌─────────────────────────────────┐ │
│ │ loader.asm │────▶│ sniff.asm (PIC) │ │
│ │ (Loader │ │ Vive apenas na RAM │ │
│ │ Fantasma) │ │ dentro do processo │ │
│ └──────────────┘ │ hospedeiro │ │
│ └────────────────┬────────────────┘ │
│ │ │
│ 1. Escaneia /proc por PID alvo │ Escuta ICMP/DNS │
│ 2. ptrace ATTACH │ Valida Autentica. │
│ 3. Força mmap remoto (RW) │ Descriptografa │
│ 4. Injeta shellcode PIC │ comando │
│ 5. mprotect → RX │ fork+execve │
│ 6. Redireciona RIP → shellcode │ memfd_create │
│ 7. ptrace DETACH → sai │ Comprime(DPCM-RLE)│
│ │ Criptografa & │
│ │ Fragmenta │
│ │ Envia Resposta │
└─────────────────────────────────────────┼───────────────────┘
│ Tráfego Criptografado
▼
[ client.asm ]
Recebe & Valida
Descriptografa Payload
Descomprime (Híbrido)
Remonta & Imprime
client.asm — Console do OperadorO terminal do lado do atacante. Lida com UI, gerenciamento dinâmico de memória e sincronização de estado do alvo. Pode enviar pacotes como Echo Requests ICMP ou consultas DNS TXT. Escuta respostas fragmentadas, previne estouros de buffer e reconstrói a saída. Possui um módulo de "Reconexão Ativa de Alvo" para resgatar sessões órfãs.
sniff.asm — Agente Implant PICO implante em execução no alvo. Compilado como um binário bruto (independente de posição, sem cabeçalhos ELF) para que possa ser injetado em endereços de memória arbitrários. Ele atualiza dinamicamente sua VTable interna para alternar entre sniffing ICMP e bind UDP DNS com base em comandos de pivô do operador.
Phantom_Loader/loader.asm — Motor de InjeçãoO mecanismo de entrega. Escaneia /proc, encontra um processo alvo pelo nome comm e injeta o shellcode PIC nele usando uma máquina de estados ptrace de múltiplos estágios. Sai limpo após a injeção — não deixa rastros.
Ghost-C2 v3.6.2 permite que o operador troque o protocolo de rede a quente sem perder o agente. Ao enviar comandos de pivô específicos, as VTables tanto no Mestre quanto no Agente são sobrescritas dinamicamente:
!D (Pivô para DNS): Ambos os nós fecham sockets ICMP e inicializam comunicação UDP Porta 53. Ideal para contornar filtragem estrita de Camada 3, misturando-se ao tráfego DNS corporativo.!I (Pivô para ICMP): O Agente fecha sockets UDP, mata bindings de porta e retorna ao sniffing silencioso de Raw Socket. Perfeito para modo stealth "Fantasma".O motor de transmissão de dados do Ghost-C2 utiliza uma camada híbrida de compressão e codificação fortemente otimizada em Assembly x86-64.
Cada pacote ICMP de saída é estruturado para ser indistinguível de um ping Linux padrão:
struct timeval.iputils do Linux (0x10 a 0x1F) contorna firewalls heurísticos básicos.Ambas as direções são criptografadas com uma chave QWORD que se desloca progressivamente. Isso mantém a entropia de Shannon baixa (diferente do AES, que atinge ~8.0 e dispara anomalias de DPI). XOR rotativo produz entropia que parece dados naturalmente ruidosos. Sem constantes criptográficas, sem S-boxes, nada para o YARA corresponder.
O implante ignora todos os pacotes ICMP onde ID + SEQ ≠ 45.000. O implante responde com pacotes onde ID + SEQ = 55.000. Isso evita confusão de eco do sistema operacional e filtra scanners de internet ou honeypots.
memfd_createA saída do comando nunca toca o disco. A saída do shell é capturada através de um arquivo RAM anônimo (memfd_create), nomeado [shm] para se misturar a mapeamentos de memória compartilhada legítimos em /proc/PID/fd.
Derrota mitigações modernas do kernel que proíbem memória RWX. O loader usa uma abordagem de duas fases (mmap remoto com RW → Injetar → mprotect remoto com RX). Nenhuma página é simultaneamente W e X.
Todos os números de syscall são divididos em duas instruções para derrotar análise estática e scanners simples baseados em grep.
Para manter OPSEC estrito, o agente Ghost-C2 (sniff.asm) não usa configurações externas. Você deve definir seu IP Mestre C2, Porta e Domínio DNS Isca diretamente no código assembly antes de compilar e injetar.
Abra sniff.asm e role até o final do segmento .text. (Nota: Como o agente é estritamente Código Independente de Posição (PIC), não há segmento .data. Todas as variáveis de configuração são armazenadas inline).
Modifique os seguintes valores para corresponder ao seu Servidor Mestre:
db 127, 0, 0, 1 para o IP do seu Mestre.dw 0xB414 (Porta 5300) para a porta desejada em Ordem de Byte de Rede (ex.: 0x3500 para Porta 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 gerado.xor.py e substitua o conteúdo da variável raw_asm pelo seu shellcode copiado.python3 xor.py e copie a saída criptografada.loader.asm.c2_payload:.target db "cron", 10).nasm -f elf64 loader.asm -o loader.o
ld loader.o -o loader
Execute na máquina alvo com privilégios de root (sudo ./loader). O agente agora está rodando completamente fileless.
Antes de compilar o Console Mestre, você deve garantir que seu ouvinte e perfis de alvo estejam alinhados com a configuração do seu Agente. Abra client.asm e navegue até a seção .data.
Localize master_bind_addr. É aqui que o Mestre escuta por beacons DNS de entrada.
Porta UDP: Altere dw 0xB414 para corresponder à porta para a qual seu Agente está enviando.
Nota: Isso deve estar em Ordem de Byte de Rede. Para Porta 53, use 0x3500.
Localize target_addr. Esta porta é usada quando você realiza um Pivô DNS (!D) ou usa o módulo de Reconexão.
Alinhamento de Porta: Altere dw 0xB414 para corresponder à porta UDP na qual o Agente está ouvindo. Se essas portas não corresponderem, ocorrerá o (Deadlock), pois o Mestre estará gritando no vazio errado.
Uma vez configurado, monte e linke o Mestre:
nasm -f elf64 client.asm -o client.o
ld client.o -o client
Dica profissional: Sempre mantenha uma "Folha de Perfil" para sua operação. Se você alterar a porta para 0x3500 (Porta 53) no sniff.asm, você DEVE atualizar tanto master_bind_addr quanto target_addr no client.asm antes do início da operação.
Nota: O Console do Operador requer privilégios de root para vincular raw sockets e porta UDP 53.
Para garantir acesso persistente e evitar perda de sessão, sempre retorne o Agente ao Modo ICMP (!I) antes de encerrar sua sessão do Console Mestre.
A Lógica: ICMP é o "Canal Dourado" do Ghost-C2 — ele é sem estado, passivo e sempre alcançável via IP Alvo.
O Risco: O modo DNS depende de sincronização dinâmica de porta UDP. Se o Console Mestre for fechado enquanto estiver no modo DNS, o Agente permanece "preso" em um estado de escuta UDP. Restabelecer a conexão exigiria conhecer a porta efêmera específica do Agente, que é perdida ao reiniciar o Mestre.
Testado em ambiente de laboratório controlado contra inspeção de tráfego ativa:
| Teste | Resultado |
|---|---|
| Suricata v8.0.3 (conjunto de regras Emerging Threats) | ✅ Bypassado |
| Suricata v8.0.3 (regras ICMP personalizadas de payload) | ✅ Bypassado |
| Gateway DigitalOcean FRA1 | ✅ 100% de sucesso na exfiltração |
| Alertas gerados durante exfiltração de ~25KB | 0 |
Ghost-C2 interage diretamente com o kernel Linux:
mprotectA ausência de um PTY é uma decisão arquitetural, não uma limitação:
/dev/ptmx e ioctl que EDRs monitoram intensamente.Ghost-C2 é um implante de execução de comandos e exfiltração hiper-stealth. Interatividade troca invisibilidade por conveniência — este projeto escolheu a invisibilidade.
Por design, Pull Requests e Forks são estritamente ignorados. A arquitetura deste projeto é mantida diretamente pelo autor. Se você encontrar um bug, falha lógica ou tiver uma sugestão de funcionalidade, abra uma Issue. Mantenha-a objetiva e técnica.
Ghost-C2 é construído com paixão, suor e Assembly x64 puro. Se este projeto ajudou você a entender evasão de baixo nível, mimetismo de protocolo, ou apenas tornou suas operações de red team mais suaves, considere apoiar o desenvolvimento!
👉 Torne-se um Patrocinador no GitHub
Ghost-C2 é desenvolvido estritamente para fins educacionais, engenharia reversa e pesquisa autorizada em segurança cibernética.
A partir da versão 3.6.1 em diante, este projeto está licenciado sob a GNU Affero General Public License v3.0 (AGPLv3). Qualquer entidade que interaja ou modifique este software através de uma rede deve divulgar seu código fonte completo, conforme exigido pela licença. Exploração comercial ou integração em plataformas proprietárias/de código fechado é estritamente proibida.
Copyright (c) 2026 JM00NJ (commSync). Todos os Direitos Reservados.
O autor não é responsável por qualquer uso ilegal ou dano causado por esta ferramenta. Use por sua conta e risco.
| Syscall | Número | Uso |
|---|
sys_socket | 41 | Criação de socket ICMP Raw / UDP |
sys_recvfrom | 45 | Captura passiva de pacotes ICMP/UDP |
sys_sendto | 44 | Transmissão de resposta ICMP/UDP |
sys_bind | 49 | Vinculação de porta UDP DNS |
sys_memfd_create | 319 | Arquivo RAM anônimo para saída |
sys_dup2 | 33 | Redirecionamento de stdout/stderr |
sys_execve | 59 | Execução de comando shell |
sys_fork | 57 | Isolamento de processo |
sys_ptrace | 101 | Injeção de processo + anti-debug |
sys_getdents64 | 217 | Parseamento de diretório /proc |
sys_mmap | 9 | Alocação remota de memória |
sys_mprotect | 10 | Troca de permissão W^X |