
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:

Esistono strumenti per elencare tutti i processi eseguiti sui sistemi Linux, compresi quelli che sono terminati. Ad esempio c'è forkstat. Riceve notifiche dal kernel su eventi relativi ai processi come fork ed exec.
Questi strumenti richiedono privilegi di root, ma questo non dovrebbe darti un falso senso di sicurezza.
Niente ti impedisce di spiare i processi in esecuzione su un sistema Linux.
Molte informazioni sono visibili in procfs finché un processo è in esecuzione.
L'unico problema è che devi catturare i processi di breve durata nell'intervallo di tempo molto breve in cui sono vivi.
Scansionare la directory /proc per nuovi PID in un ciclo infinito funziona, ma consuma molta CPU.
Un modo più furtivo è usare il seguente trucco.
I processi tendono ad accedere a file come librerie in /usr, file temporanei in /tmp, file di log in /var, ...
Usando l'API inotify, puoi ricevere notifiche ogni volta che questi file vengono creati, modificati, eliminati, consultati, ecc.
Linux non richiede utenti privilegiati per questa API poiché è necessaria per molte applicazioni innocue (come editor di testo che mostrano un esploratore file aggiornato).
Pertanto, mentre gli utenti non root non possono monitorare i processi direttamente, possono monitorare gli effetti dei processi sul file system.
Possiamo usare gli eventi del file system come trigger per eseguire la scansione di /proc, sperando di riuscire a farlo abbastanza velocemente da catturare i processi.
Questo è ciò che fa pspy.
Non c'è garanzia che non ne perderai uno, ma le probabilità sembrano buone nei miei esperimenti.
In generale, più a lungo i processi sono in esecuzione, maggiore è la possibilità di catturarli.
Logo: "Di Creative Tail [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], tramite Wikimedia Commons" (link)