Chowamy dowolny proces w systemie za pomocą polecenia mount
Napisał: Patryk Krawaczyński
17/12/2022 w Pen Test Brak komentarzy. (artykuł nr 840, ilość słów: 656)
P
oniżej zaprezentuje, jak za pomocą polecenia mount ukryć dowolny proces w systemie przed takim poleceniem jak np. ps. Dokonamy tego dzięki funkcji bind. Klasyczne montowanie tworzy widok urządzenia pamięci masowej jako drzewa katalogów. Funkcja bind zamiast tego pobiera istniejące drzewo katalogów i replikuje je w innym punkcie. Montując katalog w ten sposób możemy myśleć o montowaniu jak o aliasie do innej ścieżki. Katalogi i pliki w są takie same jak w oryginale. Każda modyfikacja po jednej stronie jest natychmiast odzwierciedlana po drugiej stronie, ponieważ oba widoki przedstawiają te same dane. Na przykład, kiedy powiążemy katalog /tmp/narf
z /tmp/nfsec
, oba będą odwoływać się do tych samych danych:
root@darkstar:~# mkdir /tmp/nfsec root@darkstar:~# touch /tmp/nfsec/hacks root@darkstar:~# touch /tmp/nfsec/cracks root@darkstar:~# mkdir /tmp/narf root@darkstar:~# mount -o bind /tmp/nfsec /tmp/narf root@darkstar:~# ls -l /tmp/nfsec total 0 -rw-r--r-- 1 root root 0 Dec 17 20:50 cracks -rw-r--r-- 1 root root 0 Dec 17 20:50 hacks root@darkstar:~# ls -l /tmp/narf total 0 -rw-r--r-- 1 root root 0 Dec 17 20:50 cracks -rw-r--r-- 1 root root 0 Dec 17 20:50 hacks root@darkstar:~#
Pierwszym krokiem będzie uruchomienie z prawami (nie)zwykłego użytkownika prostej wersji serwera HTTP za pomocą modułu języka Python:
agresor@darkstar:~$ python3 -m http.server 8080 & Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
Z poziomu administratora sprawdzamy widoczność uruchomionego procesu:
root@darkstar:~# ps auxw | grep http.server agresor 1391 0.0 0.4 27472 17440 pts/0 S 20:57 0:00 python3 -m http.server 8080
Znając teraz PID procesu (1391), który ma “zniknąć” możemy przygotować fałszywą strukturę katalogów, którą podwiążemy do oryginalnej ścieżki w pseudo systemie plików procfs:
root@darkstar:~# mkdir -p /tmp/.hidepid/fd
Przed podmianą sprawdzamy jak wygląda zawartość oryginalnej ścieżki z deskryptorami plików:
root@darkstar:~# ls -al /proc/1391/fd total 0 dr-x------ 2 agresor agresor 0 Dec 17 21:24 . dr-xr-xr-x 9 agresor agresor 0 Dec 17 21:06 .. lrwx------ 1 agresor agresor 64 Dec 17 21:24 0 -> /dev/pts/0 lrwx------ 1 agresor agresor 64 Dec 17 21:24 1 -> /dev/pts/0 lrwx------ 1 agresor agresor 64 Dec 17 21:24 2 -> /dev/pts/0 lrwx------ 1 agresor agresor 64 Dec 17 21:24 3 -> 'socket:[22199]'
Pozostaje nam przepiąć katalog fd z oryginalnej ścieżki na naszą “podstawioną”:
root@darkstar:~# cd /tmp root@darkstar:/tmp# mount -o bind .hidepid /proc/1391 root@darkstar:/tmp# ls -al /proc/1391/fd total 8 drwxr-xr-x 2 root root 4096 Dec 17 21:20 . drwxr-xr-x 3 root root 4096 Dec 17 21:20 ..
Ze względu na fakt, że jest ona teraz pusta możemy ją jeszcze bardziej “uprawdopodobnić” tworząc podobne dane z oryginału:
root@darkstar:/tmp# ln -s /dev/pts/0 /proc/1391/fd/0 root@darkstar:/tmp# ln -s /dev/pts/0 /proc/1391/fd/1 root@darkstar:/tmp# ln -s /dev/pts/0 /proc/1391/fd/2 root@darkstar:/tmp# ln -s socket:\[666\] /proc/1391/fd/3 root@darkstar:/tmp# ls -al /proc/1391/fd total 8 drwxr-xr-x 2 root root 4096 Dec 17 21:45 . drwxr-xr-x 3 root root 4096 Dec 17 21:20 .. lrwxrwxrwx 1 root root 10 Dec 17 21:43 0 -> /dev/pts/0 lrwxrwxrwx 1 root root 10 Dec 17 21:43 1 -> /dev/pts/0 lrwxrwxrwx 1 root root 10 Dec 17 21:44 2 -> /dev/pts/0 lrwxrwxrwx 1 root root 12 Dec 17 21:45 3 -> 'socket:[666]'
Sprawdźmy teraz, czy proces jest nadal widoczny w systemie:
root@darkstar:~# ps xuaw | grep http.server root@darkstar:~#
Jednak skoro wybraliśmy do ukrycia proces, który nasłuchuje na porcie sieciowym to będzie on widoczny w innych poleceniach – jednak bez podania źródła:
root@darkstar:~# netstat -tapn Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 654/systemd-resolve
Analogicznie możemy szybko znaleźć przemontowanie procesu w /proc
:
root@darkstar:~# findmnt | egrep "\/proc\/[0-9]+" | grep "\[" │ ├─/proc/1391 /dev/sda2[/tmp/.hidepid] ext4 rw,relatime root@darkstar:~# egrep "\/proc\/[0-9]+" /proc/mounts /dev/sda2 /proc/1391 ext4 rw,relatime 0 0
Więcej informacji: Tim Brown gists, Understanding Bind Mounts