
Rastreamento do histórico de eventos USB no GNU/Linux
usbrip (herdado de "USB Ripper", não "USB R.I.P.") é uma ferramenta forense simples com interface de linha de comando que permite rastrear artefatos de dispositivos USB (ou seja, histórico de eventos USB) em máquinas Linux.
Índice:
usbrip é um pequeno software que analisa dados de log do Linux: saída do journalctl ou conteúdo dos arquivos /var/log/syslog* (ou /var/log/messages*). Com base nos dados coletados, o usbrip pode construir tabelas de histórico de eventos USB com as seguintes colunas:
Além disso, também pode:
-s* Criar armazenamentos protegidos (arquivos 7-Zip) para fazer backup e acumular automaticamente eventos USB com a ajuda do agendador cron.Maneira 1. Instalar com pip:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
Maneira 2. Instalar a versão bleeding-edge com install.sh (recomendado, recursos extras disponíveis):
~$ 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 (*APENAS DEMO!*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip suporta dois tipos de timestamps para analisar dentro dos arquivos de log do sistema:
"%b %d %H:%M:%S", ex. "Jan 1 00:00:00"). Este tipo de timestamp não fornece a informação sobre o ano."%Y-%m-%dT%H:%M:%S.%f%z", ex. "1970-01-01T00:00:00.000000-00:00").Se você tiver o journalctl instalado, não há com o que se preocupar, pois ele pode converter timestamps em tempo real. Caso contrário, a estrutura syslog desejada pode ser alcançada definindo o formato RSYSLOG_FileFormat na configuração do rsyslog.
/etc/rsyslog.conf:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf personalizado para o 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
Primeiramente, o usbrip verificará se há a possibilidade de despejar eventos do sistema usando o journalctl como a opção mais portátil. Se não – ele procurará e analisará os arquivos de log do sistema /var/log/syslog* ou /var/log/messages*.
storage)Para simplificar, vamos concordar que todos os comandos onde o prefixo ~/usbrip$ aparece são executados no diretório ~/usbrip que é criado como resultado de um git clone:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shAlém de instalar com pip, o usbrip também pode ser instalado com o script personalizado installers/install.sh.
Ao usar o install.sh, alguns recursos extras se tornam disponíveis:
storage – configurar uma tarefa cron para fazer backup de eventos USB em um cronograma (um exemplo de tarefa cron pode ser encontrado em usbrip/cron/usbrip.cron).⚠️ Aviso: se você estiver usando agendamento cron, você deve configurar o crontab com sudo crontab -e para forçar o submódulo storage update a ser executado como root. As senhas dos armazenamentos são mantidas em /var/opt/usbrip/usbrip.ini e acessíveis apenas pelo root por padrão.
Para instalar o usbrip com install.sh use:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l está habilitada, as dependências Python são resolvidas a partir de pacotes .tar locais (diretório 3rdPartyTools) em vez do PyPI.-s está habilitada, não apenas o projeto usbrip é instalado, mas também a lista de dispositivos USB confiáveis, os armazenamentos de histórico e violações são criados.Após a instalação ser concluída, sinta-se à vontade para remover o diretório ~/usbrip.
Quando instalado com install.sh, o usbrip usa os seguintes caminhos:
/opt/usbrip/ – diretório principal do projeto./var/opt/usbrip/log/ – logs do cron do usbrip./var/opt/usbrip/storage/ – armazenamentos de eventos USB (history.7z e violations.7z, criados durante o processo de instalação)./var/opt/usbrip/trusted/ – listas de dispositivos USB confiáveis (auth.json, criadas durante o processo de instalação)./var/opt/usbrip/usbrip.ini – arquivo de configuração do usbrip (contém senhas para os armazenamentos 7-Zip)./usr/local/bin/usbrip – link simbólico para o script /opt/usbrip/venv/bin/usbrip.Tarefas cron podem ser configuradas da seguinte forma:
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shO script installers/uninstall.sh remove o usbrip e todos os artefatos de instalação do seu sistema.
Para desinstalar o usbrip use:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a está habilitada, não apenas o diretório do projeto usbrip é excluído, mas também todos os armazenamentos e logs do usbrip são excluídos.Não se esqueça de remover a tarefa cron se você a tiver configurado.
# ---------- BANNER ----------
~$ usbrip banner
Get usbrip banner.
# ---------- EVENTS ----------
~$ 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]
Get USB event history.
~$ 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]
Open USB event dump.
~$ 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]
Generate a list of trusted (authorized) USB devices.
~$ 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]
Get USB violation events based on the list of trusted devices.
# ---------- STORAGE ----------
~$ sudo usbrip storage list <STORAGE_TYPE> [-q] [--debug]
List contents of the selected storage. STORAGE_TYPE is either "history" or "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]
Open selected storage. Behaves similarly to the EVENTS OPEN submodule.
~$ 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]
Update storage -- add USB events to the existing storage. COMPRESSION_LEVEL is a number in [0..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]
Create storage -- create 7-Zip archive and add USB events to it according to the selected options.
~$ sudo 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.
Para obter uma lista de nomes de módulos use:
~$ usbrip -h
Para obter uma lista de nomes de submódulos para um módulo específico use:
~$ usbrip <MODULE> -h
Para obter uma lista de todas as opções para um submódulo específico use:
~$ usbrip <MODULE> <SUBMODULE> -h
Mostrar o histórico de eventos de todos os dispositivos USB, suprimindo a saída do banner, mensagens de informação e interação do usuário (-q, --quiet), representado como uma lista (-l, --list) com as últimas 100 entradas (-n NUMBER, --number NUMBER):
~$ usbrip events history -ql -n 100
Mostrar o histórico de eventos dos dispositivos USB externos (-e, --external, que foram realmente desconectados) representado como uma tabela (-t, --table) contendo as colunas Conectado, VID, PID, Desconectado e Número de Série (-c COLUMN [COLUMN ...], --column COLUMN [COLUMN ...]) filtrado por data (, ) e PID () com logs obtidos de arquivos externos (, ):
-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
👽 Nota: há uma coisa a lembrar ao trabalhar com filtros. Existem 4 tipos de filtragem disponíveis: apenas eventos USB externos (dispositivos que podem ser removidos facilmente, -e), por data (-d), por campos (--host, --vid, --pid, --product, --manufact, --serial, --port) e por número de entradas que você obtém como saída (-n). Ao aplicar diferentes filtros simultaneamente, você obterá o seguinte comportamento: primeiro, os filtros externos e por data são aplicados, então o usbrip procurará pelos valores de campo especificados na interseção dos dois últimos filtros, e no final ele cortará a saída para o número que você definiu com a opção -n. Portanto, pense nisso como uma interseção para filtragem externa e por data e união para filtragem por campos. Espero que faça sentido.
Construir o histórico de eventos de todos os dispositivos USB e redirecionar a saída para um arquivo para análise posterior. Quando o fluxo de saída NÃO é o terminal stdout (| ou > por exemplo) não haverá caracteres ANSI de escape (cor) na saída, então fique à vontade para usar dessa forma. Observe também que o usbrip usa alguns símbolos UNICODE, então seria bom converter o arquivo resultante para codificação UTF-8 (com encov por exemplo), bem como alterar os caracteres de nova linha para o estilo Windows para portabilidade (com awk por exemplo):
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 Nota: você sempre pode se livrar dos caracteres de escape por conta própria, mesmo se já tiver obtido a saída para stdout. Para fazer isso, basta copiar os dados de saída para usbrip.out e aplicar mais uma instrução awk:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
Gerar uma lista de dispositivos USB confiáveis como um arquivo JSON (trusted/auth.json) com os atributos VID e PID contendo os primeiros três dispositivos conectados em 30 de novembro de 1984:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ Aviso: há casos em que diferentes pendrives USB podem ter números de série idênticos. Isso pode acontecer como resultado de um erro de fabricação ou apenas alguns black hats conseguiram reescrever o chip de memória do dispositivo que acabou não sendo programável uma única vez e assim por diante... De qualquer forma, "nenhum sistema é seguro". O usbrip não lida com tais casos de forma inteligente até o momento, ou seja, ele tratará um par de dispositivos com SNs idênticos (se existir algum) como o mesmo dispositivo em relação à lista de dispositivos confiáveis e ao módulo genauth.
Pesquisar o histórico de eventos dos dispositivos USB externos por violações com base na lista de dispositivos USB confiáveis (trusted/auth.json) pelo atributo PID, restringindo os eventos resultantes àqueles que têm Bob-PC como hostname, EvilUSBManufacturer como fabricante, 0123456789 como número de série e representar a saída como uma tabela com as colunas Conectado, VID e PID:
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
Pesquisar detalhes sobre um dispositivo USB específico pelo seu VID (--vid VID) e PID (--pid PID):
~$ usbrip ids search --vid 0781 --pid 5580
Baixar a versão mais recente do banco de dados usb.ids database:
~$ usbrip ids download