Ευπάθεια στο OpenSMTPD που επιτρέπει την απομακρυσμένη εκτέλεση κώδικα με δικαιώματα root

Στον διακομιστή αλληλογραφίας που αναπτύχθηκε από το έργο OpenBSD ΆνοιγμαSMTPD αναγνωρισθείς κρίσιμη ευπάθεια (CVE-2020-7247), το οποίο σας επιτρέπει να εκτελείτε εξ αποστάσεως εντολές φλοιού στον διακομιστή με δικαιώματα χρήστη root. Η ευπάθεια εντοπίστηκε κατά τη διάρκεια ενός νέου ελέγχου που διενεργήθηκε από την Qualys Security (προηγούμενος έλεγχος OpenSMTPD πραγματοποιήθηκε το 2015, και η νέα ευπάθεια είναι παρούσα από τον Μάιο του 2018). Πρόβλημα εξαλειφθεί στην έκδοση OpenSMTPD 6.6.2. Συνιστάται σε όλους τους χρήστες να εγκαταστήσουν αμέσως την ενημέρωση (για το OpenBSD, η ενημέρωση κώδικα μπορεί να εγκατασταθεί μέσω syspatch).

Προτείνονται δύο επιλογές επίθεσης. Η πρώτη επιλογή λειτουργεί στην προεπιλεγμένη διαμόρφωση OpenSMTPD (αποδοχή αιτημάτων μόνο από τον localhost) και σας επιτρέπει να εκμεταλλευτείτε το πρόβλημα τοπικά, όταν ο εισβολέας μπορεί να έχει πρόσβαση στη διεπαφή τοπικού δικτύου (loopback) στον διακομιστή (για παράδειγμα, σε συστήματα φιλοξενίας) . Η δεύτερη επιλογή εμφανίζεται όταν το OpenSMTPD έχει ρυθμιστεί για λήψη αιτημάτων εξωτερικού δικτύου (διακομιστής αλληλογραφίας που δέχεται αλληλογραφία τρίτων). Οι ερευνητές ετοίμασαν ένα πρωτότυπο ενός exploit που λειτουργεί με επιτυχία τόσο με την έκδοση OpenSMTPD που περιλαμβάνεται στο OpenBSD 6.6 όσο και με μια φορητή έκδοση για άλλα λειτουργικά συστήματα (που πραγματοποιήθηκε στο Debian Testing).

Το πρόβλημα προκαλείται από ένα σφάλμα στη συνάρτηση smtp_mailaddr(), η οποία καλείται να ελέγξει την ορθότητα των τιμών στα πεδία "MAIL FROM" και "RCPT TO" που ορίζουν τον αποστολέα/παραλήπτη και μεταβιβάζονται κατά τη σύνδεση με τον διακομιστή αλληλογραφίας. Για να ελέγξετε το τμήμα της διεύθυνσης email που βρίσκεται πριν από το σύμβολο «@», καλείται η συνάρτηση smtp_mailaddr()
valid_localpart(), που δέχεται (MAILADDR_ALLOWED) τους χαρακτήρες "!#$%&'*/?^`{|}~+-=_", όπως απαιτείται από το RFC 5322.

Σε αυτήν την περίπτωση, η άμεση διαφυγή της συμβολοσειράς εκτελείται στη συνάρτηση mda_expand_token(), η οποία αντικαθιστά μόνο τους χαρακτήρες "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Στη συνέχεια, η γραμμή που προετοιμάστηκε στο mda_expand_token() χρησιμοποιείται κατά την κλήση του παράγοντα παράδοσης (MDA) χρησιμοποιώντας την εντολή 'execle("/bin/sh", "/bin/sh", "-c", mda_command,..." . Σε περίπτωση τοποθέτησης γραμμάτων στο mbox μέσω /bin/sh, εκκινείται η γραμμή "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", όπου η τιμή "% Το {mbox.from} περιλαμβάνει δεδομένα διαφυγής από την παράμετρο "MAIL FROM".

Η ουσία της ευπάθειας είναι ότι η smtp_mailaddr() έχει ένα λογικό σφάλμα, λόγω του οποίου, εάν αποσταλεί ένας κενός τομέας στο email, η συνάρτηση επιστρέφει έναν επιτυχημένο κωδικό επαλήθευσης, ακόμη και αν το τμήμα της διεύθυνσης πριν από το "@" περιέχει μη έγκυρους χαρακτήρες . Επιπλέον, κατά την προετοιμασία μιας συμβολοσειράς, η συνάρτηση mda_expand_token() δεν διαφεύγει από όλους τους πιθανούς ειδικούς χαρακτήρες φλοιού, αλλά μόνο τους ειδικούς χαρακτήρες που επιτρέπονται στη διεύθυνση email. Έτσι, για να εκτελέσετε την εντολή σας, αρκεί να χρησιμοποιήσετε το σύμβολο «;» στο τοπικό τμήμα του email. και χώρο, τα οποία δεν περιλαμβάνονται στο σετ MAILADDR_ESCAPE και δεν έχουν διαφυγή. Για παράδειγμα:

$nc 127.0.0.1 25

HELO καθηγητής.falken
mail FROM:<;sleep 66;>
RCPT ΠΡΟΣ:
ΣΤΟΙΧΕΙΑ
.
ΚΑΠΝΙΣΜΑ

Μετά από αυτή τη συνεδρία, το OpenSMTPD, όταν παραδοθεί στο mbox, θα εκκινήσει την εντολή μέσω του κελύφους

/usr/libexec/mail.local -f ;sleep 66; ρίζα

Ταυτόχρονα, οι δυνατότητες επίθεσης περιορίζονται από το γεγονός ότι το τοπικό τμήμα της διεύθυνσης δεν μπορεί να υπερβαίνει τους 64 χαρακτήρες και οι ειδικοί χαρακτήρες '$' και '|' αντικαθίστανται με ":" κατά τη διαφυγή. Για να παρακάμψουμε αυτόν τον περιορισμό, χρησιμοποιούμε το γεγονός ότι το σώμα του γράμματος μεταδίδεται μετά την εκτέλεση του /usr/libexec/mail.local μέσω της ροής εισόδου, δηλ. Με τον χειρισμό της διεύθυνσης, μπορείτε να εκκινήσετε μόνο τον διερμηνέα εντολών sh και να χρησιμοποιήσετε το σώμα του γράμματος ως σύνολο οδηγιών. Εφόσον οι κεφαλίδες SMTP υπηρεσίας υποδεικνύονται στην αρχή του γράμματος, προτείνεται να χρησιμοποιήσετε την εντολή ανάγνωσης σε βρόχο για να τις παραλείψετε. Ένα εργασιακό exploit μοιάζει κάπως έτσι:

$nc 192.168.56.143 25

HELO καθηγητής.falken
mail FROM:<;για i στο 0 1 2 3 4 5 6 7 8 9 abcd;κάντε ανάγνωση r;done;sh;exit 0;>
RCPT ΠΡΟΣ:[προστασία μέσω email]>
ΣΤΟΙΧΕΙΑ
#0
#1
...
#d
για i στο WOPR? κάνω
echo -n "($i) " && id || Διακοπή
έγινε > /root/x."`id -u`.""$$"
.
ΚΑΠΝΙΣΜΑ

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο