
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:

Existen herramientas para listar todos los procesos ejecutados en sistemas Linux, incluyendo aquellos que han finalizado. Por ejemplo, está forkstat. Recibe notificaciones del kernel sobre eventos relacionados con procesos como fork y exec.
Estas herramientas requieren privilegios de root, pero eso no debería darte una falsa sensación de seguridad.
Nada te impide espiar los procesos que se ejecutan en un sistema Linux.
Una gran cantidad de información es visible en procfs mientras un proceso esté en ejecución.
El único problema es que tienes que capturar procesos de corta duración en el período de tiempo muy corto en el que están vivos.
Escanear el directorio /proc en busca de nuevos PID en un bucle infinito hace el truco pero consume mucha CPU.
Una forma más sigilosa es usar el siguiente truco.
Los procesos tienden a acceder a archivos como bibliotecas en /usr, archivos temporales en /tmp, archivos de registro en /var, ...
Usando la API inotify, puedes recibir notificaciones cada vez que estos archivos sean creados, modificados, eliminados, accedidos, etc.
Linux no requiere usuarios privilegiados para esta API ya que es necesaria para muchas aplicaciones inocentes (como editores de texto que te muestran un explorador de archivos actualizado).
Por lo tanto, aunque los usuarios no root no pueden monitorear procesos directamente, pueden monitorear los efectos de los procesos en el sistema de archivos.
Podemos usar los eventos del sistema de archivos como un disparador para escanear /proc, con la esperanza de que podamos hacerlo lo suficientemente rápido para capturar los procesos.
Esto es lo que hace pspy.
No hay garantía de que no se pierda uno, pero las probabilidades parecen ser buenas en mis experimentos.
En general, cuanto más tiempo se ejecuten los procesos, mayor es la probabilidad de capturarlos.
Logo: "Por Creative Tail [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], vía Wikimedia Commons" (enlace)