
Seguimiento del historial de eventos USB en GNU/Linux
usbrip (heredado de "USB Ripper", no "USB R.I.P.") es una herramienta forense simple con interfaz de línea de comandos que le permite rastrear artefactos de dispositivos USB (es decir, historial de eventos USB) en máquinas Linux.
Índice:
usbrip es un pequeño software que analiza datos de registro de Linux: la salida de journalctl o el contenido de los archivos /var/log/syslog* (o /var/log/messages*). Basado en los datos recopilados, usbrip puede construir tablas de historial de eventos USB con las siguientes columnas:
Además, también puede:
-s* Crear almacenes protegidos (archivos 7-Zip) para realizar copias de seguridad automáticas y acumular eventos USB con la ayuda del programador cron.Método 1. Instalar con pip:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
Método 2. Instalar la versión más reciente con install.sh (recomendado, funciones adicionales 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 (*SOLO DEMOSTRACIÓN!*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip admite dos tipos de marcas de tiempo para analizar dentro de los archivos de registro del sistema:
"%b %d %H:%M:%S", ej. "Jan 1 00:00:00"). Este tipo de marca de tiempo no proporciona la información del año."%Y-%m-%dT%H:%M:%S.%f%z", ej. "1970-01-01T00:00:00.000000-00:00").Si tiene journalctl instalado, no hay nada de qué preocuparse, ya que puede convertir marcas de tiempo sobre la marcha. De lo contrario, la estructura de syslog deseada se puede lograr configurando el formato RSYSLOG_FileFormat en la configuración de rsyslog.
/etc/rsyslog.conf:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf personalizado para 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
Primero, usbrip comprobará si hay posibilidad de volcar eventos del sistema usando journalctl como la opción más portable. Si no es así, buscará y analizará los archivos de registro del sistema /var/log/syslog* o /var/log/messages*.
storage)Para simplificar, acordemos que todos los comandos donde aparece el prefijo ~/usbrip$ se ejecutan en el directorio ~/usbrip, que se crea como resultado de un git clone:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shAdemás de instalar con pip, usbrip también se puede instalar con el script personalizado installers/install.sh.
Al usar install.sh, algunas funciones adicionales están disponibles:
storage: configurar un trabajo cron para hacer copias de seguridad de eventos USB según un horario (un ejemplo de trabajo cron se puede encontrar en usbrip/cron/usbrip.cron).⚠️ Advertencia: si utiliza la programación cron, desea configurar el crontab con sudo crontab -e para forzar que el submódulo storage update se ejecute como root. Las contraseñas de almacenamiento se guardan en /var/opt/usbrip/usbrip.ini y solo son accesibles por root de forma predeterminada.
Para instalar usbrip con install.sh, use:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l está habilitada, las dependencias de Python se resuelven desde paquetes .tar locales (directorio 3rdPartyTools) en lugar de PyPI.-s está habilitada, no solo se instala el proyecto usbrip, sino que también se crean la lista de dispositivos USB de confianza, los almacenes de historial y de violaciones.Después de que la instalación se complete, puede eliminar el directorio ~/usbrip.
Cuando se instala con install.sh, usbrip utiliza las siguientes rutas:
/opt/usbrip/ – directorio principal del proyecto./var/opt/usbrip/log/ – registros de cron de usbrip./var/opt/usbrip/storage/ – almacenes de eventos USB (history.7z y violations.7z, creados durante el proceso de instalación)./var/opt/usbrip/trusted/ – listas de dispositivos USB de confianza (auth.json, creado durante el proceso de instalación)./var/opt/usbrip/usbrip.ini – archivo de configuración de usbrip (contiene contraseñas para los almacenes 7-Zip)./usr/local/bin/usbrip – enlace simbólico al script /opt/usbrip/venv/bin/usbrip.Los trabajos cron se pueden configurar de la siguiente manera:
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shEl script installers/uninstall.sh elimina usbrip y todos los artefactos de instalación de su sistema.
Para desinstalar usbrip, use:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a está habilitada, no solo se elimina el directorio del proyecto usbrip, sino también todos los almacenes y registros de usbrip.No olvide eliminar el trabajo cron si había configurado uno.
# ---------- BANNER ----------
~$ usbrip banner
Obtener banner de usbrip.
# ---------- EVENTOS ----------
~$ usbrip events history [-t | -l] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [-c <COLUMNA> [<COLUMNA> ...]] [-f <ARCHIVO> [<ARCHIVO> ...]] [-q] [--debug]
Obtener historial de eventos USB.
~$ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [-c <COLUMNA> [<COLUMNA> ...]] [-q] [--debug]
Abrir volcado de eventos USB.
~$ sudo usbrip events genauth <OUT_AUTH.JSON> [-a <ATRIBUTO> [<ATRIBUTO> ...]] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [-f <ARCHIVO> [<ARCHIVO> ...]] [-q] [--debug]
Generar una lista de dispositivos USB de confianza (autorizados).
~$ sudo usbrip events violations <IN_AUTH.JSON> [-a <ATRIBUTO> [<ATRIBUTO> ...]] [-t | -l] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [-c <COLUMNA> [<COLUMNA> ...]] [-f <ARCHIVO> [<ARCHIVO> ...]] [-q] [--debug]
Obtener eventos de violación USB basados en la lista de dispositivos de confianza.
# ---------- ALMACENAMIENTO ----------
~$ sudo usbrip storage list <TIPO_ALMACEN> [-q] [--debug]
Listar el contenido del almacén seleccionado. TIPO_ALMACEN es "history" o "violations".
~$ sudo usbrip storage open <TIPO_ALMACEN> [-t | -l] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [-c <COLUMNA> [<COLUMNA> ...]] [-q] [--debug]
Abrir el almacén seleccionado. Se comporta de manera similar al submódulo EVENTOS OPEN.
~$ sudo usbrip storage update <TIPO_ALMACEN> [IN_AUTH.JSON] [-a <ATRIBUTO> [<ATRIBUTO> ...]] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [--lvl <NIVEL_COMPRESIÓN>] [-q] [--debug]
Actualizar almacén: agregar eventos USB al almacén existente. NIVEL_COMPRESIÓN es un número en [0..9].
~$ sudo usbrip storage create <TIPO_ALMACEN> [IN_AUTH.JSON] [-a <ATRIBUTO> [<ATRIBUTO> ...]] [-e] [-n <NÚMERO_DE_EVENTOS>] [-d <FECHA> [<FECHA> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <FABRICANTE> [<FABRICANTE> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PUERTO> [<PUERTO> ...]] [--lvl <NIVEL_COMPRESIÓN>] [-q] [--debug]
Crear almacén: crear archivo 7-Zip y agregar eventos USB según las opciones seleccionadas.
~$ sudo usbrip storage passwd <TIPO_ALMACEN> [--lvl <NIVEL_COMPRESIÓN>] [-q] [--debug]
Cambiar contraseña del almacén existente.
# ---------- IDs ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
Obtener detalles adicionales sobre un dispositivo USB específico mediante su <VID> y/o <PID> de la base de datos USB ID.
~$ usbrip ids download [-q] [--debug]
Actualizar (descargar) la base de datos USB ID.
Para obtener una lista de nombres de módulos, use:
~$ usbrip -h
Para obtener una lista de nombres de submódulos para un módulo específico, use:
~$ usbrip <MÓDULO> -h
Para obtener una lista de todas las opciones para un submódulo específico, use:
~$ usbrip <MÓDULO> <SUBMÓDULO> -h
Mostrar el historial de eventos de todos los dispositivos USB, suprimiendo la salida del banner, mensajes de información e interacción del usuario (-q, --quiet), representado como una lista (-l, --list) con las últimas 100 entradas (-n NÚMERO, --number NÚMERO):
~$ usbrip events history -ql -n 100
Mostrar el historial de eventos de los dispositivos USB externos (-e, --external, que realmente fueron desconectados) representado como una tabla (-t, --table) que contiene las columnas Conectado, VID, PID, Desconectado y Número de serie (-c COLUMNA [COLUMNA ...], --column COLUMNA [COLUMNA ...]) filtrado por fecha (, ) y PID () con registros tomados de archivos externos (, ):
-d FECHA [FECHA ...]--date FECHA [FECHA ...]--pid <PID> [<PID> ...]-f ARCHIVO [ARCHIVO ...]--file ARCHIVO [ARCHIVO ...]~$ 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: hay algo que recordar al trabajar con filtros. Hay 4 tipos de filtrado disponibles: solo eventos USB externos (dispositivos que se pueden extraer fácilmente, -e), por fecha (-d), por campos (--host, --vid, --pid, --product, --manufact, --serial, --port) y por número de entradas que obtiene como salida (-n). Al aplicar diferentes filtros simultáneamente, obtendrá el siguiente comportamiento: primero, se aplican los filtros externo y por fecha, luego usbrip buscará los valores de campo especificados en la intersección de los dos últimos filtros, y al final cortará la salida al número que definió con la opción -n. Así que piénselo como una intersección para el filtrado externo y por fecha y una unión para el filtrado por campos. Espero que tenga sentido.
Construir el historial de eventos de todos los dispositivos USB y redirigir la salida a un archivo para su posterior análisis. Cuando el flujo de salida NO es la terminal stdout (| o > por ejemplo), no habrá caracteres de escape ANSI (color) en la salida, así que siéntase libre de usarlo de esa manera. También tenga en cuenta que usbrip usa algunos símbolos UNICODE, por lo que sería bueno convertir el archivo resultante a codificación UTF-8 (con encov por ejemplo), así como cambiar los caracteres de nueva línea al estilo de Windows para portabilidad (con awk por ejemplo):
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 Nota: siempre puede deshacerse de los caracteres de escape usted mismo incluso si ya ha obtenido la salida en stdout. Para hacer eso, simplemente copie los datos de salida a usbrip.out y aplique una instrucción awk más:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
Generar una lista de dispositivos USB de confianza como un archivo JSON (trusted/auth.json) con los atributos VID y PID que contenga los primeros tres dispositivos conectados el 30 de noviembre de 1984:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ Advertencia: hay casos en los que diferentes unidades flash USB pueden tener números de serie idénticos. Esto podría suceder como resultado de un error de fabricación o simplemente algunos hackers pudieron reescribir el chip de memoria de la unidad que resultó ser no programable una sola vez, etc. De todas formas, "ningún sistema es seguro". usbrip no maneja tales casos de manera inteligente hasta ahora, es decir, tratará un par de dispositivos con SN idénticos (si existe uno) como el mismo dispositivo con respecto a la lista de dispositivos de confianza y al módulo genauth.
Buscar en el historial de eventos de los dispositivos USB externos violaciones basadas en la lista de dispositivos USB de confianza (trusted/auth.json) por el atributo PID, restringir los eventos resultantes a aquellos que tienen Bob-PC como nombre de host, EvilUSBManufacturer como fabricante, 0123456789 como número de serie y representar la salida como una tabla con las columnas Conectado, VID y PID:
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
Buscar detalles sobre un dispositivo USB específico por su VID (--vid VID) y PID (--pid PID):
~$ usbrip ids search --vid 0781 --pid 5580
Descargar la última versión de la base de datos usb.ids database:
~$ usbrip ids download