
Framework C2 in Assembly x64 fileless con pivoting di protocollo ICMP/DNS a doppio canale, esecuzione diretta di syscall e iniezione di processi basata su ptrace per un'esecuzione furtiva di comandi ed esfiltrazione di dati.
________ ___ ___ ________ ________ _________ ________ ________
|\ ____\|\ \|\ \|\ __ \|\ ____\|\___ ___\ |\ ____\|\_____ \
\ \ \___| \ \ \\\ \ \ \|\ \ \ \___|\|___ \ \_| \ \ \___|\|____|\ \
\ \ \ __ \ \ __ \ \ \\\ \ \_____ \ \ \ \ \ \ \ ____\_\ \
\ \ \|\ \ \ \ \ \ \ \\\ \|____|\ \ \ \ \ \ \ \___|\____ \ \
\ \_______\ \__\ \__\ \_______\____\_\ \ \ \__\ \ \______\\_________\
\|_______|\|__|\|__|\|_______|\_________\ \|__| \|______\|_________|
\|_________|
Implant C2 fileless in puro Assembly x64 che utilizza un'architettura a doppio canale (ICMP / DNS). Zero libc. Zero disco. Invisibile agli hook EDR standard.
⭐️ Se trovi utile questa ricerca, considera di mettere una stella per supportare lo sviluppo futuro
🚨 RICERCA TECNICA COMPLETA E CODICE SORGENTE: Questa repository è un riepilogo. Per l'analisi architetturale completa, i dettagli sull'evasione della memoria W^X e l'implementazione della VTable, visita la pagina ufficiale del progetto: ICMP-Ghost Technical Breakdown
Ghost-C2 è un framework di command-and-control scritto interamente in Assembly x64 Linux puro, senza dipendenze da libc. Ogni operazione passa attraverso syscall dirette. Non ci sono tabelle di importazione, nessun artefatto del dynamic linker e nessuna scrittura su disco.
Nato originariamente come canale stealth ICMP raw, la versione 3.6.2 introduce un'architettura di Protocol Pivoting a doppio canale. Gli operatori possono passare senza problemi il canale di comunicazione dell'implant tra ICMP Raw Sockets silenziosi e DNS UDP Tunneling elusivo, al volo. L'implant vive esclusivamente in RAM, iniettato in un processo di sistema in esecuzione tramite un loader personalizzato basato su ptrace.
Questo progetto è stato realizzato per esplorare fino a che punto possono spingersi lo stealth nello spazio utente e la sincronizzazione dello stato di rete senza toccare il 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 — Console dell'OperatoreIl terminale lato attaccante. Gestisce l'interfaccia utente, la gestione dinamica della memoria e la sincronizzazione dello stato del target. Può inviare pacchetti sia come ICMP Echo Request che come query DNS TXT. Ascolta le risposte frammentate, previene i buffer overflow e ricostruisce l'output. Include un modulo di "Active Target Reconnection" per recuperare sessioni orfane.
sniff.asm — Agente Implant PICL'implant in esecuzione sul target. Compilato come binario raw (position-independent, senza header ELF) così da poter essere iniettato in indirizzi di memoria arbitrari. Aggiorna dinamicamente la sua VTable interna per passare dallo sniffing ICMP al binding UDP DNS in base ai comandi di pivot dell'operatore.
Phantom_Loader/loader.asm — Motore di IniezioneIl meccanismo di consegna. Scansiona /proc, trova un processo target tramite il nome comm e vi inietta la shellcode PIC usando una macchina a stati ptrace multistadio. Termina in modo pulito dopo l'iniezione — non lascia tracce.
Ghost-C2 v3.6.2 consente all'operatore di cambiare a caldo il protocollo di rete senza perdere l'agente. Inviando specifici comandi di pivot, le VTable sia nel Master che nell'Agente vengono sovrascritte dinamicamente:
!D (Pivot a DNS): Entrambi i nodi chiudono i socket ICMP e inizializzano la comunicazione UDP sulla Porta 53. Ideale per bypassare un filtraggio Layer 3 rigoroso mimetizzandosi nel traffico DNS aziendale.!I (Pivot a ICMP): L'Agente chiude i socket UDP, elimina i binding di porta e torna allo sniffing silenzioso su Raw Socket. Perfetto per la modalità stealth "Phantom".Il motore di trasmissione dati di Ghost-C2 utilizza un layer ibrido di compressione e codifica pesantemente ottimizzato in Assembly x86-64.
Ogni pacchetto ICMP in uscita è strutturato per essere indistinguibile da un ping Linux standard:
struct timeval.iputils Linux esatto (da 0x10 a 0x1F) bypassa i firewall euristici di base.Entrambe le direzioni sono cifrate con una chiave QWORD che si sposta progressivamente. Questo mantiene bassa l'entropia di Shannon (a differenza di AES, che raggiunge ~8.0 e innesca anomalie DPI). Il Rolling XOR produce un'entropia che appare come dati naturalmente rumorosi. Nessuna costante crittografica, nessuna S-box, nulla che YARA possa intercettare.
L'implant ignora tutti i pacchetti ICMP in cui ID + SEQ ≠ 45,000. L'implant risponde con pacchetti in cui ID + SEQ = 55,000. Questo previene la confusione dell'eco del sistema operativo e filtra gli scanner internet o gli honeypot.
memfd_createL'output dei comandi non tocca mai il disco. L'output della shell viene catturato tramite un file anonimo in RAM (memfd_create), chiamato [shm] per mimetizzarsi tra i mapping legittimi di memoria condivisa in /proc/PID/fd.
Sconfigge le moderne mitigazioni del kernel che vietano la memoria RWX. Il loader utilizza un approccio a due fasi (Remote mmap con RW → Inietta → Remote mprotect con RX). Nessuna pagina è mai simultaneamente W e X.
Tutti i numeri di syscall sono suddivisi tra due istruzioni per sconfiggere l'analisi statica e i semplici scanner basati su grep.
Per mantenere uno stretto OPSEC, l'agente Ghost-C2 (sniff.asm) non utilizza configurazioni esterne. Devi definire IP, Porta e Dominio DNS Decoy del tuo Master C2 direttamente nel codice assembly prima di compilare e iniettare.
Apri sniff.asm e scorri fino in fondo al segmento .text. (Nota: poiché l'agente è strettamente Position Independent Code (PIC), non esiste un segmento .data. Tutte le variabili di configurazione sono memorizzate inline).
Modifica i seguenti valori per allinearli al tuo Master Server:
db 127, 0, 0, 1 con l'IP del tuo Master.dw 0xB414 (Porta 5300) con la porta desiderata in Network Byte Order (es. 0x3500 per la 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 generato.xor.py e sostituisci il contenuto della variabile raw_asm con la shellcode copiata.python3 xor.py e copia l'output cifrato.loader.asm.c2_payload:.target db "cron", 10).nasm -f elf64 loader.asm -o loader.o
ld loader.o -o loader
Esegui sulla macchina target con privilegi di root (sudo ./loader). L'agente ora è in esecuzione completamente fileless.
Prima di compilare la Console Master, devi assicurarti che il listener e i profili target siano allineati con la configurazione del tuo Agente. Apri client.asm e vai alla sezione dell'area .data.
Individua master_bind_addr. È qui che il Master resta in ascolto dei beacon DNS in arrivo.
Porta UDP: Cambia dw 0xB414 per allinearla alla porta verso cui il tuo Agente sta inviando.
Nota: Deve essere in Network Byte Order. Per la Porta 53, usa 0x3500.
Individua target_addr. Questa porta viene usata quando esegui un DNS Pivot (!D) o usi il modulo Reconnect.
Allineamento delle Porte: Cambia dw 0xB414 per allinearla alla porta UDP su cui l'Agente è in ascolto. Se queste porte non coincidono, si verificherà un (Deadlock) perché il Master starà gridando nel vuoto sbagliato.
Una volta configurata, assembla e linka il Master:
nasm -f elf64 client.asm -o client.o
ld client.o -o client
Consiglio da pro: tieni sempre una "Scheda di Profilo" per la tua operazione. Se cambi la porta a 0x3500 (Porta 53) in sniff.asm, DEVI aggiornare sia master_bind_addr che target_addr in client.asm prima che l'operazione inizi.
Nota: La Console dell'Operatore richiede privilegi di root per bindare raw socket e la porta UDP 53.
Per garantire un accesso persistente e prevenire la perdita della sessione, riporta sempre l'Agente in Modalità ICMP (!I) prima di terminare la sessione della Console Master.
La Logica: ICMP è il "Golden Channel" di Ghost-C2—è stateless, passivo e sempre raggiungibile tramite l'IP del Target.
Il Rischio: la modalità DNS si basa sulla sincronizzazione dinamica delle porte UDP. Se la Console Master viene chiusa mentre è in modalità DNS, l'Agente rimane "intrappolato" in uno stato di ascolto UDP. Ristabilire la connessione richiederebbe di conoscere la porta effimera specifica dell'Agente, che viene persa al riavvio del Master.
Testato in un ambiente di laboratorio controllato contro l'ispezione attiva del traffico:
| Test | Risultato |
|---|---|
| Suricata v8.0.3 (ruleset Emerging Threats) | ✅ Bypassato |
| Suricata v8.0.3 (regole payload ICMP personalizzate) | ✅ Bypassato |
| Gateway DigitalOcean FRA1 | ✅ 100% di successo nell'exfiltration |
| Avvisi generati durante l'exfiltration di ~25KB | 0 |
Ghost-C2 interagisce direttamente con il kernel Linux:
mprotectL'assenza di una PTY è una decisione architetturale, non una limitazione:
/dev/ptmx e ioctl che gli EDR monitorano pesantemente.Ghost-C2 è un implant di esecuzione comandi ed exfiltration iper-stealth. L'interattività scambia l'invisibilità con la comodità — questo progetto ha scelto l'invisibilità.
Per scelta progettuale, Pull Request e Fork vengono rigorosamente ignorati. L'architettura di questo progetto è mantenuta direttamente dall'autore. Se trovi un bug, un difetto logico o hai un suggerimento per una funzionalità, apri una Issue. Mantienila obiettiva e tecnica.
Ghost-C2 è costruito con passione, sudore e puro Assembly x64. Se questo progetto ti ha aiutato a capire l'evasione di basso livello, la mimica dei protocolli, o ha semplicemente reso più fluide le tue operazioni di red teaming, considera di supportare lo sviluppo!
👉 Diventa uno Sponsor su GitHub
Ghost-C2 è sviluppato rigorosamente per scopi educativi, reverse engineering e ricerca cybersecurity autorizzata.
A partire dalla versione 3.6.1 in poi, questo progetto è concesso in licenza GNU Affero General Public License v3.0 (AGPLv3). Qualsiasi soggetto che interagisca con o modifichi questo software tramite rete deve divulgare il proprio codice sorgente completo come richiesto dalla licenza. Lo sfruttamento commerciale o l'integrazione in piattaforme proprietarie/closed-source è severamente vietato.
Copyright (c) 2026 JM00NJ (commSync). Tutti i diritti riservati.
L'autore non è responsabile per qualsiasi uso illegale o danno causato da questo strumento. Usalo a tuo rischio.
| Syscall | Numero | Utilizzo |
|---|
sys_socket | 41 | Creazione socket raw ICMP / UDP |
sys_recvfrom | 45 | Cattura passiva di pacchetti ICMP/UDP |
sys_sendto | 44 | Trasmissione risposte ICMP/UDP |
sys_bind | 49 | Binding della porta UDP DNS |
sys_memfd_create | 319 | File anonimo in RAM per l'output |
sys_dup2 | 33 | Redirezione stdout/stderr |
sys_execve | 59 | Esecuzione comandi shell |
sys_fork | 57 | Isolamento del processo |
sys_ptrace | 101 | Iniezione nel processo + anti-debug |
sys_getdents64 | 217 | Parsing della directory /proc |
sys_mmap | 9 | Allocazione di memoria remota |
sys_mprotect | 10 | Cambio dei permessi W^X |