Chowamy dowolny proces w systemie dzięki polecenia mount

nfsec.pl 1 rok temu

P

oniżej zaprezentuje, jak dzięki 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 dzięki 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, iż 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 przez cały czas 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 gwałtownie znaleźć przemontowanie procesu w /proc:

root@darkstar:~# findmnt | grep "\[" │ └─/proc/1391 /dev/sda2[/tmp/.hidepid] ext4 rw,relatime

Więcej informacji: Tim Brown gists

Idź do oryginalnego materiału