Kroniki Shodana: Portmapper – wzmocnione ataki DDoS, zdalny DoS oraz wycieki z NFS
Napisał: Patryk Krawaczyński
15/03/2019 w Pen Test Brak komentarzy. (artykuł nr 684, 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