
Ü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:

Es gibt Werkzeuge, um alle auf Linux-Systemen ausgeführten Prozesse aufzulisten, einschließlich derer, die beendet wurden. Zum Beispiel gibt es forkstat. Es erhält Benachrichtigungen vom Kernel über prozessbezogene Ereignisse wie fork und exec.
Diese Werkzeuge erfordern Root-Rechte, aber das sollte Ihnen kein falsches Sicherheitsgefühl geben.
Nichts hindert Sie daran, die auf einem Linux-System laufenden Prozesse auszuspionieren.
Eine Menge Informationen sind in procfs sichtbar, solange ein Prozess läuft.
Das einzige Problem ist, dass Sie kurzlebige Prozesse in dem sehr kurzen Zeitfenster, in dem sie leben, erwischen müssen.
Das Scannen des /proc-Verzeichnisses nach neuen PIDs in einer Endlosschleife erledigt den Trick, verbraucht aber viel CPU.
Eine heimlichere Methode ist die Verwendung des folgenden Tricks.
Prozesse neigen dazu, auf Dateien wie Bibliotheken in /usr, temporäre Dateien in /tmp, Logdateien in /var, ... zuzugreifen.
Mit der inotify-API können Sie Benachrichtigungen erhalten, wann immer diese Dateien erstellt, geändert, gelöscht, darauf zugegriffen usw. werden.
Linux erfordert keine privilegierten Benutzer für diese API, da sie für viele harmlose Anwendungen benötigt wird (z. B. Texteditoren, die einen aktuellen Dateiexplorer anzeigen).
Daher können Nicht-Root-Benutzer zwar Prozesse nicht direkt überwachen, aber sie können die Auswirkungen von Prozessen auf das Dateisystem überwachen.
Wir können die Dateisystemereignisse als Auslöser verwenden, um /proc zu scannen, in der Hoffnung, dass wir es schnell genug tun können, um die Prozesse zu erwischen.
Das ist es, was pspy tut.
Es gibt keine Garantie, dass Sie keinen verpassen, aber die Chancen scheinen in meinen Experimenten gut zu sein.
Im Allgemeinen gilt: Je länger die Prozesse laufen, desto größer ist die Chance, sie zu erwischen.
Logo: "By Creative Tail [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], via Wikimedia Commons" (link)