Funkcjonariusz: platforma open source do szybkiej eksfiltracji danych z komputerów, serwerów, telefonów, tabletów, aparatów cyfrowych i innych urządzeń USB.

kontakt@funkcjonariusz.com

Główną funkcjonalnością Funkcjonariusza jest eksfiltracja danych. Natomiast posiada on też funkcjonalność modyfikacji eksfiltrowanych systemów plików - tj. tworzenia plików i katalogów, zapisu danych, zmian nazw, kasowania itp.

Funkcjonalność ta w oryginalnym projekcie Drive Badger (wersji Funkcjonariusza kierowanej na rynek międzynarodowy) nazywa się "filesystem injection", a rozszerzenia ją realizujące "injectorami". W repozytorium injectors-playground znajdziesz przykładowe injectory, na podstawie których możesz tworzyć własne rozwiązania.

Kwestie prawne

Ta funkcjonalność może być potencjalnie nadużywana, np. do podkładania dowodów. Dlatego też jej użycie w trakcie przeszukania w trybie art. 220 § 3 Kodeksu postępowania karnego (a tym bardziej w trybie art. 44 § 4 Kodeksu postępowania w sprawach o wykroczenia) jest niedozwolone.

W Polsce funkcjonalności tej można legalnie używać jedynie w celach naukowych i testowych, oraz można ją instalować i konfigurować w ramach prowadzenia przygotowań technicznych (np. jako outsourcing usług IT) do działań, które prowadzone będą w krajach, w których nie łamią one lokalnego prawa (np. Brazylia, Wietnam, Korea, Wenezuela itd.).

Injectory

Injectory to proste skrypty, instalowane (bardzo podobnie do hooków) w katalogu /opt/drivebadger/injectors. Są one uruchamiane:

  • po zakończeniu eksfiltracji danych z partycji lub udziału sieciowego, oraz
  • po przemontowaniu jej w trybie do zapisu (jeśli urządzenie i system plików pozwalają na zapis)

Injector jest katalogiem (lokalnym lub kopią roboczą repozytorium) zawierającym skrypt o nazwie injector.sh i opcjonalnie inne pliki (np. zdjęcia, które mają być kopiowane na modyfikowane systemy plików). Skrypt ten otrzymuje w parametrze $1 ścieżkę do zamontowanego systemu plików i może w ramach tego systemu robić właściwie cokolwiek. Należy jednak pamiętać o kilku ograniczeniach:

  • nie ma opcji "cofnij"
  • uprawnienia plików i katalogów nie działają
  • system plików jest zamontowany w trybie case-sensitive, również NTFS (więc np. C:\Windows to co innego niż C:\WINDOWS)
  • zaawansowane funkcjonalności systemu plików, specyficzne dla systemu operacyjnego (np. NTFS Alternate Data Streams) są wyłączone i niedostępne nawet do odczytu

Czy zapis zawsze jest możliwy?

Nie. Injectory działają na zasadzie "best effort" - czyli zapis może się udać, ale jeśli się nie uda, to nie będzie to błędem.

Injectory mogą się nie uruchomić, albo mogą nie być w stanie zmodyfikować systemu plików - np.:

  1. Sterownik FUSE do danego systemu plików nie obsługuje zapisu (np. sterownik do systemów plików Apple obsługuje wyłącznie odczyt).
  2. Nośnik pod spodem nie obsługuje zapisu, np.:
    • płyta CD/DVD
    • pen drive z fizyczną blokadą zapisu
    • udział NFS wyeksportowany w trybie tylko do odczytu
  3. Operacja mount w trybie rw zwraca błąd z dowolnej innej przyczyny - np. system plików NTFS, który nie został prawidłowo zamknięty, może być zamontowany pod Linuxem tylko do odczytu.
  4. Na eksfiltrowanym dysku było zbyt wiele danych i proces eksfiltracji został przerwany przez użytkownika, albo skończyło się miejsce na docelowym dysku. W takim wypadku injector w ogóle nie zostanie uruchomiony.

Kolejność procesów eksfiltracji i modyfikacji

Funkcjonariusz przetwarza wszystkie partycje w następującej kolejności działań:

  1. Zamontowanie partycji tylko do odczytu.
  2. Uruchomienie po kolei hooków. Hooki mogą uruchamiać kolejne procesy w tle (będą one działać równolegle do dalszych działań).
  3. Uruchomienie eksfiltracji danych (rsync).
  4. Odmontowanie partycji.
  5. Jeśli został dopasowany chociaż jeden injector:
    • przemontowanie partycji w tryb do zapisu
    • uruchomienie injectora (tylko pierwszego znalezionego, patrz niżej)
    • odmontowanie partycji

Wyjątek: w przypadku szyfrowania VeraCrypt, partycje są od samego początku montowane w trybie do zapisu, a po eksfiltracji, modyfikowane bez przemontowywania.

Kolejność wyboru injectora

Injectory są dopasowywane przez skrypt get-injector-script.sh. Zwraca on nazwę najlepiej pasującego injectora na podstawie kilku warunków:

  1. Bezpośrednie dopasowanie UUID konkretnej partycji. Jeśli nie uda się go dopasować, wówczas...
  2. Dopasowanie numeru seryjnego dysku oraz typu partycji (jeśli na dysku jest kilka partycji tego samego typu, injector taki zostanie uruchomiony dla wszystkich). Jeśli tego również nie uda się dopasować, wówczas...
  3. Dopasowanie po samym typie partycji (np. ext4, ntfs) - taki injector będzie uruchamiany dla wszystkich partycji danego typu, więc należy unikać stosowania takich injectorów do prawdziwych ataków (natomiast takie uproszczone dopasowanie bardzo ułatwia niektóre testy).

Zawsze uruchamiany jest tylko pierwszy, najlepiej dopasowany injector.

Co to oznacza w praktyce:

  1. Injectory dopasowywane po UUID są najlepszym wyborem (o ile znamy UUID atakowanej partycji) w przypadku rzeczywistych ataków - celują bowiem w jedną, konkretną partycję.

  2. Injectory dopasowywane po numerze seryjnym dysku twardego mogą być o tyle praktyczniejsze, że taki numer seryjny można dyskretnie odczytać bez działającego systemu - po prostu odczytując go z etykiety na wyłączonym dysku, albo wręcz z faktury czy dokumentów gwarancyjnych. Dodatkowym założeniem jest to, że nie znamy numeru ani UUID partycji - co najwyżej jej typ (wynikający z używanego systemu operacyjnego).

    Dlatego też injector taki będzie uruchamiany kilka razy, osobno dla każdej z partycji - musisz więc zaimplementować w nim dodatkowe testy, np. czy istnieje katalog, w którym chcesz dorzucić jakieś dodatkowe pliki. Tak aby finalnie modyfikować tylko jedną partycję.

  3. Injectory dopasowane tylko po typie partycji (lub metody szyfrowania) - powinny one być używane tylko w specjalnych okolicznościach i bardzo ostrożnie, gdyż mogą łatwo wyrządzić nienaprawialne szkody. Są one generalnie przeznaczone do testów, oraz do działania w warunkach, w którym nie znamy wcześniej UUID-ów partycji ani numerów seryjnych dysków - mamy jedynie pewną szczątkową wiedzę nt. użytkownika, np. jego imię i nazwisko - możemy wówczas próbować odgadnąć jego login i zaimplementować własne testy na możliwe ścieżki katalogu domowego, i dopiero po prawidłowym odgadnięciu takiej ścieżki robić cokolwiek więcej.

Injectory a szyfrowanie dysków

Injectory jak najbardziej obsługują zaszyfrowane dyski. Istnieje natomiast kilka drobnych ograniczeń:

  1. Partycji Bitlocker i VeraCrypt nie da się dopasować po UUID.
  2. Typy partycji bitlocker, veracrypt i luks nadpisują przy rozpoznawaniu faktyczny system plików:
    • partycje ext4 zaszyfrowane LUKS mogą być dopasowywane tylko typem luks, ext4 nie zadziała
    • podobnie dla NTFS: bitlocker lub veracrypt zamiast ntfs

Przykłady kodu

Repozytorium injectors-playground zawiera szereg prostych przykładów injectorów, które robią prosty test na istnienie określonego katalogu, po czym tworzą w nim mały plik tekstowy.

Ciekawym przykładem jest też injector dla partycji luks, który dodaje klucz publiczny ssh do pliku /root/.ssh/authorized_keys na wszystkich partycjach szyfrowanych LUKS, na których istnieje katalog /root.