
Tracciamento della cronologia degli eventi USB su GNU/Linux
usbrip (erede da "USB Ripper", non "USB R.I.P.") è un semplice strumento forense con interfaccia a riga di comando che consente di tenere traccia degli artefatti dei dispositivi USB (cioè la cronologia degli eventi USB) su macchine Linux.
Indice dei contenuti:
usbrip è un piccolo programma che analizza i dati dei log Linux: output di journalctl o contenuti dei file /var/log/syslog* (o /var/log/messages*). Basandosi sui dati raccolti, usbrip può costruire tabelle della cronologia degli eventi USB con le seguenti colonne:
Inoltre, può anche:
-s* Creare archivi protetti (archivi 7-Zip) per eseguire automaticamente il backup e accumulare eventi USB con l'aiuto dello scheduler cron.Modo 1. Installare con pip:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
Modo 2. Installare la versione bleeding-edge con install.sh (consigliato, funzionalità extra disponibili):
~$ 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 (*SOLO DEMO!*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip supporta due tipi di timestamp per l'analisi all'interno dei file di log di sistema:
"%b %d %H:%M:%S", es. "Jan 1 00:00:00"). Questo tipo di timestamp non fornisce l'informazione sull'anno."%Y-%m-%dT%H:%M:%S.%f%z", es. "1970-01-01T00:00:00.000000-00:00").Se hai journalctl installato, non c'è nulla di cui preoccuparsi in quanto può convertire i timestamp al volo. Altrimenti, la struttura syslog desiderata può essere ottenuta impostando il formato RSYSLOG_FileFormat nella configurazione di rsyslog.
/etc/rsyslog.conf:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf personalizzato per 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
In primo luogo, usbrip controllerà se c'è la possibilità di dump degli eventi di sistema usando journalctl come opzione più portabile. In caso contrario, cercherà e analizzerà i file di log di sistema /var/log/syslog* o /var/log/messages*.
storage)Per semplicità, supponiamo che tutti i comandi in cui appare il prefisso ~/usbrip$ vengano eseguiti nella directory ~/usbrip creata come risultato di un git clone:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shOltre all'installazione con pip, usbrip può anche essere installato con lo script personalizzato installers/install.sh.
Quando si utilizza install.sh, alcune funzionalità extra diventano disponibili:
storage – impostare un job cron per eseguire il backup degli eventi USB su base programmata (un esempio di job cron si trova in usbrip/cron/usbrip.cron).⚠️ Attenzione: se utilizzi la pianificazione cron, devi configurare il crontab con sudo crontab -e per forzare l'esecuzione del sottomodulo storage update come root. Le password degli archivi sono conservate in /var/opt/usbrip/usbrip.ini e accessibili solo da root per impostazione predefinita.
Per installare usbrip con install.sh usa:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l è abilitata, le dipendenze Python vengono risolte da pacchetti .tar locali (directory 3rdPartyTools) invece che da PyPI.-s è abilitata, non solo viene installato il progetto usbrip ma vengono anche creati l'elenco dei dispositivi USB fidati, gli archivi della cronologia e delle violazioni.Al termine dell'installazione, puoi eliminare la directory ~/usbrip.
Quando installato con install.sh, usbrip utilizza i seguenti percorsi:
/opt/usbrip/ – directory principale del progetto./var/opt/usbrip/log/ – log cron di usbrip./var/opt/usbrip/storage/ – archivi degli eventi USB (history.7z e violations.7z, creati durante il processo di installazione)./var/opt/usbrip/trusted/ – elenchi di dispositivi USB fidati (auth.json, creati durante il processo di installazione)./var/opt/usbrip/usbrip.ini – file di configurazione di usbrip (contiene le password per gli archivi 7-Zip)./usr/local/bin/usbrip – collegamento simbolico allo script /opt/usbrip/venv/bin/usbrip.I job cron possono essere impostati come segue:
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shLo script installers/uninstall.sh rimuove usbrip e tutti gli artefatti dell'installazione dal sistema.
Per disinstallare usbrip usa:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a è abilitata, non solo viene eliminata la directory del progetto usbrip ma vengono anche cancellati tutti gli archivi e i log di usbrip.Non dimenticare di rimuovere il job cron se ne hai impostato uno.
# ---------- BANNER ----------
~$ usbrip banner
Ottieni il banner di usbrip.
# ---------- EVENTI ----------
~$ usbrip events history [-t | -l] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [-c <COLONNA> [<COLONNA> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Ottieni la cronologia degli eventi USB.
~$ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [-c <COLONNA> [<COLONNA> ...]] [-q] [--debug]
Apri un dump di eventi USB.
~$ sudo usbrip events genauth <OUT_AUTH.JSON> [-a <ATTRIBUTO> [<ATTRIBUTO> ...]] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Genera un elenco di dispositivi USB fidati (autorizzati).
~$ sudo usbrip events violations <IN_AUTH.JSON> [-a <ATTRIBUTO> [<ATTRIBUTO> ...]] [-t | -l] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [-c <COLONNA> [<COLONNA> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Ottieni eventi di violazione USB basati sull'elenco dei dispositivi fidati.
# ---------- ARCHIVIO ----------
~$ sudo usbrip storage list <TIPO_ARCHIVIO> [-q] [--debug]
Elenca il contenuto dell'archivio selezionato. TIPO_ARCHIVIO è "history" o "violations".
~$ sudo usbrip storage open <TIPO_ARCHIVIO> [-t | -l] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [-c <COLONNA> [<COLONNA> ...]] [-q] [--debug]
Apri l'archivio selezionato. Si comporta in modo simile al sottomodulo EVENTS OPEN.
~$ sudo usbrip storage update <TIPO_ARCHIVIO> [IN_AUTH.JSON] [-a <ATTRIBUTO> [<ATTRIBUTO> ...]] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [--lvl <LIVELLO_COMPRESSIONE>] [-q] [--debug]
Aggiorna l'archivio – aggiungi eventi USB all'archivio esistente. LIVELLO_COMPRESSIONE è un numero in [0..9].
~$ sudo usbrip storage create <TIPO_ARCHIVIO> [IN_AUTH.JSON] [-a <ATTRIBUTO> [<ATTRIBUTO> ...]] [-e] [-n <NUMERO_EVENTI>] [-d <DATA> [<DATA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFATTURA> [<MANUFATTURA> ...]] [--serial <SERIALE> [<SERIALE> ...]] [--port <PORTA> [<PORTA> ...]] [--lvl <LIVELLO_COMPRESSIONE>] [-q] [--debug]
Crea un archivio – crea un archivio 7-Zip e aggiungi eventi USB in base alle opzioni selezionate.
~$ sudo usbrip storage passwd <TIPO_ARCHIVIO> [--lvl <LIVELLO_COMPRESSIONE>] [-q] [--debug]
Cambia la password dell'archivio esistente.
# ---------- ID ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
Ottieni dettagli aggiuntivi su un dispositivo USB specifico dal suo <VID> e/o <PID> dal database degli ID USB.
~$ usbrip ids download [-q] [--debug]
Aggiorna (scarica) il database degli ID USB.
Per ottenere un elenco dei nomi dei moduli usa:
~$ usbrip -h
Per ottenere un elenco dei nomi dei sottomoduli per un modulo specifico usa:
~$ usbrip <MODULO> -h
Per ottenere un elenco di tutte le opzioni per un sottomodulo specifico usa:
~$ usbrip <MODULO> <SOTTOMODULO> -h
Mostra la cronologia degli eventi di tutti i dispositivi USB, sopprimendo l'output del banner, i messaggi informativi e l'interazione con l'utente (-q, --quiet), rappresentata come elenco (-l, --list) con le ultime 100 voci (-n NUMERO, --number NUMERO):
~$ usbrip events history -ql -n 100
Mostra la cronologia degli eventi dei dispositivi USB esterni (-e, --external, che sono stati effettivamente disconnessi) rappresentata come tabella (-t, --table) contenente le colonne Connesso, VID, PID, Disconnesso e Numero di serie (-c COLONNA [COLONNA ...], --column COLONNA [COLONNA ...]) filtrata per data (, ) e PID () con log presi da file esterni (, ):
-d DATA [DATA ...]--date DATA [DATA ...]--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
👽 Nota: c'è una cosa da ricordare quando si lavora con i filtri. Ci sono 4 tipi di filtraggio disponibili: solo eventi USB esterni (dispositivi che possono essere estratti facilmente, -e), per data (-d), per campi (--host, --vid, --pid, --product, --manufact, --serial, --port) e per numero di voci che si ottengono come output (-n). Applicando filtri diversi contemporaneamente, si otterrà il seguente comportamento: prima vengono applicati i filtri esterno e per data, poi usbrip cercherà i valori dei campi specificati nell'intersezione degli ultimi due filtri, e infine troncherà l'output al numero definito con l'opzione -n. Quindi consideralo come una intersezione per il filtraggio esterno e per data e una unione per il filtraggio per campi. Spero abbia senso.
Costruisci la cronologia degli eventi di tutti i dispositivi USB e reindirizza l'output a un file per ulteriori analisi. Quando il flusso di output NON è un terminale stdout (| o > per esempio) non ci saranno caratteri di escape ANSI (colore) nell'output, quindi sentiti libero di usarlo in questo modo. Inoltre, nota che usbrip utilizza alcuni simboli UNICODE, quindi sarebbe opportuno convertire il file risultante in codifica UTF-8 (con enconv per esempio) e cambiare i caratteri di newline in stile Windows per portabilità (con awk per esempio):
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 Nota: puoi sempre eliminare da solo i caratteri di escape anche se hai già ottenuto l'output su stdout. Per farlo, basta copiare i dati di output in usbrip.out e applicare un'altra istruzione awk:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
Genera un elenco di dispositivi USB fidati come file JSON (trusted/auth.json) con attributi VID e PID contenenti i primi tre dispositivi connessi il 30 novembre 1984:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ Attenzione: ci sono casi in cui chiavette USB diverse potrebbero avere numeri di serie identici. Ciò potrebbe accadere a causa di un errore di fabbricazione o semplicemente alcuni hacker hanno riscritto il chip di memoria dell'unità che si è rivelato non programmabile una tantum e così via... In ogni caso, "nessun sistema è sicuro". usbrip non gestisce ancora tali casi in modo intelligente, vale a dire tratterà una coppia di dispositivi con SN identici (se esiste) come lo stesso dispositivo per quanto riguarda l'elenco dei dispositivi fidati e il modulo genauth.
Cerca nella cronologia degli eventi dei dispositivi USB esterni le violazioni basate sull'elenco dei dispositivi USB fidati (trusted/auth.json) per attributo PID, limita gli eventi risultanti a quelli che hanno Bob-PC come hostname, EvilUSBManufacturer come produttore, 0123456789 come numero di serie e rappresenta l'output come tabella con le colonne Connesso, VID e PID:
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
Cerca dettagli su un dispositivo USB specifico in base al suo VID (--vid VID) e PID (--pid PID):
~$ usbrip ids search --vid 0781 --pid 5580
Scarica l'ultima versione del database usb.ids:
~$ usbrip ids download