analyzing-slack-space-and-file-system-artifacts

检查文件系统松弛空间(slack space)、MFT 条目、USN 日志和备用数据流,以恢复 NTFS 卷上的隐藏数据并重建文件活动。

9 stars

Best use case

analyzing-slack-space-and-file-system-artifacts is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

检查文件系统松弛空间(slack space)、MFT 条目、USN 日志和备用数据流,以恢复 NTFS 卷上的隐藏数据并重建文件活动。

Teams using analyzing-slack-space-and-file-system-artifacts should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/analyzing-slack-space-and-file-system-artifacts/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/analyzing-slack-space-and-file-system-artifacts/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/analyzing-slack-space-and-file-system-artifacts/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How analyzing-slack-space-and-file-system-artifacts Compares

Feature / Agentanalyzing-slack-space-and-file-system-artifactsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

检查文件系统松弛空间(slack space)、MFT 条目、USN 日志和备用数据流,以恢复 NTFS 卷上的隐藏数据并重建文件活动。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 分析松弛空间和文件系统制品

## 适用场景
- 在文件系统松弛空间中搜索隐藏或残留数据
- 分析 NTFS 主文件表(MFT)条目以获取已删除文件的元数据
- 从 USN 变更日志重建文件操作
- 检测用于隐藏数据或恶意软件的备用数据流(ADS)
- 在深度取证分析中检查标准文件恢复以外的内容

## 前置条件
- 含 NTFS 文件系统的取证磁盘镜像
- The Sleuth Kit(TSK)工具集:istat、icat、fls、blkls、blkstat
- MFTECmd(Eric Zimmerman)用于 MFT 解析
- MFTExplorer 用于交互式 MFT 分析
- 熟悉 NTFS 结构(MFT、$UsnJrnl、$LogFile、ADS)
- Python 及 analyzeMFT 或 mft 库用于自动化解析

## 工作流程

### 步骤 1:识别并提取 NTFS 文件系统制品

```bash
# 确定分区布局
mmls /cases/case-2024-001/images/evidence.dd

# 提取关键 NTFS 系统文件
# $MFT - 主文件表
icat -o 2048 /cases/case-2024-001/images/evidence.dd 0 > /cases/case-2024-001/ntfs/MFT

# $UsnJrnl:$J - USN 变更日志
icat -o 2048 /cases/case-2024-001/images/evidence.dd 62-128 > /cases/case-2024-001/ntfs/UsnJrnl_J

# $LogFile - 事务日志
icat -o 2048 /cases/case-2024-001/images/evidence.dd 2 > /cases/case-2024-001/ntfs/LogFile

# 从卷中提取所有松弛空间
blkls -s -o 2048 /cases/case-2024-001/images/evidence.dd > /cases/case-2024-001/ntfs/slack_space.raw

# 获取文件系统信息
fsstat -o 2048 /cases/case-2024-001/images/evidence.dd | tee /cases/case-2024-001/ntfs/fs_info.txt
```

### 步骤 2:分析主文件表(MFT)

```bash
# 使用 MFTECmd(Eric Zimmerman)解析 MFT
MFTECmd.exe -f "C:\cases\ntfs\MFT" --csv "C:\cases\analysis\" --csvf mft_analysis.csv

# 使用 analyzeMFT(Python)解析
pip install analyzeMFT

analyzeMFT.py -f /cases/case-2024-001/ntfs/MFT \
   -o /cases/case-2024-001/analysis/mft_analysis.csv \
   -c

# 使用 Python 自定义 MFT 分析
python3 << 'PYEOF'
from mft import PyMft
import csv

mft = PyMft(open('/cases/case-2024-001/ntfs/MFT', 'rb').read())

deleted_files = []
suspicious_files = []

for entry in mft.entries():
    if entry is None:
        continue

    filename = entry.get_filename()
    if filename is None:
        continue

    is_deleted = not entry.is_active()
    is_directory = entry.is_directory()
    created = entry.get_created_timestamp()
    modified = entry.get_modified_timestamp()
    mft_modified = entry.get_mft_modified_timestamp()
    size = entry.get_file_size()

    # 标记已删除文件以供恢复
    if is_deleted and not is_directory and size > 0:
        deleted_files.append({
            'filename': filename,
            'size': size,
            'created': str(created),
            'modified': str(modified),
            'entry_number': entry.entry_number
        })

    # 检测时间戳篡改(MFT 修改时间 != $SI 修改时间)
    si_modified = entry.get_si_modified_timestamp()
    fn_modified = entry.get_fn_modified_timestamp()
    if si_modified and fn_modified:
        if abs((si_modified - fn_modified).total_seconds()) > 86400:  # >1 天差异
            suspicious_files.append({
                'filename': filename,
                'si_modified': str(si_modified),
                'fn_modified': str(fn_modified),
                'delta': str(si_modified - fn_modified)
            })

print(f"=== 已删除文件(可恢复元数据)===")
print(f"总计: {len(deleted_files)}")
for f in deleted_files[:20]:
    print(f"  [{f['modified']}] {f['filename']} ({f['size']} 字节)")

print(f"\n=== 潜在时间戳篡改 ===")
print(f"可疑文件总计: {len(suspicious_files)}")
for f in suspicious_files[:10]:
    print(f"  {f['filename']}: $SI={f['si_modified']}, $FN={f['fn_modified']} (差值: {f['delta']})")
PYEOF
```

### 步骤 3:分析松弛空间中的隐藏数据

```bash
# 从松弛空间提取字符串
strings -a /cases/case-2024-001/ntfs/slack_space.raw > /cases/case-2024-001/analysis/slack_strings.txt

# 在松弛空间中搜索特定模式
grep -iab "password\|secret\|confidential\|credit.card\|ssn" \
   /cases/case-2024-001/ntfs/slack_space.raw > /cases/case-2024-001/analysis/slack_keywords.txt

# 分析单个文件的松弛空间
python3 << 'PYEOF'
import struct

# 文件松弛空间由以下部分组成:
# 1. RAM 松弛:文件末尾到下一扇区边界之间的字节(历史上填充 RAM 内容或零)
# 2. 驱动器松弛:文件最后扇区之后,簇中剩余的扇区

# 分析特定 MFT 条目的松弛空间
# 使用 Sleuth Kit 获取特定文件的松弛空间
import subprocess

# 获取文件详情
result = subprocess.run(
    ['istat', '-o', '2048', '/cases/case-2024-001/images/evidence.dd', '14523'],
    capture_output=True, text=True
)
print(result.stdout)

# 输出显示数据运行 - 最后一个簇可能包含松弛数据
# 计算松弛大小:(已分配大小 - 文件大小) 字节
PYEOF

# 在松弛空间中搜索文件签名(嵌入文件)
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 /cases/case-2024-001/analysis/bulk_extract/ \
   /cases/case-2024-001/ntfs/slack_space.raw
```

### 步骤 4:解析 USN 变更日志

```bash
# 使用 MFTECmd 解析 USN 日志
MFTECmd.exe -f "C:\cases\ntfs\UsnJrnl_J" --csv "C:\cases\analysis\" --csvf usn_journal.csv

# Python USN 日志解析
pip install pyusn

python3 << 'PYEOF'
import struct
import csv
from datetime import datetime, timedelta

def parse_usn_record(data, offset):
    """解析单个 USN_RECORD_V2。"""
    if offset + 8 > len(data):
        return None, offset

    record_len = struct.unpack_from('<I', data, offset)[0]
    if record_len < 56 or record_len > 65536 or offset + record_len > len(data):
        return None, offset + 8

    major_ver = struct.unpack_from('<H', data, offset + 4)[0]
    if major_ver != 2:
        return None, offset + record_len

    mft_ref = struct.unpack_from('<Q', data, offset + 8)[0] & 0xFFFFFFFFFFFF
    parent_ref = struct.unpack_from('<Q', data, offset + 16)[0] & 0xFFFFFFFFFFFF
    usn = struct.unpack_from('<Q', data, offset + 24)[0]
    timestamp = struct.unpack_from('<Q', data, offset + 32)[0]
    reason = struct.unpack_from('<I', data, offset + 40)[0]
    source_info = struct.unpack_from('<I', data, offset + 44)[0]
    security_id = struct.unpack_from('<I', data, offset + 48)[0]
    file_attrs = struct.unpack_from('<I', data, offset + 52)[0]
    filename_len = struct.unpack_from('<H', data, offset + 56)[0]
    filename_off = struct.unpack_from('<H', data, offset + 58)[0]

    name = data[offset + filename_off:offset + filename_off + filename_len].decode('utf-16-le', errors='ignore')

    # 将 Windows FILETIME 转换为 datetime
    ts = datetime(1601, 1, 1) + timedelta(microseconds=timestamp // 10)

    # 解码原因标志
    reasons = []
    reason_flags = {
        0x01: 'DATA_OVERWRITE', 0x02: 'DATA_EXTEND', 0x04: 'DATA_TRUNCATION',
        0x10: 'NAMED_DATA_OVERWRITE', 0x20: 'NAMED_DATA_EXTEND',
        0x100: 'FILE_CREATE', 0x200: 'FILE_DELETE', 0x400: 'EA_CHANGE',
        0x800: 'SECURITY_CHANGE', 0x1000: 'RENAME_OLD_NAME', 0x2000: 'RENAME_NEW_NAME',
        0x4000: 'INDEXABLE_CHANGE', 0x8000: 'BASIC_INFO_CHANGE',
        0x10000: 'HARD_LINK_CHANGE', 0x20000: 'COMPRESSION_CHANGE',
        0x40000: 'ENCRYPTION_CHANGE', 0x80000: 'OBJECT_ID_CHANGE',
        0x100000: 'REPARSE_POINT_CHANGE', 0x200000: 'STREAM_CHANGE',
        0x80000000: 'CLOSE'
    }
    for flag, desc in reason_flags.items():
        if reason & flag:
            reasons.append(desc)

    record = {
        'timestamp': ts.strftime('%Y-%m-%d %H:%M:%S'),
        'filename': name,
        'mft_entry': mft_ref,
        'parent_entry': parent_ref,
        'reasons': '|'.join(reasons),
        'usn': usn
    }

    return record, offset + record_len

# 解析日志
with open('/cases/case-2024-001/ntfs/UsnJrnl_J', 'rb') as f:
    data = f.read()

records = []
offset = 0
while offset < len(data) - 8:
    record, offset = parse_usn_record(data, offset)
    if record:
        records.append(record)
    else:
        offset += 8  # 跳过零字节

# 过滤删除事件
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']]

print(f"USN 记录总数: {len(records)}")
print(f"文件创建: {len(creations)}")
print(f"文件删除: {len(deletions)}")
print(f"文件重命名: {len(renames)}")

print("\n=== 最近删除 ===")
for r in deletions[-20:]:
    print(f"  [{r['timestamp']}] 已删除: {r['filename']} (MFT#{r['mft_entry']})")

# 将完整日志写入 CSV
with open('/cases/case-2024-001/analysis/usn_journal.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=['timestamp', 'filename', 'mft_entry', 'parent_entry', 'reasons', 'usn'])
    writer.writeheader()
    writer.writerows(records)
PYEOF
```

### 步骤 5:检测和分析备用数据流

```bash
# 列出镜像中所有备用数据流
find /mnt/evidence -exec getfattr -d {} \; 2>/dev/null | grep -i "ads\|zone\|stream"

# 使用 Sleuth Kit 查找 ADS
fls -r -o 2048 /cases/case-2024-001/images/evidence.dd | grep ":" | \
   tee /cases/case-2024-001/analysis/ads_list.txt

# 提取特定 ADS 内容
# 格式:icat 镜像 inode:ads名称
icat -o 2048 /cases/case-2024-001/images/evidence.dd 14523:hidden_stream \
   > /cases/case-2024-001/analysis/extracted_ads.bin

# 检查 Zone.Identifier 数据流(下载来源追踪)
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.txt

# Zone.Identifier 内容揭示:
# [ZoneTransfer]
# ZoneId=3          (3 = Internet,表示文件已下载)
# ReferrerUrl=https://malicious-site.com/payload.exe
# HostUrl=https://cdn.malicious-site.com/payload.exe
```

## 核心概念

| 概念 | 描述 |
|------|------|
| 文件松弛空间(File slack) | 文件末尾与簇边界之间包含残留数据的未使用空间 |
| RAM 松弛(RAM slack) | 从文件末尾到扇区边界的松弛空间部分(历史上填充 RAM 内容) |
| MFT($MFT) | 主文件表——每个文件都有条目的 NTFS 元数据数据库 |
| USN 日志($UsnJrnl) | 记录 NTFS 上所有文件/目录修改的变更日志 |
| 备用数据流(Alternate Data Streams) | NTFS 功能,允许每个文件有多个数据流(用于隐藏存储) |
| $STANDARD_INFORMATION | MFT 属性,包含用户态应用程序可修改的时间戳 |
| $FILE_NAME | MFT 属性,包含仅内核可修改的时间戳 |
| 时间戳篡改(Timestomping) | 修改文件时间戳以逃避检测的反取证技术 |

## 工具与系统

| 工具 | 用途 |
|------|------|
| MFTECmd | Eric Zimmerman 的 MFT 和 USN 日志解析器,支持 CSV 输出 |
| MFTExplorer | 用于 MFT 分析的交互式 GUI 工具 |
| analyzeMFT | 支持 CSV/JSON 输出的 Python MFT 解析器 |
| The Sleuth Kit | 文件系统取证工具集(fls、icat、blkls、istat) |
| bulk_extractor | 从原始数据(包括松弛空间)中提取特征 |
| NTFS Log Tracker | 用于解析 $LogFile 事务记录的工具 |
| streams.exe | 用于列出 NTFS 备用数据流的 Sysinternals 工具 |
| Plaso | 解析 MFT 和 USN 日志的超级时间线工具 |

## 常见场景

**场景 1:通过时间戳篡改检测反取证**
将 MFT 条目中的 $STANDARD_INFORMATION 时间戳与 $FILE_NAME 时间戳进行比较,标记 $SI 时间戳早于 $FN 时间戳的文件(正常操作中不可能发生),将时间戳被篡改的文件识别为故意操纵的证据,与其他时间线证据相关联。

**场景 2:备用数据流中的隐藏数据**
扫描附加到文件上超出标准 Zone.Identifier 的 ADS,提取 ADS 内容进行分析,检查存储在 ADS 中的隐藏可执行文件或文档,将 ADS 创建与用户活动时间线相关联,记录调查结果作为证据。

**场景 3:从 MFT 重建已删除文件**
解析 MFT 中的非活动(已删除)条目,提取已删除文件的文件名、大小和时间戳,如果数据簇未被覆盖则使用 icat 恢复文件内容,建立已删除证据文件列表,与 USN 日志删除事件相关联。

**场景 4:从 USN 日志重建文件活动**
解析调查时段的 USN 变更日志,识别文件创建、修改、重命名和删除事件,重建文件操作序列,检测数据暂存证据(创建、复制、压缩、删除模式),识别反取证文件擦除。

## 输出格式

```
文件系统制品分析:
  卷: NTFS(分区 2,465 GB)
  簇大小: 4096 字节

  MFT 分析:
    条目总数: 456,789
    活动文件: 234,567
    已删除条目: 12,345(8,901 个含可恢复元数据)
    时间戳被篡改文件: 23(检测到 SI/FN 不匹配)

  USN 日志:
    已解析记录: 2,345,678
    日期范围: 2024-01-01 至 2024-01-20
    文件创建: 45,678
    文件删除: 23,456
    文件重命名: 12,345

  备用数据流:
    发现 ADS 总数: 1,234
    Zone.Identifier: 890(已下载文件)
    自定义/可疑 ADS: 5(检测到隐藏数据)

  松弛空间:
    总松弛空间: 12.3 GB
    关键词命中: 45(密码、信用卡)
    从松弛空间雕刻文件: 23

  可疑发现:
    - 23 个文件含被篡改的时间戳
    - 5 个文件含隐藏 ADS 数据
    - USN 显示 2024-01-18 存在大量删除(反取证)
    - 松弛空间含残留邮件片段

  报告: /cases/case-2024-001/analysis/
```

Related Skills

recovering-deleted-files-with-photorec

9
from killvxk/cybersecurity-skills-zh

使用 PhotoRec 基于文件签名的数据雕刻(File Carving)引擎,从磁盘镜像和存储介质中恢复已删除文件,无论文件系统是否损坏。

performing-file-carving-with-foremost

9
from killvxk/cybersecurity-skills-zh

使用 Foremost 的文件头/文件尾签名雕刻技术,从磁盘镜像和未分配空间中恢复文件,无论文件系统状态如何均可提取证据。

investigating-ransomware-attack-artifacts

9
from killvxk/cybersecurity-skills-zh

识别、收集和分析勒索软件攻击制品,以确定变种、初始访问向量、加密范围和恢复选项。

implementing-ticketing-system-for-incidents

9
from killvxk/cybersecurity-skills-zh

实施集成事件工单系统,将 SIEM 告警对接 ServiceNow、Jira 或 TheHive, 用于结构化事件跟踪、SLA 管理、升级工作流和合规文档记录。 适用于 SOC 团队需要通过自动化工单创建、分配路由和解决跟踪来规范事件生命周期管理时。

implementing-patch-management-for-ot-systems

9
from killvxk/cybersecurity-skills-zh

本技能涵盖为OT/ICS环境实施结构化补丁管理程序,在传统IT补丁方法可能导致过程中断或安全隐患的情况下进行管理。内容包括供应商兼容性测试、基于风险的补丁优先级排序、通过测试环境的分阶段部署、维护窗口协调、回滚程序,以及在因运营约束或供应商限制无法应用补丁时的补偿控制措施。

implementing-google-workspace-sso-configuration

9
from killvxk/cybersecurity-skills-zh

为 Google Workspace 配置基于 SAML 2.0 的单点登录(SSO),与第三方身份提供商集成,实现集中认证并强制执行全组织范围的访问策略。

implementing-google-workspace-phishing-protection

9
from killvxk/cybersecurity-skills-zh

配置 Google Workspace 高级钓鱼和恶意软件保护设置,包括预投递扫描、附件保护、伪造检测和增强安全浏览(Enhanced Safe Browsing)。

implementing-google-workspace-admin-security

9
from killvxk/cybersecurity-skills-zh

实施全面的 Google Workspace 安全加固,包括管理控制台 配置、抗钓鱼 MFA 强制执行、DLP 策略、电子邮件认证 (SPF/DKIM/DMARC)、OAuth 应用控制和外部共享限制。 适用于 Google Workspace 加固、G Suite 安全配置 或云办公安全管理相关请求。

implementing-file-integrity-monitoring-with-aide

9
from killvxk/cybersecurity-skills-zh

配置 AIDE(高级入侵检测环境)进行文件完整性监控,包括基线创建、定期完整性检查、变更检测和告警

implementing-code-signing-for-artifacts

9
from killvxk/cybersecurity-skills-zh

本技能涵盖为构建产物实施代码签名,以确保软件供应链中的完整性和真实性。 内容包括使用 GPG、Sigstore 和平台专用签名工具对二进制文件、软件包和容器进行签名, 建立信任链,以及在部署管道中验证签名。

extracting-windows-event-logs-artifacts

9
from killvxk/cybersecurity-skills-zh

使用 Chainsaw、Hayabusa 和 EvtxECmd 提取、解析和分析 Windows 事件日志(EVTX),以检测横向移动、持久化和权限提升。

extracting-memory-artifacts-with-rekall

9
from killvxk/cybersecurity-skills-zh

使用 Rekall 内存取证框架分析内存转储,检测进程空洞化(process hollowing)、通过 VAD 异常注入的代码、隐藏进程和 rootkit。应用 pslist、psscan、vadinfo、malfind 和 dlllist 等插件从 Windows 内存镜像中提取取证工件。适用于应急响应内存分析场景。