
Бесфайловый C2-фреймворк на ассемблере x64 с двухканальным пивотингом по протоколам ICMP/DNS, прямым выполнением системных вызовов и внедрением в процессы на основе ptrace для скрытого выполнения команд и эксфильтрации данных.
________ ___ ___ ________ ________ _________ ________ ________
|\ ____\|\ \|\ \|\ __ \|\ ____\|\___ ___\ |\ ____\|\_____ \
\ \ \___| \ \ \\\ \ \ \|\ \ \ \___|\|___ \ \_| \ \ \___|\|____|\ \
\ \ \ __ \ \ __ \ \ \\\ \ \_____ \ \ \ \ \ \ \ ____\_\ \
\ \ \|\ \ \ \ \ \ \ \\\ \|____|\ \ \ \ \ \ \ \___|\____ \ \
\ \_______\ \__\ \__\ \_______\____\_\ \ \ \__\ \ \______\\_________\
\|_______|\|__|\|__|\|_______|\_________\ \|__| \|______\|_________|
\|_________|
Бесфайловый C2-имплант на чистом x64 Assembly, использующий двухканальную архитектуру (ICMP / DNS). Ноль libc. Ноль на диске. Невидим для стандартных EDR-хуков.
⭐️ Если вы считаете это исследование полезным, пожалуйста, поставьте звёздочку, чтобы поддержать дальнейшую разработку
🚨 ПОЛНОЕ ТЕХНИЧЕСКОЕ ИССЛЕДОВАНИЕ И ИСХОДНЫЙ КОД: Этот репозиторий — краткая сводка. Полное описание архитектуры, детали обхода памяти W^X и реализация VTable доступны на официальной странице проекта: ICMP-Ghost Technical Breakdown
Ghost-C2 — это C2-фреймворк, написанный полностью на чистом x64 Linux Assembly без зависимостей от libc. Каждая операция выполняется через прямые системные вызовы. Нет таблиц импорта, нет артефактов динамического линковщика и нет записи на диск.
Изначально созданный как скрытый ICMP-канал, версия 3.6.2 представляет архитектуру двухканального переключения протоколов (Dual-Channel Protocol Pivoting). Оператор может на лету переключать канал связи импланта между бесшумными raw-сокетами ICMP и маскирующимся DNS UDP-туннелированием. Имплант живёт исключительно в RAM, внедряясь в работающий системный процесс с помощью кастомного загрузчика на основе ptrace.
Этот проект создан, чтобы исследовать, насколько далеко можно продвинуться в скрытности пользовательского пространства и синхронизации состояния сети, не затрагивая ядро.
┌─────────────────────────────────────────────────────────────┐
│ 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 — консоль оператораАтакующая терминальная сторона. Обрабатывает интерфейс, динамическое управление памятью и синхронизацию состояния цели. Может отправлять пакеты как ICMP Echo Request, так и DNS TXT-запросы. Слушает фрагментированные ответы, предотвращает переполнение буфера и восстанавливает вывод. Содержит модуль «Active Target Reconnection» для восстановления потерянных сессий.
sniff.asm — PIC-имплантИмплант, работающий на цели. Скомпилирован как «сырой» бинарник (позиционно-независимый, без ELF-заголовков), поэтому может быть внедрён в произвольные адреса памяти. Динамически обновляет внутренний VTable для переключения между сниффингом ICMP и привязкой UDP DNS по командам оператора на переключение протокола.
Phantom_Loader/loader.asm — механизм внедренияМеханизм доставки. Сканирует /proc, находит целевой процесс по имени comm и внедряет PIC-шеллкод в него с помощью многоступенчатого ptrace-конечного автомата. После внедрения корректно завершает работу, не оставляя следов.
Ghost-C2 v3.6.2 позволяет оператору «горячо» менять сетевой протокол без потери агента. При отправке специальных команд переключения VTable как на стороне Master, так и на стороне Agent динамически перезаписываются:
!D (переключение на DNS): Оба узла закрывают ICMP-сокеты и инициализируют связь через UDP-порт 53. Идеально для обхода строгой фильтрации Layer 3 за счёт маскировки под корпоративный DNS-трафик.!I (переключение на ICMP): Агент закрывает UDP-сокеты, убивает привязки портов и возвращается в режим бесшумного сниффинга raw-сокетов. Идеально для «фантомного» режима скрытности.Движок передачи данных Ghost-C2 использует гибридный уровень сжатия и кодирования, сильно оптимизированный на x86-64 Assembly.
Каждый исходящий ICMP-пакет структурирован так, чтобы его нельзя было отличить от стандартного Linux ping:
struct timeval.iputils (0x10 – 0x1F) обходит базовые эвристические файрволы.Оба направления шифруются прогрессивно сдвигаемым QWORD-ключом. Это сохраняет низкую энтропию Шеннона (в отличие от AES с показателем ~8.0, вызывающим аномалии DPI). Rolling XOR даёт энтропию, похожую на естественный шум. Никаких криптографических констант, никаких S-блоков — YARA не за что зацепиться.
Имплант игнорирует все ICMP-пакеты, где ID + SEQ ≠ 45,000. Имплант отвечает пакетами, где ID + SEQ = 55,000. Это предотвращает путаницу с эхо-ответами ОС и отсеивает интернет-сканеры и honeypot-ловушки.
memfd_createВывод команд никогда не касается диска. Вывод оболочки захватывается через анонимный RAM-файл (memfd_create), названный [shm], чтобы сливаться с легитимными отображениями общей памяти в /proc/PID/fd.
Обходит современные защитные механизмы ядра, запрещающие RWX-память. Загрузчик использует двухфазный подход (Remote mmap с RW → Inject → Remote mprotect с RX). Ни одна страница никогда не является одновременно W и X.
Все номера системных вызовов разделены на две инструкции для обхода статического анализа и простых сканеров на основе grep.
Для соблюдения строгих требований OPSEC агент Ghost-C2 (sniff.asm) не использует внешние конфигурации. Вы должны определить IP-адрес Master C2, порт и фиктивный DNS-домен непосредственно в ассемблерном коде перед компиляцией и внедрением.
Откройте sniff.asm и прокрутите до самого низа сегмента .text. (Примечание: поскольку агент является строго позиционно-независимым кодом (PIC), сегмента .data не существует. Все конфигурационные переменные хранятся инлайн.)
Измените следующие значения в соответствии с вашим Master-сервером:
db 127, 0, 0, 1 на IP вашего Master.dw 0xB414 (порт 5300) на нужный порт в сетевом порядке байт (например, 0x3500 для порта 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 и замените содержимое переменной raw_asm на скопированный шеллкод.python3 xor.py и скопируйте зашифрованный вывод.loader.asm.c2_payload:.target db "cron", 10).nasm -f elf64 loader.asm -o loader.o
ld loader.o -o loader
Выполните на целевой машине с root-правами (sudo ./loader). Теперь агент работает полностью бесфайлово.
Перед компиляцией консоли Master убедитесь, что профили её слушателя и цели совпадают с конфигурацией агента. Откройте client.asm и перейдите к области .data.
Найдите master_bind_addr. Здесь Master прослушивает входящие DNS-маяки.
UDP-порт: Замените dw 0xB414 на порт, на который отправляет ваш агент.
Примечание: порт должен быть указан в сетевом порядке байт. Для порта 53 используйте
0x3500.
Найдите target_addr. Этот порт используется при DNS-переключении (!D) или использовании модуля Reconnect.
Согласование портов: Измените dw 0xB414, чтобы он совпадал с UDP-портом, который слушает агент. Если порты не совпадают, возникает (Deadlock): Master будет кричать не туда.
После настройки соберите и слинкуйте Master:
nasm -f elf64 client.asm -o client.o
ld client.o -o client
Совет: всегда держите «профильный лист» для вашей операции. Если вы меняете порт на 0x3500 (порт 53) в sniff.asm, вы ОБЯЗАНЫ обновить и master_bind_addr, и target_addr в client.asm до начала операции.
Примечание: консоль оператора требует root-прав для привязки raw-сокетов и UDP-порта 53.
Чтобы обеспечить постоянный доступ и не потерять сессию, всегда переключайте агента обратно в режим ICMP (!I) перед завершением сессии консоли Master.
Логика: ICMP — это «золотой канал» Ghost-C2 — он не имеет состояния, пассивен и всегда доступен через IP цели.
Риск: режим DNS полагается на динамическую синхронизацию UDP-портов. Если консоль Master закрыта в режиме DNS, агент остаётся «запертым» в состоянии прослушивания UDP. Для восстановления соединения потребуется знать конкретный эфемерный порт агента, который теряется при перезапуске Master.
Протестировано в контролируемой лабораторной среде с активной инспекцией трафика:
| Тест | Результат |
|---|---|
| Suricata v8.0.3 (набор правил Emerging Threats) | ✅ Обход |
| Suricata v8.0.3 (пользовательские правила ICMP-полезной нагрузки) | ✅ Обход |
| Шлюз DigitalOcean FRA1 | ✅ 100% успешная эксфильтрация |
| Оповещений при эксфильтрации ~25 КБ | 0 |
Ghost-C2 взаимодействует напрямую с ядром Linux:
mprotectОтсутствие PTY — это архитектурное решение, а не ограничение:
/dev/ptmx и вызовов ioctl, за которыми EDR-системы пристально следят.Ghost-C2 — это сверхскрытный имплант для выполнения команд и эксфильтрации. Интерактивность обменивает невидимость на удобство — этот проект выбрал невидимость.
По замыслу, Pull Request'ы и форки строго игнорируются. Архитектура этого проекта поддерживается непосредственно автором. Если вы нашли баг, логическую ошибку или у вас есть предложение по функциональности, пожалуйста, откройте Issue. Держите его объективным и техническим.
Ghost-C2 создан со страстью, потом и чистым x64 Assembly. Если этот проект помог вам понять низкоуровневые методы обхода, имитацию протоколов или просто сделал ваши операции red team более гладкими, поддержите разработку!
Ghost-C2 разработан строго в образовательных целях, для обратной разработки и авторизованных исследований в области кибербезопасности.
Начиная с версии 3.6.1 и далее, этот проект распространяется под лицензией GNU Affero General Public License v3.0 (AGPLv3). Любая организация, взаимодействующая с этим ПО или модифицирующая его через сеть, обязана раскрыть свой полный исходный код, как того требует лицензия. Коммерческая эксплуатация или интеграция в проприетарные/закрытые платформы строго запрещены.
Copyright (c) 2026 JM00NJ (commSync). Все права защищены.
Автор не несёт ответственности за любое незаконное использование или ущерб, причинённый этим инструментом. Используйте его на свой страх и риск.
| Системный вызов | Номер | Назначение |
|---|
sys_socket | 41 | Создание raw-сокета ICMP/UDP |
sys_recvfrom | 45 | Пассивный захват ICMP/UDP-пакетов |
sys_sendto | 44 | Передача ICMP/UDP-ответов |
sys_bind | 49 | Привязка UDP DNS-порта |
sys_memfd_create | 319 | Анонимный RAM-файл для вывода |
sys_dup2 | 33 | Перенаправление stdout/stderr |
sys_execve | 59 | Выполнение команд оболочки |
sys_fork | 57 | Изоляция процессов |
sys_ptrace | 101 | Внедрение в процессы + анти-отладка |
sys_getdents64 | 217 | Разбор каталога /proc |
sys_mmap | 9 | Выделение удалённой памяти |
sys_mprotect | 10 | Переключение прав W^X |