Zdalne rozpoznawanie systemu operacyjnego techniki skanowania sieciowego

Sty 27
2010

komputerInformacje na temat systemu operacyjnego działającego na komputerze to podstawowa informacja, która daje nam możliwość testowania jego poziomu bezpieczeństwa. Aby móc zdalnie rozpoznać system operacyjny należy posłużyć się skanerem sieciowym. Skanery te dzielą się na dwa rodzaje. Aktywne takie jak Nmap oraz Xprobe i pasywne takie jak P0f.

Teoria

Podczas skanowania komputerów przy użyciu dowolnego skanera pojawia się pytanie „Jak to działa?”. Generalnie skaner aktywny i pasywny działa w oparciu na tej samej zasadzie, a mianowicie na przetwarzaniu i analizowaniu odebranych pakietów. Jedyna znacząca różnica pomiędzy nimi to sposób, w jaki te pakiety otrzymują.

Skaner aktywny jak Nmap wysyła na dany host pakiet, a następnie odbiera i analizuje odpowiedź serwera. Na podstawie odebranych i przetworzonych danych zwraca w komunikacie informacje o prawdopodobnej konfiguracji serwera. Prawdopodobnej, gdyż nigdy nie ma 100% pewności co do autentyczności takich informacji. Ponadto skan aktywny generuje mnóstwo pakietów oraz wzburza ruch sieciowy, przez co Administrator systemu w bardzo prosty sposób może wykryć próbę ataku.

Skan pasywny, którym charakteryzuje się P0f jest skanowaniem cichym, ze względu na brak generowania pakietów ze strony programu. Skan pasywny polega jedynie na odbieraniu i analizowaniu standardowych odpowiedzi serwera, dzięki czemu nie zostawiamy mnóstwa śladów w logach, tak jak przy użyciu techniki skanowania aktywnego. Program ten może nam posłużyć do wykrywania prób skanowania naszego komputera.

Praktyka

Mając już jako takie pojecie na temat skanerów oraz ich rodzajów możemy przystąpić do części praktycznej. W pierwszej kolejności należy zainstalować odpowiednie oprogramowanie. Osobiście korzystam z systemu Ubuntu, więc instalacja przebiega następująco. Dla programu Nmap:

sudo apt-get install nmap

Dla xprobe2:

sudo apt-get install xprobe

Oraz dla pasywnego skanera p0f:

sudo apt-get install P0f

Aby nie narażać się żadnemu Administratorowi próby praktyczne wykonamy na naszej lokalnej maszynie. Po uruchomieniu terminala należy zalogować się na konto administratora root, aby w trakcie skanowania nie przeszkodziły nam żadne ograniczenia.

Na pierwszy ogień pójdzie skaner Nmap, który jako parametr przyjmuje adres hosta.

root@cyber-jadro:/home/komeniusz# nmap localhost

Starting Nmap 4.76 ( http://nmap.org ) at 2009-09-05 18:52 CEST
Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1.
Interesting ports on localhost (127.0.0.1):
Not shown: 995 closed ports
PORT STATE SERVICE
80/tcp open http
631/tcp open ipp
3306/tcp open mysql
8089/tcp open unknown
9050/tcp open tor-socks

Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds
root@cyber-jadro:/home/komeniusz#

Powyższe polecenie zwróciło nam listę otwartych portów dzięki czemu wiemy, że serwer jest włączony i działa. Przydałoby się dowiedzieć na jakim systemie operacyjnym pracuje serwer. Pomoże nam w tym parametr -O.

root@cyber-jadro:/home/komeniusz# nmap -O localhost

Starting Nmap 4.76 ( http://nmap.org ) at 2009-09-05 18:57 CEST
Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1.
Interesting ports on localhost (127.0.0.1):
Not shown: 995 closed ports
PORT STATE SERVICE
80/tcp open http
631/tcp open ipp
3306/tcp open mysql
8089/tcp open unknown
9050/tcp open tor-socks
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.17 – 2.6.20
Network Distance: 0 hops

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.79 seconds
root@cyber-jadro:/home/komeniusz#

Jak widać:

Running: Linux 2.6.X
OS details: Linux 2.6.17 – 2.6.20


Nmap zasugerował nam, że na serwerze pracuje system z rodziny Linux na jądrze z serii 2.6.X. Ma racje 🙂

Przyjrzyjmy się trochę bliżej jak działa ten skaner. Nmap posiada bazę fingerprintów(ang. odcisków palców), na podstawie których porównuje odebrane pakiety i stwierdza z czym możemy mieć do czynienia. Plik ten powinniśmy znaleźć w ścieżce /usr/share/nmap/nmap-os-db, składa się on z kilkudziesięciu tysięcy linii. Nmap przy skanowaniu nie wysyła jednego, a kilka pakietów. Każdy pakiet to jeden test. Testy nazwane są kolejno od T1 do T7.

T1 – Wysyła pakiet z ustawioną flagą SYN wraz z opcjami TCP na otwarty port serwera. Flaga SYN ustawiona w pakiecie, mówi o chęci nawiązania połączenia z serwerem.
T2 – Wysyła pusty pakiet bez żadnych opcji na otwartych portach.
T3 – Wysyła pakiet z ustawionymi flagami SYN|FIN|URG|PSH na otwarty(lub nasłuchujący) port bez żądnej opcji.
T4 – Wysyła pakiet z ustawioną flagą ACK na otwarty port bez żadnych opcji.
T5 – Wysyła pakiet z ustawioną flagą SYN na zamknięty port bez żadnych opcji.
T6 – Wysyła pakiet z ustawioną flagą ACK na zamknięty port bez żadnych opcji.
T7 – Wysyła pakiet FIN|PSH|URG na zamknięty port bez żadnych opcji.

Warto zaznaczyć, że aby test zakończył się sukcesem serwer musi mieć choć jeden otwarty port. Poniżej przykładowa sygnatura z pliku nmap-os-db.

# Linux version 2.4.27 / monterey linux
Fingerprint Linux 2.4.27
Class Linux | Linux | 2.4.X | general purpose
SEQ(SP=BF-C9%GCD=<7%ISR=C2-CC%TI=Z%II=I%TS=7)
OPS(O1=M5B4ST11NW0%O2=M5B4ST11NW0%O3=M5B4NNT11NW0%O4=M5B4ST11NW0%O5=M5B4ST11NW0%O6=M5B4ST11)
WIN(W1=16A0%W2=16A0%W3=16A0%W4=16A0%W5=16A0%W6=16A0)
ECN(R=Y%DF=Y%T=40%TG=40%W=16D0%O=M5B4NNSNW0%CC=N%Q=)
T1(R=Y%DF=Y%T=40%TG=40%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=N)
T3(R=Y%DF=Y%T=40%TG=40%W=16A0%S=O%A=S+%F=AS%O=M5B4ST11NW0%RD=0%Q=)
T4(R=Y%DF=Y%T=40%TG=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T5(R=Y%DF=Y%T=40%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=Y%T=40%TG=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T7(R=Y%DF=Y%T=40%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
U1(DF=N%T=40%TG=40%TOS=F8%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUL=G%RUD=G)
IE(DFI=N%T=40%TG=40%TOSI=B8%CD=S%SI=S%DLI=S)

Kolejnym skanerem, który może nam pomóc w rozpoznawaniu systemu operacyjnego to xprobe2. Przeskanujmy zatem serwer localhost, w sposób analogiczny do Nmap’a.

root@cyber-jadro:/home/komeniusz# xprobe2 localhost

Xprobe2 v.0.3 Copyright (c) 2002-2005 fyodor@o0o.nu, ofir@sys-security.com, meder@o0o.nu

[+] Target is localhost
[+] Loading modules.
[+] Following modules are loaded:
[x] [1] ping:icmp_ping – ICMP echo discovery module
[x] [2] ping:tcp_ping – TCP-based ping discovery module
[x] [3] ping:udp_ping – UDP-based ping discovery module
[x] [4] infogather:ttl_calc – TCP and UDP based TTL distance calculation
[x] [5] infogather:portscan – TCP and UDP PortScanner
[x] [6] fingerprint:icmp_echo – ICMP Echo request fingerprinting module
[x] [7] fingerprint:icmp_tstamp – ICMP Timestamp request fingerprinting module
[x] [8] fingerprint:icmp_amask – ICMP Address mask request fingerprinting module
[x] [9] fingerprint:icmp_port_unreach – ICMP port unreachable fingerprinting module
[x] [10] fingerprint:tcp_hshake – TCP Handshake fingerprinting module
[x] [11] fingerprint:tcp_rst – TCP RST fingerprinting module
[x] [12] fingerprint:smb – SMB fingerprinting module
[x] [13] fingerprint:snmp – SNMPv2c fingerprinting module
[+] 13 modules registered
[+] Initializing scan engine
[+] Running scan engine
[-] ping:tcp_ping module: no closed/open TCP ports known on 127.0.0.1. Module test failed
[-] ping:udp_ping module: no closed/open UDP ports known on 127.0.0.1. Module test failed
[-] No distance calculation. 127.0.0.1 appears to be dead or no ports known
[+] Host: 127.0.0.1 is up (Guess probability: 50%)
[+] Target: 127.0.0.1 is alive. Round-Trip Time: 0.00012 sec
[+] Selected safe Round-Trip Time value is: 0.00023 sec
[-] fingerprint:tcp_hshake Module execution aborted (no open TCP ports known)
[-] fingerprint:smb need either TCP port 139 or 445 to run
[-] fingerprint:snmp: need UDP port 161 open
[+] Primary guess:
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.22” (Guess probability: 100%)
[+] Other guesses:
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.23” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.21” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.20” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.19” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.24” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.25” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.26” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.27” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.28” (Guess probability: 100%)
[+] Cleaning up scan engine
[+] Modules deinitialized
[+] Execution completed.
root@cyber-jadro:/home/komeniusz#

Program na początku informuje użytkownika o załadowanych modułach, które wykorzystał do skanowania.

[+] Loading modules.
[+] Following modules are loaded:
[x] [1] ping:icmp_ping – ICMP echo discovery module
[x] [2] ping:tcp_ping – TCP-based ping discovery module
[x] [3] ping:udp_ping – UDP-based ping discovery module
[x] [4] infogather:ttl_calc – TCP and UDP based TTL distance calculation
[x] [5] infogather:portscan – TCP and UDP PortScanner
[x] [6] fingerprint:icmp_echo – ICMP Echo request fingerprinting module
[x] [7] fingerprint:icmp_tstamp – ICMP Timestamp request fingerprinting module
[x] [8] fingerprint:icmp_amask – ICMP Address mask request fingerprinting module
[x] [9] fingerprint:icmp_port_unreach – ICMP port unreachable fingerprinting module
[x] [10] fingerprint:tcp_hshake – TCP Handshake fingerprinting module
[x] [11] fingerprint:tcp_rst – TCP RST fingerprinting module
[x] [12] fingerprint:smb – SMB fingerprinting module
[x] [13] fingerprint:snmp – SNMPv2c fingerprinting module
[+] 13 modules registered

Jak można zauważyć Xprobe w przeciwieństwie do Nmapa skupia się na skanowaniu z wykorzystaniem protokołu ICMP, a nie TCP. Skaner zwrócił nam prawdopodobną wersje skanowanego systemu.

[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.22” (Guess probability: 100%)
[+] Other guesses:
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.23” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.21” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.20” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.19” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.24” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.25” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.26” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.27” (Guess probability: 100%)
[+] Host 127.0.0.1 Running OS: „Linux Kernel 2.4.28” (Guess probability: 100%)

Według niego jest to Linux z kernelem w wersji 2.4.X – co jest nieprawdą. Jaki z tego wniosek? Skanowanie stosu TCP/IP pozwala na dokładniejsze określenie działającego systemu operacyjnego na zdalnej maszynie.

Obrona

Wiemy już jak działają skanery oraz potrafimy je wykorzystywać w celu rozpoznania systemu operacyjnego na danym komputerze. Wypadałoby nauczyć się wykrywać próby takiego skanowania.

Z pomocą przyjdzie nam tu skaner pasywny P0f, który będzie odbierać i analizować pakiety z zewnątrz. Jego użycie jest banalnie proste. Należy uruchomić go w konsoli jako root bez żadnych parametrów.

root@cyber-jadro:/home/komeniusz# p0f
p0f – passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski <lcamtuf@dione.cc>, W. Stearns <wstearns@pobox.com>
p0f: listening (SYN) on ‚eth0’, 262 sigs (14 generic, cksum 0F1F5CA2), rule: ‚all’.
^C+++ Exiting on signal 2 +++
root@cyber-jadro:/home/komeniusz#

Wchodząc na stronę Internetową, przykładowo www.nasza-klasa.pl otrzymujemy kilka informacji dotyczących naszego systemu operacyjnego.

192.168.1.10:38169 – Linux 2.6? (barebone, rare!)
-> 195.93.178.6:80 (distance 0, link: ethernet/modem)
192.168.1.10:48592 – Linux 2.6? (barebone, rare!)
-> 195.93.178.5:80 (distance 0, link: ethernet/modem)
192.168.1.10:33766 – Linux 2.6? (barebone, rare!)
-> 217.212.244.231:80 (distance 0, link: ethernet/modem)
192.168.1.10:42150 – Linux 2.6? (barebone, rare!)
-> 85.17.235.8:80 (distance 0, link: ethernet/modem)
192.168.1.10:35463 – Linux 2.6? (barebone, rare!)
-> 209.85.135.166:80 (distance 0, link: ethernet/modem)

Aby dowiedzieć się jaki system działa na danej stronie należy uruchomić nasz skaner z parametrem -A

195.93.178.5:80 – Linux recent 2.4 (2)
-> 192.168.1.10:48604 (distance 6, link: ethernet/modem)
217.17.36.25:80 – FreeBSD 4.4
-> 192.168.1.10:48979 (distance 7, link: ethernet/modem)
194.9.24.57:80 – FreeBSD 4.4
-> 192.168.1.10:47675 (distance 6, link: ethernet/modem)
194.9.24.46:80 – FreeBSD 4.4
-> 192.168.1.10:43568 (distance 6, link: ethernet/modem)
194.9.24.47:80 – FreeBSD 4.4
-> 192.168.1.10:57124 (distance 6, link: ethernet/modem)
217.17.36.25:80 – FreeBSD 4.4

Jak widać, Naszą-Klasą zarządza system z rodziny BSD 🙂

Zajmijmy się teraz próbą wykrycia skanowania naszego komputera Nmap’em. Na jednej konsoli odpalmy P0f’a nasłuchującego na interfejsie lokalnym lo przy użyciu parametru -i, a na drugim Nmapa z parametrem -O. Wynik dla P0f’a będzie składał się z kilku ładnych linii.

root@cyber-jadro:/home/komeniusz# p0f -i lo
p0f – passive os fingerprinting utility, version 2.0.8
(C) M. Zalewski <lcamtuf@dione.cc>, W. Stearns <wstearns@pobox.com>
p0f: listening (SYN) on ‚lo’, 262 sigs (14 generic, cksum 0F1F5CA2), rule: ‚all’.
127.0.0.1:60411 – UNKNOWN [2048:37:0:44:M1460:.:?:?]
-> 127.0.0.1:389 (link: ethernet/modem)
127.0.0.1:60411 – UNKNOWN [2048:57:0:44:M1460:.:?:?]
-> 127.0.0.1:443 (link: ethernet/modem)
127.0.0.1:60411 – UNKNOWN [3072:58:0:44:M1460:.:?:?]
-> 127.0.0.1:53 (link: ethernet/modem)
127.0.0.1:60411 – UNKNOWN [1024:56:0:44:M1460:.:?:?]
-> 127.0.0.1:256 (link: ethernet/modem)
127.0.0.1:60411 – UNKNOWN [1024:44:0:44:M1460:.:?:?]
-> 127.0.0.1:25 (link: ethernet/modem)
127.0.0.1:60411 – UNKNOWN [2048:41:0:44:M1460:.:?:?]
-> 127.0.0.1:22 (link: ethernet/modem)
127.0.0.1:60411 – SunOS 4.1.x
-> 127.0.0.1:554 (distance 25, link: ethernet/modem)
127.0.0.1:60411 – UNKNOWN [3072:50:0:44:M1460:.:?:?]
-> 127.0.0.1:1723 (link: ethernet/modem)
[…]

Konsola z Nmap’em winna wyglądać mniej więcej tak

root@cyber-jadro:/home/komeniusz# nmap -O localhost

Starting Nmap 4.76 ( http://nmap.org ) at 2009-09-06 14:03 CEST
Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1.
Interesting ports on localhost (127.0.0.1):
Not shown: 995 closed ports
PORT STATE SERVICE
80/tcp open http
631/tcp open ipp
3306/tcp open mysql
8089/tcp open unknown
9050/tcp open tor-socks
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.17 – 2.6.20
Network Distance: 0 hops

OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.84 seconds
root@cyber-jadro:/home/komeniusz#

Jak widać Nmap generuje mnóstwo pakietów, dlatego też łatwo jest rozpoznać skanowanie przy jego pomocy.

Źródła

Czytelnik zainteresowany problematyką skanowania może się dokształcić czytając poniższe publikacje

Jeden komentarz w “Zdalne rozpoznawanie systemu operacyjnego techniki skanowania sieciowego”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *