A hozzáférés megszerzése a dolog fele; a másik fele az, hogy ne veszítsék el. Ezért szinte minden automatizált kártékony szoftver elsőként az újraindulását biztosítja: újraindítás után, a fájl törlése után, jelszóváltás után. Innen a tipikus történet — „kitakarítottuk, és két nap múlva visszajött”.
Nem is olyan sok hely van, ahol ezt elintézik, és mind ellenőrizhető néhány perc alatt. Alább a teljes körút sorrendben.
1. SSH-kulcsok
A visszatérés legegyszerűbb módja: egy sor az authorized_keys fájlban túléli a jelszóváltást, a rendszerfrissítést és az újraindítást.
sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;
Minden sor valakinek az állandó hozzáférése. Ha nem tudod megmondani, kié, tekintsd idegennek. Figyeld a sor végi megjegyzést is: az tetszőleges szöveg, és az, hogy egyezik a neveddel, semmit nem bizonyít.
2. Az összes felhasználó cron-feladatai
Nem elég a saját crontabot átnézni:
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
Mire figyelj: a @reboot sorokra, a hosszú kódolt parancsokra, a shellbe továbbított curl- vagy wget-hívásokra, mindenre, ami a /tmp, /dev/shm vagy /var/tmp könyvtárból indul. Ezekből a könyvtárakból semmi szokásos nem indul.
3. systemd-időzítők és -szolgáltatások
A cron mai megfelelője, és érezhetően ritkábban ellenőrzik:
systemctl list-timers --all
systemctl list-units --type=service --state=running
sudo ls -la /etc/systemd/system/ /run/systemd/system/
Külön a felhasználói szolgáltatásokat, amelyek root jogosultság nélkül futnak, és nem kerülnek be az általános listába:
systemctl --user list-units --type=service
sudo ls -la /home/*/.config/systemd/user/
Még egy részlet: a felhasználóra bekapcsolt munkamenet-fenntartás (loginctl enable-linger) lehetővé teszi, hogy a szolgáltatásai aktív munkamenet nélkül fussanak. Ez a loginctl list-users paranccsal ellenőrizhető.
4. A shell indítófájljai
A shell indítófájljának végére írt kód minden bejelentkezéskor lefut:
sudo tail -5 /root/.bashrc /root/.profile /home/*/.bashrc /home/*/.profile
sudo ls -la /etc/profile.d/
Éppen a fájl végét kell nézni — oda írnak, hogy futólagos átolvasáskor ne tűnjön fel.
5. ld.so.preload
Olyan fájl, amely a rendszert a megadott könyvtár betöltésére kényszeríti minden induló folyamatba. Normál körülmények között soha nem keletkezik:
ls -l /etc/ld.so.preload
A jelenléte gyakorlatilag egyértelmű jele a súlyos kompromittálódásnak, és az ilyen könyvtár általában fájlokat, folyamatokat és hálózati kapcsolatokat is elrejt. Semmi, amit ezután ezen a gépen látsz, nem érdemel bizalmat.
6. A csomagkezelő hookjai
Ritkán említett módszer: az apt képes parancsokat futtatni minden csomagművelet előtt és után.
sudo ls -la /etc/apt/apt.conf.d/
sudo grep -r 'DPkg::Pre-Invoke\|DPkg::Post-Invoke\|APT::Update' /etc/apt/apt.conf.d/
Egy ilyen hook minden frissítéstelepítéskor lefut — azaz rendszeresen és root jogosultsággal.
7. A nap üzenete Ubuntun
Az /etc/update-motd.d/ könyvtár végrehajtható szkripteket tartalmaz, amelyek minden SSH-bejelentkezéskor futnak, és összeállítják az üdvözlő szöveget. A hely éppen azért kényelmes, mert rendszerszerűnek látszik:
sudo ls -la /etc/update-motd.d/
8. Halasztott at-feladatok
sudo atq
sudo ls -la /var/spool/cron/atjobs/ 2>/dev/null
Régi és ritkán használt mechanizmus, ezért mind közül a legritkábban ellenőrzött.
A lépések sorrendje, ha találsz valamit
Az első reflex az, hogy azonnal töröld a leletet. Ez hiba: vele együtt eltűnik az információ arról, hogyan került oda, és e kérdés megválaszolása nélkül minden megismétlődik.
- Ments másolatot a fájlról vagy a feladatról és a módosítási idejéről.
- Ellenőrizd a webszerver naplóiban és az
auth.logfájlban, mi történt ugyanabban a percben. Általában ott van a belépési pont. - Nézd át mind a nyolc helyet a listáról, ne csak azt, ahol találtál valamit. Hátsó ajtót szinte soha nem hagynak egyetlen példányban.
- Csak ezután takaríts, és zárd be magát a sebezhetőséget.
Tudni, hogy néz ki a norma
Ennek az ellenőrzésnek a fő nehézsége nem a parancsok, hanem az, hogy egy ismeretlen sor a feladatlistán nem tűnik gyanúsnak, ha nem emlékszünk, hogyan nézett ki a lista korábban. Egy olyan szerveren, amelyet más állított be, vagy amelyet egy éve állítottak be, szinte lehetetlen megkülönböztetni a sajátot az idegentől.
Innen a gyakorlati következtetés: az „ahogy van” állapotról ma érdemes pillanatképet készíteni, amíg a szerver rendben van. A cron-feladatok, időzítők, kulcsok és szolgáltatások listája egy egészséges gépen az a referencia, amellyel később összehasonlítunk. Összegyűjtve és előzményekkel együtt megőrizve a hátsó ajtó keresését több órás munkából két lista összevetésévé alakítja. Hogy néz ki mindez, azt az alábbi bemutatóoldalak mutatják.