Anthropic-Cybersecurity-Skills 实战指南:NTFS Slack Space 与文件系统痕迹的深度取证分析
【免费下载链接】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
本文聚焦 analyzing-slack-space-and-file-system-artifacts 这一数字取证技能所配套的 API 参考文档,系统讲解如何借助 The Sleuth Kit(TSK)、analyzeMFT、MFTECmd、bulk_extractor、foremost 等工具,对 NTFS 卷的 Slack Space、MFT、USN Change Journal 与 Alternate Data Streams(ADS)展开深度取证分析。读完本文,你将掌握从磁盘镜像中提取 slack 空间、解析 MFT 恢复已删除文件元数据、从 USN 日志重建文件操作时间线、以及发现隐藏在 ADS 中的数据与反取证痕迹(如时间戳篡改)的完整技术方案。
为什么需要"标准恢复之外"的取证分析
常规文件恢复只能还原仍在 MFT 中有记录的文件,而攻击者与隐蔽数据往往藏身在常规工具看不到的地方。NTFS 文件系统为取证分析提供了四个高价值的目标:
- Slack Space(文件间隙):文件末尾到簇边界之间未使用的空间,可能残留上一份文件的数据;
- MFT(主文件表):记录每个文件(含已删除文件)元数据的 NTFS 数据库;
- USN Change Journal:记录 NTFS 卷上所有文件/目录变更的日志;
- Alternate Data Streams(ADS):NTFS 允许每个文件携带多个数据流,是经典的隐蔽存储手段。
该技能被映射到 NIST CSF 2.0 的 RS.AN-03、DE.AE-02、RS.MA-01 与 MITRE ATT&CK 的 T1070.006(时间戳修改)、T1564.004(NTFS 文件属性隐藏)、T1070.004(文件删除)、T1005(本地数据收集)、T1006(间接数据访问),可见其对应的是典型的反取证对抗与隐蔽数据场景。
前置条件与工具准备
在进行此类深挖之前,需要满足以下条件(来自技能文档 SKILL.md):
- 一份包含 NTFS 文件系统的取证磁盘镜像(如
.dd格式); - The Sleuth Kit(TSK)工具集:
istat、icat、fls、blkls、blkstat; - MFTECmd(Eric Zimmerman 工具)用于 MFT 解析;
- MFTExplorer 用于交互式 MFT 分析;
- 对 NTFS 结构(MFT、
$UsnJrnl、$LogFile、ADS)的理解; - Python 环境(可安装 analyzeMFT 或 mft 库做自动化解析)。
仓库配套的自动化脚本位于 scripts/agent.py,它以子进程方式封装了 TSK 与 analyzeMFT 的调用,可以直接作为自动化取证的入口。
整体取证工作流
技能文档给出了一条五步式工作流,API 参考中的命令工具分散在各步骤中:
- 识别并提取 NTFS 文件系统痕迹:确定分区布局,提取
$MFT、$UsnJrnl:$J、$LogFile与全部 slack 空间; - 分析 MFT:解析条目,识别已删除文件元数据与时间戳异常;
- 分析 Slack Space 中的隐藏数据:字符串提取、关键字检索、文件签名雕刻;
- 解析 USN Change Journal:重建文件创建、修改、重命名、删除活动;
- 检测并分析 ADS:列出并提取隐藏流。
下文按照 API 参考的组织方式,逐一展开每个工具的使用方法与底层原理。
The Sleuth Kit(TSK)命令行工具
TSK 是整套流程的地基。API 参考文档(api-reference.md)给出了四个核心命令的用法。
blkls —— 提取 Slack Space
# Extract slack space from partition at offset 2048 blkls -s -o 2048 evidence.dd > slack_space.raw-s表示只输出 slack 空间,-o 2048指定分区在镜像中的扇区偏移(sector offset)。若使用 512 字节扇区,偏移 2048 扇区对应约 1 MiB 处的分区起点。提取出的slack_space.raw是后续字符串检索、文件雕刻与 bulk_extractor 分析的输入。
fls —— 列出文件与 Alternate Data Streams
# Recursive file listing with ADS fls -r -o 2048 evidence.dd # Filter for ADS entries (lines containing ":") fls -r -o 2048 evidence.dd | grep ":"fls -r递归列出目录与文件;由于 ADS 在输出中以文件名:流名形式呈现(行内包含冒号),因此用grep ":"即可快速筛选出所有 ADS 条目。这也是 agent.py 中find_ads_in_image函数的实现思路——它调用fls -r -o <offset> <image>并过滤含:的行。
icat —— 按 inode 提取文件内容
# Extract $MFT (inode 0) icat -o 2048 evidence.dd 0 > MFT # Extract ADS content icat -o 2048 evidence.dd 14523:Zone.Identifiericat按 inode 号直接读取内容,无需挂载文件系统。NTFS 中$MFT固定为 inode 0,因此icat ... 0 > MFT可导出完整主文件表。提取 ADS 时使用inode:流名的语法,例如读取Zone.Identifier流。技能工作流中还使用了另外两个固定 inode:$LogFile(事务日志)为 inode 2,$UsnJrnl:$J(USN 日志数据流)可通过 inode 62-128 提取(见 SKILL.md):
# $MFT - Master File Table icat -o 2048 /cases/case-2024-001/images/evidence.dd 0 > /cases/case-2024-001/ntfs/MFT # $UsnJrnl:$J - USN Change Journal icat -o 2048 /cases/case-2024-001/images/evidence.dd 62-128 > /cases/case-2024-001/ntfs/UsnJrnl_J # $LogFile - Transaction log icat -o 2048 /cases/case-2024-001/images/evidence.dd 2 > /cases/case-2024-001/ntfs/LogFileistat —— 显示 inode 详情
istat -o 2048 evidence.dd 14523istat输出指定 inode 的元数据,包括属性类型、数据运行(data runs)与各时间戳。在 SKILL.md 的 slack 分析小节中,istat被用来确认文件占用的最后一个簇——文件末尾簇中可能包含 slack 数据,slack 大小可按下式估算:slack 大小 = 分配大小 - 文件大小。
辅助命令:mmls 与 fsstat
在正式提取之前,先用mmls确定分区布局、用fsstat查看文件系统信息,这在技能工作流 Step 1 中已示范(见 SKILL.md):
# Determine partition layout mmls /cases/case-2024-001/images/evidence.dd # Extract all slack space from the volume blkls -s -o 2048 /cases/case-2024-001/images/evidence.dd > /cases/case-2024-001/ntfs/slack_space.raw # Get file system information fsstat -o 2048 /cases/case-2024-001/images/evidence.dd | tee /cases/case-2024-001/ntfs/fs_info.txtagent.py中extract_slack_space函数将这条blkls调用封装为 Python 子进程(见 scripts/agent.py),并把输出重定向到文件。
MFT 解析:恢复已删除文件与检测时间戳篡改
MFT 的每个条目包含多个属性,其中两个时间戳属性对取证至关重要:
$STANDARD_INFORMATION($SI):用户态应用程序(含攻击工具)可以修改其时间戳;$FILE_NAME($FN):仅内核可修改,更可信。
用 analyzeMFT 解析
pip install analyzeMFT analyzeMFT.py -f MFT -o mft_output.csv -c-f指定 MFT 文件,-o指定 CSV 输出路径,-c表示输出 CSV 格式。技能工作流中的等价调用为:
analyzeMFT.py -f /cases/case-2024-001/ntfs/MFT \ -o /cases/case-2024-001/analysis/mft_analysis.csv \ -cagent.py 的parse_mft_with_analyzeMFT函数正是此命令的封装。
用 MFTECmd(Eric Zimmerman)解析
MFTECmd.exe -f MFT --csv output/ --csvf mft_analysis.csvMFTECmd 是 Windows 下的高性能解析器,--csv指定输出目录,--csvf指定 CSV 文件名。它的输出包含SI_Modified与FN_Modified两列——这正是 agent.py 中detect_timestomping函数检测时间戳篡改的依据:遍历 CSV,凡是SI_Modified与FN_Modified不一致的条目即被标记为可疑。
用 Python mft 库做定制分析
技能文档提供了一段完整的 PyMft 定制分析脚本,它完成两类工作:
- 枚举已删除文件:对
not entry.is_active()且非目录、大小大于 0 的条目收集文件名、大小、创建/修改时间与条目号,用于后续恢复; - 检测时间戳篡改:比较
get_si_modified_timestamp()与get_fn_modified_timestamp(),若差异超过 86400 秒(1 天)即标记为可疑——因为正常情况下$SI与$FN的时间戳一致,而$SI时间戳早于$FN在正常操作中是不可能的(见 SKILL.md 场景 1)。
这段脚本还演示了通过entry.entry_number获取条目号,为后续用icat恢复数据簇做好铺垫。
Slack Space 分析:查找隐藏与残留数据
Slack space 分为两部分(见 SKILL.md):
- RAM slack:文件末尾到下一扇区边界之间的字节(历史上可能残留 RAM 内容);
- Drive slack:文件最后一个扇区之后、簇边界之前的剩余扇区。
字符串与关键字检索
# Search slack space for strings strings -a /cases/case-2024-001/ntfs/slack_space.raw > /cases/case-2024-001/analysis/slack_strings.txt # Search for specific patterns in slack space grep -iab "password\|secret\|confidential\|credit.card\|ssn" \ /cases/case-2024-001/ntfs/slack_space.raw > /cases/case-2024-001/analysis/slack_keywords.txtstrings -a提取全部可打印字符串,grep -iab(-i忽略大小写、-a按文本处理、-b显示字节偏移)定位敏感关键字。仓库脚本 agent.py 的search_slack_keywords用二进制逐关键字扫描实现了等价逻辑,并记录每个命中的偏移量及前后各 20 字节的上下文,便于快速评估命中是否真正可疑。
文件签名雕刻(foremost)
foremost -t jpg,pdf,zip -i slack_space.raw -o carved_files/foremost依据文件签名(magic bytes)从原始数据中恢复被删除或残留的完整文件。-t指定要雕刻的文件类型(jpg、pdf、zip),-i指定输入,-o指定输出目录。技能工作流中将其应用于整卷 slack 空间(见 SKILL.md):
foremost -t jpg,pdf,zip -i /cases/case-2024-001/ntfs/slack_space.raw \ -o /cases/case-2024-001/carved/slack_carved/结构化数据挖掘(bulk_extractor)
bulk_extractor -o output_dir/ slack_space.rawbulk_extractor擅长从原始数据中批量提取结构化特征——URL、邮箱、信用卡号、哈希、压缩文件等,输出到指定目录的多个特征文件中。它对 slack 空间这类"非结构化残留数据"尤其有效,因为它逐扇区扫描、不依赖文件系统结构。
USN Change Journal 解析:重建文件操作时间线
USN Change Journal($UsnJrnl:$J)记录 NTFS 卷上每次文件系统变更,即使文件已被删除,其变更记录仍可能保留在日志中,是重建"数据暂存—删除"等攻击活动的关键证据。
记录结构(USN_RECORD_V2)
API 参考给出了二进制记录的核心布局(api-reference.md):
| Offset | Size | Field |
|---|---|---|
| 0 | 4 | Record length |
| 4 | 2 | Major version |
| 8 | 8 | MFT reference |
| 16 | 8 | Parent MFT reference |
| 32 | 8 | Timestamp (FILETIME) |
| 40 | 4 | Reason flags |
| 56 | 2 | Filename length |
| 58 | 2 | Filename offset |
Reason Flags
| Flag | Meaning |
|---|---|
0x100 | FILE_CREATE |
0x200 | FILE_DELETE |
0x1000 | RENAME_OLD_NAME |
0x2000 | RENAME_NEW_NAME |
0x80000000 | CLOSE |
技能文档中的 Python 解析器还补充了更完整的标志映射(见 SKILL.md):0x01DATA_OVERWRITE、0x02DATA_EXTEND、0x04DATA_TRUNCATION、0x10NAMED_DATA_OVERWRITE、0x20NAMED_DATA_EXTEND、0x400EA_CHANGE、0x800SECURITY_CHANGE、0x4000INDEXABLE_CHANGE、0x8000BASIC_INFO_CHANGE、0x10000HARD_LINK_CHANGE、0x20000COMPRESSION_CHANGE、0x40000ENCRYPTION_CHANGE、0x80000OBJECT_ID_CHANGE、0x100000REPARSE_POINT_CHANGE、0x200000STREAM_CHANGE。同一记录的reason字段可能是多个标志的按位组合。
用 MFTECmd 解析 USN 日志
MFTECmd.exe -f UsnJrnl_J --csv output/ --csvf usn_journal.csv用 Python 手工解析 USN 日志
技能文档提供了一段完整的 USN 记录解析器,仓库 agent.py 中parse_usn_journal是它的精简工程化版本,两者要点一致:
- 用
struct.unpack_from按小端序逐字段解析(Record length、Major version、MFT reference、Parent reference、USN、FILETIME 时间戳、Reason flags、Filename length/offset); - 防御性校验:
record_len < 56或> 65536或超出文件长度时跳过 8 字节继续扫描,处理日志中的空洞与零填充; - MFT reference 掩码:
& 0xFFFFFFFFFFFF取低 48 位,去掉序列号; - FILETIME 转换:Windows FILETIME 以 1601-01-01 为纪元、单位 100ns,因此
datetime(1601, 1, 1) + timedelta(microseconds=timestamp // 10); - 文件名解码:以
utf-16-le从filename_off处读取filename_len字节。
解析后即可按事件类型分类统计并重建时间线:
deletions = [r for r in records if 'FILE_DELETE' in r['reasons']] creations = [r for r in records if 'FILE_CREATE' in r['reasons']] renames = [r for r in records if 'RENAME_NEW_NAME' in r['reasons']]Alternate Data Streams(ADS)检测与提取
列出镜像中的 ADS
# Using Sleuth Kit to find ADS fls -r -o 2048 /cases/case-2024-001/images/evidence.dd | grep ":" | \ tee /cases/case-2024-001/analysis/ads_list.txt提取指定 ADS 内容
# Format: icat image inode:ads_name icat -o 2048 /cases/case-2024-001/images/evidence.dd 14523:hidden_stream \ > /cases/case-2024-001/analysis/extracted_ads.bin批量提取 Zone.Identifier
Zone.Identifier流标记文件下载来源(如浏览器下载),对追踪恶意载荷投递链路价值很高。技能文档给出批量提取脚本(SKILL.md):
fls -r -o 2048 /cases/case-2024-001/images/evidence.dd | grep "Zone.Identifier" | \ while read line; do inode=$(echo "$line" | awk '{print $2}' | tr -d ':') echo "=== $line ===" icat -o 2048 /cases/case-2024-001/images/evidence.dd "${inode}:Zone.Identifier" 2>/dev/null echo "" done > /cases/case-2024-001/analysis/zone_identifiers.txtZone.Identifier 内容格式如下,ZoneId=3表示文件来自 Internet,ReferrerUrl/HostUrl记录来源地址:
[ZoneTransfer] ZoneId=3 (3 = Internet, indicating file was downloaded) ReferrerUrl=https://malicious-site.com/payload.exe HostUrl=https://cdn.malicious-site.com/payload.exe关键概念速查
| Concept | Description |
|---|---|
| File slack | Unused space between file end and cluster boundary containing residual data |
| RAM slack | Portion of slack from file end to sector boundary (historically filled with RAM) |
| MFT ($MFT) | Master File Table - NTFS metadata database with entries for every file |
| USN Journal ($UsnJrnl) | Change journal recording all file/directory modifications on NTFS |
| Alternate Data Streams | NTFS feature allowing multiple data streams per file (hidden storage) |
| $STANDARD_INFORMATION | MFT attribute with timestamps modifiable by user-mode applications |
| $FILE_NAME | MFT attribute with timestamps only modifiable by the kernel |
| Timestomping | Anti-forensic technique modifying file timestamps to avoid detection |
工具与系统清单
| Tool | Purpose |
|---|---|
| MFTECmd | Eric Zimmerman MFT and USN Journal parser with CSV output |
| MFTExplorer | Interactive GUI tool for MFT analysis |
| analyzeMFT | Python MFT parser with CSV/JSON output |
| The Sleuth Kit | File system forensics toolkit (fls, icat, blkls, istat) |
| bulk_extractor | Feature extraction from raw data including slack space |
| NTFS Log Tracker | Tool for parsing $LogFile transaction records |
| streams.exe | Sysinternals tool for listing NTFS Alternate Data Streams |
| Plaso | Super-timeline tool parsing MFT and USN Journal |
典型实战场景
场景 1:反取证检测(时间戳篡改)比较 MFT 条目中$STANDARD_INFORMATION与$FILE_NAME的时间戳,标记$SI时间戳早于$FN(正常操作中不可能出现)的文件,识别被刻意修改时间戳的证据,并与时间线其他证据关联。
场景 2:ADS 中的隐藏数据扫描除标准Zone.Identifier之外挂载在文件上的 ADS,提取内容分析,检查是否存在隐藏的可执行文件或文档,将 ADS 的创建与用户活动时间线关联,形成证据链。
场景 3:从 MFT 重建已删除文件解析 MFT 中非活跃(已删除)条目,提取文件名、大小与时间戳;若数据簇未被覆盖,用icat恢复内容;建立删除证据清单并与 USN Journal 的删除事件关联。
场景 4:从 USN 日志重建文件活动解析调查时间窗口内的 USN 变更记录,识别创建、修改、重命名、删除事件,重建文件操作序列,检测"创建—复制—压缩—删除"式的数据暂存模式,以及反取证的文件擦除行为。
自动化封装:agent.py
仓库提供了可复用的自动化入口 scripts/agent.py,其命令行参数设计如下:
--image:取证镜像路径(必填);--offset:分区扇区偏移,默认 2048;--case-id:案件标识,默认CASE-001;--output-dir:输出目录,默认./analysis;--action:可选extract_slack、parse_usn、find_ads、search_slack、parse_mft、detect_timestomping、full_analysis(默认执行完整分析);--mft-path/--usn-path:已提取的$MFT与$UsnJrnl:$J文件路径。
脚本内部以子进程方式调用blkls、fls、analyzeMFT.py(超时 120 秒,见 agent.py),并将结果汇总为 JSON 报告。其generate_report函数输出包含report_type、case_id、generated_at与findings的结构化报告,便于直接写入 SIEM 或取证管理平台。
输出报告示例
技能文档给出了标准化的分析报告输出格式(SKILL.md),涵盖 MFT、USN、ADS、Slack Space 四大维度的统计与可疑发现:
File System Artifact Analysis: Volume: NTFS (Partition 2, 465 GB) Cluster Size: 4096 bytes MFT Analysis: Total Entries: 456,789 Active Files: 234,567 Deleted Entries: 12,345 (8,901 with recoverable metadata) Timestomped Files: 23 (SI/FN mismatch detected) USN Journal: Records Parsed: 2,345,678 Date Range: 2024-01-01 to 2024-01-20 File Creations: 45,678 File Deletions: 23,456 File Renames: 12,345 Alternate Data Streams: Total ADS Found: 1,234 Zone.Identifier: 890 (downloaded files) Custom/Suspicious ADS: 5 (hidden data detected) Slack Space: Total Slack: 12.3 GB Keyword Hits: 45 (passwords, credit cards) Carved Files: 23 from slack space Suspicious Findings: - 23 files with timestomped timestamps - 5 files with hidden ADS containing data - USN shows mass deletion on 2024-01-18 (anti-forensics) - Slack space contains residual email fragments Reports: /cases/case-2024-001/analysis/结论与延伸阅读
通过本技能与配套 API 参考,你可以系统性地完成 NTFS 深度取证:用 TSK 工具提取 slack 空间与关键系统文件,用 MFT 解析器恢复已删除文件元数据并检测时间戳篡改,用 USN 日志重建文件操作时间线,用 ADS 检测发现隐蔽数据。这套方法超越了标准文件恢复的能力边界,正对应 MITRE ATT&CK 中 T1070.006、T1564.004、T1070.004、T1005、T1006 等反取证与隐蔽技术的对抗场景。
继续深入研究可参考仓库内的以下材料:
- 技能主文档 SKILL.md:完整五步工作流与全部命令脚本;
- API 参考 api-reference.md:本文所依据的工具命令速查;
- 自动化脚本 agent.py:可运行的取证分析封装实现;
- 仓库 ATT&CK 覆盖矩阵 与 MITRE Navigator 层文件:了解该技能在整个框架覆盖体系中的定位。
【免费下载链接】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),仅供参考