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