usbrip(名称源自“USB Ripper”,而非“USB R.I.P.”)是一款简单的命令行取证工具,可让您跟踪 Linux 机器上的 USB 设备痕迹(即 USB 事件历史)。
目录:
usbrip 是一款小型软件,用于分析 Linux 日志数据:journalctl 输出或 /var/log/syslog*(或 /var/log/messages*)文件的内容。基于收集的数据,usbrip 可以构建 USB 事件历史表格,包含以下列:
此外,它还可以:
-s 标志安装时* 创建受保护的存储(7-Zip 归档),以借助 cron 调度器自动备份和累积 USB 事件。方式 1. 使用 pip 安装:
~$ sudo -H python3 -m pip install -U usbrip
~$ usbrip -h
方式 2. 使用 install.sh 安装最新版(推荐,提供额外功能):
~$ sudo apt install python3-venv p7zip-full -y
~$ git clone https://github.com/snovvcrash/usbrip && cd usbrip
~/usbrip$ sudo -H installers/install.sh
~/usbrip$ cd
~$ usbrip -h

Docker (*仅作演示!*)
~$ docker run --rm -it snovvcrash/usbrip
usbrip 支持在系统日志文件中解析两种类型的时间戳:
"%b %d %H:%M:%S",例如 "Jan 1 00:00:00")。此类时间戳不提供年份信息。"%Y-%m-%dT%H:%M:%S.%f%z",例如 "1970-01-01T00:00:00.000000-00:00")。如果您已安装 journalctl,则无需担心,因为它可以动态转换时间戳。否则,可以通过在 rsyslog 配置中设置 RSYSLOG_FileFormat 格式来实现所需的 syslog 结构。
/etc/rsyslog.conf 中注释掉以下行:$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
.conf 文件:~$ echo '$ActionFileDefaultTemplate RSYSLOG_FileFormat' | sudo tee /etc/rsyslog.d/usbrip.conf
~$ sudo rm -f /var/log/syslog* /var/log/messages*
~$ sudo systemctl restart rsyslog
首先,usbrip 会检查是否可以使用 journalctl 转储系统事件(作为最便携的选项)。如果不能,它将搜索并解析 /var/log/syslog* 或 /var/log/messages* 系统日志文件。
storage 模块使用)为简便起见,我们约定所有带有 ~/usbrip$ 前缀的命令都在 ~/usbrip 目录下执行,该目录由 git clone 创建:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.sh除了使用 pip 安装外,usbrip 还可以通过自定义的 installers/install.sh 脚本来安装。
使用 install.sh 时,会启用一些额外功能:
storage 模块 – 设置 cron 任务以按计划备份 USB 事件(cron 任务示例可在 usbrip/cron/usbrip.cron 中找到)。⚠️ 警告: 如果您使用 cron 调度,则需要使用 sudo crontab -e 配置 crontab,以强制 storage update 子模块以 root 身份运行。存储密码保存在 /var/opt/usbrip/usbrip.ini 中,默认情况下仅 root 可访问。
要使用 install.sh 安装 usbrip,请运行:
~/usbrip$ sudo -H installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h
-l 开关时,Python 依赖项将从本地 .tar 包(3rdPartyTools 目录)中解析,而非 PyPI。-s 开关时,不仅安装 usbrip 项目,还会创建受信任的 USB 设备列表、历史记录和违规存储。安装完成后,可以删除 ~/usbrip 目录。
使用 install.sh 安装后,usbrip 使用以下路径:
/opt/usbrip/ – 项目主目录。/var/opt/usbrip/log/ – usbrip cron 日志。/var/opt/usbrip/storage/ – USB 事件存储(history.7z 和 violations.7z,在安装过程中创建)。/var/opt/usbrip/trusted/ – 受信任 USB 设备列表(auth.json,在安装过程中创建)。/var/opt/usbrip/usbrip.ini – usbrip 配置文件(包含 7-Zip 存储的密码)。/usr/local/bin/usbrip – 指向 /opt/usbrip/venv/bin/usbrip 脚本的符号链接。可以按如下方式设置 cron 任务:
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron
uninstall.shinstallers/uninstall.sh 脚本可从系统中移除 usbrip 及所有安装产物。
要卸载 usbrip,请运行:
~/usbrip$ sudo installers/uninstall.sh [-a/--all]
-a 开关时,不仅删除 usbrip 项目目录,还会删除所有存储和 usbrip 日志。如果您之前设置了 cron 任务,请不要忘记将其移除。
# ---------- BANNER ----------
~$ usbrip banner
获取 usbrip 横幅。
# ---------- EVENTS ----------
~$ usbrip events history [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
获取 USB 事件历史。
~$ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
打开 USB 事件转储。
~$ sudo usbrip events genauth <OUT_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
生成受信任(授权)USB 设备列表。
~$ sudo usbrip events violations <IN_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
基于受信任设备列表获取 USB 违规事件。
# ---------- STORAGE ----------
~$ sudo usbrip storage list <STORAGE_TYPE> [-q] [--debug]
列出所选存储的内容。STORAGE_TYPE 为 "history" 或 "violations"。
~$ sudo usbrip storage open <STORAGE_TYPE> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
打开所选存储。行为类似于 EVENTS OPEN 子模块。
~$ sudo usbrip storage update <STORAGE_TYPE> [IN_AUTH.JSON] [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
更新存储 – 将 USB 事件添加到现有存储中。COMPRESSION_LEVEL 为 [0..9] 之间的数字。
~$ sudo usbrip storage create <STORAGE_TYPE> [IN_AUTH.JSON] [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--host <HOST> [<HOST> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
创建存储 – 创建 7-Zip 归档,并根据所选选项将 USB 事件添加到其中。
~$ sudo usbrip storage passwd <STORAGE_TYPE> [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
更改现有存储的密码。
# ---------- IDs ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
从 USB ID 数据库中获取特定 USB 设备(通过 <VID> 和/或 <PID>)的额外详细信息。
~$ usbrip ids download [-q] [--debug]
更新(下载)USB ID 数据库。
要获取模块名称列表,请使用:
~$ usbrip -h
要获取特定模块的子模块名称列表,请使用:
~$ usbrip <MODULE> -h
要获取特定子模块的所有开关列表,请使用:
~$ usbrip <MODULE> <SUBMODULE> -h
显示所有 USB 设备的事件历史,抑制横幅输出、信息消息和用户交互(-q, --quiet),以列表形式(-l, --list)显示最新的 100 条记录(-n NUMBER, --number NUMBER):
~$ usbrip events history -ql -n 100
显示外部 USB 设备(-e, --external,即实际断开连接的设备)的事件历史,以表格形式(-t, --table)显示,包含连接时间、VID、PID、断开时间和序列号列(-c COLUMN [COLUMN ...], --column COLUMN [COLUMN ...]),按日期(-d DATE [DATE ...], )和 PID()过滤,日志取自外部文件(, ):
--date DATE [DATE ...]--pid <PID> [<PID> ...]-f FILE [FILE ...]--file FILE [FILE ...]~$ usbrip events history -et -c conn vid pid disconn serial -d '1995-09-15' '2018-07-01' --pid 1337 -f /var/log/syslog.1 /var/log/syslog.2.gz
👽 注意: 使用过滤器时有一件事需要记住。有 4 种类型的过滤可用:仅外部 USB 事件(易于拔出的设备,-e)、按日期(-d)、按字段(--host, --vid, --pid, --product, --manufact, --serial, --port)以及按输出条目数(-n)。当同时应用不同过滤器时,您将得到以下行为:首先应用外部和按日期过滤器,然后在后两个过滤器的交集中搜索指定的字段值,最后将输出截断为您通过 -n 选项定义的数量。因此,可以将其视为外部和按日期过滤的交集,以及按字段过滤的并集。希望这说得通。
构建所有 USB 设备的事件历史并将输出重定向到文件以供进一步分析。当输出流不是终端 stdout(例如使用 | 或 >)时,输出中不会出现 ANSI 转义字符(颜色),因此可以放心使用。另外请注意,usbrip 使用了一些 UNICODE 符号,因此最好将结果文件转换为 UTF-8 编码(例如使用 encov),并将换行符转换为 Windows 风格以保持可移植性(例如使用 awk):
~$ usbrip events history -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out
👽 注意: 即使您已经将输出发送到 stdout,也可以随时自行去除转义字符。只需将输出数据复制到 usbrip.out 并应用另一个 awk 指令:
~$ awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out
生成受信任 USB 设备列表作为 JSON 文件(trusted/auth.json),包含 VID 和 PID 属性,仅包含 1984 年 11 月 30 日插入的前三个设备:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ 警告: 有时不同 U 盘可能具有相同的序列号。这可能是由于制造错误或某些黑帽重写了驱动器的存储芯片(结果发现并非一次性可编程)等原因造成的。无论如何,“没有系统是安全的”。目前 usbrip 没有以智能方式处理此类情况,即它将具有相同 SN 的一对设备(如果存在)视为同一设备,在受信任设备列表和 genauth 模块中也是。
基于受信任 USB 设备列表(trusted/auth.json),按 PID 属性搜索外部 USB 设备的事件历史中的违规行为,将结果事件限制为那些主机名为 Bob-PC、制造商为 EvilUSBManufacturer、序列号为 0123456789 的事件,并以表格形式输出,显示连接时间、VID 和 PID 列:
~$ sudo usbrip events violations trusted/auth.json -a pid -et --host Bob-PC --manufact EvilUSBManufacturer --serial 0123456789 -c conn vid pid
通过 VID(--vid VID)和 PID(--pid PID)搜索特定 USB 设备的详细信息:
~$ usbrip ids search --vid 0781 --pid 5580
下载最新版本的 usb.ids 数据库:
~$ usbrip ids download