
Monitorear procesos de Linux sin permisos de root
pspy es una herramienta de línea de comandos diseñada para espiar procesos sin necesidad de permisos de root. Te permite ver los comandos ejecutados por otros usuarios, trabajos cron, etc. mientras se ejecutan. Excelente para enumerar sistemas Linux en CTFs. También excelente para demostrar a tus colegas por qué pasar secretos como argumentos en la línea de comandos es una mala idea.
La herramienta recopila la información de los escaneos de procfs. Los observadores Inotify colocados en partes seleccionadas del sistema de archivos activan estos escaneos para capturar procesos de corta duración.
Obtén la herramienta en la máquina Linux que deseas inspeccionar. Primero consigue los binarios. Descarga los binarios publicados aquí:
pspy32 downloadpspy64 downloadpspy32s downloadpspy64s downloadLos archivos compilados estáticamente deberían funcionar en cualquier sistema Linux pero son bastante grandes (~4MB). Si el tamaño es un problema, prueba las versiones más pequeñas que dependen de libc y están comprimidas con UPX (~1MB).
Puedes usar Go instalado en tu sistema o ejecutar el proceso de compilación basado en Docker que se utilizó para crear la publicación.
Para esto último, asegúrate de que Docker esté instalado y luego ejecuta make build-build-image para construir una imagen Docker, seguido de make build para compilar los binarios con ella.
Puedes ejecutar pspy --help para conocer las banderas y su significado.
El resumen es el siguiente:
La configuración predeterminada debería ser adecuada para la mayoría de las aplicaciones.
Observar archivos dentro de /usr es lo más importante ya que muchas herramientas accederán a las bibliotecas que contiene.
Algunos ejemplos más complejos:
# 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
Para ver la herramienta en acción, simplemente clona el repositorio y ejecuta make example (se necesita Docker).
Se sabe que pasar contraseñas como argumentos de línea de comandos no es seguro, y el ejemplo se puede usar para demostrarlo.
El comando inicia un contenedor Debian en el que un trabajo cron secreto, ejecutado por root, cambia una contraseña de usuario cada minuto.
pspy se ejecuta en primer plano, como usuario myuser, y escanea procesos.
Deberías ver una salida similar a esta:
~/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
Primero, pspy imprime todos los procesos que se están ejecutando actualmente, cada uno con PID, UID y la línea de comandos.
Cuando pspy detecta un nuevo proceso, añade una línea a este registro.
En este ejemplo, encuentras un proceso con PID 23 que parece cambiar la contraseña de myuser.
Este es el resultado de un script de Python utilizado en el crontab privado de root /var/spool/cron/crontabs/root, que ejecuta este comando de shell (consulta crontab y script).
Nota que myuser no puede ver ni el crontab ni el script de Python.
Con pspy, puede ver los comandos de todos modos.
A continuación se muestra un ejemplo de la máquina Shrek de Hack The Box. En este desafío de CTF, la tarea es explotar un trabajo cron oculto que está cambiando la propiedad de todos los archivos en una carpeta. La vulnerabilidad es el uso inseguro de un comodín junto con chmod (detalles para el lector interesado). Requiere bastante trabajo de adivinación para encontrarlo y explotarlo. Con pspy, sin embargo, el trabajo cron es fácil de encontrar y analizar:
