pspy – nieuprzywilejowany podgląd procesów Linuksa
Napisał: Patryk Krawaczyński
28/05/2019 w Bezpieczeństwo, Pen Test Brak komentarzy. (artykuł nr 695, ilość słów: 760)
N
arzędzie to pozwala na podglądanie procesów bez konieczności posiadania uprawnień administratora. Pozwala zobaczyć polecenia uruchamiane przez innych użytkowników, zadania cron w trakcie ich wykonywania itp. Świetnie nadaje się do badania systemów podczas testów penetracyjnych oraz CTFach. Jak to możliwe, że widzimy polecenia innych użytkowników? Dopóki proces trwa wiele informacji jest widocznych w procfs. Jedynym problemem jest to, że trzeba czasem złapać te krótko żyjące procesy w bardzo krótkim czasie. Skanowanie katalogu /proc w poszukiwaniu nowych PIDów w nieskończonej pętli może zdać egzamin, ale tym samym będzie zużywać bardzo dużo zasobów procesora.
Bardziej dyskretnym sposobem jest użycie API inotify, dzięki któremu możemy otrzymywać powiadomienia za każdym razem, gdy wybrane pliki są tworzone, modyfikowane, usuwane i uzyskiwany jest do nich dostęp itd. Linux do wykorzystania tego interfejsu nie wymaga uprzywilejowanych uprawnień. Wiele niewinnych aplikacji takich jak edytory tekstu jawnie korzysta z tego rozwiązania. Oczywiście użytkownicy inni niż administrator (root) nie mogą bezpośrednio monitorować procesów, ale mogą monitorować efekty procesów w tym systemie plików. Dlatego możemy użyć zdarzeń systemu plików jako wyzwalacza do skanowania /proc, mając nadzieję, że możemy zrobić to wystarczająco szybko, aby przechwycić wszystkie procesy. Tak właśnie działa pspy. Nie daje nam to żadnej gwarancji, że nie przegapimy żadnego zdarzenia, ale ogólnie rzecz biorąc im dłużej lub częściej przebiegają procesy, tym większa szansa na ich złapanie. Sprawdźmy. W pierwszej konsoli zalogujemy się jako zwykły użytkownik, a w drugiej jako administrator serwera i wydamy polecenia: w, uptime oraz mysql z parametrami połączenia do bazy:
agresor@darkstar:~$ ./pspy64 Config: Printing events (colored=true): processes=true | file-system-events=false Scannning for processes every 100ms and on inotify events Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive) Draining file system events due to startup... 2019/05/27 23:03:50 CMD: UID=0 PID=1278 | /sbin/agetty --noclear tty1 linux 2019/05/27 23:03:50 CMD: UID=0 PID=1276 | /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220 2019/05/27 23:03:50 CMD: UID=0 PID=1270 | /lib/systemd/systemd-logind 2019/05/27 23:03:50 CMD: UID=0 PID=1269 | /usr/lib/accountsservice/accounts-daemon 2019/05/27 23:03:50 CMD: UID=116 PID=1252 | qmgr -l -t unix -u 2019/05/27 23:03:50 CMD: UID=0 PID=1248 | /usr/lib/postfix/sbin/master 2019/05/27 23:03:50 CMD: UID=0 PID=1078 | /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid 2019/05/27 23:03:50 CMD: UID=115 PID=1067 | /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 115:119 2019/05/27 23:03:50 CMD: UID=0 PID=1 | /lib/systemd/systemd --system --deserialize 27 2019/05/27 23:03:56 CMD: UID=1485 PID=8288 | sudo su - 2019/05/27 23:03:56 CMD: UID=0 PID=8289 | su - 2019/05/27 23:03:56 CMD: UID=0 PID=8302 | /bin/sh /usr/bin/lesspipe 2019/05/27 23:03:56 CMD: UID=0 PID=8308 | mesg n 2019/05/27 23:04:01 CMD: UID=0 PID=8310 | /usr/sbin/CRON -f 2019/05/27 23:04:01 CMD: UID=0 PID=8312 | /sbin/modprobe -q -- net-pf-10 2019/05/27 23:04:09 CMD: UID=0 PID=8314 | w 2019/05/27 23:04:16 CMD: UID=0 PID=8315 | uptime 2019/05/27 23:04:57 CMD: UID=0 PID=8318 | mysql -u admin -h localhost -ptajnehaslo 2019/05/27 23:05:01 CMD: UID=0 PID=8322 | /bin/sh -c command -v debian-sa1 > /dev/null && debian-sa1 1 1
Konsola administratora:
agresor@darkstar:~$ sudo su - root@darkstar:~# w 23:04:09 up 137 days, 8:19, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT agresor pts/0 175.19.1.45 23:01 22.00s 2.44s 2.38s ./pspy64 agresor pts/1 175.19.1.45 23:02 0.00s 0.12s 0.02s sshd: agresor [priv] root@darkstar:~# uptime 23:04:16 up 137 days, 8:19, 2 users, load average: 0.00, 0.00, 0.00 root@darkstar:~# mysql -u admin -h localhost -ptajnehaslo
Oprócz szpiegowania administratora – widzimy jakie niebezpieczne może być przekazywanie poufnych informacji jako argumenty w linii poleceń – czy to w żywych poleceniach, czy skryptach uruchamianych z poziomu cron’a. Podobny efekt tylko bardziej surowy możemy osiągnąć wydając polecenie:
inotifywait -m -r -e open --format '%w%f' /proc
Jeśli chcemy zabezpieczyć się przed tego typu dostępem do katalogu /proc musimy wykorzystać funkcję ukrywania procesów przed innymi użytkownikami – hidepid. Po zamontowaniu wirtualnego systemu plików procfs z tą opcją użytkownik będzie miał tylko i wyłącznie dostęp do listy swoich procesów:
mount -o remount,rw,hidepid=2 /proc
Więcej informacji: pspy – unprivileged linux process snooping