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:
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 8080Znają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/fdPrzed 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-resolveAnalogicznie możemy gwałtownie znaleźć przemontowanie procesu w /proc:
root@darkstar:~# findmnt | grep "\[" │ └─/proc/1391 /dev/sda2[/tmp/.hidepid] ext4 rw,relatimeWięcej informacji: Tim Brown gists