
Überwache Linux-Prozesse ohne Root-Berechtigungen
pspy ist ein Kommandozeilenwerkzeug, das entwickelt wurde, um Prozesse auszuspionieren, ohne Root-Berechtigungen zu benötigen. Es ermöglicht Ihnen, Befehle anderer Benutzer, Cron-Jobs usw. während der Ausführung zu sehen. Hervorragend geeignet zur Enumeration von Linux-Systemen in CTFs. Auch nützlich, um Kollegen zu demonstrieren, warum das Übergeben von Geheimnissen als Argumente in der Kommandozeile eine schlechte Idee ist.
Das Tool sammelt die Informationen aus Procfs-Scans. Inotify-Überwacher, die auf ausgewählten Teilen des Dateisystems platziert sind, lösen diese Scans aus, um kurzlebige Prozesse zu erfassen.
Holen Sie sich das Tool auf die Linux-Maschine, die Sie überprüfen möchten. Besorgen Sie sich zuerst die Binärdateien. Laden Sie die veröffentlichten Binärdateien hier herunter:
pspy32 downloadpspy64 downloadpspy32s downloadpspy64s downloadDie statisch kompilierten Dateien sollten auf jedem Linux-System funktionieren, sind aber recht groß (~4 MB). Wenn die Größe ein Problem ist, probieren Sie die kleineren Versionen, die von libc abhängen und mit UPX komprimiert sind (~1 MB).
Verwenden Sie entweder Go, das auf Ihrem System installiert ist, oder führen Sie den Docker-basierten Build-Prozess aus, der zur Erstellung der Veröffentlichung verwendet wurde.
Stellen Sie für Letzteres sicher, dass Docker installiert ist, und führen Sie dann make build-build-image aus, um ein Docker-Image zu erstellen, gefolgt von make build, um die Binärdateien damit zu erstellen.
Sie können pspy --help ausführen, um mehr über die Flags und ihre Bedeutung zu erfahren.
Die Zusammenfassung ist wie folgt:
Die Standardeinstellungen sollten für die meisten Anwendungen ausreichen.
Das Überwachen von Dateien in /usr ist am wichtigsten, da viele Tools auf Bibliotheken darin zugreifen.
Einige komplexere Beispiele:
# print both commands and file system events and scan procfs every 1000 ms (=1sec)
./pspy64 -pf -i 1000
# place watchers recursively in two directories and non-recursively into a third
./pspy64 -r /path/to/first/recursive/dir -r /path/to/second/recursive/dir -d /path/to/the/non-recursive/dir
# disable printing discovered commands but enable file system events
./pspy64 -p=false -f
Um das Tool in Aktion zu sehen, klonen Sie einfach das Repository und führen Sie make example aus (Docker erforderlich).
Es ist bekannt, dass das Übergeben von Passwörtern als Befehlszeilenargumente nicht sicher ist, und das Beispiel kann verwendet werden, um dies zu demonstrieren.
Der Befehl startet einen Debian-Container, in dem ein geheimer Cron-Job, der von root ausgeführt wird, jede Minute ein Benutzerpasswort ändert.
pspy wird im Vordergrund ausgeführt, als Benutzer myuser, und scannt nach Prozessen.
Sie sollten eine Ausgabe ähnlich dieser sehen:
~/pspy (master) $ make example
[...]
docker run -it --rm local/pspy-example:latest
[+] cron started
[+] Running as user uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),27(sudo)
[+] Starting pspy now...
Watching recursively : [/usr /tmp /etc /home /var /opt] (6)
Watching non-recursively: [] (0)
Printing: processes=true file-system events=false
2018/02/18 21:00:03 Inotify watcher limit: 524288 (/proc/sys/fs/inotify/max_user_watches)
2018/02/18 21:00:03 Inotify watchers set up: Watching 1030 directories - watching now
2018/02/18 21:00:03 CMD: UID=0 PID=9 | cron -f
2018/02/18 21:00:03 CMD: UID=0 PID=7 | sudo cron -f
2018/02/18 21:00:03 CMD: UID=1000 PID=14 | pspy
2018/02/18 21:00:03 CMD: UID=1000 PID=1 | /bin/bash /entrypoint.sh
2018/02/18 21:01:01 CMD: UID=0 PID=20 | CRON -f
2018/02/18 21:01:01 CMD: UID=0 PID=21 | CRON -f
2018/02/18 21:01:01 CMD: UID=0 PID=22 | python3 /root/scripts/password_reset.py
2018/02/18 21:01:01 CMD: UID=0 PID=25 |
2018/02/18 21:01:01 CMD: UID=??? PID=24 | ???
2018/02/18 21:01:01 CMD: UID=0 PID=23 | /bin/sh -c /bin/echo -e "KI5PZQ2ZPWQXJKEL\nKI5PZQ2ZPWQXJKEL" | passwd myuser
2018/02/18 21:01:01 CMD: UID=0 PID=26 | /usr/sbin/sendmail -i -FCronDaemon -B8BITMIME -oem root
2018/02/18 21:01:01 CMD: UID=101 PID=27 |
2018/02/18 21:01:01 CMD: UID=8 PID=28 | /usr/sbin/exim4 -Mc 1enW4z-00000Q-Mk
Zuerst gibt pspy alle derzeit ausgeführten Prozesse aus, jeweils mit PID, UID und der Befehlszeile.
Wenn pspy einen neuen Prozess erkennt, fügt es eine Zeile zu diesem Log hinzu.
In diesem Beispiel finden Sie einen Prozess mit PID 23, der scheinbar das Passwort von myuser ändert.
Dies ist das Ergebnis eines Python-Skripts, das im privaten Crontab von root /var/spool/cron/crontabs/root verwendet wird und diesen Shell-Befehl ausführt (siehe crontab und script).
Beachten Sie, dass myuser weder das Crontab noch das Python-Skript sehen kann.
Mit pspy kann es die Befehle dennoch sehen.
Unten ist ein Beispiel von der Maschine Shrek von Hack The Box. In dieser CTF-Herausforderung besteht die Aufgabe darin, einen versteckten Cron-Job auszunutzen, der den Besitzer aller Dateien in einem Ordner ändert. Die Schwachstelle ist die unsichere Verwendung eines Wildcards zusammen mit chmod (Details für den interessierten Leser). Es erfordert erhebliches Ratespiel, um es zu finden und auszunutzen. Mit pspy hingegen ist der Cron-Job leicht zu finden und zu analysieren: