Отримати доступ — половина справи; друга половина — не втратити його. Тому майже все автоматизоване шкідливе програмне забезпечення насамперед влаштовує собі повторний запуск: після перезавантаження, після видалення файла, після зміни пароля. Звідси й знайома історія — «почистили, а за два дні воно повернулося».
Місць, де це влаштовують, не так уже й багато, і всі їх можна перевірити за кілька хвилин. Нижче — повне коло по порядку.
1. Ключі SSH
Найпростіший шлях назад: рядок у authorized_keys переживає зміну пароля, оновлення системи й перезавантаження.
sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;
Кожен рядок — чийсь постійний доступ. Якщо ви не можете сказати, чий саме, вважайте його чужим. Зверніть увагу й на коментар у кінці рядка: це довільний текст, і збіг із вашим іменем нічого не доводить.
2. Завдання cron усіх користувачів
Перевіряти треба не лише власний crontab:
for u in $(cut -f1 -d: /etc/passwd); do echo "== $u"; sudo crontab -u "$u" -l 2>/dev/null; done
sudo ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/
sudo cat /etc/crontab
Ознаки, які варто шукати: рядки @reboot, довгі закодовані команди, виклики curl чи wget, спрямовані в оболонку, будь-що, запущене з /tmp, /dev/shm або /var/tmp. Нічого штатного з цих каталогів не працює.
3. Таймери й служби systemd
Сучасний аналог cron, і перевіряють його помітно рідше:
systemctl list-timers --all
systemctl list-units --type=service --state=running
sudo ls -la /etc/systemd/system/ /run/systemd/system/
Окремо — служби користувача, які працюють без прав root і в загальному списку не з’являються:
systemctl --user list-units --type=service
sudo ls -la /home/*/.config/systemd/user/
Ще одна деталь: lingering, увімкнений для користувача (loginctl enable-linger), дозволяє його службам працювати без активної сесії. Перевіряється через loginctl list-users.
4. Файли запуску оболонки
Код, дописаний у кінець файла запуску оболонки, виконується при кожному вході:
sudo tail -5 /root/.bashrc /root/.profile /home/*/.bashrc /home/*/.profile
sudo ls -la /etc/profile.d/
Дивіться саме кінець файла — туди дописують, щоб не впадало в око при швидкому погляді.
5. ld.so.preload
Файл, який змушує систему завантажувати задану бібліотеку в кожен запущений процес. За нормальних обставин він не створюється ніколи:
ls -l /etc/ld.so.preload
Його наявність — практично однозначна ознака серйозної компрометації, і така бібліотека зазвичай однаково добре ховає файли, процеси й мережеві з’єднання. Ніщо з того, що ви побачите на цій машині далі, не заслуговує на довіру.
6. Хуки менеджера пакетів
Спосіб, про який рідко згадують: apt може виконувати команди до й після кожної операції з пакетами.
sudo ls -la /etc/apt/apt.conf.d/
sudo grep -r 'DPkg::Pre-Invoke\|DPkg::Post-Invoke\|APT::Update' /etc/apt/apt.conf.d/
Такий хук спрацьовує при кожному встановленні оновлення — тобто регулярно і від root.
7. Повідомлення дня в Ubuntu
Каталог /etc/update-motd.d/ містить виконувані скрипти, які запускаються при кожному вході по SSH і складають текст привітання. Місце зручне саме тим, що має вигляд частини системи:
sudo ls -la /etc/update-motd.d/
8. Відкладені завдання at
sudo atq
sudo ls -la /var/spool/cron/atjobs/ 2>/dev/null
Старий і рідко вживаний механізм, а тому найменш перевірюваний.
Що робити, якщо щось знайшли
Перший порив — одразу видалити знахідку. Це помилка: разом з нею зникає інформація про те, як воно туди потрапило, а без відповіді на це питання все повториться.
- Збережіть копію файла або завдання і час його зміни.
- За цим часом подивіться в журналах вебсервера і в
auth.log, що відбувалося в ту саму хвилину. Зазвичай там і є точка входу. - Перевірте всі вісім місць зі списку, а не лише те, де щось знайшлося. Бекдор майже ніколи не лишають в одному примірнику.
- І лише потім прибирайте й закривайте саму уразливість.
Знати, який вигляд має норма
Головна складність у цій перевірці — не команди, а те, що незнайомий рядок у списку завдань не має підозрілого вигляду, якщо ви не пам’ятаєте, яким цей список був раніше. На сервері, налаштованому кимось іншим або налаштованому рік тому, відрізнити своє від чужого майже неможливо.
Звідси практичний висновок: зняти знімок «як є» має сенс сьогодні, поки сервер у порядку. Список завдань cron, таймерів, ключів і служб на здоровій машині — це той еталон, з яким потім усе й порівнюють. Зібраний і збережений з історією, він перетворює полювання на бекдор із багатогодинної вправи на порівняння двох списків. Який вигляд це має, показують демосторінки нижче.