Anthropic-Cybersecurity-Skills 实战:Windows USB 设备连接历史取证分析指南
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
本文是 Anthropic-Cybersecurity-Skills 仓库中analyzing-usb-device-connection-history技能(Skill)的深度实战指南。该技能属于数字取证(Digital Forensics)子域,聚焦于通过关联 Windows 注册表键(USBSTOR、MountedDevices、MountPoints2)、事件日志(System、Security、DriverFrameworks-UserMode)与setupapi.dev.log,完整重建 USB 设备的连接历史、首次/末次插入时间戳与盘符映射。读完本文后,你将掌握一套可直接落地的手工取证工作流,以及基于本仓库 agent.py 的自动化解析能力,可应用于可移动介质数据泄露调查、内部威胁追踪、合规审计与设备溯源场景。
何时使用本技能
根据 SKILL.md 的定位,本技能在以下场景中价值最高:
- 调查经由可移动存储设备(U 盘、移动硬盘)实施的数据泄露(Exfiltration)事件;
- 内部威胁调查中追踪特定用户的 USB 设备使用情况;
- 合规审计中验证可移动介质管控策略(removable media policy)是否得到执行;
- 将 USB 连接事件与文件访问、复制事件进行关联取证;
- 在应急响应中建立完整的设备连接时间线。
在 MITRE ATT&CK 视角下,本技能覆盖了T1052.001(Exfiltration Over Physical Medium: Exfiltration over USB)、T1025(Data from Removable Media)、T1091(Replication Through Removable Media)、T1005(Data from Local System)与T1074.001(Data Staged: Local Data Staging);在 NIST CSF 2.0 上对应RS.AN-03、DE.AE-02、RS.MA-01(见 SKILL.md 的 frontmatter 与仓库 ATTACK_COVERAGE.md 的技术映射体系)。
前置条件
- 取证镜像(forensic image),或已提取的注册表配置单元(hives)与事件日志;
- 可访问SYSTEM、SOFTWARE、NTUSER.DAT注册表配置单元;
- SetupAPI 日志(
setupapi.dev.log,用于首次连接时间戳); - Windows 事件日志(System、Security、DriverFrameworks-UserMode);
- 工具:USBDeview、USB Forensic Tracker、RegRipper;
- 理解 USB 设备标识体系:VID(Vendor ID)、PID(Product ID)、序列号(serial number)。
取证工作流总览
完整的分析流程分为五个步骤,前四步分别从不同证据源提取信息,第五步汇总为统一时间线:
- 提取 USB 相关取证产物(挂载镜像、拷贝配置单元/日志);
- 解析USBSTOR注册表键(设备清单与末次连接时间);
- 提取MountedDevices盘符映射与MountPoints2用户关联;
- 从setupapi.dev.log与事件日志提取首次连接时间戳;
- 汇总构建 USB 活动时间线并输出报告。
提示:完整操作应始终在取证镜像的只读副本上进行,本技能提供的工作流以
mount -o ro,loop只读挂载为起点。
Step 1:提取 USB 相关取证产物
对取证镜像进行只读挂载后,将关键证据文件拷贝到案件工作目录。挂载时需根据镜像的分区起始扇区计算偏移(示例中为2048*512,即标准 1 MiB 对齐):
# Mount forensic image and copy relevant artifacts mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence mkdir -p /cases/case-2024-001/usb/ # Registry hives cp /mnt/evidence/Windows/System32/config/SYSTEM /cases/case-2024-001/usb/ cp /mnt/evidence/Windows/System32/config/SOFTWARE /cases/case-2024-001/usb/ cp /mnt/evidence/Users/*/NTUSER.DAT /cases/case-2024-001/usb/ # SetupAPI logs (first connection timestamps) cp /mnt/evidence/Windows/INF/setupapi.dev.log /cases/case-2024-001/usb/ # Event logs cp /mnt/evidence/Windows/System32/winevt/Logs/System.evtx /cases/case-2024-001/usb/ cp "/mnt/evidence/Windows/System32/winevt/Logs/Microsoft-Windows-DriverFrameworks-UserMode%4Operational.evtx" \ /cases/case-2024-001/usb/ 2>/dev/null cp "/mnt/evidence/Windows/System32/winevt/Logs/Microsoft-Windows-Partition%4Diagnostic.evtx" \ /cases/case-2024-001/usb/ 2>/dev/null本技能原文档 SKILL.md 中明确说明:事件日志的Microsoft-Windows-DriverFrameworks-UserMode%4Operational.evtx与Microsoft-Windows-Partition%4Diagnostic.evtx路径在部分系统中不存在,拷贝命令后附加了2>/dev/null以容忍缺失,这保证了工作流在差异化 Windows 环境中的健壮性。
Step 2:解析 USBSTOR 注册表键
USBSTOR是 SYSTEM 配置单元中存储 USB 大容量存储设备标识与连接数据的核心键。其枚举路径结构为:
ControlSet00X\Enum\USBSTOR\Disk&Ven_厂商&Prod_产品&Rev_修订\序列号注意:必须先读取Select键中的Current值确定当前 ControlSet(通常是 ControlSet001),否则可能解析到非活动配置单元。
使用python-registry(Registry模块)解析的完整脚本如下:
python3 << 'PYEOF' from Registry import Registry import json reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM") # Find current ControlSet select = reg.open("Select") current = select.value("Current").value() controlset = f"ControlSet{current:03d}" # Parse USBSTOR usbstor_path = f"{controlset}\\Enum\\USBSTOR" usbstor = reg.open(usbstor_path) devices = [] print("=== USBSTOR DEVICES ===\n") for device_class in usbstor.subkeys(): # Format: Disk&Ven_VENDOR&Prod_PRODUCT&Rev_REVISION class_name = device_class.name() parts = class_name.split('&') vendor = parts[1].replace('Ven_', '') if len(parts) > 1 else 'Unknown' product = parts[2].replace('Prod_', '') if len(parts) > 2 else 'Unknown' revision = parts[3].replace('Rev_', '') if len(parts) > 3 else 'Unknown' for instance in device_class.subkeys(): serial = instance.name() last_write = instance.timestamp() device_info = { 'vendor': vendor, 'product': product, 'revision': revision, 'serial': serial, 'last_connected': str(last_write), } # Get friendly name if available try: friendly = instance.value("FriendlyName").value() device_info['friendly_name'] = friendly except: pass # Get device parameters try: params = instance.subkey("Device Parameters") try: device_info['class_guid'] = params.value("ClassGUID").value() except: pass except: pass devices.append(device_info) print(f"Device: {vendor} {product}") print(f" Serial: {serial}") print(f" Last Connected: {last_write}") print(f" Friendly Name: {device_info.get('friendly_name', 'N/A')}") print() # Save results with open('/cases/case-2024-001/analysis/usb_devices.json', 'w') as f: json.dump(devices, f, indent=2) print(f"\nTotal USB storage devices found: {len(devices)}") PYEOF关键点:
- 设备类名解析:
Disk&Ven_Kingston&Prod_DataTraveler_3.0&Rev_PMAP这类名称按&拆分后,分别对应厂商、产品、修订号; - 末次连接时间:取自实例键的最后写入时间戳(
instance.timestamp()),这是 USBSTOR 能提供的"末次连接"证据; - FriendlyName:人类可读的设备名称,用于与采购/白名单记录比对;
- ClassGUID:位于
Device Parameters子键,用于进一步归类设备。
仓库中的 agent.py(第 12-42 行parse_usbstor)将该逻辑封装为可复用函数,且改用regipy库实现同样的遍历:RegistryHive打开 SYSTEM →Select键读取Current→iter_subkeys()遍历设备类与实例 → 从instance.header.last_modified获取末次连接时间戳。可见原文档的解析思路与仓库参考实现(api-reference.md 中的 regipy 示例)完全一致,仅是库 API 不同。
Step 3:提取盘符映射与用户关联
USBSTOR 只告诉我们"什么设备被插过",还需回答"插到哪个盘符"和"哪个用户用过"。这一步分别由MountedDevices与MountPoints2承担。
MountedDevices:盘符到设备的映射
python3 << 'PYEOF' from Registry import Registry import struct reg = Registry.Registry("/cases/case-2024-001/usb/SYSTEM") mounted = reg.open("MountedDevices") print("=== MOUNTED DEVICES (Drive Letter Assignments) ===\n") for value in mounted.values(): name = value.name() data = value.value() if name.startswith("\\DosDevices\\"): drive_letter = name.replace("\\DosDevices\\", "") if len(data) > 24: # USB device - contains device path string try: device_path = data.decode('utf-16-le').strip('\x00') if 'USBSTOR' in device_path or 'USB#' in device_path: print(f" {drive_letter} -> {device_path}") except: pass else: # Fixed disk - contains disk signature + offset disk_sig = struct.unpack('<I', data[0:4])[0] offset = struct.unpack('<Q', data[4:12])[0] print(f" {drive_letter} -> Disk Signature: 0x{disk_sig:08X}, Offset: {offset}") PYEOF解析要点:
- 值名
\DosDevices\E:中的盘符即设备挂载盘符; - 数据长度 > 24 字节的值通常是 USB 设备,其内容为 UTF-16LE 编码的设备路径字符串,可通过包含
USBSTOR或USB#判定为 USB 设备; - 长度 ≤ 24 字节的值对应固定磁盘,内容是 4 字节磁盘签名 + 8 字节分区偏移(因此需要
struct.unpack按<I与<Q解包)。
MountPoints2:哪个用户访问了哪些卷
python3 << 'PYEOF' from Registry import Registry import os, glob print("\n=== USER MOUNT POINTS (MountPoints2) ===\n") for ntuser in glob.glob("/cases/case-2024-001/usb/NTUSER*.DAT"): try: reg = Registry.Registry(ntuser) mp2 = reg.open("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2") print(f"User hive: {os.path.basename(ntuser)}") for key in mp2.subkeys(): guid = key.name() last_write = key.timestamp() if '{' in guid: print(f" Volume: {guid} | Last accessed: {last_write}") print() except Exception as e: print(f" Error parsing {ntuser}: {e}") PYEOF由于 MountPoints2 位于每个用户各自的NTUSER.DAT中,脚本通过glob遍历所有用户配置单元,从而建立"设备卷 GUID → 用户 → 访问时间"的关联。这正是将设备与具体嫌疑人(用户)关联起来的关键证据链。
仓库参考文档 api-reference.md 汇总了本技能涉及的四个核心注册表路径,可作为手工分析的速查表:
| 路径 | 配置单元 | 说明 |
|---|---|---|
ControlSet00X\Enum\USBSTOR | SYSTEM | USB 大容量存储设备标识符 |
MountedDevices | SYSTEM | 盘符到设备的映射 |
ControlSet00X\Enum\USB | SYSTEM | 所有 USB 设备(不限于存储) |
Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 | NTUSER.DAT | 按用户的卷访问历史 |
Step 4:提取首次连接时间戳
USBSTOR 只提供末次连接时间,首次连接时间需要从 SetupAPI 日志与事件日志中获取。
SetupAPI:首次安装时间
python3 << 'PYEOF' import re print("=== SETUPAPI USB DEVICE INSTALLATIONS ===\n") with open('/cases/case-2024-001/usb/setupapi.dev.log', 'r', errors='ignore') as f: content = f.read() # Find USB device installation sections pattern = r'>>>\s+\[Device Install.*?\n.*?Section start (\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}).*?\n(.*?)<<<' matches = re.findall(pattern, content, re.DOTALL) usb_installs = [] for timestamp, section in matches: if 'USBSTOR' in section or 'USB\\VID' in section: # Extract device ID dev_match = re.search(r'(USBSTOR\\[^\s]+|USB\\VID_\w+&PID_\w+[^\s]*)', section) if dev_match: device_id = dev_match.group(1) usb_installs.append({ 'first_install': timestamp, 'device_id': device_id }) print(f" {timestamp} | {device_id}") print(f"\nTotal USB installations found: {len(usb_installs)}") PYEOF正则逻辑说明:匹配>>> [Device Install ...] Section start 时间戳 ... <<<格式的安装段,再在段内查找USBSTOR\...或USB\VID_...&PID_...设备 ID,从而得到该设备首次被系统识别并安装驱动的时间。
事件日志:连接/拔出事件
python3 << 'PYEOF' import json from evtx import PyEvtxParser try: parser = PyEvtxParser("/cases/case-2024-001/usb/System.evtx") print("\n=== SYSTEM EVENT LOG USB EVENTS ===\n") for record in parser.records_json(): data = json.loads(record['data']) event_id = str(data['Event']['System']['EventID']) # USB device connection events if event_id in ('20001', '20003', '10000', '10100'): timestamp = data['Event']['System']['TimeCreated']['#attributes']['SystemTime'] event_data = data['Event'].get('UserData', data['Event'].get('EventData', {})) print(f" [{timestamp}] EventID {event_id}: {json.dumps(event_data, default=str)[:200]}") except Exception as e: print(f"Error: {e}") PYEOF需要关注的事件 ID 汇总(本技能原文档明确列出):
| 事件源 | 事件 ID | 含义 |
|---|---|---|
| DriverFrameworks-UserMode | 2003、2010、2100、2102 | USB 设备驱动安装/启停相关 |
| Security | 6416 | 识别到新的外部设备(外接设备审计) |
| System | 20001、20003、10000、10100 | USB 插拔相关连接事件 |
结合仓库 agent.py 中的parse_setupapi_log(第 85-100 行)可见,自动化实现使用了相同的正则模式(>>>\s+\[Device Install...与Section start),说明该正则模式在仓库实现中已被验证为有效。这样手工脚本与仓库 Agent 代码形成互相印证,读者可以放心复用。
Step 5:构建 USB 活动时间线与报告
将前四步证据汇总为统一时间线,输出 CSV 供后续分析工具(如 Excel、Splunk、Timesketch)使用:
python3 << 'PYEOF' import json, csv timeline = [] # Load USBSTOR data with open('/cases/case-2024-001/analysis/usb_devices.json') as f: devices = json.load(f) for device in devices: timeline.append({ 'timestamp': device['last_connected'], 'source': 'USBSTOR Registry', 'device': f"{device['vendor']} {device['product']}", 'serial': device['serial'], 'event': 'Last Connected', 'detail': device.get('friendly_name', '') }) # Sort chronologically timeline.sort(key=lambda x: x['timestamp']) # Write timeline CSV with open('/cases/case-2024-001/analysis/usb_timeline.csv', 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=['timestamp', 'source', 'device', 'serial', 'event', 'detail']) writer.writeheader() writer.writerows(timeline) print(f"USB Timeline: {len(timeline)} events written to usb_timeline.csv") # Print summary print("\n=== USB DEVICE SUMMARY ===") for entry in timeline: print(f" {entry['timestamp']} | {entry['device']} | {entry['serial'][:20]} | {entry['event']}") PYEOF仓库 agent.py 的build_timeline(第 103-125 行)在手工脚本基础上做了增强:同时把 USBSTOR 的"Last Connected"事件与 MountPoints2 的"Volume Accessed"事件合并进同一条时间线,并按时间戳排序后通过export_timeline_csv(第 128-135 行)导出。该 Agent 的 CLI 用法为:
python3 agent.py \ --system-hive /cases/case-2024-001/usb/SYSTEM \ --ntuser /cases/case-2024-001/usb/NTUSER.DAT \ --setupapi-log /cases/case-2024-001/usb/setupapi.dev.log \ --output-dir ./usb_analysis \ --case-id CASE-2024-001从main()(第 138-178 行)可以看到参数约定:--system-hive为必填,--ntuser、--setupapi-log可选,输出包含设备清单、盘符映射、时间线事件数以及一份 JSON 报告。这种"手工脚本 + 可复用 Agent"的组合,正是本技能设计的意图——先用文档理解原理,再用 Agent 自动化重复劳动。
关键概念速查
| 概念 | 说明 |
|---|---|
| USBSTOR | 存储 USB 大容量存储设备标识与连接数据的注册表键 |
| VID/PID | 唯一标识 USB 设备厂商与型号的厂商 ID 与产品 ID |
| 设备序列号 | 单个 USB 设备的唯一标识(注意:部分设备共享序列号) |
| MountedDevices | 将卷 GUID 与盘符映射到物理设备的注册表键 |
| MountPoints2 | 按用户记录卷访问历史的注册表键 |
| SetupAPI 日志 | 记录设备首次连接(驱动安装)时间的 Windows 驱动安装日志 |
| DeviceContainers | SOFTWARE 配置单元中携带设备元数据与时间戳的注册表键 |
| EMDMgmt | 追踪 ReadyBoost 兼容设备(含序列号与时间戳)的注册表键 |
其中DeviceContainers与EMDMgmt位于SOFTWARE配置单元,可作为 USBSTOR 之外的时间戳佐证源(详见 api-reference.md)。
工具与系统
| 工具 | 用途 |
|---|---|
| USB Forensic Tracker | 专门的 USB 设备历史提取工具 |
| USBDeview | NirSoft 出品,列出系统连接过的所有 USB 设备 |
| RegRipper(usbstor 插件) | 从注册表配置单元自动提取 USB 产物 |
| Registry Explorer | 交互式分析 USB 相关注册表键 |
| KAPE | 自动化收集 USB 相关取证产物 |
| Plaso/log2timeline | 构建包含 USB 连接事件的完整时间线 |
| FTK Imager | 取证成像(含可移动介质) |
| Velociraptor | 端点 Agent,内置 USB 设备历史狩猎产物 |
常见实战场景
场景 1:离职员工数据泄露提取 USBSTOR 条目识别所有连接过的 USB 设备;用设备序列号关联 MountPoints2 确认具体用户访问;将时间戳与文件访问日志、Jump List 最近文件交叉比对;在 USN Journal 中查找大规模文件复制特征。
场景 2:安全系统上出现未授权设备将所有 USBSTOR 条目与公司白名单设备清单比对;通过 VID/PID 识别未获企业批准的硬件;确定未授权设备的首次与末次连接时间;核查是否发生了数据传输。
场景 3:经 USB 传播的恶意软件找出恶意软件执行(Prefetch 时间戳)之前刚刚插入的 USB 设备;提取设备序列号与厂商信息;检查该设备的 autorun 是否被启用;在 Prefetch 与 ShimCache 中查找从可移动盘符启动的可执行文件痕迹。
场景 4:跨多台系统追踪同一 U 盘在所有取证镜像的 USBSTOR 中搜索同一序列号;绘制该 U 盘在各系统的连接时间地图;还原设备在组织内的移动路径;与网络共享访问日志关联。
报告输出格式
本技能给出了标准的取证报告输出模板(节选):
USB Device History Analysis: System: DESKTOP-ABC123 (Windows 10 Pro) Total USB Storage Devices: 12 Analysis Sources: USBSTOR, MountedDevices, MountPoints2, SetupAPI, Event Logs Device Inventory: 1. Kingston DataTraveler 3.0 (Serial: 0019E06B4521A2B0) First Connected: 2024-01-10 09:15:32 (SetupAPI) Last Connected: 2024-01-18 14:30:00 (USBSTOR) Drive Letter: E: User Access: suspect_user (MountPoints2) 2. WD My Passport (Serial: 575834314131363035) First Connected: 2024-01-15 20:00:00 Last Connected: 2024-01-15 23:45:00 Drive Letter: F: User Access: suspect_user Suspicious Findings: - Kingston drive connected 15 times during investigation period - WD Passport connected only once, late evening (unusual hours) - Unknown device (VID_1234&PID_5678) connected 2024-01-17, no matching approved device Timeline: /cases/case-2024-001/analysis/usb_timeline.csv报告中 "Suspicious Findings" 段落的价值在于将证据转化为可操作的调查线索——连接频次异常、非工作时间插入、无法匹配白名单的未知设备,都是需要进一步深挖的切入点。
局限性与注意事项
- USBSTOR 只记录末次连接:它不提供每次插入的历史记录,完整连接历史必须依赖事件日志(2003/20001 等)与 SetupAPI 日志;
- 共享序列号问题:部分厂商(尤其是廉价 U 盘)会让多个设备共用同一序列号,此时无法通过序列号唯一区分物理设备,需结合 VID/PID 与体积特征;
- 日志留存窗口:System 事件日志与 DriverFrameworks-UserMode 日志受日志大小与轮转策略影响,可能无法覆盖全部历史,需与注册表证据互为补充;
- 仅限授权取证:本技能(及仓库整体)明确要求仅在拥有授权或书面许可的系统上进行取证分析,遵守适用的法律与交战规则(见 README.md 的使用声明与 SECURITY.md)。
延伸阅读
- 技能正文:SKILL.md
- 参考 API 文档(regipy / python-evtx 用法):api-reference.md
- 自动化 Agent 脚本:scripts/agent.py
- 框架映射说明:mappings/README.md
- ATT&CK 覆盖总览:ATTACK_COVERAGE.md
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考