Obținerea accesului este jumătate din treabă; cealaltă jumătate este să nu îl piardă. De aceea, aproape tot software-ul rău intenționat automatizat își asigură în primul rând repornirea: după o repornire, după ștergerea fișierului, după schimbarea parolei. De aici povestea tipică — „am curățat, iar peste două zile s-a întors”.

Locurile în care se aranjează asta nu sunt chiar atât de multe și toate pot fi verificate în câteva minute. Mai jos este întregul tur, în ordine.

1. Chei SSH

Cel mai simplu mod de a reveni: o linie în authorized_keys supraviețuiește schimbării parolei, actualizării sistemului și repornirii.

sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;

Fiecare linie este accesul permanent al cuiva. Dacă nu poți spune al cui, consider-o străină. Observă și comentariul de la sfârșitul liniei: este text liber, iar potrivirea cu numele tău nu dovedește nimic.

2. Sarcinile cron ale tuturor utilizatorilor

Nu este suficient să te uiți în propriul 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

La ce să fii atent: liniile @reboot, comenzile lungi codificate, apelurile curl sau wget trimise către un shell, tot ce pornește din /tmp, /dev/shm sau /var/tmp. Din aceste directoare nu pornește nimic obișnuit.

3. Cronometre și servicii systemd

Echivalentul modern al cronului, verificat vizibil mai rar:

systemctl list-timers --all
systemctl list-units --type=service --state=running
sudo ls -la /etc/systemd/system/ /run/systemd/system/

În special serviciile de utilizator, care rulează fără drepturi de root și nu ajung în lista generală:

systemctl --user list-units --type=service
sudo ls -la /home/*/.config/systemd/user/

Încă un detaliu: menținerea sesiunii activată pentru un utilizator (loginctl enable-linger) permite serviciilor lui să ruleze fără o sesiune activă. Se verifică prin comanda loginctl list-users.

4. Fișierele de pornire ale shellului

Codul adăugat la sfârșitul fișierului de pornire al shellului se execută la fiecare autentificare:

sudo tail -5 /root/.bashrc /root/.profile /home/*/.bashrc /home/*/.profile
sudo ls -la /etc/profile.d/

Trebuie privit tocmai sfârșitul fișierului — acolo se adaugă, ca să nu sară în ochi la o parcurgere rapidă.

5. ld.so.preload

Un fișier care obligă sistemul să încarce biblioteca indicată în fiecare proces pornit. În condiții normale nu apare niciodată:

ls -l /etc/ld.so.preload

Prezența lui este practic un semn fără echivoc al unei compromiteri grave, iar o astfel de bibliotecă ascunde de obicei și fișiere, și procese, și conexiuni de rețea. Nimic din ce vei mai vedea pe această mașină nu merită încredere.

6. Hook-urile managerului de pachete

O metodă la care se gândește rar cineva: apt poate rula comenzi înainte și după fiecare operațiune cu pachete.

sudo ls -la /etc/apt/apt.conf.d/
sudo grep -r 'DPkg::Pre-Invoke\|DPkg::Post-Invoke\|APT::Update' /etc/apt/apt.conf.d/

Un astfel de hook rulează la fiecare instalare de actualizări — adică regulat și cu drepturi de root.

7. Mesajul zilei în Ubuntu

Directorul /etc/update-motd.d/ conține scripturi executabile pornite la fiecare autentificare SSH, care compun textul de întâmpinare. Locul este comod tocmai pentru că pare de sistem:

sudo ls -la /etc/update-motd.d/

8. Sarcini at amânate

sudo atq
sudo ls -la /var/spool/cron/atjobs/ 2>/dev/null

Un mecanism vechi și rar folosit, și de aceea cel mai rar verificat dintre toate.

Ordinea acțiunilor dacă se găsește ceva

Primul reflex este să ștergi imediat descoperirea. Este o greșeală: odată cu ea dispare informația despre cum a ajuns acolo, iar fără răspuns la această întrebare totul se repetă.

  1. Păstrează o copie a fișierului sau a sarcinii și ora modificării.
  2. Verifică în jurnalele serverului web și în auth.log ce s-a întâmplat în același minut. De obicei acolo este punctul de intrare.
  3. Verifică toate cele opt locuri din listă, nu doar cel în care ai găsit ceva. Ușile din spate nu se lasă aproape niciodată într-un singur exemplar.
  4. Abia apoi curăță și închide vulnerabilitatea propriu-zisă.

Să știi cum arată normalul

Principala dificultate a acestei verificări nu sunt comenzile, ci faptul că o linie necunoscută din lista de sarcini nu pare suspectă dacă nu ne amintim cum arăta lista înainte. Pe un server configurat de altcineva sau configurat acum un an, distincția între ce e al tău și ce e străin este aproape imposibilă.

De aici concluzia practică: un instantaneu al stării „așa cum este” merită făcut azi, cât timp serverul este în regulă. Lista sarcinilor cron, a cronometrelor, a cheilor și a serviciilor de pe o mașină sănătoasă este etalonul cu care vom compara ulterior. Colectată și păstrată împreună cu istoricul, transformă căutarea unei uși din spate dintr-o muncă de câteva ore în compararea a două liste. Cum arată asta arată paginile demonstrative de mai jos.