
Suivi de l'historique des événements USB sous GNU/Linux
usbrip (hérité de « USB Ripper », et non de « USB R.I.P. ») est un outil de forensique simple doté d'une interface en ligne de commande qui vous permet de suivre les artefacts de périphériques USB (c'est-à-dire l'historique des événements USB) sur des machines Linux.
Table des matières :
usbrip est un petit logiciel qui analyse les données de journaux Linux : la sortie de journalctl ou le contenu des fichiers /var/log/syslog* (ou /var/log/messages*). Sur la base des données collectées, usbrip peut construire des tableaux d'historique des événements USB avec les colonnes suivantes :
De plus, il peut également :
-s* Créer des stockages protégés (archives 7-Zip) pour sauvegarder automatiquement et accumuler les événements USB à l'aide du planificateur cron.Méthode 1. Installer avec pip :
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
Méthode 2. Installer la version de pointe avec install.sh (recommandé, fonctionnalités supplémentaires disponibles) :
~$ sudo apt install python3-venv p7zip-full -y
~$ git clone https://github.com/snovvcrash/usbrip && cd usbrip
~/usbrip$ sudo -H installers/install.sh
~/usbrip$ cd
~$ usbrip -h

Docker (*DÉMO UNIQUEMENT !*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip prend en charge deux types d'horodatages à analyser dans les fichiers journaux système :
"%b %d %H:%M:%S", ex. "Jan 1 00:00:00"). Ce type d'horodatage ne fournit pas l'information sur l'année."%Y-%m-%dT%H:%M:%S.%f%z", ex. "1970-01-01T00:00:00.000000-00:00").Si vous avez journalctl installé, il n'y a rien à craindre car il peut convertir les horodatages à la volée. Sinon, la structure syslog souhaitée peut être obtenue en définissant le format RSYSLOG_FileFormat dans la configuration de rsyslog.
/etc/rsyslog.conf :$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf personnalisé pour usbrip :~$ echo '$ActionFileDefaultTemplate RSYSLOG_FileFormat' | sudo tee /etc/rsyslog.d/usbrip.conf
~$ sudo rm -f /var/log/syslog* /var/log/messages*
~$ sudo systemctl restart rsyslog
Premièrement, usbrip vérifiera s'il est possible de vider les événements système en utilisant journalctl comme option la plus portable. Si ce n'est pas le cas, il recherchera et analysera les fichiers journaux système /var/log/syslog* ou /var/log/messages*.
storage)Pour simplifier, convenons que toutes les commandes où le préfixe ~/usbrip$ apparaît sont exécutées dans le répertoire ~/usbrip créé à la suite d'un git clone :
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shEn plus de l'installation avec pip, usbrip peut également être installé avec le script personnalisé installers/install.sh.
Lors de l'utilisation de install.sh, certaines fonctionnalités supplémentaires deviennent disponibles :
storage – définir une tâche cron pour sauvegarder les événements USB selon un planning (un exemple de tâche cron se trouve dans usbrip/cron/usbrip.cron).⚠️ Avertissement : si vous utilisez la planification cron, vous devez configurer le crontab avec sudo crontab -e afin de forcer l'exécution du sous-module storage update en tant que root. Les mots de passe de stockage sont conservés dans /var/opt/usbrip/usbrip.ini et sont accessibles uniquement par root par défaut.
Pour installer usbrip avec install.sh, utilisez :
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l est activé, les dépendances Python sont résolues à partir de paquets .tar locaux (répertoire 3rdPartyTools) au lieu de PyPI.-s est activé, non seulement le projet usbrip est installé, mais aussi la liste des périphériques USB de confiance, les stockages d'historique et de violations sont créés.Une fois l'installation terminée, vous pouvez supprimer le répertoire ~/usbrip.
Lorsqu'il est installé avec install.sh, usbrip utilise les chemins suivants :
/opt/usbrip/ – répertoire principal du projet./var/opt/usbrip/log/ – journaux cron d'usbrip./var/opt/usbrip/storage/ – stockages d'événements USB (history.7z et violations.7z, créés pendant le processus d'installation)./var/opt/usbrip/trusted/ – listes des périphériques USB de confiance (auth.json, créées pendant le processus d'installation)./var/opt/usbrip/usbrip.ini – fichier de configuration d'usbrip (contient les mots de passe pour les stockages 7-Zip)./usr/local/bin/usbrip – lien symbolique vers le script /opt/usbrip/venv/bin/usbrip.Les tâches cron peuvent être définies comme suit :
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shLe script installers/uninstall.sh supprime usbrip et tous les artefacts d'installation de votre système.
Pour désinstaller usbrip, utilisez :
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a est activé, non seulement le répertoire du projet usbrip est supprimé, mais aussi tous les stockages et les journaux d'usbrip sont supprimés.N'oubliez pas de supprimer la tâche cron si vous en aviez configuré une.
# ---------- BANNIÈRE ----------
~$ usbrip banner
Obtenir la bannière d'usbrip.
# ---------- ÉVÉNEMENTS ----------
~$ usbrip events history [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Obtenir l'historique des événements USB.
~$ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
Ouvrir un dump d'événements USB.
~$ sudo usbrip events genauth <OUT_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Générer une liste de périphériques USB de confiance (autorisés).
~$ sudo usbrip events violations <IN_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Obtenir les événements de violation USB basés sur la liste des périphériques de confiance.
# ---------- STOCKAGE ----------
~$ sudo usbrip storage list <STORAGE_TYPE> [-q] [--debug]
Lister le contenu du stockage sélectionné. STORAGE_TYPE est soit "history" soit "violations".
~$ sudo usbrip storage open <STORAGE_TYPE> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
Ouvrir le stockage sélectionné. Se comporte de manière similaire au sous-module EVENTS OPEN.
~$ sudo usbrip storage update <STORAGE_TYPE> [IN_AUTH.JSON] [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
Mettre à jour le stockage — ajouter des événements USB au stockage existant. COMPRESSION_LEVEL est un nombre entre 0 et 9.
~$ sudo usbrip storage create <STORAGE_TYPE> [IN_AUTH.JSON] [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
Créer un stockage — créer une archive 7-Zip et y ajouter des événements USB selon les options sélectionnées.
~$ sudo usbrip storage passwd <STORAGE_TYPE> [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
Changer le mot de passe du stockage existant.
# ---------- IDS ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
Obtenir des détails supplémentaires sur un périphérique USB spécifique par son <VID> et/ou <PID> à partir de la base de données USB ID.
~$ usbrip ids download [-q] [--debug]
Mettre à jour (télécharger) la base de données USB ID.
Pour obtenir la liste des noms de modules, utilisez :
~$ usbrip -h
Pour obtenir la liste des noms de sous-modules pour un module spécifique, utilisez :
~$ usbrip <MODULE> -h
Pour obtenir la liste de tous les commutateurs pour un sous-module spécifique, utilisez :
~$ usbrip <MODULE> <SUBMODULE> -h
Afficher l'historique des événements de tous les périphériques USB, en supprimant l'affichage de la bannière, les messages d'information et les interactions utilisateur (-q, --quiet), représenté sous forme de liste (-l, --list) avec les 100 dernières entrées (-n NUMBER, --number NUMBER) :
~$ usbrip events history -ql -n 100
Afficher l'historique des événements des périphériques USB externes (-e, --external, qui ont été effectivement déconnectés) représenté sous forme de tableau (-t, --table) contenant les colonnes Connecté, VID, PID, Déconnecté et Numéro de série (-c COLUMN [COLUMN ...], --column COLUMN [COLUMN ...]) filtré par date (, ) et PID () avec des journaux provenant de fichiers externes (, ) :
-d DATE [DATE ...]--date DATE [DATE ...]--pid <PID> [<PID> ...]-f FILE [FILE ...]--file FILE [FILE ...]~$ usbrip events history -et -c conn vid pid disconn serial -d '1995-09-15' '2018-07-01' --pid 1337 -f /var/log/syslog.1 /var/log/syslog.2.gz
👽 Remarque : il y a une chose à retenir lorsqu'on travaille avec des filtres. Il existe 4 types de filtrage disponibles : uniquement les événements USB externes (périphériques qui peuvent être facilement retirés, -e), par date (-d), par champs (--host, --vid, --pid, --product, --manufact, --serial, --port) et par nombre d'entrées que vous obtenez en sortie (-n). Lorsque vous appliquez différents filtres simultanément, vous obtiendrez le comportement suivant : d'abord, les filtres externe et par date sont appliqués, puis usbrip recherchera les valeurs de champs spécifiées dans l'intersection des deux derniers filtres, et enfin il réduira la sortie au nombre que vous avez défini avec l'option -n. Considérez cela comme une intersection pour les filtrages externe et par date et une union pour les filtrages par champs. J'espère que c'est logique.
Construire l'historique des événements de tous les périphériques USB et rediriger la sortie vers un fichier pour une analyse plus approfondie. Lorsque le flux de sortie n'est PAS le terminal stdout (| ou > par exemple), il n'y aura pas de caractères d'échappement ANSI (couleur) dans la sortie, donc n'hésitez pas à l'utiliser de cette façon. Notez également qu'usbrip utilise certains symboles UNICODE, il serait donc agréable de convertir le fichier résultant en encodage UTF-8 (avec encov par exemple) ainsi que de changer les caractères de nouvelle ligne en style Windows pour la portabilité (avec awk par exemple) :
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 Remarque : vous pouvez toujours vous débarrasser des caractères d'échappement par vous-même même si vous avez déjà obtenu la sortie vers stdout. Pour ce faire, copiez simplement les données de sortie dans usbrip.out et appliquez une instruction awk supplémentaire :
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
Générer une liste de périphériques USB de confiance sous forme de fichier JSON (trusted/auth.json) avec les attributs VID et PID contenant les trois premiers périphériques connectés le 30 novembre 1984 :
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ Avertissement : il existe des cas où différentes clés USB peuvent avoir des numéros de série identiques. Cela peut se produire à la suite d'une erreur de fabrication ou simplement parce que des pirates ont réussi à réécrire la puce mémoire du lecteur qui s'est avérée non programmable une seule fois, etc. Quoi qu'il en soit, « aucun système n'est sûr ». usbrip ne gère pas ces cas de manière intelligente pour l'instant, c'est-à-dire qu'il traitera une paire de périphériques avec des NS identiques (s'il en existe un) comme le même périphérique en ce qui concerne la liste des périphériques de confiance et le module genauth.
Rechercher dans l'historique des événements des périphériques USB externes les violations basées sur la liste des périphériques USB de confiance (trusted/auth.json) par attribut PID, limiter les événements résultants à ceux qui ont Bob-PC comme nom d'hôte, EvilUSBManufacturer comme fabricant, 0123456789 comme numéro de série et afficher la sortie sous forme de tableau avec les colonnes Connecté, VID et PID :
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
Rechercher des détails sur un périphérique USB spécifique par son VID (--vid VID) et son PID (--pid PID) :
~$ usbrip ids search --vid 0781 --pid 5580
Télécharger la dernière version de la base de données usb.ids :
~$ usbrip ids download