Rozpoznawanie systemu operacyjnego

Konrad Madej

5 czerwca 2002


Spis rzeczy

Wprowadzenie

Znajomość Systemu Operacyjnego dla atakującego jest jednym z podstawowych elementów przygotowania się do przeprowadzenia ataku. Często się zdarza że dziury w bezpieczeństwie są zależne od rodzaju SO. Przykładowo błąd w jakimś programie daje możliwość przejęcia systemu po wysłaniu odpowiednio skonstruowanego pakietu (żądania). Do poprawnego skonstruowania części takiego ,,szkodliwego'' żądania (np. tzw. shellcode 1 ) potrzebna jest znajomość atakowanego SO / architektury. Teoretycznie można wypróbować wszystkie możliwości, jednak często jest tak że mamy tylko jedną szansę, ponieważ program po otrzymaniu takiego pakietu kończy się bądź zostaje zabity przez jądro systemu. Jeżeli shellcode nie był odpowiedni nie uda się przejąć systemu ani powtórzyć ataku.

Z drugiej strony ukrywanie rodzaju SO nie jest samo w sobie zabezpieczeniem systemu, nie łata furtek jakimi można skompromitować system. Dlatego zabezpieczanie się przed możliwością rozpoznania SO powinno następować dopiero po załataniu i zabezpieczeniu systemu.

,,Rozgadane'' serwisy i programy

Jedną z najstarszych technik uzyskiwania informacji o systemie operacyjnym jest szukanie informacji poprzez zainstalowane serwisy dostępne z zewnątrz. Programy które pełnią rolę serwerów różnych usług często podają dokładne informacji o sobie jak i systemie na którym działają. Klasycznym przykładem mogą być ,,banery'' wyświetlane przez demony programu telnet:
$ telnet lew.elka.pw.edu.pl
Trying 194.29.160.129...
Connected to lew.elka.pw.edu.pl.
Escape character is '^]'.


SunOS 5.7

login:
Widzimy że zdalny system pracuje pod kontrolą Solaris 7 najprawdopodniej na platformie Sparc.

,,Bezpieczny zastępca'' programu telnet - Secure Shell (ssh), a dokładnie jego darmowa implemetacja OpenSSH, przy domyślnej kompilacji również podaje dokładne informacje zarówno o sobie jak i systemie podczas nawiązywania połączenia:

$ ssh -v 172.16.0.1
[...]
debug1: Remote protocol version 1.99, remote software version 
  OpenSSH_3.0.2p1 Debian 1:3.0.2p1-6
[...]

Równie łatwo uzyskać informacje o systemie od serwerów WWW:

$ echo -e "GET / HTTP/1.0\\n" | nc www.pw.edu.pl 80

HTTP/1.1 200 OK
Date: Sun, 02 Jun 2002 18:21:54 GMT
Server: Apache/1.3.22 (Unix)  (Red-Hat/Linux) mod_ssl/2.8.5 
  OpenSSL/0.9.6 PHP/4.
0.6 mod_perl/1.24
Last-Modified: Tue, 02 Oct 2001 07:47:15 GMT
ETag: "4301a-31a-3bb97103"
Accept-Ranges: bytes
Content-Length: 794
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
[...]

Sprawa się komplikuje gdy na danym serwerze nie są udostępnione żadne usługi bądź gdy używane są filtry pakietów do ograniczenia dostępu tylko z zaufanych miejsc (sieci) do serwisów. System może być jednak używany przez użytkowników np. do wysyłania poczty elektronicznej bądź czytania grup dyskusyjnych. Programy ,,klienckie'' do obsługi tekstowych wiadomości internetowych (zgodnych z RFC 822) często zaszywają w nich interesujące nas informacje. Poniżej nagłowek Message-ID ustawiany przez popularny program pine:

Message-ID: <Pine.SOL.4.30.0205272332250.4474-100000@mion.elka.pw.edu.pl>
Możemy z niego wyczytać że komputer z którego została wysłana wiadomość z tym nagłówkiem, pracuje pod kontrolą systemu Solaris (najprawdopodniej platforma Sparc) i użyty został program pine w wersji 4.30.

Krótko opisane powyżej techniki są tylko przykładami na to jak w łatwy sposób można uzyskać informacje o zdalnym systemie. Jest wiele innych metod opartych również na wykorzystaniu różnych protokołów, które niejako podają nam szukane informacje np. SNMP albo rekordy DNS.

Udostępnione serwisy jak i programy ,,klienckie'', które komunikują się ze ,,światem zewnętrznym'', używane w danym systemie są często źródłem bardzo wielu informacji. Mogą one pomóc potencjalnemu atakującemu w skompromitowaniu systemu. Ukrywanie informacji o programach udostępniających usługi jak i rodzaju systemu operacyjnego nie chroni przed atakiem a jedynie utrudnia w jego przygotowaniu i przeprowadzeniu. Dlatego ta forma bezpieczeństwa (ang. security by obscurity) powinna być stosowana dopiero w ostatniej fazie fortyfikowania systemu.

,,Odcisk'' TCP/IP

Opisana w poprzednim rozdziale technika uzyskiwania informacji z protokołów warstw aplikacji chociaż często skuteczna i bardzo prosta może okazać się niewystarczająca. Administrator ma tutaj duże pole do popisu aby zatrzymać wyciek informacji z aplikacji poprzez konfiguracje bądź proste modyfikacje w źródłach programów (jeżeli są one dostępne). Dodatkową wadą metody jest to że najczęściej musimy nawiązać połączenie z daną aplikacją co jest odnotowywane w plikach logów systemowych.

Metodą bardziej zaawansowaną i trudną do oszukania jest badanie pól nagłówków protokołów warstw niższych czyli przede wszystkim IP i TCP. Zgodnie z dokumentami RFC pewne pola tych nagłówków mogą być ustawiane z pewną dowolnością przez systemy operacyjne. Dodatkowo mogą występować pewne rozszerzenia protokołów, które nie muszą być obsługiwane przez wszystkie implementacje stosów TCP/IP. Różnice w implementacjach przenoszą się na ,,wygląd'' pakietów i zachowanie stosu w określonych sytuacjach dając jednocześnie możliwość identyfikacji.

Metody badania nagłówków TCP/IP w celu ustalenia systemu operacyjnego (a dokładniej implementacji stosu TCP/IP) są dwie: aktywna i pasywna. W pierwszej wysyłamy specjalnie skonstruowany pakiet bądź pakiety do zdalnego systemu a następnie badamy otrzymaną odpowiedź. Wygląd otrzymanego pakietu i/lub zachowanie zdalnego systemu porównujemy z danymi z wcześniej stworzonej bazy ,,sygnatur i zachowań''. W metodzie pasywnej nie komunikujemy się bezpośrednio z interesującym nas zdalnym systemem ale musimy zdobyć specyficzne pakiety wysłane przez niego. Mogą one pochodzić z dowolnego połączenia. Przykładowo możena wykorzystać pakiety które służyły do nawiązania połączenia z naszym serwerem WWW.

Metoda ,,aktywna'' ze względu na swoją ,,dynamikę'' ma dużo większy wachlarz możliwości badania zdalnego systemu, jednak wymaga interakcji zapoczątkowanej przez nas ze zdalnym systemem. Taka interakcja z jednej strony może być utrudniona przez zdalne filtry pakietów a z drugiej może nas zdemaskować. W przypadku metody pasywnej mamy mniejsze możliwości ale niejako pozostajemy przezroczyści.

Aktywny ,,odcisk palca''

W metodzie aktywnego ,,odcisku palca'' można wykorzystać szeregu technik, które pozwolą na jednoznaczną identyfikację zdalnego systemu. Wszystkie z nich polegają na wysłaniu specjalnie skonstruowanego pakietu bądź pakietów do interesującego systemu i badaniu odpowiedzi.

Poniżej zostały opisane niektóre z możliwych technik:

Wymienione wyżej techniki to tylko kilka najpopularniejszych. Różnią się one ,,mocą'' działania, trudnością implementacji oraz możliwością im zapobiegania.

Ochrona przed rozpoznaniem naszego systemu operacyjnego metodą badania stosu TCP/IP jest trudna gdyż zmiana zachowania implementacji jest często praktycznie niemożliwa. W przypadku np. TTL administrator ma często możliwość ustawienia tej wartości, dzięki czemu może ,,zrównać się'' z innym systemem operacyjnych. W innych przypadkach jest to jednak niemożliwe bez zmian w implementacji. Tutaj z pewną pomocą mogą przyjść filtry pakietów, które mogą w ograniczony sposób zmieniać obserwowane zachowanie stosu TCP/IP oraz przede wszystkim ograniczyć wysyłanie pakietów przez system na różne podejrzane ,,zapytania'' z nieznanych źródeł.

Przykłady

Próbkowanie ,,FIN''.

Zgodnie z RFC 793 wysłanie segmentu TCP z ustawioną flagą FIN do otwartego powinno zostać zignorowane jednak niektóre ,,złamane'' implementacje odpowiadają na taki pakiet. Tak zachowuje się np. Windows 98. Test został przeprowadzony przy pomocy programy sendip, który pozwala budować i wysyłać dowolne pakiety.
# sendip -p ipv4 -is 172.16.0.1 -p tcp -ts 20000 -td 222 -tfs 0 
  -tff 1 dark
Zachowanie systemu zostało zarejestrowane programem tcpdump.
21:59:52.388556 172.16.0.1.20000 > 172.16.0.2.222: F [tcp sum ok] 
  218449933:218449953(20) win 65535 (ttl 255, id 26919, len 40)
21:59:52.389056 172.16.0.2.222 > 172.16.0.1.20000: R [tcp sum ok] 
  0:0(0) ack 218449954 win 0 (ttl 128, id 16896, len 40)

Badanie TCP ISN.

Systemy różnie generują kolejne początkowe numery sekwencyjne. Niektóre z nich generują liczby zupełnie przypadkowe, inne stałe albo zależne od czasu. Ta cecha pozwala rozpoznać z jaką implementacją mamy doczynienia. Przykładowo w Windows 98 kolejne ISN są zależne od czasu. Możemy to zaobserwować wysyłając trzy pakiety SYN w stałych odstępach czasu (co 5s):
22:40:23.203118 172.16.0.1.0 > 172.16.0.2.1026: 
  S 2412794997:2412795017(20) win 65535
22:40:23.203853 172.16.0.2.1026 > 172.16.0.1.0: 
  S 2637924:2637924(0) ack 2412794998 win 8760 <mss 1460,nop,nop,sackOK> (DF)

22:40:28.237680 172.16.0.1.0 > 172.16.0.2.1026: 
  S 239167826:239167846(20) win 65535
22:40:28.238230 172.16.0.2.1026 > 172.16.0.1.0: 
  S 2642959:2642959(0) ack 239167827 win 8760 <mss 1460,nop,nop,sackOK> (DF)

22:40:33.265479 172.16.0.1.0 > 172.16.0.2.1026: 
  S 3557021046:3557021066(20) win 65535
22:40:33.266189 172.16.0.2.1026 > 172.16.0.1.0: 
  S 2647987:2647987(0) ack 3557021047 win 8760 <mss 1460,nop,nop,sackOK> (DF)
Różnica ISN pomiędzy drugą i pierwszą próbą wynosi $2642959-2637924=5035$, natomiast pomiędzy trzecią i drugą $2647987-2642959=5028$. Widzimy zatem że ISN liniowo zależy od czasu i ziwększa się o 1 co 1. milisekundę. Ze względu na duże implikacje dla bezpieczeństwa, ISN powinien być nieprzwidywalny.

Pasywny ,,odcisk palca''

Metoda pasywna określania systemu operacyjnego opiera się na tych samych podstawach co aktywna. Specyfikacje protokołów pozwalają na pewną dowolność implementacji w niektórych ,,miejscach'' dzięki czemu można je rozróżniać (dochodzą również błędy w implementacjach).

W technice aktywnej konstruowaliśmy specjalny pakiet bądź pakiety i wysyłaliśmy do interesującego nas systemu następnie badaliśmy odpowiedź. Metoda pasywna powinna bazować tylko na informacji jaką możemy znaleźć w typowej komunikacji. Jednym z bardziej charakterystycznych pakietów, który niesie maksymalnie dużo informacji o stosie TCP/IP nadawcy jest segment SYN nawiązujący sesję TCP. Poniżej zostały przedstawione elementy jakie można wykorzystać do identyfikacji systemu operacyjnego na podstawie pakietu SYN. Część z nich pokrywa się z technikami zaprezentowanymi już dla metody aktywnej.

Przykłady

Poniżej kilka przykładowych pakietów SYN pochodzących z różnych systemów operacyjnych ,,złapanych'' programem tcpdump.

Linux 2.4.18

10:38:39.590583 172.16.0.1.32772 > 172.16.0.2.22: S [tcp sum ok] 
231104793:231104793(0) win 5840 <mss 1460,sackOK,timestamp 260958 0,
nop,wscale 0> (DF) (ttl 64, id 39495, len 60)
Możemy wyczytać następujące informacje:

Windows 98

10:51:58.570649 172.16.0.2.1028 > 172.16.0.1.22: S [tcp sum ok] 
134682:134682(0) win 8192 <mss 1460,nop,nop,sackOK> (DF) 
(ttl 128, id 13312, len 48)
Dla Windows 98 mamy:

Solaris 7

11:11:08.129665 194.29.160.35.1010 > 194.29.168.3.22: S [tcp sum ok]
2789939954:2789939954(0) win 8760 <mss 1460> (DF) 
(ttl 255, id 46647, len 44)
Solaris 7 ma zupełnie inny ,,odcisk'':

W tabeli [*] zestawiono ze sobą te trzy systemy operacyjne i ich ,,parametry'' stosu TCP/IP.


Tablica: ,,Parametry'' implementacji stosów TCP/IP
  Linux 2.4.x Windows 98 Solaris
TTL 64 128 255
DF 1 1 1
win 5840 8192 8760
mss 1460 1460 1460
sackOK 1 1 -
timestamp 1 - -
wscale 1 - -
nop 1 1 -


Podsumowanie

Wymienione tutaj techniki nie pokrywają całego zakresu możliwości pasywnego rozpoznawania systemów. Możemy tutaj choćby użyć technologie rozpoznawania charakterystycznych ISN (opisana w metodzie aktywnej), badania danych zawieranych w pakietach ICMP ECHO_REQUEST.

Technologia ,,niewidzialnego'' rozpoznawania systemów operacyjnych może mieć wiele zastosowań. Możemy analizować kto łączy się z naszym serwisem WWW. Metoda ta jest skuteczna gdy na drodze do interesującego nas systemu stoi filtr pakietów, który nie pozwala użyć żadnej z technik aktywnych. Jedyne co potrzebujemy to zdobyć charakterystyczny pakiet wysłany przez niego czyli np. nawiązał połączenie z jakimś serwisem udostępnianym przez nas.

Metoda ta może mieć duże zastosowanie w monitorowaniu sieci lokalnych firm, i w żaden sposób niezakłucający jej pracy, wykrywać podejrzane systemy np. Windows ;)

Literatura

1
Honeynet Project, ,,Know Your Enemy: Passive Fingerprinting''

2
Rob Beck, ,,Passive-Aggressive Resistance: OS Fingerprint Evasion''

3
Fyodor, ,,Remote OS detection via TCP/IP Stack FingerPrinting''

4
SWITCH, ,,Default TTL Values in TCP/IP''

5
Craig Smith, passfingerprint.pl version 0.2

6
Michał Zalewski, p0f version 1.7

7
RFC 822, ,,Standard for the format of arpa internet text messages''

About this document ...

Rozpoznawanie systemu operacyjnego

This document was generated using the LaTeX2HTML translator Version 2K.1beta (1.48)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -split 0 -verbosity 0 -no_navigation -dir /home/konrad/public_html/elektron/mydocs/fingerprint fingerprint.tex

The translation was initiated by Konrad Madej on 2002-06-12


Footnotes

... shellcode1
Kod w asemblerze który jest umieszczany gdzieś w pamięci i po udanym przełączeniu sterowania do niego powoduje uruchomienie programu shella (/bin/sh)


Konrad Madej 2002-06-12