Usbrip: herramienta forense de línea de comandos para rastrear dispositivos USB en Linux
Usbrip (derivado de “USB Ripper”, no “USB R.I.P”) es una herramienta forense de código abierto con interfaz CLI que te permite realizar un seguimiento de los artefactos del dispositivo USB (también conocido como historial de eventos USB, eventos “conectados” y “desconectados”) en máquinas Linux.
Descripción
usbrip es un pequeño software escrito en Python 3 puro (sin embargo, utilizando algunos módulos externos, puedes consultar Dependencias/PIP) que analiza los archivos de registro de Linux (/var/log/syslog* o/var/log/messages* dependiendo de la distribución) para construir tablas de historial de eventos USB.
Dichas tablas pueden contener las siguientes columnas: “Conectado” (fecha y hora), “Usuario”, “VID” (ID de proveedor), “PID” (ID de producto), “Producto”, “Fabricante”, “Número de serie”, “Puerto” y “Desconectado” (fecha y hora).
Además, también te permite:
- Exportar información recopilada como un registro JSON (y abrir dichos registros, por supuesto);
- Generar una lista de dispositivos USB autorizados (de confianza) como JSON (llamados auth.json);
- Buscar “eventos de violación” en función de auth.json: mostrar (o generar otro JSON con) dispositivos USB que aparecen en el historial y NO aparecen en el auth.json;
- *cuando se instala con el indicador –s* crea almacenamientos cifrados (archivos 7zip) para hacer copias de seguridad y acumular eventos USB automáticamente con la ayuda del programador crontab;
- Buscar detalles adicionales sobre un dispositivo USB específico en función de su VID y/o PID.
Inicio rápido
usbrip está disponible para descargar e instalar en PyPI:
$ pip3 install usbrip
Capturas de pantalla
Git Clone
Para simplificar, aceptemos que todos los comandos donde ~/usbrip$ aparece el prefijo se ejecutan en el directorio ~/usbrip que se crea como resultado de git clone:
~$ git clone https://github.com/snovvcrash/usbrip.git usbrip && cd usbrip ~/usbrip$
Dependencias
usbrip funciona solo con la estructura no modificada de los archivos de registro del sistema, por lo que, desafortunadamente, no podrás analizar el historial de USB si cambias el formato de syslogs (con syslog-ng o rsyslog, por ejemplo). Es por eso que las marcas de tiempo de los campos “Conectado” y “Desconectado” no tienen el año, por cierto. Mantén esto en mente.
Paquetes DEB
- Intérprete de python3.6 (o más reciente)
- python3-venv
- p7zip-full (usado por el módulo storages)
~$ sudo apt install -y python3-venv p7zip-full
Paquetes PIP
usbrip utiliza los siguientes módulos externos:
- terminaltables
- termcolor
Portable
Para resolver las dependencias de Python manualmente (en realidad no es necesario porque pip o setup.py puede automatizar el proceso, consulta Instalación) crea un entorno virtual (opcional) y ejecuta pip desde dentro:
~/usbrip$ python3 -m venv venv && source venv/bin/activate (venv) ~/usbrip$ pip install -r requirements.txt
O deja que pipenv en una línea haga todo el trabajo sucio por ti:
~/usbrip$ pipenv install && pipenv shell
Después de eso, puedes ejecutar usbrip de forma portable:
(venv) ~/usbrip$ python -m usbrip -h Or (venv) ~/usbrip$ python __main__.py -h
Instalación
Hay dos formas de instalar usbrip en el sistema: pip o setup.py.
pip o setup.py
Antes que nada, usbrip es pip instalable. Esto significa que después de clonar el repositorio git, simplemente puedes iniciar el proceso de instalación de pip y luego ejecutar usbrip desde cualquier lugar de tu terminal de la siguiente manera:
~/usbrip$ python3 -m venv venv && source venv/bin/activate (venv) ~/usbrip$ pip install . (venv) ~/usbrip$ usbrip -h
O si deseas resolver las dependencias de Python localmente (sin molestar a PyPI), usa setup.py:
~/usbrip$ python3 -m venv venv && source venv/bin/activate (venv) ~/usbrip$ python setup.py install (venv) ~/usbrip$ usbrip -h
Nota: es probable que desees ejecutar el proceso de instalación mientras el entorno virtual de Python está activo (como se muestra arriba).
install.sh
En segundo lugar, usbrip también se puede instalar en el sistema con el script ./installers/install.sh. Cuando se utilizan ./installers/install.sh algunas funciones adicionales están disponibles:
- El entorno virtual se crea automáticamente;
- El módulo storage estará disponible: puedes configurar un crontab job para hacer una copia de seguridad de los eventos USB en un horario (el ejemplo de los crontab jobs se puede encontrar en usbrip/cron/usbrip.cron).
Advertencia: si estás utilizando la programación crontab, debes configurar el cron job con sudo crontab –e con el fin de forzar la ejecución de storage update del submódulo como root y proteger las contraseñas de los almacenamientos de eventos USB. Las contraseñas de almacenamiento se guardan /var/opt/usbrip/usbrip.ini.
El script ./installers/uninstall.sh elimina todos los artefactos de instalación de tu sistema.
Para instalar usbrip usa:
~/usbrip$ chmod +x ./installers/install.sh ~/usbrip$ sudo -H ./installers/install.sh [-l/--local] [-s/--storages] ~/usbrip$ cd ~$ usbrip -h
- Cuando el conmutador –l está habilitado, las dependencias de Python se resuelven desde paquetes locales .tar (./3rdPartyTools/) en lugar de PyPI.
- Cuando el interruptor –s está habilitado, no solo se instala el proyecto usbrip, sino que también se crea la lista de dispositivos USB confiables, el historial y el almacenamiento de incidentes.
Nota: cuando uses la opción –s durante la instalación, asegúrate de que los registros del sistema contengan al menos una entrada de dispositivo USB externo. Es una condición necesaria para que usbrip cree con éxito la lista de dispositivos confiables (y como resultado, cree con éxito el almacenamiento de incidentes).
Una vez completada la instalación, no dudes en eliminar la carpeta usbrip.
Rutas
Cuando los instalas, usbrip usa las siguientes rutas:
- /opt/usbrip/ – directorio principal del proyecto;
- /var/opt/usbrip/usbrip.ini – archivo de configuración usbrip: mantiene contraseñas para almacenamientos 7zip;
- /var/opt/usbrip/storage/– Almacenamiento de eventos USB: history.7z y violations.7z (creado durante el proceso de instalación);
- /var/opt/usbrip/log/– registros de usbrip (se recomienda registrar la actividad de usbrip cuando se usa crontab, ver usbrip/cron/usbrip.cron);
- /var/opt/usbrip/trusted/ – lista de dispositivos USB confiables (creados durante el proceso de instalación);
- /usr/local/bin/usbrip– enlace simbólico al scritp /opt/usbrip/venv/bin/usbrip.
Cron
Cron Jobs 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.sh
Para desinstalar usbrip usa:
~/usbrip$ chmod +x ./installers/uninstall.sh ~/usbrip$ sudo ./installers/uninstall.sh [-a/--all]
- Cuando el interruptor –a está habilitado, no solo se elimina el directorio del proyecto usbrip, sino que también se eliminan todos los almacenamientos y registros de usbrip.
Y no olvides eliminar el cron job.
Uso
Sinopsis
# ---------- BANNER ---------- $ usbrip banner Get usbrip banner. # ---------- EVENTS ---------- $ usbrip events history [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--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] Get USB event history. $ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--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] Open USB event dump. $ usbrip events gen_auth <OUT_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug] Generate a list of trusted (authorized) USB devices. $ usbrip events violations <IN_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USE R> [<USER> ...]] [--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] Get USB violation events based on the list of trusted devices. # ---------- STORAGE ---------- $ usbrip storage list <STORAGE_TYPE> [-q] [--debug] List contents of the selected storage (7zip archive). STORAGE_TYPE is "history" or "violations". $ usbrip storage open <STORAGE_TYPE> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug] Open selected storage (7zip archive). Behaves similary to the EVENTS OPEN submodule. $ usbrip storage update <STORAGE_TYPE> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug] Update storage — add USB events to the existing storage (7zip archive). COMPRESSION_LEVEL is a number in [0..9]. $ usbrip storage create <STORAGE_TYPE> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBE R_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug] Create storage — create 7zip archive and add USB events to it according to the selected options. $ usbrip storage passwd <STORAGE_TYPE> [--lvl <COMPRESSION_LEVEL>] [-q] [--debug] Change password of the existing storage. # ---------- IDs ---------- $ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug] Get extra details about a specific USB device by its <VID> and/or <PID> from the USB ID database. $ usbrip ids download [-q] [--debug] Update (download) the USB ID database.
Ayuda
Para obtener una lista de nombres de módulos, debes utilizar:
$ usbrip -h
Puedes obtener una lista de nombres de submódulos para un módulo específico, usando:
$ usbrip <module> -h
Para obtener una lista de todos los modificadores para un submódulo específico, utiliza:
$ usbrip <module> <submodule> -h
Ejemplos
- Mostrar el historial de eventos de todos los dispositivos USB, suprimiendo la salida del banner, los mensajes de información y la interacción del usuario (-q, –quiet), representados como una lista (-l, –list) con las últimas 100 entradas ( -n NUMBER, –number NUMBER):
$ usbrip events history -ql -n 100
- Mostrar el historial de eventos de los dispositivos USB externos ( -e, -external que en realidad estaban desconectados) representados como una tabla ( -t, –table) que contiene las columnas “Conectado”, “VID”, “PID”, “Desconectado” y “Número de serie” (-c COLUMN [COLUMN], –column COLUMN [COLUMN]) por fecha ( -d DATE [DATE …], –date DATE [DATE …]) con registros tomados de los archivos externos ( -f FILE [FILE …], –file FILE [FILE …]):
$ usbrip events history -et -c conn vid pid disconn serial -d "Dec 9" "Dec 10" -f /var/log/syslog.1 /var/log/syslog.2.gz
- Crear 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 es NOT es stdout terminal (| o > por ejemplo) no habría caracteres de escape ANSI (color) en la salida, así que siéntete libre de usarlo de esa manera. También ten en cuenta que usbrip usa algunos símbolos UNICODE, por lo que sería bueno convertir el archivo resultante a la codificación UTF-8 (con, encov por ejemplo), así como cambiar los caracteres de nueva línea al estilo de Windows para la portabilidad (con, awk por ejemplo):
usbrip history events -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
Observación:
Siempre puedes deshacerte de los caracteres de escape por sí mismo, incluso si ya tienes la salida en stdout. Para hacer eso, simplemente copia los datos de salida usbrip.out y agrega 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 confiables como un archivo JSON (trusted/auth.json) con los atributos “VID” y “PID” que contienen los primeros tres dispositivos conectados el 26 de septiembre:
$ usbrip events gen_auth trusted/auth.json -a vid pid -n 3 -d "Sep 26"
- Buscar incidentes en el historial de eventos de los dispositivos USB externos en función de la lista de dispositivos USB confiables (trusted/auth.json) mediante el atributo “PID”, restringir los eventos resultantes a aquellos que tienen “Bob” como usuario, “EvilUSBManufacturador” como fabricante, “1234567890 “como número de serie y representar la salida como una tabla con las columnas “Conectado”, “VID” y “PID”:
$ usbrip events violations trusted/auth.json -a pid -et --user Bob --manufact EvilUSBManufacturer --serial 1234567890 -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/usb.ids (la fuente está aquí):
$ usbrip ids download