update
This commit is contained in:
parent
8ef373349f
commit
c75e7a6ea5
62
README.md
62
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
|
||||
```
|
||||
102
usbsearch.sh
Normal file
102
usbsearch.sh
Normal file
|
|
@ -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
|
||||
Loading…
Reference in New Issue
Block a user