Подключенные usb устройства linux. Linux-форензика в лице треккинга истории подключений USB-устройств

В рамках погружения в одну из дисциплин (в процессе обучения по специальности компбеза) я работал над одним занимательным проектом, который бы мне не хотелось просто похоронить в недрах папки «Универ» на внешнем винчестере.

Сей проект носит название usbrip и представляет собой небольшую консольную опенсорс утилиту для Linux-форензики, а именно для работы с историей подключений USB-устройств. Программа написана на чистом Python 3 (с использованием некоторых сторонних модулей) и не требует зависимостей помимо Python 3.x интерпретатора и пары строк из requirements.txt , разрешающихся одной строкой с помощью pip.

В этом посте я опишу некоторые возможности данного софта и оставлю краткий мануал со ссылкой на источник загрузки.

Снято! (… в смысле Cut!)

Примечание. Описываемый в статье функционал актуален для версии утилиты. За последней версией с множеством новых плюшек предлагаю перейти в репозиторий .

Скриншоты

Получение истории подключений съёмных USB-устройств:


Поиск дополнительной информации о USB-устройстве по идентификатору модели (PID"у):

Описание

Как известно, операционные системы на базе GNU/Linux очень трепетно относятся к логированию разного рода событий, и подключение/отключение USB-устройств не является исключением. В совокупности с одним из пунктов UNIX-философии о «текстовых потоках, как универсальных интерфейсах» информацию об артефактах таких событий (с разной степенью подробности) в зависимости от дистрибутива можно обнаружить в одном или нескольких из следующих текстовых файлов:
  • /var/log/kern.log* ;
  • /var/log/syslog* ;
  • /var/log/messages* ;
  • /var/log/dmesg* ;
  • /var/log/daemon.log* .
FORENSIC-PROOF даже показывает нам такую картинку на этот счет (немного неполную, но неважно):

Для своей работы usbrip находит универсальные для всех сборок Linux, основанных на Debian (Ubuntu, Linux Mint и др.) и RPM (CentOS, Fedora, openSUSE и др.), лог-файлы, а именно: /var/log/syslog* или /var/log/messages* , парсит их в поисках нужной информации и обликает найденные следы подключений USB-устройств в красивые таблички (или списки - как угодно).

Также usbrip умеет:

  • создавать списки авторизированных (доверенных) устройств в виде JSON-файлов;
  • искать «события-нарушителей» на основе списка доверенных устройств: такие события (подключение/отключение USB), в которых участвовали USB-устройства, не отмеченные как доверенные;
  • искать дополнительную информацию о USB-устройстве по его VID (Vendor ID) и/или PID (Product ID).

Справка

Получить список доступных модулей:

$ python3 usbrip.py -h
Получить список доступных подмодулей для конкретного модуля:

$ python3 usbrip.py <модуль> -h
Получить список доступных опций для конкретного подмодуля:

$ python3 usbrip.py <модуль> <подмодуль> -h

Синтаксис

$ python3 usbrip.py banner Вывод на экран баннера утилиты. $ python3 usbrip.py events history [-q] [-t | -l] [-e] [-n КОЛИЧЕСТВО_СОБЫТИЙ] [-d ДАТА [ДАТА...]] [-c СТОЛБЕЦ [СТОЛБЕЦ...]] [-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]] Просмотр истории USB-подключений. $ python3 usbrip.py events gen_auth <ВЫХОДНОЙ_ФАЙЛ.JSON> [-a ПРИЗНАК [ПРИЗНАК...]] [-q] [-e] [-n КОЛИЧЕСТВО_СОБЫТИЙ] [-d ДАТА [ДАТА...]] [-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]] Формирование списка авторизированных (доверенных) USB-устройств. $ python3 usbrip.py events violations <ВХОДНОЙ_ФАЙЛ.JSON> [-a ПРИЗНАК [ПРИЗНАК...]] [-q] [-t | -l] [-e] [-n КОЛИЧЕСТВО_СОБЫТИЙ] [-d ДАТА [ДАТА...]] [-c СТОЛБЕЦ [СТОЛБЕЦ...]] [-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]] Поиск "событий-нарушителей" на основе списка доверенных устройств. $ python3 usbrip.py ids search [-q] [--vid VID] [--pid PID] [--offline] Поиск дополнительной информации об устройстве по его VID и/или PID по базе данных идентификаторов. $ python3 usbrip.py ids download [-q] Обновление (загрузка) локальной базы данных идентификаторов USB-устройств.

Опции

Опции, поддерживаемые подмодулями "events history", "events gen_auth", "events violations", "ids search", "ids download": -q, --quiet опустить вывод баннера, информационных (зелёных) сообщений, а также не задавать вопросы по ходу выполнения ##################################################################################### Опции, поддерживаемые подмодулями "events history", "events gen_auth", "events violations": -e, --external искать только съёмные USB-устройства (у которых есть информация об отсоединении) -n КОЛИЧЕСТВО_СОБЫТИЙ, --number КОЛИЧЕСТВО_СОБЫТИЙ количество последних по дате событий, которое будет выведено -d ДАТА [ДАТА...], --date ДАТА [ДАТА...] список дат, по которым будет производится фильтрация событий при поиске -f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...], --file ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...] список лог-файлов (если не указано, поиск истории событий будет произведен по лог-файлам по умолчанию: /var/log/syslog* или /var/log/messages* в зависимости от версии ОС) ##################################################################################### Опции, поддерживаемые подмодулями "events history", "events violations": -t, --table сформировать вывод в виде таблицы (если размера окна терминала не хватает для корректного отображения таблицы, вывод автоматически будет сформирован в виде списка; при указании флага -t вывод будет сформирован в виде таблицы принудительно) -l, --list сформировать вывод в виде списка -c СТОЛБЕЦ [СТОЛБЕЦ...], --column СТОЛБЕЦ [СТОЛБЕЦ...] список столбцов, которые будут использованы при построении таблицы (имеет действие только при формировании вывода в виде таблицы); разрешённые ключи: "conn", "user", "vid", "pid", "prod", "manufact", "serial", "port", "disconn". ##################################################################################### Опции, поддерживаемые подмодулями "events gen_auth", "events violations": -a ПРИЗНАК [ПРИЗНАК...], --attribute ПРИЗНАК [ПРИЗНАК...] список признаков, которые будут использованы при построении списка авторизированных устройств (а также при поиске "событий-нарушителей" в случае подмодуля "events violations"); разрешённые ключи: "vid", "pid", "prod", "manufact", "serial". ##################################################################################### Опции, поддерживаемые подмодулями "ids search", "ids download": --vid VID vendor ID или идентификатор производителя USB-устройства (обычно 4 шестнадцатиричных цифры) --vid PID product ID или идентификатор модели USB-устройства (обычно 4 шестнадцатиричных цифры) --offline если указано, поиск дополнительной информации о USB-устройстве по базе данных идентификаторов будет произведен без предварительного ее (базы) обновления

Примеры использования

Показать историю подключений всех USB-устройств, опуская баннер, информационные (зелёные) сообщения, а также не задавая вопросы по ходу выполнения (-q, --quite), сформировав вывод в виде списка (-l, --list), включив в него 100 последних найденных событий (-n КОЛИЧЕСТВО_СОБЫТИЙ, --number КОЛИЧЕСТВО_СОБЫТИЙ):
$ python3 usbrip.py events history -ql -n 100
Показать историю подключений съёмных USB-устройств (-e, --external), сформировав вывод в форме таблицы с полями (столбцами) «Connected», «VID», «PID», «Disconnected» и «Serial Number» (-c СТОЛБЕЦ [СТОЛБЕЦ...], --column СТОЛБЕЦ [СТОЛБЕЦ...]), отфильтровав поиск по датам (-d ДАТА [ДАТА...], --date ДАТА [ДАТА...]), взяв при этом информацию из внешних лог-файлов (-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...], --file ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]):
$ python3 usbrip.py events history -et -c conn vid pid disconn serial -d "Dec 9" "Dec 10" -f /var/log/syslog.1 /var/log/syslog.2.gz
Построить таблицу истории подключений всех USB-устройств и перенаправить вывод в файл для дальнейшего анализа. В том случае, если поток вывода не стандартный stdout ("|" либо ">" к примеру) в выходных данных не будут присутствовать спец. символы, отвечающие за цвет шрифта в терминале, поэтому текстовый файл не будет замусорен нечитаемыми символами. Также нужно отметить, что usbrip использует некоторые UNICODE-константы, поэтому было бы неплохо сразу конвертировать кодировку создаваемого файла в UTF-8 для их корректного отображения (например с помощью encov), а также использовать символы новой строки в Windows-стиле для лучшей переносимости (например с помощью awk):
$ python3 usbrip.py history events -t | awk "{ sub("$", "\r"); print }" > usbrip.txt && enconv -x UTF8 usbrip.txt
Примечание: избавиться от спец. символов, отвечающих за цвет можно и в том случае, если вывод уже был направлен в stdout. Для этого необходимо скопировать полученные данные в новый файл usbrip.txt и добавить еще одну awk -инструкцию:
$ awk "{ sub("$", "\r"); gsub("\\x1B\\[*[ -/]*[@-~]", ""); print }" usbrip.txt && enconv -x UTF8 usbrip.txt
Создать список доверенных устройств в виде JSON-файла (trusted/auth.json), содержащего поля «VID» и «PID» первых трех устройств, подключенных 26-го сентября:
$ python3 usbrip.py events gen_auth trusted/auth.json -a vid pid -n 3 -d "Sep 26"
Найти среди истории подключений съёмных USB-устройств «события-нарушители» на основе списка доверенных устройств (trusted/auth.json) по полю «PID» и сформировать вывод в виде таблицы с полями «Connected», «VID» и «PID»:
$ python3 usbrip.py events violations trusted/auth.json -a pid -et -c conn vid pid
Найти дополнительную информацию о USB-устройстве на основе его VID"а и PID"а:
$ python3 usbrip.py ids search --vid 0781 --pid 5580
Загрузить/обновить базу данных идентификаторов USB-устройств (источник ):
$ python3 usbrip.py ids download

Ссылки и постскриптум

Забрать утилиту можно с Гитхаба , все зависимости для запуска и корректной работы указаны в requirements.txt .

Благодарю за внимание!

P. S. да, стиль баннера и информационных сообщений вдохновлен проектом sqlmap (*^.^*)

UPD 13.06.2018. Появилось расследование реального (?) кейса с участием моей утилиты от человека с Codeby (сам в шоке, если честно).

В рамках погружения в одну из дисциплин (в процессе обучения по специальности Компбеза) я работал над одним занимательным проектом, который бы мне не хотелось просто похоронить в недрах папки «Универ» на внешнем винчестере.

Сей проект носит название

usbrip

и представляет собой небольшую консольную опенсорс утилиту для Linux-форензики, а именно для работы с историей подключений USB-устройств. Программа написана на чистом Python 3 (с использованием некоторых сторонних модулей) и не требует зависимостей помимо Python 3.x интерпретатора и нескольких строк из

requirements.txt

Разрешающихся одной строкой с помощью pip3.

В этом посте я опишу некоторые возможности данного софта и оставлю краткий мануал со ссылкой на источник загрузки.

$ python3 usbrip.py ids download

Ссылки и постскриптум

Забрать утилиту можно с

Гитхаба

Все зависимости для запуска и корректной работы указаны в

requirements.txt

Благодарю за внимание!

P. S.

да, стиль баннера и информационных сообщений вдохновлен проектом

sqlmap

Поддержка USB включена в ядро начиная с версии 2.2.7 и можно сказать, что эта технология уже обкатана и проблем при подключении таких устройств быть не должно. Достаточно лишь подключить фотокамеру, флешку, принтер или любое другое устройство, как оно будет автоматически распознано. А будет ли работать например принтер зависит от наличия драйверов.

Чтобы было возможным оценить ситуацию разберем, как реализована поддержка USB и где искать информацию о подключенных стройствах, хотя все сказано о частично касается и USB. Реализацией поддержки USB в Linux занимается Linux USB Project (www.linux-usb.org), куда и следует идти за информацией. В сегодняшних компьютерах можно найти три типа контролеров, отличающихся интерфейсом взаимодействия с устройствами. Это OHCI (Open Host Controller Interface), UHCI (Universal Host Controller Interface) и EHCI (Enhanced Host Controller Interface). Первые два реализуют поддержку USB версии 1.1, последний 2.0 обеспечивая скорость обмена до 480 Мбит/с. UHCI контроллеры несколько проще и дешевле, но требуют сложных драйверов и больше нагружают на процессор. Узнать свой тип контролера все так же очень просто:

$ lspci -v
00:02.0 USB Controller: nVidia Corporation MCP55 USB Controller (rev a1) (prog-if 10 )

Flags: bus master, 66MHz, fast devsel, latency 0, IRQ 11
Memory at fe02f000 (32-bit, non-prefetchable)
Capabilities:

00:02.1 USB Controller: nVidia Corporation MCP55 USB Controller (rev a2) (prog-if 20 )
Subsystem: Biostar Microtech Int’l Corp Unknown device 3405
Flags: bus master, 66MHz, fast devsel, latency 0, IRQ 5
Memory at fe02e000 (32-bit, non-prefetchable)
Capabilities:

Как видишь, у меня имеются оба типа контроллеров: OHCI и EHCI. Если ты используешь самосборное ядро, включи нужный драйвер в пункте «USB Host Controller Drivers». Не буду тебя нагружать всеми опциями, все параметры которые доступны в ядре можно промотреть набрав «cat /usr/src/linux/.config | grep -i usb».

Также следует помнить, что работа с USB осуществляется путем эмуляции SCSI, поэтому нужно активировать и параметры относящиеся к поддержке SCSI.
Для непосредственной работы с USB-устройствами создается каталог /proc/bus/usb в виртуальной файловой системе /proc, который монтируется через /etc/fstab:

none /proc/bus/usb usbfs noauto 0 0
Если такой строчки в твоем файле нет, это может означать что разработчики избавили тебя от лишних мыслей и монтируют usbfs в стартовых скриптах. В каком конкретно скрипте это делается, ты узнаешь введя «sudo grep -iR «usbfs» /etc/* «. Например в KUbuntu за монтирование USB отвечает скрипт /etc/init.d/mountdevsubfs.sh . Вручную смонтировать файловую систему для USB к /proc/bus/usb, можно так:

$ sudo mount -t usbdevfs none /proc/bus/usb

После этого команда «mount | grep usbfs » должна показать наличие строки:

procbususb on /proc/bus/usb type usbfs (rw)

А вывод «lsmod » загруженные модули usbcore , модуль драйвера ohci_hcd,ehci_hcd, uhci_hcs , а также модуль соответствующий драйверу подключенного устройства вроде scanner.o, printer.o, usb_storage .
Информацию о подключении USB устройства можно получить из /var/log/dmesg и непосредственно из /proc . Если каталог /proc/bus/usb пуст это значит, что виртуальная файловая система USB не смонтирована. Внутри каталога должно быть несколько файлов с именами вида 001, 002 по количеству контроллеров и файл devices который «знает» обо всех устройствах:

$ cat /proc/bus/usb/devices

T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh=10
B: Alloc= 0/800 us (0%), #Int= 0, #Iso= 0
D: Ver= 2.00 Cls=09(hub) Sub=00 Prot=01 MxPS=64 #Cfgs= 1

S: Manufacturer=Linux 2.6.20-15-generic ehci_hcd
S: Product=EHCI Host Controller
S: SerialNumber=0000:00:02.1


E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms

T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh=10
B: Alloc= 0/900 us (0%), #Int= 0, #Iso= 0
D: Ver= 1.10 Cls=09(hub) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0000 ProdID=0000 Rev= 2.06
S: Manufacturer=Linux 2.6.20-15-generic ohci_hcd
S: Product=OHCI Host Controller
S: SerialNumber=0000:00:02.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub) Sub=00 Prot=00 Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms

T: Bus=01 Lev=01 Prnt=01 Port=07 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1307 ProdID=0163 Rev= 1.00
S: Manufacturer=????????y
S: Product=USB Mass Storage Device
S: SerialNumber=9fe1ad57805553
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr= 80mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=125us
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=03(Int.) MxPS= 64 Ivl=16ms

Расшифровать вывод легко, подробности ищи в документации (/usr/src//Documentation/usb/proc_usb_info.txt ). Скажу только, что буква T указывает на топологию, Bus и Level показывают к какой шине подключено устройство и уровень, Spd показывает скорость, MxCh — сколько еще устройств можно подключить к нему, Driver — драйвер. Например Driver=hub показывает, что это хаб, а Driver=usb-storage — USB устройство для хранения информации.
В репозитарии KUbuntu можно найти несколько утилит, которые помогут тебе разобраться с USB. Так использовав lsusb ты получишь еще больше информации о USB устройствах, а не нравится консоль используй usbview.

Вот в принципе и все, что хотелось сказать о подключении горячих устройств к компьютеру с Linux, надеюсь с сегодняшнего дня проблем с этим у тебя уже не будет.

USB - Universal Serial Bus (Универсальная последовательная шина) была разработана консорциумом компаний с целью предоставить единственную, простую шину для подключения периферии.

Дизайн USB позволяет устройствам подключаться на лету, используя для подключения стандартные гнезда. USB устройства включают в себя: клавиатуры, мыши, принтеры, сканеры, жесткие диски, флэш-драйвы, камеры, модемы, сетевые адаптеры и колонки, а их список постоянно растёт.

Имеющаяся в Linux поддержка USB устройств достаточно всеобъемлюща, но ряд устройств требуют специальных драйверов, а другие, преимущественно принтеры и сканеры, могут не поддерживаться или поддерживаться лишь частично.

Компьютерные системы могут содержать один или более контроллеров или хабов, предназначенных для подключения USB устройств или другого (внешнего) хаба. Хаб может поддерживать до 7 устройств, которые, в свою очередь, могут иметь дополнительные хабы. Хаб внутри системного блока называется root hub (корневой хаб). Каждая такая звездоподобная топология может поддерживать до 127 хабов или устройств.

Говоря USB порт, мы подразумеваем возможность поддержки USB в компьютере и гнездо для подключения, а не внутренний адрес порта, используемый устройством.

Многослойность USB системы позволяет хосту определить характеристики USB устройства, включая класс, имя производителя, имя устройства, требования к напряжению, скорость, уровень поддержки USB и другие функции.

Модуль поддержки USB устройств в Linux

USB устройства в настоящее время полностью поддерживаются в Linux. Большая часть изменений проявилась в ветке ядра 2.6, хотя определённая поддержка имелась даже в ядрах 2.2. Linux поддерживает как USB 2.0, так и ранние спецификации. Ввиду подключения на лету (горячего подключения), заложенной в самой природе USB, поддержка обычно производится посредством модулей ядра, которые могут загружаться или выгружаться по необходимости.

Команда lspci позволяет отобразить USB устройства:

Root@localhost:~:# lspci | grep -i usb 00:03.0 USB Controller: Silicon Integrated Systems USB 1.1 Controller (rev 0f) 00:03.1 USB Controller: Silicon Integrated Systems USB 1.1 Controller (rev 0f) 00:03.3 USB Controller: Silicon Integrated Systems USB 2.0 Controller

Вывод команды показывает, что в системе имеются 3 USB контроллера.

С помощью команды lsmod можно отобразить загруженные USB модули:

Root@localhost:~:# lsmod | egrep "usb|hci|hid|mouse|Module" Module Size Used by hid_microsoft 3232 0 usbhid 32992 0 hid 39040 2 hid_microsoft,usbhid ohci_hcd 24332 0 psmouse 41644 0 ssb 38464 1 ohci_hcd ehci_hcd 34152 0

Отображение подключенных USB устройств

Сводная информация о подключенных в настоящее время USB устройствах содержится в файле /proc/bus/usb/devices . Вывести её можно следующей командой:

Root@localhost:~:# cat /proc/bus/usb/devices T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 3 B: Alloc= 0/900 us (0%), #Int= 0, #Iso= 0 D: Ver= 1.10 Cls=09(hub) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0001 Rev= 2.06 S: Manufacturer=Linux 2.6.29.6 ohci_hcd S: Product=OHCI Host Controller S: SerialNumber=0000:00:03.1 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 3 B: Alloc= 28/900 us (3%), #Int= 2, #Iso= 0 D: Ver= 1.10 Cls=09(hub) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0001 Rev= 2.06 S: Manufacturer=Linux 2.6.29.6 ohci_hcd S: Product=OHCI Host Controller S: SerialNumber=0000:00:03.0 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=255ms T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=045e ProdID=00db Rev= 1.73 S: Manufacturer=Microsoft S: Product=Natural� Ergonomic Keyboard 4000 C:* #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID) Sub=01 Prot=01 Driver=usbhid E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms I:* If#= 1 Alt= 0 #EPs= 1 Cls=03(HID) Sub=00 Prot=00 Driver=usbhid E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl=10ms T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6 B: Alloc= 0/800 us (0%), #Int= 0, #Iso= 0 D: Ver= 2.00 Cls=09(hub) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0002 Rev= 2.06 S: Manufacturer=Linux 2.6.29.6 ehci_hcd S: Product=EHCI Host Controller S: SerialNumber=0000:00:03.3 C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr= 0mA I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 4 Ivl=256ms

В листинге Spd=480 соответствует шине USB 2.0, а Spd=12 - устройствам USB 1.1. Далее в списке видно, что к системе в настоящее время подключено 1 USB устройство - Microsoft Natural Ergonomic Keyboard 400 (Spd=1.5).

На этой клавиатуре я, естественно, и набираю данный текст.

Иерархию подключения USB устройств позволяет увидеть команда lsusb с опцией -t:

Root@localhost:~:# lsusb -t Bus# 3 `-Dev# 1 Vendor 0x1d6b Product 0x0001 Bus# 2 `-Dev# 1 Vendor 0x1d6b Product 0x0001 `-Dev# 2 Vendor 0x045e Product 0x00db Bus# 1 `-Dev# 1 Vendor 0x1d6b Product 0x0002

Вывод информации о конкретном USB устройстве можно получить следующей командой:

Root@localhost:~:# lsusb -vd 0x045e:0x00db Bus 002 Device 002: ID 045e:00db Microsoft Corp. Natural Ergonomic Keyboard 4000 V1.0 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x045e Microsoft Corp. idProduct 0x00db Natural Ergonomic Keyboard 4000 V1.0 bcdDevice 1.73 iManufacturer 1 Microsoft iProduct 2 Natural� Ergonomic Keyboard 4000 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 59 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 1 Boot Interface Subclass bInterfaceProtocol 1 Keyboard iInterface 0 ** UNRECOGNIZED: 09 21 11 01 00 01 22 3c 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 10 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 ** UNRECOGNIZED: 09 21 11 01 00 01 22 56 00 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 10 Device Status: 0x0000 (Bus Powered)

Подключение USB устройства на лету

Новые системы имеют поддержку подключения USB устройств на лету (горячее подключение), что подразумевает подключение устройства к работающей системе, которая должна:

  • определить тип USB устройства, найти драйвер и запустить его;
  • связать драйвер с устройством;
  • уведомить о USB устройстве другие подсистемы.



В рамках погружения в одну из дисциплин (в процессе обучения по специальности Компбеза) я работал над одним занимательным проектом, который бы мне не хотелось просто похоронить в недрах папки «Универ» на внешнем винчестере.

Сей проект носит название usbrip и представляет собой небольшую консольную опенсорс утилиту для Linux-форензики, а именно для работы с историей подключений USB-устройств. Программа написана на чистом Python 3 (с использованием некоторых сторонних модулей) и не требует зависимостей помимо Python 3.x интерпретатора и нескольких строк из requirements.txt , разрешающихся одной строкой с помощью pip3.

В этом посте я опишу некоторые возможности данного софта и оставлю краткий мануал со ссылкой на источник загрузки.

Снято! (… в смысле Cut!)

Скриншоты

Получение истории подключений съёмных USB-устройств:


Поиск дополнительной информации о USB-устройстве по идентификатору модели (PID"у):

Описание

Как известно, операционные системы на базе GNU/Linux очень трепетно относятся к логированию разного рода событий, и подключение/отключение USB-устройств не является исключением. В совокупности с одним из пунктов UNIX-философии о «текстовых потоках, как универсальных интерфейсах» информацию об артефактах таких событий (с разной степенью подробности) в зависимости от дистрибутива можно обнаружить в одном или нескольких из следующих файлов:
  • /var/log/kern.log* ;
  • /var/log/syslog* ;
  • /var/log/messages* ;
  • /var/log/dmesg* ;
  • /var/log/daemon.log* .
FORENSIC-PROOF даже показывает нам такую картинку на этот счет (немного неполную, но неважно):

Для своей работы usbrip находит универсальные для всех сборок Linux, основанных на Debian (Ubuntu, Linux Mint и др.) и RPM (CentOS, Fedora, openSUSE и др.), лог-файлы, а именно: /var/log/syslog* или /var/log/messages* , парсит их в поисках нужной информации и обликает найденные следы подключений USB-устройств в красивые таблички (или списки - как угодно).

Также usbrip умеет:

  • создавать списки авторизированных (доверенных) устройств в виде JSON-файлов;
  • искать «события-нарушителей» на основе списка доверенных устройств: такие события (подключение/отключение USB), в которых участвовали USB-устройства, не отмеченные как доверенные;
  • искать дополнительную информацию о USB-устройстве по его VID (Vendor ID) и/или PID (Product ID).

Справка

Получить список доступных модулей:

$ python3 usbrip.py -h
Получить список доступных подмодулей для конкретного модуля:

$ python3 usbrip.py <модуль> -h
Получить список доступных опций для конкретного подмодуля:

$ python3 usbrip.py <модуль> <подмодуль> -h

Синтаксис

$ python3 usbrip.py banner $ python3 usbrip.py events history [-q] [-t | -l] [-e] [-n КОЛИЧЕСТВО_СОБЫТИЙ] [-d ДАТА [ДАТА...]] [-c СТОЛБЕЦ [СТОЛБЕЦ...]] [-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]] $ python3 usbrip.py events gen_auth <ВЫХОДНОЙ_ФАЙЛ.JSON> [-q] [-e] [-n КОЛИЧЕСТВО_СОБЫТИЙ] [-d ДАТА [ДАТА...]] [-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]] $ python3 usbrip.py events violations <ВХОДНОЙ_ФАЙЛ.JSON> [-q] [-t | -l] [-e] [-n КОЛИЧЕСТВО_СОБЫТИЙ] [-d ДАТА [ДАТА...]] [-c СТОЛБЕЦ [СТОЛБЕЦ...]] [-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]] $ python3 usbrip.py ids search [-q] [--vid VID] [--pid PID] [--offline] $ python3 usbrip.py ids download [-q]

Опции

Опции, поддерживаемые подмодулями "events history", "events gen_auth", "events violations", "ids search", "ids download": -q, --quiet опустить вывод баннера, информационных (зелёных) сообщений, а также не задавать вопросы по ходу выполнения ##################################################################################### Опции, поддерживаемые подмодулями "events history", "events gen_auth", "events violations": -e, --external искать только съёмные USB-устройства (у которых есть информация об отсоединении) -n КОЛИЧЕСТВО_СОБЫТИЙ, --number КОЛИЧЕСТВО_СОБЫТИЙ количество последних по дате событий, которое будет выведено -d ДАТА [ДАТА...], --date ДАТА [ДАТА...] список дат, по которым будет производится фильтрация событий при поиске -f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...], --file ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...] список лог-файлов (если не указано, поиск истории событий будет произведен по лог-файлам по умолчанию: /var/log/syslog* или /var/log/messages* в зависимости от версии ОС) ##################################################################################### Опции, поддерживаемые подмодулями "events history", "events violations": -t, --table сформировать вывод в виде таблицы (если размера окна терминала не хватает для корректного отображения таблицы, вывод автоматически будет сформирован в виде списка; при указании флага -t вывод будет сформирован в виде таблицы принудительно) -l, --list сформировать вывод в виде списка -c СТОЛБЕЦ [СТОЛБЕЦ...], --column СТОЛБЕЦ [СТОЛБЕЦ...] список столбцов, которые будут использованы при построении таблицы (имеет действие только при формировании вывода в виде таблицы); разрешённые ключи: "conn", "user", "vid", "pid", "prod", "manufact", "serial", "port", "disconn". ##################################################################################### Опции, поддерживаемые подмодулями "ids search", "ids download": --vid VID vendor ID или идентификатор производителя USB-устройства (обычно 4 шестнадцатиричных цифры) --vid PID product ID или идентификатор модели USB-устройства (обычно 4 шестнадцатиричных цифры) --offline если указано, поиск дополнительной информации о USB-устройстве по базе данных идентификаторов будет произведен без предварительного ее (базы) обновления

Примеры использования

Показать историю подключений всех USB-устройств, опуская баннер, информационные (зелёные) сообщения, а также не задавая вопросы по ходу выполнения (-q, --quite), сформировав вывод в виде списка (-l, --list), включив в него 100 последних найденных событий (-n КОЛИЧЕСТВО_СОБЫТИЙ, --number КОЛИЧЕСТВО_СОБЫТИЙ):
$ python3 usbrip.py events history -ql -n 100
Показать историю подключений съёмных USB-устройств (-e, --external), сформировав вывод в форме таблицы с полями (столбцами) «Connected», «VID», «PID», «Disconnected» и «Serial Number» (-c СТОЛБЕЦ [СТОЛБЕЦ...], --column СТОЛБЕЦ [СТОЛБЕЦ...]), отфильтровав поиск по датам (-d ДАТА [ДАТА...], --date ДАТА [ДАТА...]), взяв при этом информацию из внешних лог-файлов (-f ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...], --file ЛОГ_ФАЙЛ [ЛОГ_ФАЙЛ...]):
$ python3 usbrip.py events history -et -c conn vid pid disconn serial -d "Dec 9" "Dec 10" -f /var/log/syslog.1 /var/log/syslog.2.gz
Построить таблицу истории подключений всех USB-устройств и перенаправить вывод в файл для дальнейшего анализа. В том случае, если поток вывода не стандартный stdout ("|" либо ">" к примеру) в выходных данных не будут присутствовать спец. символы, отвечающие за цвет шрифта в терминале, поэтому текстовый файл не будет замусорен нечитаемыми символами. Также нужно отметить, что usbrip использует некоторые UNICODE-константы, поэтому было бы неплохо сразу конвертировать кодировку создаваемого файла в UTF-8 для их корректного отображения (например с помощью encov), а также использовать символы новой строки в Windows-стиле для лучшей переносимости (например с помощью awk):
$ python3 usbrip.py history events -t | awk "{ sub("$", "\r"); print }" > usbrip.txt && enconv -x UTF8 usbrip.txt
Примечание: избавиться от спец. символов, отвечающих за цвет можно и в том случае, если вывод уже был направлен в stdout. Для этого необходимо скопировать полученные данные в новый файл usbrip.txt и добавить еще одну awk -инструкцию:
$ awk "{ sub("$", "\r"); gsub("\\x1B\\[*[ -/]*[@-~]", ""); print }" usbrip.txt && enconv -x UTF8 usbrip.txt
Создать список доверенных устройств в виде JSON-файла (trusted/auth.json), содержащего первые три устройства, подключенные 26-го сентября:
$ python3 usbrip.py events gen_auth trusted/auth.json -n 3 -d "Sep 26"
Поиск среди истории подключений съёмных USB-устройств «событий-нарушителей» на основе списка доверенных устройств (trusted/auth.json) и сформировать вывод в виде таблицы с полями «Connected», «VID» и «PID»:
$ python3 usbrip.py events violations trusted/auth.json -et -c conn vid pid
Поиск дополнительной информации о USB-устройстве на основе его VID"а и PID"а:
$ python3 usbrip.py ids search --vid 0781 --pid 5580
Загрузить/обновить базу данных идентификаторов USB-устройств (источник