
Генерировать конфигурации редиректора Caddy из профилей Cobalt Strike или Sliver C2.
CaddySmith — это небольшой скрипт на Python, который читает профиль C2 от Cobalt Strike или Sliver и генерирует конфигурацию веб-сервера Caddy. Созданный Caddyfile превращает обычный Linux-сервер в редиректор: легитимный трафик от beacon'ов перенаправляется (обратный прокси) на ваш team server, а всё остальное (сканеры, поисковые боты, зондирование синих команд, случайные curl-запросы) отправляется на приманку (decoy URL).
Я написал этот инструмент, потому что Caddy гораздо удобнее для быстрого развертывания, чем Apache: один статический бинарник, автоматические сертификаты Let's Encrypt, и никаких танцев с a2enmod.
Только для санкционированных тестов. Это инструмент для наступательной безопасности. Запускайте его только против сред, на тестирование которых у вас есть письменное разрешение.
CaddySmith автоматически определяет формат по содержимому файла:
set uri "/foo". Каждый URI для HTTP-GET/HTTP-POST становится отдельным маршрутом с точным путём, при этом применяются клиентские заголовки из профиля.path /api* /static* /resources*) и выполняя поиск подстроки номера сборки Chrome в User-Agent (который сохраняется при перезаписи UA на разных платформах у Sliver).Вы также можете принудительно указать парсер с помощью --profile-type cobaltstrike или --profile-type sliver.
Получив файл профиля, скрипт извлекает:
--server-name)set host_stage)Затем он создаёт Caddyfile, который:
.env, /wp-admin, .php и т.д.)pip install не нужен)python3 caddysmith.py my.profile \
--backend https://teamserver.internal:443 \
--decoy https://www.example.com/ \
--server-name redirector.example.com \
--email [email protected] \
--forbid-http \
-o redirector.caddy
Эта команда записывает сгенерированную конфигурацию в redirector.caddy и выводит сводку в stderr.
Скопируйте сгенерированный файл на редиректор и запустите Caddy с ним. Требуется флаг --adapter caddyfile, так как Caddy по умолчанию использует JSON-конфигурацию:
caddy run --config /etc/caddy/redirector.caddy --adapter caddyfile
Чтобы перезагрузить работающий экземпляр с обновлённой конфигурацией:
caddy reload --config /etc/caddy/redirector.caddy --adapter caddyfile
Если Caddy сообщает о проблемах с форматированием, исправьте их с помощью:
caddy fmt --overwrite /etc/caddy/redirector.caddy
Поместите файл в /etc/caddy/ и импортируйте его из основного Caddyfile:
# /etc/caddy/Caddyfile
import /etc/caddy/redirector.caddy
Если вы передали --email (рекомендуется), сгенерированный фрагмент уже содержит блок глобальных опций, поэтому в основном Caddyfile нужна только строка import. Если не передали, добавьте email вручную в блок { } перед импортом.
Затем проверьте и перезагрузите:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Caddy автоматически выпустит сертификат Let's Encrypt для домена, указанного в --server-name, при условии, что A-запись указывает на редиректор.
Обычно нужен strict. Lax полезен при отладке, почему настоящий beacon не подключается.
Допустим, у вас есть профиль, имитирующий конечную точку Amazon, и вы хотите развернуть его на redirector.0xtb.sh:
python3 caddysmith.py amazon.profile \
--backend https://10.1.1.10:443 \
--decoy https://www.amazon.com/ \
--server-name redirector.0xtb.sh \
--forbid-http \
--policy strict \
-o /etc/caddy/redirector.caddy
В сводке будет показано, какие маршруты были построены, например:
Routes built: 2
- [profile-get] /broadcast
- [profile-post] /1/events/com.amazon.csm.csa.prod
Если вы пересоздадите и увидите ноль маршрутов, скрипт, скорее всего, не смог разобрать ваш профиль — проверьте предупреждения в stderr.
Для конфигурации импланта Sliver (JSON):
python3 caddysmith.py sliver-implant.json \
--backend https://10.1.1.10:443 \
--decoy https://www.amazon.com/ \
--server-name redirector.0xtb.sh \
--email [email protected] \
--forbid-http \
--policy strict \
-o /etc/caddy/redirector.caddy
В сводке будет указано, что обнаружен Sliver, и показан маршрут по префиксу:
Profile type: sliver
Routes built: 1
- [sliver] /api /public /resources /services /static (prefix)
Поскольку Sliver генерирует URI случайным образом из комбинаций путь × файл × расширение, сгенерированный сопоставитель path использует glob-шаблоны префиксов (path /api* /public* /resources* /services* /static*), а не точные пути. Сопоставитель User-Agent использует подстроку номера сборки Chrome (например, 3921.146), который Sliver сохраняет при перезаписи UA на разных платформах.
# Обычный HTTP должен вернуть 403 (если использовали --forbid-http)
curl -I http://redirector.0xtb.sh/
# Простое имя хоста должно перенаправить на decoy
curl -kI https://redirector.0xtb.sh/
# Плохой UA также должен перенаправить
curl -kI -A "curl/8.4.0" https://redirector.0xtb.sh/broadcast
# Запрос с правильным UA и путём должен проксироваться (200)
# В режиме strict необходимо также отправить все клиентские заголовки из профиля.
set host_stage "true" (или не установлено вовсе), скрипт выдаст предупреждение и пропустит URI стейджера. Добавьте set host_stage "false"; в профиль или передайте URI стейджеров явно через --extra-uri./api, /static и т.д. Сканеры, которые случайно используют эти префиксы (например, /api/.env), будут отправлены на team server, а не заблокированы локально — но собственный HTTP-транспорт Sliver аутентифицируется по ID импланта, поэтому неавторизованные запросы отклоняются на уровне C2. Фильтрация по UA всё равно блокирует большинство сканеров.--backend. Если нужно несколько team server, запустите скрипт несколько раз и объедините конфигурации вручную.set uri "/path1 /path2"; работает (несколько путей на одной строке), но нестандартное форматирование может сломать парсер. Проверьте список маршрутов в сводке.tls_insecure_skip_verify. Если у бэкенда настоящий сертификат, удалите эту строку из сгенерированного файла.Apache-основанный Malleable-Redirector послужил отправной точкой для того, что генерирует этот скрипт: та же трёхдорожечная модель URI (URI из профиля / дополнительные URI / свободные URI), те же режимы политики, та же общая структура. CaddySmith просто переводит вывод в синтаксис Caddy вместо Apache .htaccess.
MIT
| Флаг | По умолчанию | Что делает |
|---|
profile | (обязательно) | Путь к файлу .profile |
--backend | https://teamserver.local:443 | Куда проксировать подходящий трафик |
--decoy | https://www.example.com/ | Куда перенаправлять неподходящий трафик |
--server-name | c2.example.com | Доменное имя вашего редиректора |
--policy | strict | strict, lax или none |
--profile-type | auto | Принудительно задать cobaltstrike или sliver (по умолчанию автоопределение) |
--extra-uri PATH | — | Дополнительный URI для прокси (с проверкой UA). Можно повторять. |
--lax-uri PATH | — | Дополнительный URI для прокси (без проверок). Можно повторять. |
--allow-ua STRING | — | Дополнительный UA, разрешённый на маршрутах --extra-uri. Можно повторять. |
--forbid-http | выкл. | Возвращать 403 на обычный HTTP |
--email EMAIL | — | Email для регистрации и уведомлений Let's Encrypt |
-o, --output FILE | stdout | Записать конфигурацию в файл |