Η απόκτηση πρόσβασης είναι η μισή δουλειά· η άλλη μισή είναι να μην τη χάσεις. Γι' αυτό σχεδόν όλο το αυτοματοποιημένο κακόβουλο λογισμικό φροντίζει πρώτα απ' όλα να ξαναξεκινά: μετά από επανεκκίνηση, μετά τη διαγραφή του αρχείου, μετά την αλλαγή του κωδικού. Εξ ου και η γνωστή ιστορία — «καθαρίσαμε και δύο μέρες μετά ξαναγύρισε».

Τα σημεία όπου αυτό ρυθμίζεται δεν είναι και τόσα πολλά, και όλα ελέγχονται σε λίγα λεπτά. Παρακάτω είναι ο πλήρης γύρος με τη σειρά.

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

Παλιός και σπάνια χρησιμοποιούμενος μηχανισμός, και συνεπώς ο λιγότερο ελεγχόμενος από όλους.

Τι να κάνετε αν βρείτε κάτι

Η πρώτη παρόρμηση είναι να διαγράψετε αμέσως το εύρημα. Αυτό είναι λάθος: μαζί του εξαφανίζεται η πληροφορία για το πώς έφτασε εκεί, και χωρίς απάντηση σε αυτό το ερώτημα όλα θα ξανασυμβούν.

  1. Κρατήστε αντίγραφο του αρχείου ή της εργασίας και της ώρας τροποποίησής του.
  2. Με βάση αυτή την ώρα, δείτε στα αρχεία του διακομιστή ιστού και στο auth.log τι συνέβαινε το ίδιο λεπτό. Εκεί βρίσκεται συνήθως το σημείο εισόδου.
  3. Ελέγξτε όλα τα οκτώ σημεία της λίστας, όχι μόνο εκείνο όπου βρέθηκε κάτι. Μια κερκόπορτα σχεδόν ποτέ δεν αφήνεται σε ένα μόνο αντίγραφο.
  4. Μόνο μετά καθαρίστε και κλείστε την ίδια την ευπάθεια.

Να ξέρετε πώς μοιάζει το φυσιολογικό

Η κύρια δυσκολία σε αυτόν τον έλεγχο δεν είναι οι εντολές αλλά το ότι μια άγνωστη γραμμή σε λίστα εργασιών δεν φαίνεται ύποπτη αν δεν θυμάστε πώς ήταν η λίστα πριν. Σε διακομιστή που ρύθμισε κάποιος άλλος, ή που ρυθμίστηκε πριν έναν χρόνο, το να ξεχωρίσετε τα δικά σας από τα ξένα είναι σχεδόν αδύνατο.

Εξ ου και το πρακτικό συμπέρασμα: το να πάρετε ένα στιγμιότυπο «όπως είναι» έχει νόημα σήμερα, όσο ο διακομιστής είναι εντάξει. Η λίστα εργασιών cron, χρονομετρητών, κλειδιών και υπηρεσιών σε ένα υγιές μηχάνημα είναι το σημείο αναφοράς με το οποίο συγκρίνονται αργότερα όλα. Συγκεντρωμένη και τηρούμενη με ιστορικό, μετατρέπει το κυνήγι μιας κερκόπορτας από πολύωρη άσκηση σε σύγκριση δύο λιστών. Πώς μοιάζει αυτό το δείχνουν οι σελίδες επίδειξης παρακάτω.