
GNU/Linux에서 USB 이벤트 내역 추적
usbrip ("USB Ripper"에서 유래, "USB R.I.P." 아님)는 Linux 시스템에서 USB 장치 아티팩트(즉, USB 이벤트 기록)를 추적할 수 있는 간단한 포렌식 도구로 명령줄 인터페이스를 제공합니다.
목차:
usbrip은 Linux 로그 데이터(journalctl 출력 또는 /var/log/syslog* (또는 /var/log/messages*) 파일 내용)를 분석하는 작은 소프트웨어입니다. 수집된 데이터를 기반으로 usbrip은 다음 열로 USB 이벤트 기록 테이블을 작성할 수 있습니다:
또한 다음 작업도 가능합니다:
-s 플래그로 설치된 경우* cron 스케줄러를 사용하여 USB 이벤트를 자동으로 백업하고 누적하는 보호된 스토리지(7-Zip 아카이브)를 생성합니다.방법 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$ 접두사가 나타나는 모든 명령은 git clone 결과로 생성된 ~/usbrip 디렉토리에서 실행된다고 가정합니다:
~$ git clone https://github.com/snovvcrash/usbrip
~$ cd usbrip
~/usbrip$ pwd
install.shpip로 설치하는 것 외에도 사용자 정의 installers/install.sh 스크립트로 usbrip을 설치할 수 있습니다.
install.sh를 사용하면 몇 가지 추가 기능을 사용할 수 있습니다:
storage 모듈을 사용할 수 있습니다 – cron 작업을 설정하여 USB 이벤트를 정기적으로 백업합니다 (cron 작업 예제는 usbrip/cron/usbrip.cron에서 찾을 수 있습니다).⚠️ 경고: cron 스케줄링을 사용하는 경우 storage update 하위 모듈을 root로 실행하려면 sudo crontab -e로 crontab을 구성해야 합니다. 스토리지 비밀번호는 /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 의존성이 PyPI 대신 로컬 .tar 패키지(3rdPartyTools 디렉토리)에서 확인됩니다.-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 작업을 설정한 경우 해당 작업도 제거하는 것을 잊지 마십시오.
# ---------- 배너 ----------
~$ usbrip banner
usbrip 배너를 표시합니다.
# ---------- 이벤트 ----------
~$ usbrip events history [-t | -l] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [-c <열> [<열> ...]] [-f <파일> [<파일> ...]] [-q] [--debug]
USB 이벤트 기록을 가져옵니다.
~$ usbrip events open <덤프.JSON> [-t | -l] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [-c <열> [<열> ...]] [-q] [--debug]
USB 이벤트 덤프를 엽니다.
~$ sudo usbrip events genauth <출력_AUTH.JSON> [-a <속성> [<속성> ...]] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [-f <파일> [<파일> ...]] [-q] [--debug]
신뢰할 수 있는 (승인된) USB 장치 목록을 생성합니다.
~$ sudo usbrip events violations <입력_AUTH.JSON> [-a <속성> [<속성> ...]] [-t | -l] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [-c <열> [<열> ...]] [-f <파일> [<파일> ...]] [-q] [--debug]
신뢰할 수 있는 장치 목록을 기반으로 USB 위반 이벤트를 가져옵니다.
# ---------- 스토리지 ----------
~$ sudo usbrip storage list <스토리지_유형> [-q] [--debug]
선택한 스토리지의 내용을 나열합니다. STORAGE_TYPE은 "history" 또는 "violations"입니다.
~$ sudo usbrip storage open <스토리지_유형> [-t | -l] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [-c <열> [<열> ...]] [-q] [--debug]
선택한 스토리지를 엽니다. EVENTS OPEN 하위 모듈과 유사하게 동작합니다.
~$ sudo usbrip storage update <스토리지_유형> [입력_AUTH.JSON] [-a <속성> [<속성> ...]] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [--lvl <압축_수준>] [-q] [--debug]
스토리지를 업데이트합니다 — 기존 스토리지에 USB 이벤트를 추가합니다. COMPRESSION_LEVEL은 [0..9] 범위의 숫자입니다.
~$ sudo usbrip storage create <스토리지_유형> [입력_AUTH.JSON] [-a <속성> [<속성> ...]] [-e] [-n <이벤트_수>] [-d <날짜> [<날짜> ...]] [--host <호스트> [<호스트> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <제품> [<제품> ...]] [--manufact <제조업체> [<제조업체> ...]] [--serial <일련번호> [<일련번호> ...]] [--port <포트> [<포트> ...]] [--lvl <압축_수준>] [-q] [--debug]
스토리지를 생성합니다 — 7-Zip 아카이브를 만들고 선택한 옵션에 따라 USB 이벤트를 추가합니다.
~$ sudo usbrip storage passwd <스토리지_유형> [--lvl <압축_수준>] [-q] [--debug]
기존 스토리지의 비밀번호를 변경합니다.
# ---------- ID ----------
~$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
USB ID 데이터베이스에서 <VID> 및/또는 <PID>로 특정 USB 장치에 대한 추가 세부 정보를 가져옵니다.
~$ usbrip ids download [-q] [--debug]
USB ID 데이터베이스를 업데이트 (다운로드)합니다.
모듈 이름 목록을 보려면 다음을 사용합니다:
~$ usbrip -h
특정 모듈의 하위 모듈 이름 목록을 보려면 다음을 사용합니다:
~$ usbrip <모듈> -h
특정 하위 모듈의 모든 스위치 목록을 보려면 다음을 사용합니다:
~$ usbrip <모듈> <하위모듈> -h
배너 출력, 정보 메시지 및 사용자 상호작용을 억제하고 (-q, --quiet), 목록으로 표시하며 (-l, --list), 최신 100개 항목 (-n NUMBER, --number NUMBER)으로 모든 USB 장치의 이벤트 기록을 표시합니다:
~$ usbrip events history -ql -n 100
외부 USB 장치 (-e, --external, 실제로 분리된 장치)의 이벤트 기록을 테이블로 표시하며 (-t, --table), Connected, VID, PID, Disconnected 및 Serial Number 열을 포함하고 (-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). 여러 필터를 동시에 적용하면 다음과 같은 동작이 발생합니다: 먼저 외부 및 날짜별 필터가 적용된 다음, usbrip은 마지막 두 필터의 교집합에서 지정된 필드 값을 검색하고, 마지막으로 -n 옵션으로 정의된 수로 출력을 자릅니다. 따라서 외부 및 날짜별 필터링의 경우 교집합, 필드별 필터링의 경우 합집합으로 생각하십시오. 이해가 되길 바랍니다.
모든 USB 장치의 이벤트 기록을 작성하고 추가 분석을 위해 출력을 파일로 리디렉션합니다. 출력 스트림이 터미널 표준 출력이 아닌 경우 (| 또는 > 예) 출력에는 ANSI 이스케이프 문자(색상)가 없으므로 그렇게 사용해도 됩니다. 또한 usbrip은 일부 UNICODE 기호를 사용하므로 결과 파일을 UTF-8 인코딩으로 변환하고(예: enconv 사용) 이식성을 위해 개행 문자를 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
VID 및 PID 속성을 사용하여 1984년 11월 30일에 연결된 처음 세 개의 장치를 포함하는 신뢰할 수 있는 USB 장치 목록을 JSON 파일(trusted/auth.json)로 생성합니다:
~$ sudo usbrip events genauth trusted/auth.json -a vid pid -n 3 -d '1984-11-30'
⚠️ 경고: 다른 USB 플래시 드라이브가 동일한 일련번호를 가질 수 있는 경우가 있습니다. 이는 제조 오류로 인해 발생하거나, 악의적인 사용자가 드라이브의 메모리 칩을 다시 작성할 수 있었던 경우(일회성 프로그래밍이 아닌 경우 등) 발생할 수 있습니다. 어쨌든 "어떤 시스템도 안전하지 않습니다". usbrip은 현재 이러한 경우를 지능적으로 처리하지 않습니다. 즉, 동일한 SN을 가진 장치 쌍(존재하는 경우)은 신뢰할 수 있는 장치 목록과 genauth 모듈에 관해 동일한 장치로 취급됩니다.
신뢰할 수 있는 USB 장치 목록(trusted/auth.json)을 기반으로 외부 USB 장치의 이벤트 기록에서 PID 속성별로 위반을 검색하고, 결과 이벤트를 호스트 이름이 Bob-PC, 제조업체가 EvilUSBManufacturer, 일련번호가 0123456789인 것으로 제한하며, 출력을 Connected, 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