Получаването на достъп е половината работа; другата половина е той да не се загуби. Затова практически целият автоматизиран зловреден софтуер първо си осигурява повторно стартиране: след рестарт, след изтриване на файла, след смяна на паролата. Оттук типичната история — „почистихме, а след два дни се върна“.
Местата, на които това се урежда, не са чак толкова много и всички могат да се проверят за няколко минути. По-долу е целият обход по ред.
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/
Още една подробност: включеното поддържане на сесията за потребител (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 задачи, таймери, ключове и услуги на здрава машина е еталонът, с който после ще сравняваме. Събран и запазен заедно с историята, той превръща търсенето на задна врата от няколкочасова работа в сравнение на два списъка. Как изглежда това, показват демонстрационните страници по-долу.