NFsec Logo

Kroniki Shodana: Portmapper – wzmocnione ataki DDoS, zdalny DoS oraz wycieki z NFS

15/03/2019 (2 tygodnie temu) w Pen Test Brak komentarzy.  (artykuł nr 682, ilość słów: 1516)

R

PC Portmapper (znany również jako: portmap lub rpcbind) jest usługą typu Open Network Computing Remote Procedure Call (ONC RPC) zaprojektowaną do mapowania numerów usług RPC na numery portów sieciowych. Procesy RPC powiadamiają rcpbind, gdy startują rejestrując porty na których będą nasłuchiwać. To samo tyczy się ich numerów programów, które mają obsługiwać. Wówczas usługa rpcbind przekierowuje klienta do właściwego numeru portu, aby mógł komunikować się z żądanym serwisem. 3 lata temu usługa ta została wykorzystana do wzmacniania rozproszonych ataków DoS. Gdy portmapper jest odpytywany rozmiar odpowiedzi jest zależny od ilości usług RPC obecnych na hoście. W 2015 roku badacze z firmy Level 3 w swoich eksperymentach uzyskali odpowiedzi na poziomie od 486 bajtów (współczynnik wzmocnienia 7.1) do 1930 bajtów (ww = 28.4) dla 68-bajtowego zapytania. Średni rozmiar wzmocnienia w przeprowadzonych testach wynosił 1241 bajtów (ww = 18.3), podczas gdy w rzeczywistych atakach DDoS zaobserwowana wartość wynosiła 1348 bajtów, co daje wzmocnienie na poziomie 19.8 raza.

Wzmocniony DDoS:

Atakujący mogą używać zapytań do portmappera do ataków DDoS, ponieważ usługa działa na 111stym porcie TCP lub UDP. W przypadku protokołu UDP istnieje możliwość fałszowania źródłowego adresu IP, więc atakujący mogą wysyłać małe zapytania do portmappera, używając adresu IP ofiary, a serwer wyśle do niech większą objętościowo (wzmocnioną) odpowiedź. Wektor tego ataku jest znany również dla takich usług, jak memcache, NTP oraz SSDP. Na dzień dzisiejszy według Shodana istnieje 2 miliony 200 tysięcy hostów z udostępnioną usługą portmapper. Nadal jest to bardzo duża liczba, która może zostać wykorzystana do stworzenia botnetu i przeprowadzenia ataków DDoS. Niestety przeprowadzanie wzmocnionych ataków odmowy usługi z ukrywaniem źródłowych adresów IP jest tylko jedną z niedoskonałości tej usługi.

Zdalny DoS:

W 2017 roku Guido Vranken odkrył podatność serwisu rpcbind. Wystarczy 60 bajtowy ładunek informacji wysłany na port UDP, aby doprowadzić do awarii hosta poprzez zapełnienie całej jego pamięci. Luka pozwala atakującemu na przydzielenie dowolnej ilości bajtów (do czterech gigabajtów na atak) na zdalnym hoście wystawiającym usługę rpcbind. Pamięć na serwerze nigdy nie zostanie zwolniona, chyba że proces ulegnie awarii lub administrator osobiście zatrzyma i uruchomi ponownie usługę.

Otwarte serwery NFS:

Jak wcześniej wspomniałem bardzo często z portmapperem są uruchamiane inne usługi. Do najczęstszych (~ 250 tysięcy) należą serwery NFS. Jak możemy się domyślić przy takiej skali nie trudno napotkać na otwarty serwer portmap + NFS. Zanim spróbujemy taki znaleźć zainstalujmy oprogramowanie klienckie dla tych usług, czyli:

apt-get install nfs-common rpcbind

Szukając w wynikach Shodana powinnyśmy zwrócić uwagę na te pozycje, które posiadają usługę nfs wylistowaną w katalogu portmappera:

Portmap
Program	Version	Protocol	Port
portmapper	4	tcp	111
portmapper	3	tcp	111
portmapper	2	tcp	111
portmapper	4	udp	111
portmapper	3	udp	111
portmapper	2	udp	111
status	1	udp	60914
status	1	tcp	37897
nfs	2	tcp	2049
nfs	3	tcp	2049
nfs	4	tcp	2049
nfs	2	udp	2049
nfs	3	udp	2049
nfs	4	udp	2049
nlockmgr	1	udp	56354
nlockmgr	3	udp	56354
nlockmgr	4	udp	56354
nlockmgr	1	tcp	50626
nlockmgr	3	tcp	50626
nlockmgr	4	tcp	50626
mountd	1	udp	34423
mountd	1	tcp	40039
mountd	2	udp	45212
mountd	2	tcp	39810
mountd	3	udp	52743
mountd	3	tcp	55501

Mając już wybrany adres możemy przejść do eksploracji serwera NFS. Zanim to jednak nastąpi musimy potwierdzić, czy rzeczywiście stan prezentowany w Shodanie jest jeszcze aktualny. Możemy dokonać tego poleceniem:

root@darkstar:~# rpcinfo -s X.X.X.X
   program version(s) netid(s)                         service     owner
    100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser
    100024  1         tcp6,udp6,tcp,udp                status      102
    100021  4,3,1     tcp6,udp6,tcp,udp                nlockmgr    unknown
    100003  4,3,2     udp,tcp                          nfs         unknown
    100005  3,2,1     tcp6,udp6,tcp,udp                mountd      superuser

lub

root@darkstar:~# rpcinfo -p X.X.X.X
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100000    4     7    111  portmapper
    100000    3     7    111  portmapper
    100000    2     7    111  portmapper
    100005    1   udp    829  mountd
    100005    3   udp    829  mountd
    100005    1   tcp    829  mountd
    100005    3   tcp    829  mountd
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs

Aby nie używać skanera portów nmap, ale przekonać się że usługa portmapper odpowiada nieautoryzowanym hostom możemy użyć prostych zapytań dla różnych protokołów:

rpcinfo -p -T udp X.X.X.X
rpcinfo -p -T tcp X.X.X.X

Jeśli, jakakolwiek z nich zakończy się komunikatem: „RPC: Port mapper failure – Timed out” lub „rpcinfo: can’t contact portmapper: RPC: Remote system error – Connection refused” – oznacza to, że port 111 jest filtrowany za pomocą zapory ogniowej lub TCP Wrappers. W przeciwnym wypadku możemy użyć polecenia showmount, który odpyta daemona montowania na zdalnym hoście o listę eksportową serwera NFS, czyli jakie i komu udziały są udostępnione. Nas interesują te, które są dostępne dla wszystkich klientów, czyli: everyone, * lub 0.0.0.0/0 (inne za to mogą posłużyć jako informacja wywiadowcza).

root@darkstar:~# showmount -e X.X.X.X
Export list for X.X.X.X:
/var/www (everyone)
root@darkstar:~# showmount -e Y.Y.Y.Y
Export list for Y.Y.Y.Y:
/volume2/XXX       *
/volume2/Downloads *
/volume1/Torrents  *
root@darkstar:~# showmount -e Z.Z.Z.Z
Export list for Z.Z.Z.Z:
/mnt/homes        0.0.0.0/0
/mnt/Transmission 0.0.0.0/0

Ostatnim krokiem jest próba zamontowania zdalnego udziału na naszej lokalnej maszynie:

root@darkstar:~# mkdir /nfs
root@darkstar:~# mount -v Y.Y.Y.Y:/nfsshare /nfs
mount.nfs: timeout set for Tue Mar 12 22:12:27 2019
mount.nfs: trying text-based options 'vers=4.2,addr=Y.Y.Y.Y,clientaddr=10.0.2.15'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.1,addr=Y.Y.Y.Y,clientaddr=10.0.2.15'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4.0,addr=Y.Y.Y.Y,clientaddr=10.0.2.15'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=Y.Y.Y.Y'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying Y.Y.Y.Y prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying Y.Y.Y.Y prog 100005 vers 3 prot UDP port 892

root@darkstar:~# df -h /nfs
Filesystem              Size  Used Avail Use% Mounted on
Y.Y.Y.Y:/nfsshare       9.8G  1.3G  8.0G  15% /nfs

To, że usługa nie ogranicza adresu źródłowego klienta do żadnej konkretnej wartości nie znaczy, ze zawsze będziemy w stanie zamontować taki udział. Może się zdarzyć że klient nie będzie miał wystarczających uprawnień, aby chodzić po ścieżce dostępu do udziału.

Jak się bronic?

Po pierwsze rpcbind jest wymagany w przypadku stosowania protokołu NFS w wersji 2 oraz 3. NFSv4 nasłuchuje na ogólnie znanym (ang. well-known) porcie TCP 2049, co eliminuje potrzebę interakcji z portmapperem – więc nie musimy go instalować i uruchamiać. Jeśli musimy implementować jeszcze NFSv2 lub NFSv3 to powinniśmy zadbać o to, aby usługi te działały tylko w wewnętrznej sieci. Przykład pliku /etc/default/rpcbind:

OPTIONS="-w -l -h 192.168.1.1"

Jeśli komunikacja musi odbywać się za pomocą internetu to powinniśmy osłonić porty samego portmappera, jak i usług RCP za pomocą iptables (wówczas ich porty trzeba zmienić z dynamicznych na statyczne) oraz TCP Wrappers:

# /etc/hosts.allow
rpcbind: 192.168.1.2 192.168.1.3
# /etc/hosts.deny
rpcbind: ALL

Możliwość komunikacji powinny mieć tylko określone i zaufane adresy IP. To samo tyczy się tablicy klientów definiowanej w pliku exports serwera NFS.

Więcej informacji: rpcbomb, Bypass RPC Portmapper Filtering, Openly accessible Portmapper services, RPC Portmapper Abused for DDoS Attack Reflection, Amplification

Kategorie K a t e g o r i e : Pen Test

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

Brak nowszych postów

Komentowanie tego wpisu jest zablokowane.