Niepozorny ping

Artykuł pokazuje koncepcję i w żadnym wypadku nie wyczerpuje tematu ani samego pinga i jego customizacji czy budowania pakietu od zera, ani kwestii rozwiązań klasy Command and Control.

Przyznam się bez bicia, nie wiedziałem, że ping posiada pole przeznaczone na dane, które w banalny sposób można kontrolować. Gdy tylko ta informacja zagościła w moich zwojach, od razu zapaliła mi się lampka. Biorąc pod uwagę tezę, że dla przykładowego admina może być niezauważalny, pominięty (coś w rodzaju wyrobionej ślepoty na banery reklamowe), ping nadaje się do dyskretnej komunikacji! Do tego ping co do zasady działa wszędzie tak samo, więc mamy idealny kanał platform agnostic, który nie wzbudza szczególnych podejrzeń.

Szybki reaserch pokazał, co było do przewidzenia, że istnieją gotowe projekty świetnie realizujące techniki, takie jak Command and Control, tunel przez ICMP, a nawet SSH over ICMP

Czym jest ICMP?

Internet Control Message Protocol, czyli (ICMP) jest protokołem warstwy sieciowej wykorzystywanym diagnostycznie. Pozwala nam łatwo i szybko zweryfikować, czy adresy IP mogą ze sobą „rozmawiać”.

Czym jest ping?

Najpopularniejszym zastosowaniem bazującym na ICMP jest ping, szeroko dostępny, niezależnie od platformy. Ping pozwala sprawdzić, czy dany host jest osiągalny w sieci. Ping wysyła pakiet żądania (echo request) do hosta docelowego i oczekuje od niego odpowiedzi (echo reply).

Struktura ICMP

Pakiety ICMP są enkapsulowane za pomocą pakietu nagłówka IP. Według MTU, rozmiar pakietu ICMP nie może być większy niż 1500 bajtów.

IP headerICMP headerICMP payload size  MTU (1500)
20 bytes8 bytes1472 bytes  (max)20 + 8 + 1472 = 1500

Do ręcznego wygenerowania pakietu musimy obliczyć sumę kontrolną oraz zrozumieć całą strukturę pakietu, a nie to jest przedmiotem tego posta. Dlatego w tym celu wykorzystamy narzędzie nping, które jest częścią pakietu nmap (dostępny w systemie ping nie pozwala nam na dodanie danych, dlatego będziemy potrzebować nping). Poniższe polecenie pozwoli nam wskazać komputer, do którego poślemy ping z dedykowaną wiadomością tekstową

$ nping --icmp -c 1 --data-string 'wiadomosc' 192.168.0.10

Jak odebrać Payload?

Podczas pentestów posługuję się tcpdump (np. tcpdump -i eth0 -n icmp), co pozwala na sprawdzenie, czy np. mam jakąś możliwość wykonywania poleceń lub czy istnieje jakaś komunikacja – jednak to zastosowanie jest mało wygodne w tym przypadku. Wiele lepiej wypada przykładowy skrypt, który pozwala słuchać i odczytywać komunikaty ping, w szczególności zawartość pola „data”

import socket
def listen():
  s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
  s.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
  while 1:
	data, addr = s.recvfrom(1472)
	print("Packet from %r: %r" % addr,data)
listen()

W oknie terminala, w którym działa skrypt listenera powinna pokazać się linia, na końcu której będzie widoczny nasz tekst.

Sprawdź to w akcji

Poniżej znajduje się krótki film w rodzaju Proof Of Concept pokazujący krok po kroku koncepcje wykorzystania narzędzia ping do przemycania komunikacji między komputerami.

Repozytorium z kodem i krótkim opisem:

https://github.com/siguritech/NastyPing

CNC/C2 and SSH over ICMP

Ostatnie czasy przyniosły wiele bodźców, które mocno podnoszą świadomość cyberbezpieczeństwa oraz tego, jak działają hackerzy, w tym również, jak działają techniki pentesterów. Nawiązując do mojej tezy ze wstępu, dociekliwy researcher może włączyć do swojego arsenału narzędzie, które pozwoli mu pozostać niezauważonym. Poniżej link do projektu, za pomocą którego można tunelować SSH przez ICMP, dzięki czemu jesteśmy w stanie zakamuflować naszego reverse shella.

https://github.com/bdamele/icmpsh