
Monitorare i processi Linux senza permessi di root
pspy è uno strumento da riga di comando progettato per intercettare i processi senza necessità di permessi di root. Permette di vedere i comandi eseguiti da altri utenti, cron job, ecc. mentre vengono eseguiti. Ottimo per l'enumerazione dei sistemi Linux nei CTF. Ottimo anche per dimostrare ai tuoi colleghi perché passare segreti come argomenti nella riga di comando è una cattiva idea.
Lo strumento raccoglie le informazioni dalle scansioni di procfs. I watcher di Inotify posizionati su parti selezionate del file system attivano queste scansioni per catturare i processi di breve durata.
Ottieni lo strumento sulla macchina Linux che vuoi ispezionare. Prima scarica i binari. Scarica i binari rilasciati qui:
pspy32 downloadpspy64 downloadpspy32s downloadpspy64s downloadI file compilati staticamente dovrebbero funzionare su qualsiasi sistema Linux ma sono piuttosto grandi (~4 MB). Se le dimensioni sono un problema, prova le versioni più piccole che dipendono da libc e sono compresse con UPX (~1 MB).
Usa Go installato sul tuo sistema o esegui il processo di compilazione basato su Docker che è stato eseguito per creare il rilascio.
Per quest'ultimo, assicurati che Docker sia installato, quindi esegui make build-build-image per creare un'immagine Docker, seguito da make build per compilare i binari con essa.
Puoi eseguire pspy --help per conoscere i flag e il loro significato.
Il riepilogo è il seguente:
Le impostazioni predefinite dovrebbero andare bene per la maggior parte delle applicazioni.
Monitorare i file all'interno di /usr è molto importante poiché molti strumenti accederanno alle librerie al suo interno.
Alcuni esempi più complessi:
# stampa sia i comandi che gli eventi del file system ed esegue la scansione di procfs ogni 1000 ms (=1 sec)
./pspy64 -pf -i 1000
# posiziona watcher ricorsivamente in due directory e non ricorsivamente in una terza
./pspy64 -r /path/to/first/recursive/dir -r /path/to/second/recursive/dir -d /path/to/the/non-recursive/dir
# disabilita la stampa dei comandi scoperti ma abilita gli eventi del file system
./pspy64 -p=false -f
Per vedere lo strumento in azione, basta clonare il repo ed eseguire make example (Docker necessario).
È noto che passare password come argomenti della riga di comando non è sicuro, e l'esempio può essere usato per dimostrarlo.
Il comando avvia un container Debian in cui un cron job segreto, eseguito da root, cambia la password di un utente ogni minuto.
pspy eseguito in primo piano, come utente myuser, e scansiona i processi.
Dovresti vedere un output simile a questo:
~/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
Innanzitutto, pspy stampa tutti i processi attualmente in esecuzione, ognuno con PID, UID e la riga di comando.
Quando pspy rileva un nuovo processo, aggiunge una riga a questo log.
In questo esempio, trovi un processo con PID 23 che sembra cambiare la password di myuser.
Questo è il risultato di uno script Python utilizzato nel crontab privato di root /var/spool/cron/crontabs/root, che esegue questo comando shell (controlla crontab e script).
Nota che myuser non può vedere né il crontab né lo script Python.
Con pspy, può comunque vedere i comandi.
Di seguito è riportato un esempio dalla macchina Shrek di Hack The Box. In questa sfida CTF, il compito è sfruttare un cron job nascosto che cambia la proprietà di tutti i file in una cartella. La vulnerabilità è l'uso insicuro di un wildcard insieme a chmod (dettagli per il lettore interessato). Richiede un notevole lavoro di ipotesi per trovarla e sfruttarla. Con pspy, tuttavia, il cron job è facile da trovare e analizzare:
