
Проверки безопасности Linux
Инструмент для обнаружения, удаления криптомайнеров и усиления защиты серверов Linux.
Создан на основе реального реагирования на инциденты — обнаруживает майнеры, которые скрываются от
ps,top,htopиbtopс помощью руткит-техник.
git clone https://gitlab.com/abdom.seada/security-checks.git
cd security-checks
sudo bash setup.sh
🔀 Ветка:
master— этот инструментарий находится в веткеmaster. Другие скрипты безопасности могут быть добавлены в отдельных ветках в будущем.
⚠️ Запустите
setup.shсразу после клонирования — пропуск этого шага является причиной №1 ошибок.
sudo bash setup.sh
setup.sh делает всё автоматически:
Ожидаемый вывод при успешной настройке:
✅ Setup complete — all checks passed!
Next steps:
sudo ./miner-hunter scan # Safe read-only scan
sudo ./miner-hunter full # Scan → Kill → Harden
💡 Зачем это нужно? Linux не выполнит файл, если у него нет флага
+x. Git и SCP-передачи удаляют его.setup.shисправляет все файлы за один раз, включая модулиlib/, от которых зависит основной скрипт.
sudo ./miner-hunter scan # ✅ Safe — read-only, zero changes
sudo ./miner-hunter full # ⚠️ Full pipeline: Scan → Kill → Harden
sudo ./miner-hunter scan --dry-run # 👁️ Preview mode — shows what would happen
| Параметр | Описание |
|---|---|
-d, --dry-run |
Реальные ситуации и что именно запускать в каждой из них.
top ничего не показывает"Это классический симптом руткита. Майнер скрывается от инструментов пользовательского пространства, но не может скрыться от счётчиков производительности оборудования.
# Step 1: Run a safe scan first — confirm what's there before touching anything
sudo ./miner-hunter scan
Что вы увидите, если майнер присутствует:
🚨 [CRITICAL] CPU anomaly: 97% user CPU but top shows max 2% per process
🚨 [CRITICAL] perf detected 4 hidden threads consuming ~94% total CPU
🚨 [CRITICAL] Active connection to 185.x.x.x:9200 (known mining port)
🚨 [CRITICAL] Fake kernel thread PID=3421 NAME=[kworker/0:1] EXE=/tmp/.x/miner
# Step 2: Kill the miner and block its pool
sudo ./miner-hunter kill
# Step 3: Harden the server so it can't come back
sudo ./miner-hunter harden
Вы заметили что-то подозрительное — необычный исходящий трафик, задание cron, которое вы не создавали, процесс со странным именем — но вы не уверены.
# Run a full scan — completely safe, read-only, zero changes
sudo ./miner-hunter scan
# Then read the structured report
sudo ./miner-hunter report
Отчёт в /root/miner_evidence_*/report.txt категоризирует каждую находку по серьёзности:
[CRITICAL] → немедленно переходите к kill[WARNING] → просмотрите вручную перед действиемУ майнера есть механизм персистентности — задание cron, служба systemd, запись PM2 или бэкдор в профиле оболочки, которые возрождают его после убийства.
sudo ./miner-hunter scan
Ищите это в выводе:
⚠️ [WARN] Suspicious cron entry: * * * * * /tmp/.x/update
🚨 [CRITICAL] Malicious systemd service: /etc/systemd/system/update-check.service
🚨 [CRITICAL] PM2 process 'app-worker' has 8432 restarts — likely miner respawn loop
🚨 [CRITICAL] Shell profile backdoor detected in /root/.bashrc
# kill removes ALL persistence artifacts — not just the running process
sudo ./miner-hunter kill
# Then harden to install the watchdog so you're alerted if anything respawns
sudo ./miner-hunter harden
💡 После
kill, сторожевой cron запускается каждые 5 минут и записывает в/var/log/miner_hunter/watchdog_alerts.log— вы сразу узнаете, если что-то вернётся.
Упреждающее усиление защиты перед развёртыванием — нет майнера, нет инцидента, просто блокировка системы.
# Run harden standalone — no scan or kill needed
sudo ./miner-hunter harden
Это сделает:
sshd/usr/bin (контрольные суммы MD5 — чтобы вы могли позже обнаружить подменённые бинарники)После kill, шаг проверки сообщает, что майнер может всё ещё работать:
⚠️ MINER MAY HAVE RESPAWNED
CPU: 89% | Mining conns: 1
Firewall blocks are in place — miner can't reach pool
Consider a REBOOT or OS REINSTALL
# 1. Firewall blocks are already in place — miner CANNOT reach its pool
# Confirm blocks are active:
iptables -L OUTPUT -n | grep DROP
# 2. Run a second scan to see what survived
sudo ./miner-hunter scan
# 3. Check for a kernel module rootkit hiding the process
lsmod | grep -iE 'diamorphine|reptile|kovid|rootkit'
# 4. Non-zero taint = out-of-tree kernel modules loaded (rootkit indicator)
cat /proc/sys/kernel/tainted
Если значение taint ядра не равно нулю или появляется известный модуль руткита — майнер имеет контроль уровня ядра. Самым безопасным путём на этом этапе является полная переустановка ОС из известной чистой резервной копии.
После harden сторожевой cron уже установлен. Вот как с ним работать:
# Watch the alert log in real time
tail -f /var/log/miner_hunter/watchdog_alerts.log
# Confirm the watchdog cron job is registered
cat /etc/cron.d/miner-watchdog
# Check for /usr/bin binary changes since your baseline was taken
md5sum --check /var/lib/miner_hunter/usrbin_baseline.md5 --quiet
Любой вывод последней команды означает, что системный бинарник был изменён после создания базовой линии — немедленно проведите расследование.
| Техника | Что обнаруживает |
|---|---|
Профилирование аппаратных PMC с помощью perf | Скрытые потребители ЦП — руткиты не могут подделать аппаратные счётчики |
Когда вы запускаете sudo ./miner-hunter kill, выполняется следующая последовательность:
DROP применяются до убийства, чтобы майнер не мог переподключиться, даже если он возродитсяSIGKILL на TGID (PID лидера группы потоков)perf и проверяет /proc/net/tcp, чтобы подтвердить снижение нагрузки ЦП и отсутствие соединенийsecurity-checks/ ← repo root (master branch)
├── miner-hunter # Entry point — this is what you run
├── setup.sh # ⚙️ First-time setup — run once after cloning
├── lib/
│ ├── common.sh # Shared utilities: logging, colors, helpers
│ ├── detect_hidden.sh # Hidden process & rootkit detection
│ ├── detect_cpu.sh # CPU profiling via perf & /proc
│ ├── detect_network.sh # Mining pool connection detection
│ ├── detect_persistence.sh # Persistence mechanism detection
│ ├── kill_miner.sh # Process killing & artifact removal
│ └── harden.sh # Post-incident hardening
├── README.md
└── LICENSE
Этот инструмент был создан в ходе активного реагирования на инцидент с криптомайнером, который:
next, чтобы слиться с процессами Next.js на сервере Node.jskthreadd — настоящее имя потока ядра/proc/PID/exe → (deleted))ps, top, htop и btopperfMIT
| Шаг | Что делает |
|---|
| ✅ Права | chmod +x для miner-hunter и всех скриптов lib/*.sh |
| ✅ Каталоги | Создаёт /var/log/miner_hunter/ и /var/lib/miner_hunter/ (только для root, 700) |
| ✅ Зависимости | Проверяет perf, mpstat, iptables, fail2ban, bc, strings — автоматически устанавливает отсутствующие |
| ✅ Самопроверка | Запускает ./miner-hunter --version, чтобы убедиться, что всё настроено правильно |
| Команда | Описание | Изменяет систему? |
|---|
scan | Полное сканирование обнаружения — скрытые процессы, ЦП, сеть, персистентность | ✅ Нет |
kill | Убить обнаруженные майнеры, заблокировать IP-адреса пулов, удалить артефакты | ⚠️ Да |
harden | Усиление защиты после инцидента — SSH, брандмауэр, сторожевой пёс, базовая линия целостности | ⚠️ Да |
full | Запускает scan → kill → harden с запросами подтверждения между фазами | ⚠️ Да |
report | Показать последний отчёт сканирования | ✅ Нет |
| Предварительный просмотр всех действий без внесения изменений |
-e, --evidence DIR | Сохранить доказательства в пользовательский каталог вместо /root/miner_evidence_* |
-h, --help | Показать справку |
-v, --version | Показать версию |
| Техника | Что обнаруживает |
|---|
Сравнение /proc и ps | Процессы, невидимые для пользовательских инструментов |
| Перехват LD_PRELOAD | Вредоносные разделяемые библиотеки, перехватывающие libc для сокрытия процессов |
| Руткиты модулей ядра | Diamorphine, Reptile, Kovid и другие известные руткиты |
| Поддельные потоки ядра | Майнеры, маскирующиеся под [kworker], [kthreadd], [kswapd] |
| Изменённые системные бинарники | Заменённые ps, top, ls, ss, netstat |
Дельта-сэмплирование /proc | Прямой учёт ЦП на уровне ядра для каждого PID |
| Обнаружение аномалий ЦП | Высокая загрузка ЦП в %user без видимого процесса, который бы её объяснял |
| Техника |
|---|
| Что обнаруживает |
|---|
Прямое чтение /proc/net/tcp | Активные соединения — обходит перехваченные ss/netstat |
| Обнаружение портов майнинга | Порты 3333, 4444, 5555, 7777, 9200, 14433, 14444, 45560 |
| Разрешение доменов майнинга | Разрешает известные домены пулов и перекрестно проверяет активные соединения |
| Сопоставление сокетов с PID | Определяет, какой процесс владеет каждым майнинг-соединением |
| Местоположение | Что проверяет |
|---|
| Cron | /etc/cron*, /var/spool/cron/, все пользовательские crontab'ы |
| Systemd | Все unit-файлы и таймеры на подозрительные записи |
| Правила Udev | Выполнение, срабатывающее на события устройств |
| PM2 | Записи менеджера процессов Node.js с чрезвычайно большим числом перезапусков |
| Профили оболочки | .bashrc, .bash_profile, /etc/profile, /etc/profile.d/* |
| SSH | Все файлы authorized_keys у всех пользователей |
| Веб-шеллы | PHP-файлы внутри каталогов проекта Node.js |
| Конфиги XMRig | config.json в типичных местах размещения майнеров |
| Действие | Подробности |
|---|
| Сохранение брандмауэра | Служба systemd для восстановления блокировок майнинга iptables при каждой перезагрузке |
| Аудит SSH | Проверяет PermitRootLogin, PasswordAuthentication, MaxAuthTries — выводит рекомендуемые значения |
| Проверка Fail2ban | Проверяет, активен ли jail sshd, и сообщает о забаненных IP-адресах |
| Сторожевой пёс майнера | Задание cron каждые 5 минут — проверка аномалий ЦП, LD_PRELOAD, портов майнинга, PHP веб-шеллов |
Базовая линия /usr/bin | Создаёт контрольные суммы MD5 всех бинарников в /usr/bin для будущего обнаружения подмен |
| Требование | Подробности |
|---|
| ОС | Linux — протестировано на Ubuntu 24.04 LTS, Debian 13 |
| Привилегии | Должен выполняться от имени root (sudo) |
| Автоматически устанавливается setup.sh | perf, mpstat (sysstat), bc, strings (binutils) |
| Рекомендуется | fail2ban — отмечается, если отсутствует, не устанавливается автоматически |
| Требуется (не устанавливается автоматически) | iptables — должен присутствовать для этапов kill/harden |
| Вывод | Расположение | Содержимое |
|---|
| Каталог доказательств | /root/miner_evidence_YYYYMMDD_HHMMSS/ | Захваченные бинарники, отчёты perf, конфиги майнера |
| Файл журнала | /var/log/miner_hunter/run_YYYYMMDD_HHMMSS.log | Полный журнал выполнения с временными метками |
| Отчёт | evidence_dir/report.txt | Структурированная сводка находок с уровнями серьёзности |
| Оповещения сторожевого пса | /var/log/miner_hunter/watchdog_alerts.log | Текущие оповещения после harden |
| Базовая линия целостности | /var/lib/miner_hunter/usrbin_baseline.md5 | Контрольные суммы /usr/bin после harden |