diff --git a/README.md b/README.md index e69de29..469725e 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,62 @@ +# usbSearch + +`usbSearch` — bash-скрипт для **поиска и анализа событий подключения USB-устройств** в системе Linux. +Работает **универсально**: автоматически определяет, используется ли `systemd (journalctl)` или классические лог-файлы `/var/log`. + +Проект полезен для: + +* forensic / incident response +* аудита подключаемых USB-устройств +* серверов и рабочих станций +* систем без GUI + +--- + +## Использование + +### Дать права на исполнение + +```bash +sudo chmod +x usbSearch.sh +``` + +### Запуск от root (рекомендуется) + +```bash +sudo ./usbSearch.sh +``` + +--- + +## Как это работает + +1. Скрипт проверяет: + + * доступен ли `journalctl` + * есть ли доступ к журналу systemd +2. Если **systemd доступен**: + + * используется `journalctl -k` +3. Если **systemd недоступен**: + + * анализируются файлы `/var/log/kern.log*` +4. Из логов извлекаются события: + + * `New USB device found` + * `Product` + * `Manufacturer` + * `SerialNumber` + * `USB Mass Storage` + +--- + +## Пример вывода + +``` +----------------------------------------------------------- +Дата: Sep 12 14:33:21 | VID:0781 PID:5567 +Дата: Sep 12 14:33:21 | Manufacturer: SanDisk +Дата: Sep 12 14:33:21 | Product: Cruzer Blade +Дата: Sep 12 14:33:21 | SerialNumber: 4C530001230915117293 +Дата: Sep 12 14:33:22 | USB Mass Storage device +``` diff --git a/usbsearch.sh b/usbsearch.sh new file mode 100644 index 0000000..2a14045 --- /dev/null +++ b/usbsearch.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +PATTERN='New USB device found|Product:|Manufacturer:|SerialNumber:|USB Mass Storage' + +clear +echo -e "\e[1;32m" +cat <<'EOF' + _ __ _ + /\ /\ ___| |__ / _\ ___ __ _ _ __ ___| |__ +/ / \ \/ __| '_ \\ \ / _ \/ _` | '__/ __| '_ \ +\ \_/ /\__ \ |_) |\ \ __/ (_| | | | (__| | | | + \___/ |___/_.__/\__/\___|\__,_|_| \___|_| |_| +EOF +echo -e "\e[0m" + +############################################################################### +# Определение источника логов +############################################################################### +if command -v journalctl >/dev/null 2>&1 && \ + journalctl --no-pager -n 1 >/dev/null 2>&1 +then + SOURCE="journalctl" +else + SOURCE="files" +fi + +############################################################################### +# Функция парсинга (общая для всех источников) +############################################################################### +parse_usb() { +awk ' +{ + idx=1 + while ($idx != "New" && + $idx != "Product:" && + $idx != "Manufacturer:" && + $idx != "SerialNumber:" && + $idx != "Mass" && idx != NF) { + idx++ + } + + if ($idx == "New") { + print("\033[35m-----------------------------------------------------------\033[0m") + } + + if ($idx == "Mass") { + printf("\033[1;33m") + } + + printf("Дата: %s %s %s | ", $1, $2, $3) + + if ($idx == "New") { + printf("VID:%s PID:%s\n", substr($(idx + 4), 10, 4), substr($(idx + 5), 11, 4)) + } + else if ($idx == "Mass") { + printf("USB Mass Storage device\n\033[0m") + } + else { + while ($(idx-1) != $NF) { + printf("%s ", $idx) + idx++ + } + printf("\n") + } +}' +} + +############################################################################### +# journalctl +############################################################################### +if [[ "$SOURCE" == "journalctl" ]] +then + echo -e "\e[1;34m--------------------- journalctl ---------------------\e[0m" + + journalctl -k \ + --no-pager \ + --output=short \ + | grep -E "$PATTERN" \ + | parse_usb + +############################################################################### +# Legacy logs (/var/log) +############################################################################### +else + LOG_PATH=/var/log + LOG_BASE="kern.log" + LOG_LIST=$(find "$LOG_PATH" -type f -name "$LOG_BASE*") + + for doc in $LOG_LIST + do + echo -e "\e[1;34m--------------------- File $doc ---------------------\e[0m" + + if [[ "${doc##*.}" == "gz" ]] + then + CMD=zgrep + else + CMD=grep + fi + + $CMD -E "$PATTERN" "$doc" | parse_usb + done +fi