zakria03/rdp-cache-workbench
GitHub: zakria03/rdp-cache-workbench
一个用于防御性取证审查的 PowerShell 工具集,自动化搜索、提取并重建 Windows RDP 位图缓存文件以辅助数字调查。
Stars: 0 | Forks: 0
# RDP 缓存审查工作台
用于防御性审查 Windows 远程桌面位图缓存文件的 PowerShell 工具。
此存储库可以直接作为脚本使用,或打包为 `RdpCacheWorkbench` PowerShell 模块。
该项目自动化了实用的 RDP 位图缓存审查工作流程:
1. 在整台 PC 或用户指定的文件夹中搜索 Windows RDP 位图缓存文件。
2. 将缓存文件复制到工作案件文件夹中并生成 SHA-256 清单。
3. 使用固定的本地工具缓存来存放锁定的 ANSSI `bmc-tools` 和 BriMor Labs `rdpieces`。
4. 使用 `bmc-tools` 从 `.bin` / `.bmc` 缓存文件中提取位图图块。
5. 在用户确认后安装/检查 `rdpieces` 所需的依赖项。
6. 运行 `rdpieces` 以尝试自动重建并打开输出文件夹。
## 它搜索的内容
该脚本搜索符合典型 Windows RDP 位图缓存名称的文件:
- `Cache0000.bin`, `Cache0001.bin`, `Cache????.bin`
- `bcache*.bmc`
默认的整台 PC 搜索模式会搜索固定的本地驱动器,并将结果缩小至包含以下内容的路径:
```
\Microsoft\Terminal Server Client\Cache\
```
当你提供 `-SearchRoot` 参数时,脚本会在该文件夹中更广泛地搜索类似缓存的文件名。这允许你将其指向已复制的取证文件夹。
## 外部工具和依赖来源
脚本在下载或安装任何内容之前都会询问。来源会显示在提示中。
锁定的 `bmc-tools` 和 `rdpieces` 存储在固定的本地缓存中,以便在首次成功进行在线设置后,后续运行可以离线工作。
默认工具缓存:
```
%LOCALAPPDATA%\RdpCacheWorkbench\tools
```
使用以下命令覆盖它:
```
.\Invoke-RdpCacheReview.ps1 -ToolCacheRoot D:\RdpCacheWorkbench\tools
```
| 组件 | 用途 | 来源 |
|---|---|---|
| Python | 运行 `bmc-tools` | |
| Pillow | bmc-tools 拼图输出可选/必需的组件 | |
| Strawberry Perl | 在 Windows 上运行 `rdpieces.pl` | |
| ImageMagick | 被 `rdpieces` 用于图像操作 | |
| ANSSI bmc-tools | 提取 RDP 缓存位图图块 | |
| BriMor Labs RDPieces | 尝试自动重建 | |
| Perl 模块 | `IO::All`, `DBI`, `DBD::SQLite` | |
## 快速开始
打开 PowerShell。对于整台 PC 搜索,请以管理员身份运行以获得更好的覆盖率:
```
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\Invoke-RdpCacheReview.ps1
```
或者从本地克隆导入模块:
```
Import-Module .\RdpCacheWorkbench\RdpCacheWorkbench.psd1
Invoke-RdpCacheReview
```
或者从最新的 GitHub 发布版本下载源代码归档,解压并从解压后的文件夹导入模块:
```
Import-Module .\RdpCacheWorkbench\RdpCacheWorkbench.psd1
Invoke-RdpCacheReview
```
在该模块发布到 PowerShell Gallery 后,使用以下命令安装:
```
Install-Module RdpCacheWorkbench -Scope CurrentUser
Invoke-RdpCacheReview
```
搜索特定文件夹:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot "$env:LOCALAPPDATA\Microsoft\Terminal Server Client\Cache"
```
使用自定义工作文件夹:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot C:\Users -WorkingRoot D:\Cases\RDP-Case-001
```
使用自定义固定工具缓存:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot C:\Users\ZM -ToolCacheRoot D:\RdpCacheWorkbench\tools
```
在首次成功进行在线运行后,脚本会重用 `bmc-tools` 和 `rdpieces` 的锁定缓存副本。如果已安装 Python、Pillow、Strawberry Perl、ImageMagick 和所需的 Perl 模块,后续运行不需要互联网连接。
无需交互式选择即可处理所有发现的缓存位置:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot C:\Users -WorkingRoot D:\Cases\RDP-Case-001 -ProcessAllSources
```
在不打开资源管理器窗口的情况下以非交互模式运行:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot C:\Users\ZM -WorkingRoot D:\Cases\RDP-Case-001 -ProcessAllSources -NonInteractive -NoOpenFolders
```
通过模块命令也可以使用相同的参数:
```
Invoke-RdpCacheReview -SearchRoot C:\Users\ZM -WorkingRoot D:\Cases\RDP-Case-001 -ProcessAllSources -NonInteractive -NoOpenFolders
```
## 参数
| 参数 | 描述 |
|---|---|
| `-SearchRoot` | 要搜索的文件夹。如果省略,则搜索固定的本地驱动器。 |
| `-WorkingRoot` | 案件输出文件夹。如果省略,则会创建一个带时间戳的桌面文件夹。 |
| `-ToolCacheRoot` | 用于存放锁定的第三方工具的固定文件夹。默认为 `%LOCALAPPDATA%\RdpCacheWorkbench\tools`。 |
| `-ProcessAllSources` | 处理所有发现的源缓存目录。 |
| `-NonInteractive` | 避免提示。专为预先准备好的环境设计。 |
| `-InstallDependencies` | 与 `-NonInteractive` 一起使用时,允许安装依赖项。交互式运行在每次安装前仍会询问。 |
| `-NoOpenFolders` | 不要在资源管理器中打开提取/重建的输出文件夹。 |
## 输出结构
```
rdp-cache-review-YYYYMMDD-HHMMSS/
cache/ Copied cache files grouped by source directory
extracted/ BMP tiles extracted by bmc-tools
rebuilt/ RDPieces reconstruction output
logs/
cache-manifest.csv
third-party-run-manifest.json
run-summary.json
%LOCALAPPDATA%\RdpCacheWorkbench\tools\
bmc-tools/ Pinned cached copy, reused across runs
rdpieces/ Pinned cached copy, reused across runs
```
## 解释局限性
RDP 位图缓存数据不是干净的屏幕录制。输出通常是碎片化的。重建的图像应被视为启发式产物,并需要与其他证据进行交叉验证。
常见局限性:
- 图块可能来自多个会话。
- 单个图块通常不带有可靠的时间戳。
- 自动重建可能会产生错误匹配。
- 缺失图块是正常现象。
- 敏感数据可能出现在碎片中。
## 故障排除
### RDPieces 提示输出文件夹已存在
`rdpieces` 需要自行创建输出目录。请删除目标输出文件夹或选择一个新名称。
### 安装后找不到 `perl`、`magick`、`py` 或 `python`
打开一个新的 PowerShell 窗口并重新运行脚本。某些安装程序仅为新的 shell 更新 PATH。
### 找不到文件
提供特定的文件夹:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot "$env:LOCALAPPDATA\Microsoft\Terminal Server Client\Cache"
```
或检查所有配置文件:
```
.\Invoke-RdpCacheReview.ps1 -SearchRoot C:\Users
```
## PowerShell 模块打包
`RdpCacheWorkbench/` 文件夹的结构专为 PowerShell Gallery 打包设计:
```
RdpCacheWorkbench/
RdpCacheWorkbench.psd1
RdpCacheWorkbench.psm1
```
验证模块清单:
```
Test-ModuleManifest .\RdpCacheWorkbench\RdpCacheWorkbench.psd1
```
运行完整的本地项目检查:
```
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Test-Project.ps1
```
验证模块包暂存文件夹:
```
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Test-Package.ps1
```
`scripts/Sync-ModuleFromScript.ps1` 是维护人员的辅助工具,不是运行时工具,也不是 PowerShell Gallery 模块包的一部分。如果 `Invoke-RdpCacheReview.ps1` 发生更改,请在验证之前重新生成模块包装器:
```
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Sync-ModuleFromScript.ps1
```
在审查包并设置 API key 后发布到 PowerShell Gallery:
```
Publish-Module -Path .\RdpCacheWorkbench -NuGetApiKey $env:PSGALLERY_API_KEY
```
除非项目发展为多个具有独立版本控制的工具,否则请将模块保留在此存储库中。GitHub Releases 和 PowerShell Gallery 都可以指向同一个源存储库。
## 代码签名
拥有 Authenticode 代码签名证书的发布维护者可以在发布前对 PowerShell 文件进行签名:
```
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\Sign-ReleaseFiles.ps1 -CertificateThumbprint ""
```
在签名前运行 `scripts\Sync-ModuleFromScript.ps1`。在签名后重新生成模块包装器会移除 `RdpCacheWorkbench.psm1` 上的签名。
## 更新日志
请查看 `CHANGELOG.md` 了解发布历史。
## GitHub Pages 着陆页
`docs/` 文件夹包含一个静态着陆页。要使用 GitHub Pages 发布它:
1. 将此存储库推送到 GitHub。
2. 转到 **Settings → Pages**。
3. 将 **Source** 设置为 `Deploy from a branch`。
4. 选择分支 `main` 和文件夹 `/docs`。
5. 保存。
## 离线和重复运行行为
该脚本旨在避免不必要的重新安装/下载循环:
- 在安装前会检查 Python、Pillow、Perl、ImageMagick 和 Perl 模块。
- 仅当固定的工具缓存丢失或未锁定到配置的固定 commit 时,才会下载 `bmc-tools` 和 `rdpieces`。
- 仅当 `.rdp-cache-workbench-tool-lock.json` 与配置的 commit 和 ZIP URL 匹配时,才会接受现有的工具文件夹。
- 如果你在首次成功设置之前离线运行,脚本将无法下载缺失的工具或依赖项。
## 安全说明
仅在固定的本地工具缓存丢失或过时,此脚本才会从 GitHub 下载锁定的公开工具。对于受控环境,请从经过审查的内部来源预先填充 `-ToolCacheRoot`,或者从你自己的 fork 发布经过审查的发布资产并设置 `ExpectedArchiveSha256`。
## 许可证
该项目基于 BSD 3-Clause 许可证授权。重新分发必须保留版权声明和注明 Zakria Mahmood 的许可证文本。
## 供应链安全态势
此版本将两个取证辅助工具锁定到明确的 Git commit,而不是下载不断变动的分支头:
| 工具 | 版本 | Commit |
|---|---:|---|
| ANSSI bmc-tools | 3.05 | `5a4cad32be78b3b874aeec910cb478e04ba3501e` |
| BriMor Labs RDPieces | 1.1 build 20201118 | `2a74aeb4b8f42fac1af1f6c9d721fcb299224021` |
锁定文件是 `third_party.lock.json`。脚本在执行期间还会写入 `logs/third-party-run-manifest.json`,其中包括固定的工具缓存路径。下载的工具目录会收到自己的 `.rdp-cache-workbench-tool-lock.json`;如果现有的工具文件夹未锁定到配置的 commit,脚本在替换它之前会进行询问。
RDPieces 通过 Perl 反引号执行来使用 ImageMagick。该包装器通过在临时的 `subst` 驱动器下暂存 BMP 输入,并向 RDPieces 传递诸如 `R:\source` 和 `R:\output` 之类的简单路径,来缓解路径注入和路径解析风险。有关详细信息,请参阅 `SECURITY_REVIEW.md`。
标签:AI合规, IPv6, Libemu, PE 加载器, PowerShell, RDP缓存, 数字取证, 数字取证, 自动化脚本, 自动化脚本, 逆向工具