
Отслеживание истории событий USB на GNU/Linux
usbrip (унаследовано от «USB Ripper», не «USB R.I.P.») — это простой инструмент криминалистики с интерфейсом командной строки, позволяющий отслеживать артефакты USB-устройств (т.е. историю USB-событий) на машинах Linux.
Содержание:
usbrip — это небольшая программа, анализирующая данные журналов Linux: вывод journalctl или содержимое файлов /var/log/syslog* (или /var/log/messages*). На основе собранных данных usbrip может строить таблицы истории USB-событий со следующими столбцами:
Кроме того, он также может:
-s* создавать защищённые хранилища (архивы 7-Zip) для автоматического резервного копирования и накопления USB-событий с помощью планировщика cron.Способ 1. Установка через pip:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
Способ 2. Установка последней версии с помощью install.sh (рекомендуется, доступны дополнительные функции):
~$ 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 (*ТОЛЬКО ДЕМО!*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip поддерживает два типа временных меток для анализа файлов системного журнала:
"%b %d %H:%M:%S", например "Янв 1 00:00:00"). Этот тип меток не содержит информации о годе."%Y-%m-%dT%H:%M:%S.%f%z", например "1970-01-01T00:00:00.000000-00:00").Если у вас установлен journalctl, то беспокоиться не о чем, так как он может конвертировать метки времени на лету. В противном случае желаемую структуру syslog можно получить, установив формат RSYSLOG_FileFormat в конфигурации rsyslog.
/etc/rsyslog.conf:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf файл для 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
Сначала usbrip проверит, есть ли возможность сбросить системные события с помощью journalctl как наиболее портативный вариант. Если нет – он будет искать и обрабатывать файлы системных журналов /var/log/syslog* или /var/log/messages*.
storage)Для простоты договоримся, что все команды с префиксом ~/usbrip$ выполняются в каталоге ~/usbrip, который создаётся в результате git clone:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shПомимо установки через pip, usbrip можно установить с помощью пользовательского скрипта installers/install.sh.
При использовании install.sh становятся доступны некоторые дополнительные возможности:
storage – настроить задачу cron для резервного копирования USB-событий по расписанию (пример задачи cron можно найти в usbrip/cron/usbrip.cron).⚠️ Предупреждение: если вы используете планировщик cron, настройте crontab с помощью sudo crontab -e, чтобы принудительно запускать подмодуль storage update от имени root. Пароли хранилищ находятся в /var/opt/usbrip/usbrip.ini и по умолчанию доступны только root.
Для установки usbrip с помощью install.sh используйте:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l зависимости Python разрешаются из локальных .tar-пакетов (каталог 3rdPartyTools) вместо PyPI.-s устанавливается не только проект usbrip, но также создаются список доверенных USB-устройств, хранилища истории и нарушений.После завершения установки каталог ~/usbrip можно удалить.
При установке с помощью install.sh usbrip использует следующие пути:
/opt/usbrip/ – основная директория проекта./var/opt/usbrip/log/ – журналы usbrip для cron./var/opt/usbrip/storage/ – хранилища USB-событий (history.7z и violations.7z, создаются в процессе установки)./var/opt/usbrip/trusted/ – списки доверенных USB-устройств (auth.json, создаётся в процессе установки)./var/opt/usbrip/usbrip.ini – конфигурационный файл usbrip (содержит пароли для хранилищ 7-Zip)./usr/local/bin/usbrip – символическая ссылка на скрипт /opt/usbrip/venv/bin/usbrip.Задачи cron можно настроить следующим образом:
~/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Скрипт installers/uninstall.sh удаляет usbrip и все артефакты установки из системы.
Для удаления usbrip используйте:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a удаляется не только каталог проекта usbrip, но и все хранилища и журналы usbrip.Не забудьте удалить задачу cron, если вы её настроили.
# ---------- 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.
Чтобы получить список имён модулей, используйте:
~$ usbrip -h
Чтобы получить список имён подмодулей для конкретного модуля, используйте:
~$ usbrip <MODULE> -h
Чтобы получить список всех ключей для конкретного подмодуля, используйте:
~$ usbrip <MODULE> <SUBMODULE> -h
Показать историю событий всех USB-устройств, подавив вывод баннера, информационных сообщений и взаимодействие с пользователем (-q, --quiet), в виде списка (-l, --list) с последними 100 записями (-n NUMBER, --number NUMBER):
~$ usbrip events history -ql -n 100
Показать историю событий внешних USB-устройств (-e, --external, которые были фактически отключены) в виде таблицы (-t, --table) со столбцами: Подключено, VID, PID, Отключено и Серийный номер (-c COLUMN [COLUMN ...], --column COLUMN [COLUMN ...]), отфильтрованных по дате (, ) и PID (), с логами, взятыми из внешних файлов (, ):
-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
👽 Примечание: есть одна вещь, которую нужно помнить при работе с фильтрами. Доступно 4 типа фильтрации: только внешние USB-события (устройства, которые легко извлечь, -e), по дате (-d), по полям (--host, --vid, --pid, --product, --manufact, --serial, --port) и по количеству записей, полученных в выводе (-n). При одновременном применении разных фильтров поведение будет следующим: сначала применяются фильтры внешних и по дате, затем usbrip будет искать указанные значения полей в пересечении двух последних фильтров, и в конце обрежет вывод до количества, заданного параметром -n. Так что думайте об этом как о пересечении для фильтров внешних и по дате и объединении для фильтров по полям. Надеюсь, это имеет смысл.
Построить историю событий всех USB-устройств и перенаправить вывод в файл для дальнейшего анализа. Когда выходной поток НЕ является терминалом stdout (| or > для примера), в выводе не будет ANSI-escape-символов (цветов), так что смело используйте этот способ. Также обратите внимание, что usbrip использует некоторые символы UNICODE, поэтому желательно преобразовать результирующий файл в кодировку UTF-8 (например, с помощью enconv), а также изменить символы перевода строки на стиль Windows для переносимости (например, с помощью awk):
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 Примечание: вы всегда можете избавиться от escape-символов самостоятельно, даже если вывод уже попал в stdout. Для этого скопируйте выходные данные в usbrip.out и примените ещё одну инструкцию awk:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
Создать список доверенных USB-устройств в виде JSON-файла (trusted/auth.json) с атрибутами VID и PID, содержащего первые три устройства, подключённые 30 ноября 1984 года:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ Предупреждение: бывают случаи, когда разные USB-флешки могут иметь одинаковые серийные номера. Это может произойти из-за производственной ошибки или просто злоумышленники смогли перезаписать чип памяти устройства, который оказался не однократно программируемым и т.д. В любом случае, «нет безопасных систем». usbrip не обрабатывает такие случаи интеллектуальным образом на данный момент, а именно: он будет рассматривать пару устройств с одинаковыми SN (если таковые есть) как одно и то же устройство в отношении списка доверенных устройств и модуля genauth.
Найти в истории событий внешних USB-устройств нарушения на основе списка доверенных USB-устройств (trusted/auth.json) по атрибуту PID, ограничить результирующие события теми, у которых хост Bob-PC, производитель EvilUSBManufacturer, серийный номер 0123456789, и представить вывод в виде таблицы со столбцами Connected, VID и PID:
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
Найти подробную информацию о конкретном USB-устройстве по его VID (--vid VID) и PID (--pid PID):
~$ usbrip ids search --vid 0781 --pid 5580
Загрузить последнюю версию базы данных usb.ids:
~$ usbrip ids download