
Dateiloses x64-Assembly-C2-Framework mit Dual-Channel-ICMP/DNS-Protokoll-Pivoting, direkter Syscall-Ausführung und ptrace-basierter Prozessinjektion für verdeckte Befehlsausführung und Datenextiltration.
________ ___ ___ ________ ________ _________ ________ ________
|\ ____\|\ \|\ \|\ __ \|\ ____\|\___ ___\ |\ ____\|\_____ \
\ \ \___| \ \ \\\ \ \ \|\ \ \ \___|\|___ \ \_| \ \ \___|\|____|\ \
\ \ \ __ \ \ __ \ \ \\\ \ \_____ \ \ \ \ \ \ \ ____\_\ \
\ \ \|\ \ \ \ \ \ \ \ \\\ \|____|\ \ \ \ \ \ \ \___|\____ \ \
\ \_______\ \__\ \__\ \_______\____\_\ \ \ \__\ \ \______\\_________\
\|_______|\|__|\|__|\|_______|\_________\ \|__| \|______\|_________|
\|_________|
Dateiloser, reiner x64-Assembly-C2-Implantat, der eine Dual-Channel-Architektur (ICMP / DNS) nutzt. Null libc. Null Festplatte. Unsichtbar für standardmäßige EDR-Hooks.
⭐️ Wenn du diese Forschung nützlich findest, ziehe bitte in Betracht, ihr einen Stern zu geben, um die weitere Entwicklung zu unterstützen
🚨 VOLLSTÄNDIGE TECHNISCHE FORSCHUNG & QUELLCODE: Dieses Repository ist eine Zusammenfassung. Für die vollständige architektonische Aufschlüsselung, W^X-Speicher-Evasion-Details und VTable-Implementierung besuche die offizielle Projektseite: ICMP-Ghost Technical Breakdown
Ghost-C2 ist ein Command-and-Control-Framework, das vollständig in reinem x64-Linux-Assembly ohne libc-Abhängigkeiten geschrieben ist. Jeder Vorgang läuft über direkte Syscalls. Es gibt keine Importtabellen, keine Dynamic-Linker-Artefakte und keine Schreibvorgänge auf die Festplatte.
Ursprünglich als roher ICMP-Stealth-Kanal konzipiert, führt Version 3.6.2 eine Dual-Channel-Protokoll-Pivoting-Architektur ein. Betreiber können den Kommunikationskanal des Implantats im laufenden Betrieb nahtlos zwischen stillen ICMP-Raw-Sockets und ausweichendem DNS-UDP-Tunneling umschalten. Das Implantat lebt ausschließlich im RAM und wird über einen benutzerdefinierten ptrace-basierten Loader in einen laufenden Systemprozess injiziert.
Dieses Projekt entstand, um zu erkunden, wie weit User-Space-Stealth und Netzwerkzustandssynchronisation gehen können, ohne den Kernel zu berühren.
┌─────────────────────────────────────────────────────────────┐
│ 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 — Operator-KonsoleDas Terminal auf Angreiferseite. Verwaltet UI, dynamische Speicherverwaltung und Zielzustandssynchronisation. Kann Pakete entweder als ICMP-Echo-Requests oder DNS-TXT-Abfragen versenden. Lauscht auf fragmentierte Antworten, verhindert Pufferüberläufe und rekonstruiert die Ausgabe. Verfügt über ein Modul zur „Active Target Reconnection“, um verwaiste Sitzungen zu retten.
sniff.asm — PIC-Implantat-AgentDas auf dem Zielsystem laufende Implantat. Wird als rohes Binärformat kompiliert (positionsunabhängig, ohne ELF-Header), sodass es in beliebige Speicheradressen injiziert werden kann. Es aktualisiert dynamisch seine interne VTable, um auf Basis von Operator-Pivot-Befehlen zwischen ICMP-Sniffing und UDP-DNS-Bindung umzuschalten.
Phantom_Loader/loader.asm — Injektions-EngineDer Zustellmechanismus. Durchsucht /proc, findet einen Zielprozess anhand des Comm-Namens und injiziert den PIC-Shellcode mithilfe einer mehrstufigen ptrace-Zustandsmaschine. Beendet sich sauber nach der Injektion – hinterlässt keine Spuren.
Ghost-C2 v3.6.2 erlaubt dem Betreiber, das Netzwerkprotokoll zu wechseln, ohne den Agent zu verlieren. Durch das Senden spezifischer Pivot-Befehle werden die VTables sowohl im Master als auch im Agent dynamisch überschrieben:
!D (Pivot zu DNS): Beide Knoten schließen ICMP-Sockets und initialisieren die Kommunikation über UDP-Port 53. Ideal, um strenge Layer-3-Filter zu umgehen, indem man sich in den Unternehmens-DNS-Verkehr einfügt.!I (Pivot zu ICMP): Der Agent schließt UDP-Sockets, beendet Portbindungen und fällt zurück in stilles Raw-Socket-Sniffing. Perfekt für den „Phantom“-Stealth-Modus.Die Datenübertragungs-Engine von Ghost-C2 nutzt eine hybride Kompressions- und Kodierungsschicht, die stark in x86-64-Assembly optimiert ist.
Jedes ausgehende ICMP-Paket ist so strukturiert, dass es nicht von einem standardmäßigen Linux-ping zu unterscheiden ist:
struct timeval.iputils-Padding (0x10 bis 0x1F) umgeht einfache heuristische Firewalls.Beide Richtungen werden mit einem sich progressiv verschiebenden QWORD-Schlüssel verschlüsselt. Dadurch bleibt die Shannon-Entropie niedrig (anders als bei AES, das etwa 8.0 erreicht und DPI-Anomalien auslöst). Rolling-XOR erzeugt Entropie, die wie natürlich verrauschte Daten aussieht. Keine kryptografischen Konstanten, keine S-Boxen, nichts, das YARA matchen könnte.
Das Implantat ignoriert alle ICMP-Pakete, bei denen ID + SEQ ≠ 45,000. Das Implantat antwortet mit Paketen, bei denen ID + SEQ = 55,000. Dies verhindert OS-Echo-Verwirrung und filtert Internet-Scanner oder Honeypots aus.
memfd_createDie Befehlsausgabe berührt nie die Festplatte. Die Shell-Ausgabe wird über eine anonyme RAM-Datei (memfd_create) erfasst, die als [shm] benannt ist, um sich in legitime Shared-Memory-Zuordnungen in /proc/PID/fd einzufügen.
Überwindet moderne Kernel-Härtungen, die RWX-Speicher verbieten. Der Loader verwendet einen zweiphasigen Ansatz (Remote mmap mit RW → Injizieren → Remote mprotect mit RX). Keine Seite ist jemals gleichzeitig W und X.
Alle Syscall-Nummern werden auf zwei Anweisungen aufgeteilt, um statische Analyse und einfache grep-basierte Scanner zu besiegen.
Um strenge OPSEC zu gewährleisten, verwendet der Ghost-C2-Agent (sniff.asm) keine externen Konfigurationen. Du musst die Master-C2-IP, den Port und die Decoy-DNS-Domain direkt im Assembly-Code definieren, bevor du kompilierst und injizierst.
Öffne sniff.asm und scrolle ganz nach unten zum .text-Segment. (Hinweis: Da der Agent strikt positionsunabhängiger Code (PIC) ist, gibt es kein .data-Segment. Alle Konfigurationsvariablen sind inline gespeichert).
Ändere die folgenden Werte, damit sie zu deinem Master-Server passen:
db 127, 0, 0, 1 in die IP deines Masters.dw 0xB414 (Port 5300) in den gewünschten Port in Network Byte Order (z. B. 0x3500 für Port 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 und ersetze den Inhalt der Variable raw_asm durch deinen kopierten Shellcode.python3 xor.py aus und kopiere die verschlüsselte Ausgabe.loader.asm.c2_payload:.target db "cron", 10 anpasst).nasm -f elf64 loader.asm -o loader.o
ld loader.o -o loader
Führe ihn auf dem Zielsystem mit Root-Rechten aus (sudo ./loader). Der Agent läuft nun vollständig dateilos.
Bevor du die Master-Konsole kompilierst, musst du sicherstellen, dass ihre Listener- und Zielprofile mit der Konfiguration deines Agents übereinstimmen. Öffne client.asm und navigiere zum .data-Bereich.
Suche master_bind_addr. Hier lauscht der Master auf eingehende DNS-Beacons.
UDP-Port: Ändere dw 0xB414, damit er dem Port entspricht, an den dein Agent sendet.
Hinweis: Dies muss in Network Byte Order erfolgen. Für Port 53 verwende
0x3500.
Suche target_addr. Dieser Port wird verwendet, wenn du einen DNS-Pivot (!D) durchführst oder das Reconnect-Modul nutzt.
Port-Ausrichtung: Ändere dw 0xB414, damit er dem UDP-Port entspricht, auf dem der Agent lauscht. Wenn diese Ports nicht übereinstimmen, kommt es zum (Deadlock), da der Master ins Leere schreit.
Nach der Konfiguration assemblieren und linken:
nasm -f elf64 client.asm -o client.o
ld client.o -o client
Protipp: Bewahre für deine Operation immer ein „Profile Sheet“ auf. Wenn du den Port in sniff.asm auf 0x3500 (Port 53) änderst, MUSST du vor Operationsbeginn sowohl master_bind_addr als auch target_addr in client.asm aktualisieren.
Hinweis: Die Operator-Konsole benötigt Root-Rechte, um Raw-Sockets und UDP-Port 53 zu binden.
Um dauerhaften Zugriff zu gewährleisten und Sitzungsverluste zu vermeiden, pivote den Agent vor dem Beenden deiner Master-Konsolen-Sitzung immer zurück in den ICMP-Modus (!I).
Die Logik: ICMP ist der „Goldene Kanal“ von Ghost-C2 – er ist zustandslos, passiv und über die Ziel-IP immer erreichbar.
Das Risiko: Der DNS-Modus basiert auf dynamischer UDP-Port-Synchronisation. Wenn die Master-Konsole im DNS-Modus geschlossen wird, bleibt der Agent in einem UDP-Hörzustand „gefangen“. Eine Wiederverbindung würde erfordern, den spezifischen ephemeren Port des Agents zu kennen, der beim Neustart des Masters verloren geht.
!I (Zu ICMP wechseln)Ctrl+C (Master beenden)Getestet in einer kontrollierten Laborumgebung mit aktiver Verkehrsinspektion:
| Test | Ergebnis |
|---|---|
| Suricata v8.0.3 (Emerging-Threats-Regelsatz) | ✅ Umgangen |
| Suricata v8.0.3 (Benutzerdefinierte ICMP-Payload-Regeln) | ✅ Umgangen |
| DigitalOcean-FRA1-Gateway | ✅ 100 % Exfiltration-Erfolg |
| Bei ~25 KB Exfiltration erzeugte Alerts | 0 |
Ghost-C2 interagiert direkt mit dem Linux-Kernel:
mprotect-Abhängigkeiten zu eliminierenDas Fehlen einer PTY ist eine architektonische Entscheidung, keine Einschränkung:
/dev/ptmx- und ioctl-Aufrufe, die von EDRs stark überwacht werden.Ghost-C2 ist ein hyperstealthy Implantat zur Befehlsausführung und Exfiltration. Interaktivität tauscht Unsichtbarkeit gegen Bequemlichkeit – dieses Projekt hat sich für Unsichtbarkeit entschieden.
Beabsichtigt werden Pull Requests und Forks strikt ignoriert. Die Architektur dieses Projekts wird direkt vom Autor gepflegt. Wenn du einen Fehler, einen Logikfehler oder einen Feature-Wunsch findest, öffne bitte ein Issue. Bleibe objektiv und technisch.
Ghost-C2 wurde mit Leidenschaft, Schweiß und reinem x64-Assembly gebaut. Wenn dir dieses Projekt geholfen hat, Low-Level-Evasion, Protokoll-Nachahmung zu verstehen oder deine Red-Teaming-Operationen reibungsloser zu machen, erwäge, die Entwicklung zu unterstützen!
Ghost-C2 wird streng für Bildungszwecke, Reverse Engineering und autorisierte Cybersicherheitsforschung entwickelt.
Ab Version 3.6.1 steht dieses Projekt unter der GNU Affero General Public License v3.0 (AGPLv3). Jede Entität, die mit dieser Software über ein Netzwerk interagiert oder sie modifiziert, muss ihren vollständigen Quellcode offenlegen, wie es die Lizenz vorschreibt. Kommerzielle Ausbeutung oder Integration in proprietäre/Closed-Source-Plattformen ist strikt untersagt.
Copyright (c) 2026 JM00NJ (commSync). Alle Rechte vorbehalten.
Der Autor ist nicht verantwortlich für eine illegale Nutzung oder Schäden, die durch dieses Tool verursacht werden. Nutzung auf eigene Gefahr.
| Syscall | Nummer | Verwendung |
|---|
sys_socket | 41 | Erstellung von Raw-ICMP-/UDP-Sockets |
sys_recvfrom | 45 | Passive ICMP/UDP-Paketerfassung |
sys_sendto | 44 | Senden von ICMP/UDP-Antworten |
sys_bind | 49 | UDP-DNS-Portbindung |
sys_memfd_create | 319 | Anonyme RAM-Datei für Ausgabe |
sys_dup2 | 33 | stdout/stderr-Umleitung |
sys_execve | 59 | Ausführung von Shell-Befehlen |
sys_fork | 57 | Prozessisolierung |
sys_ptrace | 101 | Prozessinjektion + Anti-Debugging |
sys_getdents64 | 217 | /proc-Verzeichnisparsing |
sys_mmap | 9 | Remote-Speicherzuteilung |
sys_mprotect | 10 | W^X-Berechtigungswechsel |