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

Funkcjonariusz Mobilny został zaprojektowany do działania w trybie "headless", czyli bez monitora i klawiatury. Zamiast nich, aby możliwa była kontrola bieżących aktywności urządzenia, używane są wyświetlacze LED/LCD:

Model Instalacja Komentarze
Adafruit PiTFT 2.2/2.8 inch LCD instrukcja sterownik oparty na buforowaniu ramek
BakeBit NanoHat OLED instrukcja dla NanoPi NEO/NEO2, nie obsługuje Raspberry Pi
BlinkStick Strip instrukcja podłączany przez USB zamiast GPIO; nasz wybór
Pimoroni Blinkt! instrukcja nasz wybór
Pimoroni Scroll HAT Mini instrukcja
Uctronics 3.5 inch Touchscreen instrukcja sterownik oparty na buforowaniu ramek; raczej unikaj tego modelu
Waveshare 1.44inch LCD display HAT instrukcja
Waveshare True color RGB LED HAT instrukcja

To repozytorium zawiera najnowszą listę sterowników i ich dokumentacji.

Idea

Eksfiltracja danych jest czasochłonna, zwłaszcza jeśli jest prowadzona na relatywnie powolnym urządzeniu, zamiast na normalnym komputerze. Dlatego też kluczowa jest wiedza, co się aktualnie dzieje na Twoim urządzeniu:

  • czy podłączony dysk został prawidłowo rozpoznany?
  • czy udało się dopasować prawidłowy klucz odzyskiwania do podłączonego zaszyfrowanego dysku?
  • czy proces eksfiltracji nadal działa, czy już zakończył działanie?
  • inne ważne zdarzenia?

Najprostszą metodą kontroli tego typu zdarzeń będąc w terenie, potencjalnie wśród osób, które nie powinny wiedzieć, co właściwie robisz, jest użycie prostego wyświetlacza LED, który za pomocą kilku kolorowych diod pokaże w dyskretny sposób, co się akurat dzieje z urządzeniem:

Kanały

Funkcjonariusz Mobilny obsługuje wiele różnych modeli wyświetlaczy, o bardzo różnych możliwościach, a nawet różnych filozofiach działania. Interfejs do obsługi wyświetlaczy został przygotowany w taki sposób, aby umożliwić łatwą implementację obsługi kolejnych modeli, niezależnie od sposobu wyświetlania przez nie danych.

Dlatego też wymagania wobec każdego wyświetlacza są bardzo proste i zarazem bardzo ogólne: musi obsługiwać od 8 do 10 niezależnych kanałów, gdzie każdy kanał jest reprezentowany przez:

  • wielokolorową diodę LED
  • kolumnę jednokolorowych diod LED
  • wiersz tekstu na wyświetlaczu LCD (lub LED, eInk i dowolnym innym)
  • inny sposób sygnalizacji, który jest w stanie pokazać przynajmniej 6 różnych stanów (w tym stan domyślny - wyłączony)

Kanały są numerowane od 0 (do 7..8..9). W przypadku wymienionych wyżej wyświetlaczy, kanałem 0 jest pierwsza dioda LED albo pierwszy wiersz tekstu.

Każdy sterownik posiada moduł tłumaczący zdarzenia emitowane przez Funkcjonariusza Mobilnego na konkretne możliwości danego urządzenia - dla wyświetlacza Waveshare True color RGB LED HAT wygląda to następująco:

$events = array (
    "shutdown"                => array(-1, "off"),
    "ready"                   => array(0, "yellow"),
    "target_ready"            => array(0, "green"),
    "target_disconnected"     => array(0, "yellow"),
    "media_device_detected"   => array(7, "green"),
    "media_device_processed"  => array(7, "off"),
    "operation_started"       => array(-2, "green"),
    "operation_finished"      => array(-2, "off"),
);

Gdzie same nazwy kolorów poszczególnych diod LED są następnie tłumaczone na składowe kolorów:

$colors = array (
    "off"    => array(  0,   0,   0),
    "red"    => array(255,   0,   0),
    "green"  => array(  0, 255,   0),
    "blue"   => array(  0,   0, 255),
    "orange" => array(255,  30,   0),
    "yellow" => array(255,  70,   0),
    "purple" => array(255,   0, 255),
    "white"  => array(255, 255, 255),
);

Zdarzenia globalne, per-urządzenie i per-partycja

Na chwilę obecną zdefiniowanych jest 8 typów zdarzeń, z których połowa jest globalna (zawsze obsługiwana przez kanał 0), a druga połowa związana jest z eksfiltrowanymi urządzeniami i partycjami na nich - poszczególne partycje obsługiwane są przez poszczególne kanały, licząc od kanału 1. Dzięki temu prosty wyświetlacz z 8 diodami LED jest w stanie pokazywać stan realizacji 7 równoległych operacji eksfiltracji danych.

Zdarzenia globalne (kanał 0):

  • shutdown - wyłączenie całego wyświetlacza (np. wygaszenie wszystkich diod LED), przygotowanie do wyłączenia całego urządzenia
  • ready - urządzenie się prawidłowo uruchomiło, Funkcjonariusz Mobilny jest gotowy do pracy
  • target_ready - Twój dysk docelowy na dane został podłączony i prawidłowo rozpoznany
  • target_disconnected - Twój dysk został odłączony, urządzenie przeszło w tryb "fallback storage"

Zdarzenia per-urządzenie (ostatni dostępny kanał):

  • media_device_detected - wykryto podłączone urządzenie MTP/PTP (komórkę, tablet, aparat cyfrowy itp.), Funkcjonariusz Mobilny rozpoczął jego eksfiltrację (to i następne zdarzenie jest pokazywane zawsze przez ostatni kanał)
  • media_device_processed - eksfiltracja urządzenia MTP/PTP została zakończona, można je odłączyć

Zdarzenia per-partycja (kanały od 1 do 7..9):

  • operation_started - wykryto podłączony dysk twardy, pen drive lub inne urządzenie klasy USB Mass Storage, Funkcjonariusz Mobilny rozpoczął jego eksfiltrację (to i następne zdarzenie jest emitowane osobno dla każdej partycji: pierwsza partycja na kanale 1, druga na kanale 2 itd.)
  • operation_finished - eksfiltracja danej partycji została zakończona (nadal mogą trwać operacje na innych partycjach)

Dzięki takiemu podziałowi, podłączając duży dysk twardy, z wieloma partycjami (w tym ukrytymi/zarezerwowanymi partycjami Windows), zawsze prawidłowo widzisz, które partycje są jeszcze przetwarzane, a które zostały już zakończone.

Kwestie techniczne

Złącza i kompatybilność

W tej chwili obsługiwane są wyświetlacze używające 3 typów złącz:

GPIO dla Raspberry Pi:
  • jest to 40-pinowe złącze szpilkowe, które znajdziesz na krawędzi płytki
  • obejmuje ono 3 różne interfejsy sterujące urządzeniami zewnętrznymi: I2C, SPI i UART
  • złącze to jest kompatybilne z każdym modelem Raspberry Pi począwszy od B+, oraz z wieloma klonami innych firm
  • większość obsługiwanych wyświetlaczy korzysta właśnie z tego złącza
  • płytki Raspberry Pi sprzedawane są w dwóch wersjach: z wlutowanym konektorem szpilkowym lub bez niego - zwróć uwagę na wersję, którą kupujesz
GPIO dla NanoPi NEO/NEO2:
  • jest to również złącze szpilkowe, działające na niemalże identycznych zasadach jak to dla Raspberry Pi, z podobnymi interfejsami komunikacyjnymi - jednakże z uwagi na poziom miniaturyzacji platformy NanoPi, nie jest ono bezpośrednio kompatybilne (ani rozmiarem, ani wyprowadzeniami, ani szczegółowym działaniem interfejsów)
  • natomiast dla programistów języka Python, producent przygotował wersję biblioteki GPIO kompatybilną z Raspberry Pi na poziomie tego języka
  • obecnie z tego złącza korzysta tylko wyświetlacz BakeBit NanoHat OLED, zintegrowany z polecaną przez nas platformą NanoPi-NEO2
USB:
  • obecnie dostępny jest tylko sterownik dla wyświetlacza BlinkStick Strip, natomiast można go bardzo łatwo dostosować do innych modeli BlinkStick
  • zasadniczą przewagą wyświetlaczy USB jest możliwość ich podłączania i odłączania w trakcie działania Funkcjonariusza Mobilnego - można nawet równolegle podłączyć kilka sztuk, np. przełączając się z jednego na drugi (np. z wersji mobilnej na wersję zakamuflowaną w desce rozdzielczej samochodu)

Sterowniki natywne i oparte na buforowaniu ramek obrazu

Większość wyświetlaczy jest sterowana natywnie, tj. program sterujący bezpośrednio "każe" wyświetlaczowi np. zapalić konkretną diodę LED na konkretną składową kolorów, albo narysować jakąś figurę geometryczną (w tym literę/cyfrę) na wyświetlaczu LCD.

Natomiast niektóre wyświetlacze oparte są na koncepcji bufora ramki obrazu (ang. framebuffer) - innymi słowy, działają jako monitor, pokazujący obraz z wyjścia HDMI. Wyświetlacze takie - zwłaszcza modele obsługujące dodatkowo dotyk, albo chociaż mające dodatkowe przyciski - są świetnym rozwiązaniem dla tzw. kiosków interaktywnych (biletomatów, interfejsów do zamawiania jedzenia w lokalach typu McDonald itp.). Natomiast mają one jedną zasadniczą wadę: system musi działać w trybie graficznym, z automatycznym logowaniem domyślnego użytkownika po starcie systemu i automatycznym startem aplikacji do obsługi kiosku.

Funkcjonariusz Mobilny działa całkiem inaczej: cały system działa w trybie headless, a więc bez żadnego interfejsu graficznego, w maksymalnie okrojonej wersji, a obsługa podłączanych urządzeń odbywa się całkowicie w tle, za pośrednictwem mechanizmu systemd. Przez co wyświetlacze oparte na buforze ramki nie są w stanie normalnie działać.

Dlatego też są obsługiwane w całkiem inny sposób:

  • przy każdej zmianie wyświetlanego obrazu, najpierw odczytywany jest z dysku plik z buforem poprzedniej zawartości
  • zmiana nanoszona jest na ten bufor i ponownie zapisywana do pliku
  • następnie za każdym razem generowany jest nowy obrazek, odwzorowujący całą zawartość ekranu
  • następnie jest on kopiowany z pliku na urządzenie /dev/fb1

Takie podejście jak najbardziej działa, natomiast z oczywistych względów jest mało wydajne i spowalnia działanie Funkcjonariusza Mobilnego. Dlatego raczej odradzamy używanie tego typu wyświetlaczy (jeśli masz do wyboru model natywny).

Co jeśli dysk ma więcej niż 7..9 partycji?

Funkcjonariusz Mobilny obsługuje wyświetlacze mające od 8 do 10 kanałów, z czego kanał 0 jest zarezerwowany dla zdarzeń globalnych - a więc dla zdarzeń per-partycja pozostaje od 7 do 9 kanałów, w tym na ostatnim pokazywane są również zdarzenia związane z urządzeniami MTP i PTP (czyli telefonami, tabletami, aparatami cyfrowymi itp.).

Jeśli podłączony dysk twardy (pen drive itp.) ma więcej niż 7..9 partycji:

  • eksfiltracja wszystkich partycji będzie działać dokładnie tak samo, niezależnie od ich ilości
  • partycje o numerach od 8..10 wzwyż po prostu nie będą w żaden sposób obsługiwane przez wyświetlacz

Co jeśli podłączymy kilka dysków jednocześnie?

Funkcjonariusz Mobilny może eksfiltrować wiele urządzeń typu USB Mass Storage jednocześnie - jedynym ograniczeniem jest fizyczna wydajność urządzenia, do którego są one podłączane.

Natomiast interfejs do obsługi wyświetlaczy obsługuje tylko numery partycji, bez identyfikatorów dysków - więc jeśli podłączysz ich kilka jednocześnie, zdarzenia dotyczące partycji na różnych dyskach "pomieszają się" na wyświetlaczu, co może skutkować wprowadzaniem Cię w błąd co do stanu operacji - np. eksfiltracja partycji 2 na dysku 1 się już zakończyła, więc dioda na kanale 2 zgasła - ale eksfiltracja partycji 2 na dysku 2 nadal trwa i nie jest to w żaden sposób sygnalizowane.

Co jeśli podłączymy kilka urządzeń MTP/PTP jednocześnie?

Funkcjonariusz Mobilny obsługuje wiele jednocześnie podłączonych urządzeń MTP i PTP - przynajmniej teoretycznie, gdyż różne urządzenia w bardzo różny sposób implementują protokoły MTP i PTP, w konsekwencji niektóre urządzenia blokują cały protokół. Niemniej jednak, zawsze możliwe jest jednoczesne podłączenie przynajmniej po jednym urządzeniu obu tych typów.

Natomiast interfejs do obsługi wyświetlaczy obsługuje wszystkie takie urządzenia na jednym (ostatnim dostępnym) kanale - więc jeśli podłączysz ich kilka jednocześnie, zdarzenia dotyczące poszczególnych urządzeń "pomieszają się" na wyświetlaczu, co może skutkować wprowadzaniem Cię w błąd co do stanu operacji.

Podobnie w przypadku jednoczesnej eksfiltracji urządzeń MTP/PTP i dysku twardego mającego od 8..10 partycji wzwyż - zdarzenia "pomieszają się" na wyświetlaczu, natomiast same operacje będą prowadzone bez żadnych komplikacji.