Snort

Snort


Wprowadzenie

Snort jest otwartoźródłowym systemem wykrywania intruzów wdzierających się z sieci (ang. network intrusion detection system, IDS), może też służyć jako system zabezpieczania przed intruzami wdzierającymi się z sieci (ang. network intrusion prevention system, IPS). Oprogramowanie to jest rozwijane przez firmę komercyjną (obecnie, 2021 rok, Cisco). Jednak ważnym elementem zaufania do tego systemu jest jego otwartoźródłowość - każdy ma możliwość sprawdzenia, że zastosowanie Snorta nie spowoduje wprowadzenia intruza bocznymi drzwiami przez zastosowanie tego narzędzia. Dodatkowo duża popularność narzędzia sprawia, że w tym przypadku otwartoźródłowość sprzyja zmniejszaniu zagrożenia.

Snort może działać w wielu rodzajach strumieni danych:

  • na ruchu kierowanym do maszyny,
  • na ruchu, który dociera do maszyny,
  • na ruchu tranzytowym pomiędzy interfejsami i
  • na ruchu tranzytowym poprzez segment sieci.

Na takim ruchu może on też wykonywać różnego rodzaju funkcje:

  • może działać jako system wykrywania intruzów (IDS), gdy tylko wysyła alarmy,
  • może działać jako system zabezpieczania przed intruzami (IPS), gdy oprócz wysyłania alarmów, również niedopuszcza do przekazywania ruchu o określonej, niebezpiecznej charakterystyce.

Na tych zajęciach pokażemy najprostszy scenariusz, gdy Snort pracuje na ruchu, który dociera do maszyny i działa jako system wykrywania intruzów (IDS).

Uwaga: dobrze jest mieć do tych zajęć przygotowane dwie maszyny wirtualne.

Instalacja i początkowa konfiguracja

Na dobry początek warto zainstalować Snorta na maszynie wirtualnej:

# apt-get install snort snort-doc

Podczas instalacji otrzymamy zapytanie o sieć, na której będziemy wykonywać badania. W związku z tym, że będziemy tego obrazu używali w różnych sieciach, pole to należy wyczyścić i odpowiednio ustawić zmienną HOME_NET w pliku /etc/snort/snort.conf.

W tym celu po zakończeniu instalacji otwieramy wspomniany plik i zauważamy, że edytowanie wspomnianej zmiennej nie jest właściwe i należy otworzyć plik /etc/snort/snort.debian.conf, gdzie należy zmiennej DEBIAN_SNORT_HOME_NET nadać wartość opisującą adres sieci, przed atakami z której chcemy się bronić. Możemy ją wyczytać np. za pomocą polecenia ifconfig. Widząc tam zapis

  inet 10.2.7.46  netmask 255.255.240.0  broadcast 10.2.15.255

wpisujemy do zmiennej wartość 10.2.0.0/20, bo wskazuje on, że właśnie 20 bitów zajmuje część adresu określająca adres sieci.

Pierwsze uruchomienie

Możemy zacząć od tego, żeby sprawdzić, czy plik konfiguracyjny Snorta jest prawidłowy (na pewno jest prawidłowy po zainstalowaniu, ale warto zobaczyć, jak w takiej sytuacji wygląda działanie programu):

  # snort -T -i enp0s3 -c /etc/snort/snort.conf 2>&1 | less

Opcna -T oznacza właśnie testowe wykonanie, -i pozwala wskazać, jakiego interfejsu oglądanie nas interesuje, zaś opcja -c pozwala wskazać plik konfiguracyjny. Po uruchomieniu tego polecenia ukaże nam się bardzo długa ściana tekstu, która zawiera raport z poszczególnych etapów wczytywania reguł zakończony podsumowaniem (też długim) zaczynającym się od opisu:

  4057 Snort rules read
    3383 detection rules
    0 decoder rules
    0 preprocessor rules
  3383 Option Chains linked into 932 Chain Headers

który wskazuje, ile reguł zostało wczytane oraz ile z nich jest związane z wykrywaniem nieprawidłowości, ile z odkodowywaniem danych, a ile ze wstępnym przetwarzaniem. Wypisane informacje kończą się opisem wersji Snorta oraz oprogramowania, z którego on korzysta.

Alarmy Snorta

Cała siła programu Snort leży w regułach, które można pogrupować w zestawy. Po krótkim przyjrzeniu się plikowi /etc/snort/snort.conf łatwo stwierdzimy, że do pliku konfiguracyjnego dołączane są liczne pliki z katalogu /etc/snort/rules/, zawierającego właśnie różne zestawy reguł pogrupowane „tematycznie”. Można sobie rzucić okiem, jakie zestawy są dostępne, i jak wyglądają poszczególne wpisy.

Zwykle diagnozowanie działania sieci, również z użyciem Snorta, zaczynamy od ustawienia interfejsu sieciowego karty w tryb promiscuous. W trybie tym karta przekazuje do oprogramowania wszystkie pakiety, które do niej docierają - również te, które nie są do niej adresowane. Co prawda w dzisiejszych czasach ruch pakietów adresowanych do innych interfejsów niż interfejs na końcu kabla jest drastycznie ograniczony przez przełączniki, ale nie zawsze to działa (NB. warto zgłosić administratorom, gdy na interfejsie pojawiają się pakiety do niego nie adresowane). Przełączenie karty w tryb promiscuous uzyskujemy za pomoca polecenia:

  # ip link set enp0s3 promisc on

lub

  # ifconfig  enp0s3 -promisc

Możemy teraz uruchomić Snorta w celu określenia, czy nie dochodzi do naszej maszyny jakiś podejrzany ruch:

  # snort -d -l /var/log/snort/ -h 10.2.0.0/20 -A console -c /etc/snort/snort.conf

Tutaj opcja -d wskazuje, że Snort jest używany w trybie systemu wykrywania intruzów (ang. Network Intrusion Detection System, NIDS). W trybie tym widzimy tylko informacje pochodzące z ruchu o podejrzanych charakterystykach (np. pakiety o niepoprawnej strukturze). Opcja -l wskazuje, gdzie są umieszczane pliki z zebranymi przez Snorta informacjami. Dodanie -h 10.2.0.0/20 powoduje, że widzimy nieco mniej informacji na ekranie, a podejrzany ruch z odległych maszyn umieszczany jest w katalogach o nazwach zgodnych z nazwami tych maszyn, zaś -A console powoduje, że dostajemy raporty na ekranie terminala.

Możemy sobie chwilę poobserwować ruch, żeby się nieco oswoić z rodzajem uzyskiwanej informacji. Warto raz na jakiś czas nacisnąć na dłużej enter, żeby sobie oczyścić ekran z nadmiaru informacji.

Najbardziej typowym sposobem badania komputerów w sieci jest wyłanie do maszyny pinga. Wykonajmy z jakiejś innej maszyny niż ta, na której działa Snort, polecenie:

  # ping 10.2.7.46

Zapewne nic tutaj nie zobaczymy, bo reguły Snorta są tak napisane, aby nie robić alarmu w przypadku ruchu zasadniczo nieszkodliwego. Natomiast jeśli spróbujemy wysłać niestandardowe pakiety ping, to ujrzymy nietrywialny efekt działania Snorta. Po wysłaniu pakietu ping (technicznie jest to pakiet ICMP echo request) o rozmiarze 4096

  # ping -s 4096 10.2.7.46

dostaniemy następujące trzy sygnały od Snorta:

12/04-20:00:39.553493  [**] [1:480:5] ICMP PING speedera [**] [Classification: Misc activity] [Priority: 3] {ICMP} 10.2.1.95 -> 10.2.7.46
12/04-20:00:39.553493  [**] [1:499:4] ICMP Large ICMP Packet [**] [Classification: Potentially Bad Traffic] [Priority: 2] {ICMP} 10.2.1.95 -> 10.2.7.46
12/04-20:00:39.553669  [**] [1:499:4] ICMP Large ICMP Packet [**] [Classification: Potentially Bad Traffic] [Priority: 2] {ICMP} 10.2.7.46 -> 10.2.1.95

Jak to zwykle bywa, wpisy zaczynają się od znaczników czasowych. Ciąg [**] to specyficzny separator używany przez Snorta. Następny znacznik, na przykład [1:480:5], wskazuje, jakie moduły wewnętrzne Snorta zajmowały się przetwarzaniem prowadzącym do danego alarmu (pierwsza 1, zob. plik etc/generators w źródłach Snorta), jaka reguła została użyta (patrzymy na wartość sid w regule) oraz w jakiej wersji (patrzymy na wartość rev w regule).

Pochodzenie alarmu możemy w ogromnej większości przypadków (nie dotyczy to reguł preprocesora) stwierdzić, wykonując polecenie w stylu:

  # grep sid:499 /etc/snort/rules/*

Powyższa instrukcja szybko nam też wyjaśni pochodzenie następnego napisu - komentarza do alertu. Następnie po separatorze [**] widać określenie, do jakiej kategorii zdarzeń został dany alert przydzielony. Z każdą kategorią zdarzeń związany jest domyślny priorytet zwykle konfigurowany w pliku /etc/snort/classification.config. Można jednak te wartości nadpisywać w regułach.

Końcowy zapis {ICMP} 10.2.7.46 -> 10.2.1.95 jest zapisem przepisanym na początku reguły (wskazanie protokołu niższej warstwy oraz adresów pochodzenia i docelowego pakietu; czasami rozszerzone o numer portu).

Inny przykład raportu, jaki daje Snort, uzyskamy, wydając (na innej maszynie wirtualnej) polecenie:

  # nmap -A 10.2.7.46

Wtedy uzyskamy raport postaci:

12/04-19:50:41.178872  [**] [1:1418:11] SNMP request tcp [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.2.1.95:35957 -> 10.2.1.95:161
12/04-19:50:41.197157  [**] [1:1421:11] SNMP AgentX/tcp request [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.2.1.95:35957 -> 10.2.1.95:705
12/04-19:50:42.150598  [**] [1:1228:7] SCAN nmap XMAS [**] [Classification: Attempted Information Leak] [Priority: 2] {TCP} 10.2.1.95:47570 -> 10.2.1.95:1
12/04-19:50:42.150779  [**] [1:485:4] ICMP Destination Unreachable Communication Administratively Prohibited [**] [Classification: Misc activity] [Priority: 3] {ICMP} 10.2.1.95 -> 10.2.1.95

Wskazujący, że program nmap do określenia systemu operacyjnego na komputerze, który jest badany, używa protokołu SNMP, następnie wykonuje skanowanie portów, aby zakończyć proces wysłaniem niestandardowego pakietu ICMP.

Reguły Snorta

Spróbujmy teraz napisać własną regułę Snorta. Umieścimy ją w pliku /etc/snort/rules/local.rules i nadamy jej taką postać:

  alert tcp $EXTERNAL_NET any -> $HOME_NET 23 (msg: "Attempt to telnet from external net"; sid:10000002; rev:1;)

Pamiętajmy, że reguła musi być zapisana w jednym wierszu.

Teraz próba wykonania polecenia telnet z adresem naszej maszyny wirtualnej spowoduje wyświetlenie się odpowiedniego alarmu Snorta. Jednak taki alarm może być dla nas niezadowalający: brakuje klasyfikacji i priorytet jest bardzo wysoki. Dlatego poprawmy regułę tak:

  alert tcp $EXTERNAL_NET any -> $HOME_NET 23 (msg: "Attempt to telnet from external net"; sid:10000002; rev:2; classtype:attempted-user)

Tym razem próba telnetu da nam już wskazanie, że alarm należy do określonej klasy, a także wskaże sensowny jej priorytet. Warto zwrócić uwagę, że przy okazji zmiany zwiększyła się też wartość pola rev. Zwiększyliśmy je o jeden, żeby wskazać, iż zaszła zmiana i w obiegu mogą być alerty pochodzące z różnych wersji tej reguły, a zatem prawdopodobnie mające różne znaczenie.

Reguły Snorta pozwalają na badanie wielu charakterystyk pakietów, jakie trafiają do komputera. Proszę przyjrzeć się regułom z plików /etc/snort/rules/web-*, aby zorientować się, jakie rodzaje alarmów są tworzone dla aplikacji webowych. Warto też obejrzeć dokumentację ze strony https://www.snort.org.

Dalsze lektury

Snort bywa umieszczany jako część dedykowanego systemu operacyjnego służącego do wykrywania intruzów. Przykładem takiego rozwiązania jes system Security Onion.

Gdy Snort jest używany jako sonda IDS/IPS, która bada ruch w segmencie sieciowym, jest uruchamiany wraz z odpowiednimi rozwiązaniami sprzętowymi takimi jak urządzenia TAP lub na końcu połączenia przez port lustrzany.

Strona Snorta oferuje kilka rodzajów reguł (zob. https://www.snort.org/downloads/#rule-downloads):

  • reguły tworzone przez społeczność, do których dostęp jest bezpłatny i nieograniczony;
  • reguły tworzone przez ekspertów bezpieczeństwa z zespołu Talos; reguły te są bezpłatne, ale wymagają zarejestrowania na stronie Snorta;
  • reguły komercyjne, za które trzeba płacić, ale zapewniają szybsze reagowanie na potencjalne luki w bezpieczeństwie.

Są też dostępne inne subskrypcje komercyjne, oferuje takie na przykład firma Cisco.

Ćwiczenie

Proszę napisać regułę Snorta wykrywającą próbę połączenia się protokołem HTTP pod niestandardowy numer portu. Fragment pliku reguł zawierający taką regułę proszę wysłać do Moodle.