Pspy

DominicBreuker DominicBreuker
Dépôt créer le : 08/02/2018
Forks: 564 Watcher: 0 5891
Choisir une liste...
FR
logo.svg

pspy - processus Linux non privilégié snooping

Go Report Card Maintainability Test Coverage CircleCI

pspy est un outil en ligne de commande conçu pour snoop sur les processus sans avoir besoin de permissions racine. Il vous permet de voir des commandes exécutées par d'autres utilisateurs, des tâches de cron, etc. Idéal pour le dénombrement des systèmes Linux dans les CTF. C'est aussi un plaisir de démontrer à vos collègues pourquoi la transmission de secrets comme arguments sur la ligne de commande est une mauvaise idée.

L'outil rassemble l'information à partir de procfs scans. Inotifier les moniteurs placés sur certaines parties du système de fichiers déclenchent ces scans pour attraper des processus de courte durée.

Début

Télécharger

Obtenez l'outil sur la machine Linux que vous voulez inspecter. D'abord les binaires. Téléchargez les binaires publiés ici:

Les fichiers compilés statiquement devraient fonctionner sur n'importe quel système Linux mais sont assez énormes (~4MB). Si la taille est un problème, essayez les versions plus petites qui dépendent de libc et sont compressées avec UPX (~1MB).

Construire

Soit utiliser Allez installer sur votre système ou exécutez le processus de construction basé sur Docker qui a fonctionné pour créer la version. Pour ce dernier, assurez-vous que Docker est installé, puis exécutezmake build-build-imagepour construire une image Docker, suivie demake buildpour construire les binaires avec.

Tu peux courirpspy --helppour connaître les drapeaux et leur signification. Le résumé est le suivant :

  • -p: permet d'imprimer des commandes stdout (activées par défaut)
  • -f: permet d'imprimer des événements système de fichiers à stdout (désactivé par défaut)
  • -r: liste des répertoires à regarder avec Inotify. pspy regardera récursivement tous les sous-répertoires (par défaut, montres /usr, /tmp, /etc, /home, /var et /opt).
  • -d: liste des répertoires à regarder avec Inotify. pspy ne regardera que ces répertoires, pas les sous-répertoires (vide par défaut).
  • -i: intervalle en millisecondes entre les procfs scans. pspy scanne régulièrement pour de nouveaux processus indépendamment des événements Inotifier, juste au cas où certains événements ne sont pas reçus.
  • -c: imprimer des commandes de différentes couleurs. Les événements du système de fichiers ne sont plus colorés, les commandes ont différentes couleurs basées sur le processus UID.
  • --debug: imprime des messages d'erreur verbeux qui sont autrement cachés.

Les paramètres par défaut devraient être corrects pour la plupart des applications. Regarder les fichiers à l'intérieur/usrest le plus important car de nombreux outils y accéderont.

Quelques exemples plus complexes:

# 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

Exemples

Cron travail regarder

Pour voir l'outil en action, il suffit de cloner la repo et de lancermake example(Docker a besoin). Il est connu pour passer des mots de passe car les arguments en ligne de commande ne sont pas sûrs, et l'exemple peut être utilisé pour le démontrer. La commande démarre un conteneur Debian dans lequel un travail de cron secret, exécuté par root, change un mot de passe utilisateur à chaque minute. pspy fonctionne au premier plan, en tant qu'utilisateur myuser, et scanne les processus. Vous devriez voir la sortie similaire à ceci :

~/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

Tout d'abord, pspy imprime tous les processus en cours d'exécution, chacun avec PID, UID et la ligne de commande. Lorsque pspy détecte un nouveau processus, il ajoute une ligne à ce journal. Dans cet exemple, vous trouvez un processus avec PID 23 qui semble changer le mot de passe de monutilisateur. Ceci est le résultat d'un script Python utilisé dans le crontab privé racine/var/spool/cron/crontabs/root, qui exécute cette commande shell (vérifiercrontabetscript). Notez que myuser ne peut voir ni le crontab ni le script Python. Avec pspy, il peut néanmoins voir les commandes.

CTF exemple de Hack The Box

Voici un exemple de la machine Shrek deHack The Box. Dans ce défi du FCT, la tâche est d'exploiter un travail cron caché qui change la propriété de tous les fichiers dans un dossier. La vulnérabilité est l'utilisation non sûre d'un wildcard avec chmod (detailspour le lecteur intéressé). Il faut beaucoup de conjectures pour le trouver et l'exploiter. Avec pspy cependant, le travail de cron est facile à trouver et à analyser:

animated demo gif

Comment ça marche

Des outils existent pour lister tous les processus exécutés sur les systèmes Linux, y compris ceux qui ont fini. Par exempleforkstat. Il reçoit des notifications du noyau sur des événements liés au processus tels que la fourche et l'exec.

Ces outils nécessitent des privilèges racine, mais cela ne devrait pas vous donner un faux sentiment de sécurité. Rien ne vous empêche de fouiner sur les processus fonctionnant sur un système Linux. Beaucoup d'informations sont visibles dans les procfs tant qu'un processus est en cours. Le seul problème est que vous devez attraper des processus de courte durée dans la très courte période dans laquelle ils sont vivants. Analyse de la/procrépertoire pour les nouveaux PID dans une boucle infinie fait le tour mais consomme beaucoup de CPU.

Une façon plus furtive est d'utiliser le tour suivant. Le processus tend à accéder à des fichiers tels que les bibliothèques dans/usr, fichiers temporaires dans/tmp, log des fichiers dans/var, ... UtilisationinotifyAPI, vous pouvez obtenir des notifications chaque fois que ces fichiers sont créés, modifiés, supprimés, accessibles, etc. Linux n'a pas besoin d'utilisateurs privilégiés pour cette API car elle est nécessaire pour de nombreuses applications innocentes (comme les éditeurs de texte vous montrant un explorateur de fichiers à jour). Ainsi, bien que les utilisateurs non root ne puissent pas surveiller les processus directement, ils peuvent surveiller les effets des processus sur le système de fichiers.

Nous pouvons utiliser les événements du système de fichiers comme un déclencheur pour scanner/proc, espérant que nous pouvons le faire assez rapidement pour attraper les processus. C'est ce que fait Pspy. Il n'y a aucune garantie que vous ne manquerez pas un, mais les chances semblent être bonnes dans mes expériences. En général, plus les processus sont longs, plus les chances de les attraper sont grandes.

Divers

Logo : "Par Creative Tail [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], via Wikimedia Commons" (link)

Contributeurs GitHub

DominicBreuker
DominicBreuker
137 contributions
kazkansouh
kazkansouh
6 contributions
socketz
socketz
1 contributions