Εν ολίγοις: Ένα κρυφό cronjob είναι μια από τις συχνότερες κερκόπορτες σε διακομιστές Linux: κατεβάζει τακτικά κακόβουλο κώδικα ή επανεκκινεί διεργασίες, ακόμη και μετά από ενημέρωση PHP. Ελέγξτε όλα τα σημεία προγραμματισμένων εργασιών, όχι μόνο το crontab -l: crontabs όλων των χρηστών, /etc/crontab, /etc/cron.d, τους φακέλους cron, timers systemd και εργασίες at. Διασφαλίστε τα ευρήματα πριν τα αφαιρέσετε.
Γιατί τα cronjobs είναι τόσο δημοφιλή ως κερκόπορτα
Μετά από μια επιτυχημένη εισβολή ο επιτιθέμενος έχει ένα πρόβλημα: η πρόσβασή του είναι εύθραυστη. Μια ενημέρωση κλείνει την ευπάθεια, ένας διαχειριστής διαγράφει το webshell, μια επανεκκίνηση τερματίζει τη διεργασία. Ένα cronjob λύνει αυτό το πρόβλημα. Ξεκινά εντολές σε σταθερές ώρες χωρίς να παρέμβει κανείς και αποκαθιστά έτσι χαμένες προσβάσεις.
Για το PHP2Shell δεν υπάρχουν επιβεβαιωμένοι Indicators of Compromise. Τα νέα cronjobs συγκαταλέγονται όμως, σύμφωνα με τις αναφορές που διαθέτουμε, στα γενικά προειδοποιητικά σημάδια μετά από εισβολές μέσω εφαρμογών ιστού. Όποιος έχει ήδη ψάξει για webshells, πρέπει να ελέγξει ταυτόχρονα και τις προγραμματισμένες εργασίες. Τα υπόλοιπα βήματα μιας μεταγενέστερης διαχείρισης αναφέρει η Λίστα ελέγχου μετά από hack.
Πού μπορούν να κρυφτούν οι προγραμματισμένες εργασίες
Το Linux γνωρίζει πολλούς μηχανισμούς για προγραμματισμένες εργασίες. Πολλοί έλεγχοι αποτυγχάνουν επειδή εξετάζεται μόνο ένας από αυτούς.
| Σημείο | Debian/Ubuntu | Οικογένεια RHEL | Ποιος επιτρέπεται να γράφει |
|---|---|---|---|
| Crontab ανά χρήστη | /var/spool/cron/crontabs/ |
/var/spool/cron/ |
ο εκάστοτε χρήστης |
| Crontab συστήματος | /etc/crontab |
/etc/crontab |
root |
| Μεμονωμένα αρχεία | /etc/cron.d/ |
/etc/cron.d/ |
root |
| Περιοδικοί φάκελοι | /etc/cron.hourly έως /etc/cron.monthly |
ομοίως | root |
| Timers systemd | /etc/systemd/system/, units χρήστη |
ομοίως | root, εν μέρει χρήστης |
| Εργασίες at | ουρά του atd |
ομοίως | χρήστης, αν επιτρέπεται |
Σημαντικό για διακομιστές ιστού: ο χρήστης του διακομιστή ιστού μπορεί κατά κανόνα να δημιουργήσει δικό του crontab χωρίς δικαιώματα root. Ένας επιτιθέμενος με τα δικαιώματα του www-data δεν χρειάζεται γι' αυτό περαιτέρω ευπάθεια. Εγγραφές στο /etc/cron.d ή units systemd δείχνουν αντίθετα ότι απέκτησε δικαιώματα root.
Τα πάνελ φιλοξενίας όπως το Plesk ή το cPanel προσφέρουν δική τους διεπαφή για προγραμματισμένες εργασίες. Πίσω της βρίσκονται κατά κανόνα επίσης crontabs των εκάστοτε χρηστών συστήματος. Όποιος κοιτάζει μόνο στη διεπαφή, δεν αναγνωρίζει γι' αυτό κάθε εγγραφή που δημιουργήθηκε απευθείας στον διακομιστή. Ελέγξτε σε περίπτωση αμφιβολίας και τα δύο.
Έτσι ελέγχετε όλα τα σημεία πλήρως
Οι παρακάτω εντολές απλώς διαβάζουν. Εκτελέστε τις ως root και διασφαλίστε τις εξόδους με ημερομηνία.
# Εμφάνιση των crontabs όλων των χρηστών
for u in $(cut -d: -f1 /etc/passwd); do
out=$(crontab -l -u "$u" 2>/dev/null) && printf '### %s\n%s\n' "$u" "$out"
done
# Εγγραφές συστήματος και χρόνοι αλλαγής
cat /etc/crontab
ls -la --time-style=full-iso /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
# Timers systemd και εργασίες at
systemctl list-timers --all
atq 2>/dev/null
# Αναζήτηση τυπικών μοτίβων σε όλα τα αρχεία cron
grep -rnE "curl|wget|base64|/tmp/|/dev/shm|\| *(ba)?sh" /etc/crontab /etc/cron.* /var/spool/cron 2>/dev/null
Δύο κόλπα αξίζουν ιδιαίτερη προσοχή. Ορισμένες εγγραφές κρύβουν εντολές πίσω από πολλά κενά, ώστε στον επεξεργαστή να βγαίνουν δεξιά εκτός οθόνης. Άλλες χρησιμοποιούν χαρακτήρες ελέγχου που κατά την εμφάνιση αντικαθιστούν κείμενο. Με το cat -A τέτοιοι χαρακτήρες γίνονται ορατοί:
cat -A /var/spool/cron/crontabs/www-data 2>/dev/null | less
Μια δεύτερη οπτική είναι τα πρωτόκολλα της υπηρεσίας cron. Σε πολλά συστήματα το cron σημειώνει κάθε εκτέλεση με χρήστη και εντολή. Έτσι βλέπετε και εγγραφές που ο επιτιθέμενος έχει στο μεταξύ αφαιρέσει και αναγνωρίζετε από πότε τρέχει μια ύποπτη εντολή:
# Εντολές cron που εκτελέστηκαν από τον χρήστη του διακομιστή ιστού (Debian/Ubuntu ή journal του systemd)
grep -h "CRON" /var/log/syslog* 2>/dev/null | grep -E "\((www-data|apache|nginx)\) CMD"
journalctl -u cron -u crond --since "2026-10-17" --no-pager 2>/dev/null | grep CMD | head -100
Πώς αναγνωρίζετε μια κερκόπορτα cronjob
- Λήψη από το διαδίκτυο: Μια λήψη της οποίας το αποτέλεσμα περνά απευθείας σε shell.
- Κωδικοποιημένο περιεχόμενο: Μακριές συμβολοσειρές που αποκωδικοποιούνται μόνο κατά την εκτέλεση.
- Ασυνήθιστες διαδρομές: Προγράμματα στο
/tmp, στο/dev/shm, σε κρυφούς φακέλους ή καταλόγους upload. - Λάθος χρήστης: Εργασίες κάτω από τον χρήστη του διακομιστή ιστού, παρόλο που η εφαρμογή δεν χρειάζεται καμία.
- Ασυνήθιστος ρυθμός: Εκτέλεση κάθε λεπτό ή σε κάθε επανεκκίνηση μέσω
@reboot. - Ακατάλληλες χρονοσημάνσεις: Αρχείο αλλαγμένο σε περίοδο που κανείς δεν δούλευε στον διακομιστή, για παράδειγμα μετά τις 17 Οκτωβρίου.
Μην ξεχνάτε: και οι εφαρμογές έχουν δικά τους χρονοδιαγράμματα. Το WordPress, για παράδειγμα, διαχειρίζεται προγραμματισμένες εργασίες στη βάση δεδομένων. Πώς ελέγχετε εκεί, περιγράφει το Εύρεση backdoors στο WordPress.
Ένα cronjob σπάνια έρχεται μόνο του. Όποιος δημιούργησε μια προγραμματισμένη εργασία, έχει συχνά καταχωρίσει και κλειδιά SSH ή έχει κρύψει αρχεία. Ελέγξτε επιπλέον τα κλειδιά, όπως περιγράφεται στο άρθρο Εύρεση άγνωστων κλειδιών SSH.
Διασφάλιση του ευρήματος, κατανόηση, μετά αφαίρεση
Ένα κακόβουλο cronjob είναι πολύτιμο τεκμήριο. Δείχνει τη διεύθυνση λήψης, τη χρονική στιγμή της δημιουργίας του και συχνά τον χρήστη μέσω του οποίου ήρθε ο επιτιθέμενος. Διασφαλίστε το αρχείο με άθροισμα ελέγχου και χρονοσημάνσεις πριν το αφαιρέσετε. Η χρονοσήμανση βοηθά αργότερα να ανασυσταθεί η πορεία· πώς γίνεται, δείχνει το Δημιουργία της χρονολογικής γραμμής ενός περιστατικού. Και για μια πιθανή γνωστοποίηση στην αρχή προστασίας δεδομένων ή στον ασφαλιστή το εύρημα είναι σημαντικό τεκμήριο για το από πότε είχε πρόσβαση ένας επιτιθέμενος.
Η αφαίρεση μόνη δεν αρκεί. Αν τρέχει ακόμη μια διεργασία που ξαναγράφει την εγγραφή, επιστρέφει στο επόμενο λεπτό. Και όσο η αρχική ευπάθεια παραμένει ανοιχτή, ο επιτιθέμενος μπορεί να ξαναπροσπαθήσει οποιαδήποτε στιγμή. Η σειρά είναι γι' αυτό: διασφάλιση, κλείσιμο της αιτίας, αφαίρεση όλων των συστατικών, αλλαγή προσβάσεων, παρακολούθηση.
Προληπτική θωράκιση των cronjobs
Για να μην δημιουργηθεί καν μια κερκόπορτα cronjob ή να γίνει γρήγορα αντιληπτή, βοηθούν τρία μέτρα. Πρώτον, μπορεί να οριστεί ποιοι χρήστες επιτρέπεται καν να δημιουργήσουν crontab. Αν υπάρχει το αρχείο /etc/cron.allow, μόνο οι χρήστες που αναφέρονται εκεί επιτρέπεται να χρησιμοποιούν το crontab. Αν η εφαρμογή σας δεν χρειάζεται cronjob κάτω από τον χρήστη του διακομιστή ιστού, ο χρήστης αυτός δεν ανήκει στη λίστα. Ελέγξτε πρώτα ποιες εργασίες χρειάζεται πραγματικά η εφαρμογή και δημιουργήστε τες σκόπιμα κάτω από δικό τους χρήστη.
Δεύτερον, αξίζει η παρακολούθηση των αρχείων. Ένα εργαλείο ελέγχου ακεραιότητας ειδοποιεί μόλις αλλάξει ένα αρχείο στους καταλόγους cron ή κάτω από το /var/spool/cron. Τρίτον, οι προγραμματισμένες εργασίες ανήκουν στην τεκμηρίωση του διακομιστή: όποιος ξέρει ποιες εγγραφές πρέπει να υπάρχουν, αναγνωρίζει αμέσως μια ξένη.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Πλήρης έλεγχος: Εξετάζουμε όλους τους μηχανισμούς προγραμματισμένων εργασιών, και timers systemd, εργασίες at και χρονοδιαγράμματα εφαρμογών.
- Κατάταξη ευρημάτων: Αξιολογούμε ύποπτες εγγραφές χωρίς να τις εκτελούμε και εξάγουμε περαιτέρω ίχνη.
- Καθαρός καθαρισμός: Με την αφαίρεση κακόβουλου λογισμικού αφαιρούμε όλα τα συστατικά και κλείνουμε την αιτία.
- Αναγνώριση επανάληψης: Ρυθμίζουμε μια παρακολούθηση που αναφέρει νέες ή αλλαγμένες προγραμματισμένες εργασίες.
Συχνές ερωτήσεις
Γιατί οι επιτιθέμενοι χρησιμοποιούν cronjobs;
Ένα cronjob ξεκινά εντολές τακτικά και χωρίς περαιτέρω ενέργεια. Οι επιτιθέμενοι κατεβάζουν μέσω αυτού κακόβουλο κώδικα, δημιουργούν ξανά διαγραμμένα αρχεία ή επανεκκινούν διεργασίες. Έτσι η πρόσβασή τους επιζεί μιας ενημέρωσης και συχνά και ενός επιφανειακού καθαρισμού.
Αρκεί το crontab -l για τον έλεγχο;
Όχι. Το crontab -l δείχνει μόνο το crontab του τρέχοντος χρήστη. Οι προγραμματισμένες εργασίες βρίσκονται επιπλέον στα crontabs άλλων χρηστών, στο /etc/crontab, στο /etc/cron.d, στους φακέλους cron.daily, σε timers systemd και σε εργασίες at.
Πώς αναγνωρίζω ένα κακόβουλο cronjob;
Τυπικά είναι λήψεις από το διαδίκτυο με άμεση εκτέλεση, εντολές με κωδικοποιημένες συμβολοσειρές, προγράμματα σε προσωρινούς φακέλους, εργασίες κάτω από τον χρήστη του διακομιστή ιστού και εγγραφές που τρέχουν κάθε λεπτό. Ένα μεμονωμένο χαρακτηριστικό είναι ένδειξη, περισσότερα σοβαρή υπόνοια.
Μπορώ απλώς να διαγράψω τα ύποπτα cronjobs;
Πρώτα διασφάλιση, μετά αφαίρεση. Η εγγραφή αποκαλύπτει συχνά προέλευση, διεύθυνση λήψης και περαιτέρω συστατικά. Χωρίς διευκρίνιση του πώς δημιουργήθηκε, ο επιτιθέμενος την ξαναδημιουργεί συχνά.