:: FreeBSD i (anty) OS fingerprinting


Jak powszechnie wiadomo, każdy system operacyjny ma specyficzne cechy, dzięki którym możemy go odróznić od innych. Po przeczytaniu tego artykułu będziesz wiedział/a jak w prosty sposób unimożliwić (lub znacznie ograniczyć) rozpoznanie Twojego systemu operacyjnego. Najczęściej używanymi programami do identyfikowania systemu operacyjnego są to nmap, Xprobe2, p0f.


Jak to działa? - czyli klika słów na temat poszczególnych programów.

Nmap
Jest to chyba najbardziej znanym programem do skanowania sieci. Rozpoznaje on system operacyjny analizując odpowiedzi na źle zbudowane pakiety TCP. Przeprowadza on 9 testów:

  • pakiet z flagami SYN i ECE
  • pakiet NULL (wyzerowane flagi)
  • pakiet TCP z flagami SYN, FIN, URG, PSH na jakiś otwarty port TCP
  • pakiet TCP z flaga ACK na jakiś otwarty port
  • pakiet TCP z flaga SYN na jakiś zamkniety port
  • pakiet TCP z flaga ACK do zamkniętego portu
  • pakiet TCP z flagami FIN, PSH, URG na zamknięty port TCP
  • pakiet UDP na zamknięty port UDP
  • 6 kolejnych pakietów TCP z flaga SYN na jeden otwarty port
Xprobe2
Główna różnica w porównaniu do Nmap'a polega na tym, że pakiety wysyłane przez Xprobe2 maja prawidłową budowę. Do rozpoznawania systemu operacyjnego używa on komunikatów ICMP wysyłając sześć różnych testów:

  • ping - echo request [ICMP]
  • żądanie znacznika czasowego - timestamp [ICMP]
  • żądanie maski adresu - address mask request [ICMP]
  • żądanie informacji - information request [ICMP]
  • pakiet UDP do zamkniętego portu
  • pakiet TCP do otwartego portu

p0f
Program ten różni się tym od pozostałych, że nie rozpoznaje systemu w sposób aktywny. Oznacza to mniej więcej tyle, że przechwytuje pakiety przychodzące i wyszukuje w nich cech charakterystycznych poszczególnych systemów operacyjnych. Co sprawdza p0f:

  • rozmiar okna TCP
  • wartość TTL
  • obecność flagi DF
  • wartość i kolejność opcji TCP
  • różne "anomalie" - złe flagi, złe opcje, niezerowe wartości ACK


Do dzieła !- czyli jak się ukrywać.

Duuuża większość filtrów pakietów nie rozpoznaje flagi ECE (jeśli np. iptables dostanie pakiet z ustawionymi SYN oraz ECE nie widzi flagi ECE i pakiet jest "puszczony".. a pf odrzuci go) wystarczy sprawdzać flagi na porty otwarte i puszczać tylko pakiety z flagą SYN.

-- pf.conf --

# przykładowo port 80
pass in quick proto tcp from any to xxx.xxx.xxx.xxx port 80 flags S/FSRPAUE keep state

-- end pf.conf --

Po takiej operacji Nmap powinien się wyłożyć ;) ale są jeszcze Xprobe2, p0f je też wpuścimy w maliny. Następnie możemy zmienić wielkość okna TCP (RFC 1323 dla zainteresowanych) na 65535 (domyślnie chyba jest 16384).

# sysctl -w net.inet.tcp.recvspace=65535

Po takiej operacji trzeba zrestartować wszystkie usługi. Następną zmianą jaka powinna przynieść widoczne razultaty jest zmiana wartości pola TTL ze standardowego 64 na 128.

# sysctl -w net.inet.ip.ttl=128

Następną zmianą jaką wprowadzimy w naszym systemie jest wyłączenie opcji TCP odpowiedzialną za skalowanie okna i znacznika czasowego (RFC 1323).

# sysctl net.inet.tcp.rfc1323=0

Dzięki zmianom, które zostały wprowadzone w systemie Twój system powinien być rozpoznawany jako zupełnie inny od jakiegoś FreeBSD 3.x do Win XP. Oczywiście powyższe zmiany to nie wszystko co możemy zmienic w naszym systemie aby był rozpoznawany jako zupełnie inny. Następną zmianą jaką wprowadzimy w naszym systemie jest włączenie odpowiedzi na pakiety ICMP z żądaniem maski adresów:

# sysctl -w net.inet.icmp.maskrepl=1

Do reguł naszego filtra pakietów (pf oczywiście ;) ) powinniśmy dodać jeszcze:

-- pf.conf --

# ICMP
pass in quick proto icmp from any to xxx.xxx.xxx.xxx icmp-type maskreg
pass out quick proto icmp from xxx.xxx.xxx.xxx to any icmp-type maskrep

-- end pf.conf --

Możemy oczywiście dodać jeszcze więcej opcji do naszej ścianki (tu już bez opisu konkretnych opcji/flag ;) ).

-- pf.conf --

# kilka regułek na nmap'a (takich dodatkowo ;) ) $ext_if to interfejs zewnętrzny
block in log quick on $ext_if inet proto tcp from any to any flags FUP/WEUAPRSF
block in log quick on $ext_if inet proto tcp from any to any flags WEUAPRSF/WEUAPRSF
block in log quick on $ext_if inet proto tcp from any to any flags SRAFU/WEUAPRSF
block in log quick on $ext_if inet proto tcp from any to any flags /WEUAPRSF
block in log quick on $ext_if inet proto tcp from any to any flags SR/SR
block in log quick on $ext_if inet proto tcp from any to any flags SF/SF

-- end pf.conf --

Źródła:
http://www.insecure.org/nmap/nmap-fingerprinting-article-pl.html
http://www.insecure.org/nmap/index.html 
http://www.sys-security.com/index.php?page=xprobe
http://lcamtuf.coredump.cx/p0f.shtml

Autor:
Kacper 'qTi' Różycki
qTi(at)bsd4u.org