NFsec Logo

Chowamy dowolny proces w systemie za pomocą polecenia mount

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

Kategorie K a t e g o r i e : Pen Test

Tagi T a g i : , , , , , ,

Komentowanie tego wpisu jest zablokowane.