Rekonesans jest jednym z podstawowych i najważniejszych etapów testów penetracyjnych. Pomaga on nam w zdobyciu informacji, które mogą być dla nas kluczowe. Czytając artykuły z na przykład bugbounty możemy natknąć się na wzmianki o skanowaniu portów – do tego najczęściej stosowany jest nmap. Mało kto jednak wie, że to zaledwie wierzchołek góry lodowej możliwości, które oferuje nam narzędzie. W tym artykule przyjrzymy się im nieco bliżej.
Rodzaje statusów portów
Przed tym jak zaczniemy, trochę podstawowej teorii, którą będziemy wykorzystywali przy pracy z nmapem. Przy skanie będziemy dostawali informacje dotyczące portów. Jedne z nich będą otwarte (open), inne nieprzefiltrowane (unfiltered), a jeszcze inne będą miały oba te stany. Co to dla nas oznacza?
- open – aplikacja nasłuchuje na połączenia TCP lub pakiety UDP na wskazanym porcie,
- closed – port jest dostępny, odbiera i odpowiada na pakiety nmapa, ale nie ma aplikacji obsługującej połączenie,
- filtered – nmap nie jest w stanie stwierdzić, czy port jest otwarty. Powodem jest filtrowanie sieci za pomocą systemów zaporowych (firewall) przez administratora sieci,
- unfiltered – port jest otwarty, ale nmap nie jest w stanie stwierdzić czy jest zamknięty, czy otwarty. Taki stan portu może określić jedynie skanowanie ACK. Przy skanowaniu nieprzefiltrowanych portów powinniśmy użyć skanowania Windows, SYN lub FIN,
- open / filtered – stan portu określany w momencie, kiedy narzędzie nie jest w stanie ustalić, czy jest on otwarty lub zamknięty. Dzieje się to wtedy, gdy port nie daje odpowiedzi,
- closed / filtered – stan określany dla portów, dla których nmap nie wie, czy port jest zamknięty, czy filtrowany.
Najważniejsze rodzaje skanów
Skanowanie systemu operacyjnego
Na początek coś prostego – skanowanie systemu operacyjnego. Nmap przesyła pakiety UDP oraz TCP i na podstawie odpowiedzi zwrotnej analizuje i dopasuje je do tych przetrzymywanych rekordów w swojej bazie danych. Na tej podstawie następuje estymacja, który z systemów może być wykorzystywany przez hosta.
┌──(bugspace㉿kali)-[~/Desktop]
└─$ sudo nmap -O 142.250.203.131 1 ⨯
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-10 12:36 EST
Nmap scan report for waw07s06-in-f3.1e100.net (142.250.203.131)
Host is up (0.0034s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|switch|phone
Running (JUST GUESSING): Linux 1.0.X (87%), Cisco embedded (87%), Nokia Symbian OS (86%)
OS CPE: cpe:/o:linux:linux_kernel:1.0.9 cpe:/h:cisco:catalyst_1900 cpe:/o:nokia:symbian_os
Aggressive OS guesses: Linux 1.0.9 (87%), Cisco Catalyst 1900 switch (87%), Nokia 3600i mobile phone (86%)
No exact OS matches for host (test conditions non-ideal).
OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.67 seconds
Skan TCP SYN (-sS)
Jest to domyślny i najczęściej wykorzystywany sposób skanowania portów. Skanowanie SYN charakteryzuje się tym, że połączenie nie zostaje nigdy otwarte do końca, przez co jest dość dyskretne. Niepełne otwarcie polega na tym, że po przesłaniu pakietu SYN i otrzymaniu odpowiedzi, nie zostaje przesłany kolejny segment ACK. O tym jak działa TCP możecie więcej przeczytać tutaj.
Status portu jest determinowany odpowiedzią, którą otrzyma. W przypadku otrzymania segmentu SYN-ACK, port jest otwarty. Jeśli odpowiedzią jest pakiet RST – port jest zamknięty. W przypadku braku odpowiedzi lub komunikatu o błędzie ICMP, port dostanie status filtered.
┌──(bugspace㉿kali)-[~/]
└─$ sudo nmap -sS google.com
[sudo] password for kali:
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-12 10:58 EST
Nmap scan report for google.com (142.250.203.142)
Host is up (0.0064s latency).
Other addresses for google.com (not scanned): 2a00:1450:401b:80e::200e
rDNS record for 142.250.203.142: waw07s06-in-f14.1e100.net
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 4.88 seconds
Na powyższym skanie widać, że otwartymi portami jest port o numerze 80 i 443.
Skan TCP connect() (-sT)
Jeśli użytkownik nie ma uprawnień do wysyłania pakietów raw lub skanowania sieci IPv6, domyślnie wysyłane jest zapytanie TCP connect. Zamienia ono niskopoziomowe odwołania na wysokopoziomowe – te same, które wykorzystywane są przez min. przeglądarki internetowe. Do skanowania sieci należy unikać tej metody, ponieważ nmap ma nad niąmniejszą kontrolę niż w przypadku metody SYN. Ponadto, w porównaniu do niej przy TCP connect() następuje pełne połączenie, co implikuje wydłużenie czasu oraz zostawia większe ślady prób połączenia.
Skan UDP (-sU)
Ponieważ skanowanie portów wykorzystujących protokół UDP jest cięższe i pochłania więcej czasu, badacze bezpieczeństwa często to ignorują. Jest to błąd. Skanowanie UDP (poprzez dodanie parametru -sU) polega na przesyłaniu przez nmap pustych pakietów UDP na docelowe porty. Jeśli dostaniemy odpowiedź w postaci pakietu UDP, port jest klasyfikowany jako otwarty. W przypadku otrzymaniu komunikatu (błędu) ICMP, port dostaje status zamknięty lub filtrowany. Brak odpowiedzi oznacza status otwarty / filtrowany.
Skan TCP Null, FIN i Xmas (-sN, -sF, -sX)
Wszystkie trzy skanowania różnią się jedynie ustawionymi flagami w pakiecie. Jeśli nie ma odpowiedzi, oznacza to, że port jest otwarty. W przypadku zamkniętych portów dostajemy w odpowiedzi pakiet RST/ACK. Skany te działają tylko na systemach z implementacją TCP/IP zgodną z RFC 793. Ponadto, każdy ze skanów nie działa na żadnej wersji systemu Windows. Jakimi flagami różnią się skany Xmas, FIN i Null?
- Xmas – przesyła pakiet z ustawionymi flagami FIN, URG oraz PSH,
- FIN – przesyła pakiet z ustawionymi flagami FIN,
- Null – przesyła pakiet bez ustawionych flag
Skan TCP ACK (-sA)
Skanowanie TCP ACK różni się od poprzednich. Jego celem nie jest bowiem określenie statusów portów, a sprawdzenie, czy są one filtrowanie przez stateful firewall (zapora sieciowa). Wygląda to w taki sposób, że podobnie jak przy standardowym skanie, przesyłany jest pakiet ACK. Jeśli któryś z portów zwróci pakiet RST, oznacza to dla nmapa, że porty nie są filtrowane.
┌──(kali㉿kali)-[~/Desktop/3rdtools/sherlock/sherlock]
└─$ sudo nmap -sA google.com
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-12 11:01 EST
Nmap scan report for google.com (142.250.203.142)
Host is up (0.0025s latency).
Other addresses for google.com (not scanned): 2a00:1450:401b:80e::200e
rDNS record for 142.250.203.142: waw07s06-in-f14.1e100.net
All 1000 scanned ports on google.com (142.250.203.142) are unfiltered
Nmap done: 1 IP address (1 host up) scanned in 0.37 seconds
Jak widać, porty nie są filtrowane.
Skan TCP Window (-sW)
Skanowanie to polega na tym samym, co skan TCP ACK. Różni się ono jedynie tym, że przy odebranych pakietach RST sprawdza ich pole TCP Window Size w celu stwierdzenia, czy port jest otwarty lub nie. Dzieje się to za sprawą tego, że niektóre systemy operacyjne zwracają wartość dodanią w polu TCP Window Size gdy pakiet jest odesłany z otwartego portu. W przypadku zamkniętych portów wartość ta jest ujemna.
Skan TCP Maimon (-sM)
Jest to skanowanie z rodziny Null, FIN i Xmas. Różni się jedynie tym, że używa flag FIN/ACK. Dla takiej kombinacji flag pakiet zwracany RST powinien być wygenerowany niezależnie od tego, czy port jest otwarty czy zamknięty. Zdarza się, że część systemów opartych na BSD (odmiana systemu operacyjnego Unix) pomija odpowiedzi, jeśli port jest otwarty.
Nmap dostarcza także możliwości zdefiniowana własnych flag, skanowanie protokołów IP, Idle i wiele więcej. Są to jednak nieco bardziej skomplikowane skany, które nie są wykorzystywane na co dzień. Do dokumentacji narzędzia odsyłamy tutaj.
Znajdywanie podatności ze skryptami nse
Mało kto wie, że nmap nie służy jedynie do pracy przy rekonesansansie. Pozwala on między innymi na znajdywanie podatności na podstawie przygotowanych przez community oraz twórców narzędzia skryptów. Jako przykład może posłużyć nmap-vulners, vulscan bądź przygotowane już skrypty, które są instalowane wraz z nmapem.
Przed rozpoczęciem skanu wspomniane skrypty powinniśmy wrzucić (jeśli nie chcemy użyć tych zainstalowanych domyślnie) do katalogu scripts, który umieszczony jest w miejscu instalacji nmapa. Dla systemu kali docelową ścieżką będzie /usr/share/nmap/scripts
. W podstawce mamy dostępne 604 skrypty, a poczytać o nich więcej możecie tutaj. Przykładowo, aby użyć skryptu vulners.nse
, wpiszemy:
nmap scanme.nmap.org --script=vulners.nse -sV
W przykładzie został wykorzystany jeden skrypt. Aby uruchomić ich większą ilość, podamy kilka nazw po sobie oddzielonych jedynie przecinkiem. Ponadto, jeśli chcielibyśmy sprawdzić skrypty zaczynające się od danej frazy (np. „ftp”), użylibyśmy polecenia:
nmap scanme.nmap.org --script "ftp-*" -sV
Analogicznie, jeśli chcielibyśmy uruchomić wszystkie dostępne skrypty, w cudzysłowie wpisalibyśmy „*.nse”. Nie zalecam jednak tego robić – część ze skryptów wymaga aby zostały podane dodatkowe argumenty bądź zewnętrzne klucze API do ich poprawnego działania.
Źródła
https://github.com/vulnersCom/nmap-vulners
https://github.com/scipag/vulscan
https://securitytrails.com/blog/nmap-vulnerability-scan
https://www.halolinux.us/firewalls-attack-detection/tcp-ack-scans.html
https://nmap.org/man
https://linuxhint.com/nmap_xmas_scan/