• Алексей
  • DevOps
  • 2 мин. чтения

Собираем C2 на Raspberry Pi за один вечер

Собираем C2 на Raspberry Pi за один вечер

Зачем нужен C2 на малинке: краткий контекст

Command and Control сервер — это центральная точка управления сетевой инфраструктурой, позволяющая отправлять команды на удалённые машины и собирать данные об их состоянии. Обычно такие системы разворачивают на мощных серверах, но оказывается, что для локальной сети или небольшого парка устройств можно обойтись и Raspberry Pi. За счёт низкого энергопотребления и компактности «малинка» идеально подходит для домашней лаборатории или микросервисной архитектуры.

Выбираем софт: что установить на Pi

Первое решение — выбрать фреймворк. Я остановился на сочетании Node.js и Express.js для быстрого развёртывания HTTP API, но вы можете использовать Python с Flask или Go с Gin — всё зависит от ваших предпочтений.

Также потребуется:

  • SQLite или PostgreSQL для хранения информации об агентах
  • Redis как брокер сообщений для асинхронной обработки команд
  • PM2 или systemd для управления процессами
  • Nginx в качестве reverse proxy

Главное преимущество этого стека — его экономичность по памяти. Pi с 4 ГБ ОЗУ легко справляется с обработкой команд от десятков агентов одновременно.

Пошаговое развёртывание за вечер

Шаг 1: Подготовка окружения (15 минут)

Устанавливаем последнюю версию Raspberry Pi OS (preferably Lite для экономии ресурсов):

  • Обновляем систему: sudo apt update && sudo apt upgrade -y
  • Устанавливаем Node.js 18+ через NodeSource репозиторий
  • Устанавливаем git, curl и nano для конфигурирования

Шаг 2: Создание базовой структуры проекта (20 минут)

Создаём папку проекта и инициализируем npm-проект:

  • Создаём файл package.json с зависимостями: express, sqlite3, axios, uuid
  • Устанавливаем зависимости через npm install
  • Создаём структуру папок: /src, /config, /routes, /models

Базовая архитектура: Express сервер слушает на портах 3000 (API) и 8080 (агенты), Redis работает на 6379 для кеширования команд.

Шаг 3: Реализация ядра C2 (30 минут)

Основной функционал включает три endpoint’а:

  • POST /api/register — регистрация нового агента с уникальным ID
  • GET /api/command/:agent_id — получение очереди команд для агента
  • POST /api/report/:agent_id — приём результатов выполнения команд

Для каждого агента храним: уникальный идентификатор, последнее время активности, версию клиента и статус. Команды сохраняются в SQLite с полем выполнения и результатом.

Шаг 4: Веб-интерфейс управления (25 минут)

Создаём простой HTML dashboard с использованием Bootstrap. На нём отображаются:

  • Список всех активных агентов в реальном времени
  • История команд и их статусы
  • Форма для отправки новой команды выбранным агентам
  • Логирование всех действий

Для обновления в реальном времени используем простой fetch-loop с интервалом 2 секунды (нагрузка минимальна даже на слабом Pi).

Шаг 5: Безопасность и автозапуск (15 минут)

Создаём systemd-сервис для автоматического запуска приложения при перезагрузке. Добавляем базовую аутентификацию через API-ключи, которые хранятся в переменных окружения. Для production рекомендуется использовать OAuth2, но для домашней лаборатории достаточно.

Настраиваем Nginx как reverse proxy для защиты от прямого доступа к Node.js процессу и ограничения rate limit’ов.

Практические советы из реального опыта

Мониторинг нагрузки. Используйте htop и iotop для отслеживания использования ЦП и диска. Pi часто упирается в I/O при работе с SQLite — если нагрузка велика, мигрируйте на PostgreSQL.

Логирование. Настройте систему логирования через winston или bunyan. Файлы логов имеют тенденцию расти быстро, поэтому используйте логротацию.

Сетевая безопасность. Запускайте C2 только в изолированной сети, используйте VPN для удалённого доступа. Никогда не открывайте порты напрямую в интернет без шифрования.

Масштабирование. При количестве агентов больше 100 рассмотрите использование очереди сообщений (RabbitMQ) и горизонтального масштабирования на несколько Pi или переход на более мощное оборудование.

Чеклист проверки перед боевым использованием

Перед тем как развернуть систему в production, убедитесь:

  • Все зависимости установлены и актуальны
  • Системный сервис стартует при перезагрузке
  • Логирование и мониторинг включены
  • Резервные копии БД создаются автоматически (cron скрипт)
  • API endpoints защищены аутентификацией
  • HTTPS/TLS настроены для внешних подключений
  • Проведено нагрузочное тестирование минимум на 50 одновременных агентов
  • Документирована процедура восстановления после сбоев

Результаты и выводы

За один вечер я развернул полностью функциональную систему управления агентами, потребившую всего 400 строк кода на Node.js. Raspberry Pi справляется с нагрузкой от 30-40 активных клиентов без каких-либо проблем, потребляя при этом менее 3 ватт электроэнергии.

Такое решение идеально подходит для домашней лаборатории, обучения или прототипирования инфраструктуры управления. Если требуется масштабировать дальше, перейти на «настоящие» серверы будет несложно — архитектура остаётся той же, меняется только оборудование.

Код проекта я разместил на GitHub в публичном репозитории с MIT лицензией — можете использовать как отправную точку для своих экспериментов.

Межтекстовые Отзывы
Посмотреть все комментарии
guest