Linux C2-бекон с нативным загрузчиком ELF BOF в памяти, зашифрованным опросом AES-256-CFB и Python C2-сервером для бесфайловых модулей постэксплуатации.
Linux C2-бекон с нативным загрузчиком ELF BOF в памяти, написанный на C без среды выполнения Go или Rust. Разработан для интеграции в фреймворк LazyOwn RedTeam и вдохновлён Beacon Object Files от Cobalt Strike.
Этот репозиторий содержит:
beacons/v1/, beacons/v2/, beacons/v3/
Три варианта одного и того же HTTPS/CFB бекона. v1 — канонический
бекон в режиме pull. v2 добавляет mesh/p2p-обнаружение. v3 —
экспериментальная ветка.bof/<name>/bof.c
Позиционно-независимые ELF-объекты, которые бекон может загружать и
выполнять в памяти. Включены пять: whoami, is_sudo, cat,
userenum, suid_enum.c2/server.py
Небольшой Python-сервер в стиле Gopher, который раздаёт команды,
принимает результаты и размещает BOF.include/
Автономный AES-256 (aes.c/aes.h), cJSON, загрузчик
конфигурации времени выполнения (config.c/config.h плюс Python-
зеркало config_py.py), а также обёртки AES-256-CFB, общие для
бекона и тестов.Makefile, CI в .github/workflows/ci.yml,
тесты в tests/.Для 5-минутного сквозного запуска см. QUICKSTART.md. Для руководства по написанию BOF см. docs/BOF_AUTHORING.md. Для протокола обмена с C2 см. docs/PROTOCOL.md.
Сборка (Debian/Ubuntu):
sudo apt-get install gcc libcurl4-openssl-dev libssl-dev make
Среда выполнения для C2-сервера:
pip install -r requirements.txt
make config # one-time: copies config.example.json -> config.json
make beacon # builds build/beacon (runnable, with build/config.json staged next to it)
make bofs # builds all BOFs into build/bof/*.x64.o
make all-beacons # builds v1, v2, v3
make test # runs the full test suite
make clean # removes build/
После make beacon бинарный файл готов к запуску:
./build/beacon
Он читает build/config.json (рядом с самим собой) через путь поиска относительно бинарного файла, поэтому BSB_CONFIG или cd config/ не требуются. Тот же бинарный файл, скопированный на другой хост, работает идентично, если рядом с ним находится config.json.
Если вы хотите пересобрать только один BOF:
make bof-whoami
make bof-suid_enum
Для доставки на целевой хост в Makefile есть цель install, которая
подготавливает самодостаточный каталог:
make install-all DESTDIR=/tmp/deploy
scp -r /tmp/deploy/* user@target:/opt/bsb/
ssh user@target /opt/bsb/beacon
Это не обычный сценарий. Используйте его только тогда, когда вам нужно объединить бинарный файл + конфигурацию + BOF в один каталог, который можно скопировать куда-либо.
python3 c2/server.py
Сервер по умолчанию привязывается к 0.0.0.0:7070 и читает свой ключ AES
и URI C2 из config/config.json. Переопределите путь к конфигурации
с помощью BSB_CONFIG=/path/to/config.json.
После запуска сервера вы можете внедрять команды из REPL:
Client ID: linux
Command: id
./build/beacon
Beacon читает config/config.json (относительно бинарника, найденного
через путь поиска относительно бинарника), опрашивает C2 и выводит
то, что отправляет и получает. При отсутствии команд в очереди он просто
спит между опросами.
Чтобы запустить BOF, C2 возвращает JSON-объект с полем bof,
указывающим на /bof/<name>.x64.o. Beacon загружает файл и
загружает его в собственный процесс через загрузчик ELF в памяти
(RunELF в beacons/v1/beacon.c).
Все операционные параметры находятся в config/config.json и
читаются при запуске. Ничего не зашито в бинарники.
| Раздел | Ключ | По умолчанию | Назначение |
|---|---|---|---|
c2 | url | https://127.0.0.1:4444 | Базовый URL C2 |
c2 | uri | /api/poll/ | Путь URI перед идентификатором клиента |
c2 | client_id | linux | Идентификатор beacon |
crypto | aes_key_hex | (заполнитель) | 64 hex-символа = 32 байта |
crypto | mode | cfb | Режим шифрования |
timing | sleep_seconds | 6 | Базовый интервал опроса |
timing | jitter_percent | 20 | Разброс +/- в процентах при сне |
timing | curl_timeout_seconds | 10 | Общий таймаут libcurl |
timing | curl_connect_timeout_seconds | 5 | Таймаут подключения libcurl |
network | user_agents | (4 строки) | Список для ротации |
network | verify_tls | false | Проверка TLS для C2 |
bof | download_chunk_size | 4096 | Буфер загрузки BOF |
CI запускает проверку, которая проваливает сборку, если в исходниках
появляется 64-символьный hex-ключ. Настоящие ключи должны находиться в config/config.json, который
игнорируется git.
BOF — это просто исходный файл на C, который экспортирует void go(char *args, int alen).
Подключите bof/include/beacon_api.h для API обратных вызовов и
bof/include/syscalls.h для помощников прямых системных вызовов. Скомпилируйте его
позиционно-независимым и без libc:
gcc -c -fPIC -nostdlib -m64 -O2 -I bof/include bof/<name>/bof.c -o build/bof/<name>.x64.o
Цель make bof-<name> оборачивает это. Поместите полученный
.x64.o в sessions/uploads/ на хосте C2 и запустите его,
вернув команду вида bof:<name> из вашей инъекции
команд.
Полный контракт см. в docs/BOF_AUTHORING.md.
make test
Тестовый набор разделён на несколько файлов в tests/:
| Файл | Что он покрывает |
|---|---|
test_config.py | Загрузчик JSON-конфигурации на C: значения по умолчанию, переопределения, ошибки |
test_crypto.py | Обратимый цикл AES-256-CFB и взаимодействие Python/C |
test_bof_compile.py | Каждый BOF компилируется, экспортирует go, не имеет утечки libc |
test_beacon_build.py | Бинарник Beacon собирается, предоставляет BOF API + RunELF |
test_c2_server.py | Диспетчер C2: GET/POST/BOF, защита от path traversal |
test_c2_http_e2e.py | Реальный обмен по сокету HTTP/1.1 с шифрованием |
test_install_deploy.py | Рабочий процесс make создаёт запускаемое дерево, make clean его удаляет |
beacons/
v1/beacon.c canonical beacon
v2/beacon.c mesh/p2p variant
v3/beacon.c experimental variant
bof/
include/ shared BOF headers (beacon_api.h, syscalls.h)
whoami/bof.c sample: print effective UID
is_sudo/bof.c sample: check sudo/wheel membership
cat/bof.c sample: read a file
userenum/bof.c sample: list /etc/passwd users and privileges
suid_enum/bof.c privesc recon: walk FS, list SUID/SGID binaries
c2/
server.py Gopher-style C2 server
config/
config.example.json template (copy to config.json)
include/
config.h, config.c runtime config loader
config_py.py Python mirror for the C2
aes.h, aes.c standalone AES (ECB/CTR/CBC)
aes_cfb.h, aes_cfb.c AES-256-CFB the beacon actually uses
cJSON.h, cJSON.c vendored JSON parser
beacon.h BOF API the beacon implements
tests/
test_*.py Python test suite
*_harness.c C test harnesses
docs/
PROTOCOL.md wire protocol
BOF_AUTHORING.md BOF contract and gotchas
.github/workflows/
ci.yml build + test + key-leak guard
Makefile
requirements.txt C2 server runtime deps
GPL v3. См. LICENSE.