Linux-форензика в контексті трекінгу історії підключень USB-пристроїв є важливою складовою розслідування кіберзлочинів. Цей процес дозволяє виявляти і аналізувати діяльність користувачів, що може бути ключовим у визначенні порушень безпеки або несанкціонованого доступу до даних. У статті описано, як за допомогою команд Linux можна відстежувати підключення та відключення USB-пристроїв, а також техніки, які дозволяють детально аналізувати ці дані. Розглядаються як стандартні засоби операційної системи, так і спеціалізоване форензичне програмне забезпечення. Додатково акцентується увага на важливості знання та використання різних інструментів і команд Linux для трекінгу USB-підключень, які можуть виявити потенційні кіберзагрози.
У статті ви знайдете вичерпне дослідження конкретної теми, пов’язаної з технологіями чи програмуванням. Стаття містить поглиблений аналіз, докладні пояснення та, можливо, покрокові вказівки чи приклади, що стосуються теми. Він обслуговує професіоналів або ентузіастів у сфері технологій, пропонуючи ідеї та знання для поглиблення розуміння або вирішення конкретних технічних проблем.
Дисклеймер: Ця стаття створена з ознайомлювальною метою. У ній описано техніки форензики в Linux та методи трекінгу USB-підключень, щоб допомогти читачам зрозуміти ці процеси та дізнатися, як підвищити рівень кібербезпеки.
Сьогодні ми вам розповімо про один дуже цікавий проект. Він носить назву usbrip і є невеликою консольною опенсорс утилітою для Linux-форензики, а саме для роботи з історією підключень USB-пристроїв. Програма написана на чистому Python 3 (з використанням деяких сторонніх модулів) і не вимагає залежностей крім Python 3.x інтерпретатора та пари рядків з requirements.txt , які дозволяються одним рядком за допомогою pip.
Отримання історії підключень знімних 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-пристроїв в красиві таблички (або списки – як завгодно).
Створювати списки авторизованих (довірених) пристроїв у вигляді 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]
Опції, що підтримуються підмодулями '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\\[[0-?]*[ -/]*[@-~]", ""); 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 .