shellkraft/Ledger
GitHub: shellkraft/Ledger
Ledger 是一款 Cobalt Strike Aggressor Script,用于跟踪红队交战期间所有操作变更并提供完整的审计跟踪和清理状态管理。
Stars: 27 | Forks: 1
# Ledger — 操作变更跟踪 Aggressor Script
Ledger 是一个 Cobalt Strike aggressor script,用于跟踪整个红队交战期间所做的每一项操作变更。你启用的每个服务、穿透的每条防火墙规则、创建的每个账户或修改的每个注册表项,都会被记录下风险评分、操作员归属和清理状态。在交战结束时,你将获得一份完整的审计跟踪记录,了解哪些内容已被更改以及哪些内容仍需清理。
## 为什么需要
红队交战会留下痕迹。服务被启用,账户被创建,防火墙规则被开放,注册表项被修改。如果没有结构化的日志,这些很容易被遗忘——尤其是在漫长的交战过程中或多个操作员同时工作时。
Ledger 为你提供了一个持续运行的日志,包含:
- 每个条目和主机的风险评分
- 清理跟踪,确保不遗漏任何内容
- 通过 Cobalt Strike 事件日志进行的操作员归属跟踪
- 导出为 JSON 或纯文本以用于事后报告
- 当存在尚未清理的变更时,自动发出死亡 beacon 警告
## 安装
1. 将 `ledger.cna` 复制到你的 Cobalt Strike 脚本目录。
2. 在菜单栏中:**Cobalt Strike → Script Manager → Load** → 选择 `ledger.cna`。
3. 菜单栏中将出现一个 **Ledger** 菜单。
4. 现在每个 Beacon 控制台都可以使用 `dirty` 别名。
## 用法
所有命令均通过 `dirty` 别名在 Beacon 控制台中运行。
### 记录变更(不执行)
```
dirty [comment] [score]
```
`comment` 和 `score` 是可选的。如果省略,将根据类别使用合理的默认值。
```
dirty RPC "sql-enablerpc lon-db-1 lon-db-2"
dirty DEFENDER "add-exclusion C:\windows\temp" "Payload staging" 8
dirty GROUP "net group 'Domain Admins' svc_backup /add /domain"
dirty USER "net user backdoor P@ssw0rd! /add"
dirty SCHEDULED_TASK "schtasks /create /tn updater /tr C:\temp\beacon.exe /sc onlogon"
```
### 一步完成执行和记录
```
dirty exec [comment] [score]
```
记录变更并立即在 beacon 上执行命令——将两步合为一步。
```
dirty exec RPC "sql-enablerpc lon-db-1 lon-db-2"
dirty exec USER "net user backdoor P@ssw0rd! /add"
dirty exec DEFENDER "sc config WinDefend start= disabled"
dirty exec FIREWALL "netsh advfirewall set allprofiles state off"
```
**`dirty exec` 的限制**
`dirty exec` 在内部使用 `brun`,它直接执行二进制文件,没有 `cmd.exe /c` 包装器。这意味着:
- 适用于真实的可执行文件:`net`、`sc`、`reg`、`nltest`、`whoami`、`ipconfig` 等。
- **不**适用于 Beacon 内置命令:`sleep`、`cd`、`ls`、`pwd`、`download`、`upload`、`execute-assembly`、`inject` 等。对于这些命令,请正常运行 Beacon 命令,并单独使用 `dirty ` 进行记录。
- **不**适用于需要 `cmd.exe` 的 shell 内置命令:`dir`、`echo`、`set`、`type`、管道 (`|`)、重定向 (`>`) 等。请使用 `dirty CATEGORY "shell "` 手动记录这些内容。
- 从其他 `.cna` 文件加载的自定义 BOF 别名将无法通过 `dirty exec` 正确调度。
### 查看日志
```
dirty show
dirty show DEFENDER
dirty show DESKTOP-ABC123
```
显示所有记录的条目。可选的过滤器可匹配命令、备注、类别、主机名和用户名。
### 评分摘要
```
dirty score
```
显示每个主机的风险摘要,包含总评分、待清理计数和可视化条形图。主机按最高分优先排序。
### 将条目标记为已清理
```
dirty clean
dirty clean all
dirty clean host
```
主机名匹配不区分大小写,并支持部分匹配——例如 `DESKTOP` 可以匹配 `DESKTOP-FGN4LPG`。
### 导出
```
dirty export text
dirty export json
dirty export text DEFENDER
dirty export json DESKTOP-ABC
```
导出的文件会写入包含 `ledger.cna` 的目录中,顶部包含主机评分摘要,后面是完整的变更日志。**Ledger** 菜单栏按钮可直接触发未过滤的导出。
### 帮助
```
dirty help
```
## 类别和默认评分
| 类别 | 默认评分 | 默认备注 |
|----------------|:-------------:|--------------------------------|
| REGISTRY | 2 | Registry modified |
| FIREWALL | 3 | Firewall rule modified |
| SERVICE | 3 | Service configuration changed |
| RPC | 4 | Changes in RPC made |
| WINRM | 4 | WinRM enabled |
| SMB | 4 | SMB signing changed |
| DCOM | 4 | DCOM enabled |
| RDP | 5 | RDP enabled |
| SCHEDULED_TASK | 5 | Scheduled task created |
| DEFENDER | 6 | Defender configuration changed |
| GROUP | 6 | Group membership modified |
| USER | 7 | User account modified |
| ACL | 8 | ACL modified |
| SPN | 8 | SPN modified |
| DOMAIN_ADMIN | 9 | Domain admin group modified |
| TRUST | 9 | Trust relationship modified |
任何未列出的类别都会被接受,默认评分为 3。
## 风险阈值
**单条条目**
| 标签 | 评分 |
|--------|--------|
| LOW | < 5 |
| MEDIUM | 5 – 7 |
| HIGH | 8+ |
**总计(每个主机)**
| 标签 | 评分 |
|----------|---------|
| LOW | < 5 |
| MEDIUM | 5 – 9 |
| HIGH | 10 – 14 |
| CRITICAL | 15+ |
## 死亡 Beacon 警告
当一个 beacon 变为死亡状态且仍有未清理的 ledger 条目待处理时,Ledger 会向 Cobalt Strike 事件日志发送一条红色警告,所有已连接的操作员都可以看到:
该警告在每个 beacon 上触发一次,如果 beacon 恢复并再次签入,则会自动重置。链接的(子)beacon 和被操作员明确终止的 beacon 会被排除在外。警告时间会根据 beacon 的 sleep 设置进行缩放——60 秒的 sleep 会在约 2 分钟后触发,5 分钟的 sleep 会在约 10 分钟后触发。
## 导出格式
### 文本
```
LEDGER EXPORT -- 2026-05-21 19:50:34
HOST SCORE SUMMARY
================================================================================
Host Risk Score Pending Bar
--------------------------------------------------------------------------------
DESKTOP-RLP4KBJ (sally *) CRITICAL +21 2 pend [##########]
DESKTOP-FGN4LPG (Admin) CRITICAL +18 0 pend [#########]
================================================================================
CHANGE LOG
================================================================================
[000002] 2026-05-21 19:22:56 | neo | GROUP | MEDIUM +6 | CLEANED
Host : DESKTOP-FGN4LPG
User : Admin
Process : HTTP Listener_x64.exe (PID 4716)
Command : net group 'Domain Admins' svc_backup /add /domain
Comment : Added svc_backup to Domain Admins for lateral movement
```
### JSON
```
{
"exported": "2026-05-21 19:53:19",
"host_summary": [
{
"host": "DESKTOP-FGN4LPG (Admin)",
"risk": "CRITICAL",
"score": 18,
"pending": 0
},
{
"host": "DESKTOP-RLP4KBJ (sally *)",
"risk": "CRITICAL",
"score": 21,
"pending": 2
}
],
"entries": [
{
"id": "000004",
"timestamp": "2026-05-21 19:31:36",
"operator": "neo",
"beacon_id": "1607712302",
"computer": "DESKTOP-RLP4KBJ",
"beacon_user": "sally *",
"beacon_process": "HTTP Listener_x64.exe (PID 11540)",
"functionality": "USER",
"command": "net user svc_backup P@ssw0rd123! /add /domain",
"comment": "Created service account for persistence",
"score": 7,
"risk": "MEDIUM",
"cleaned": false
}
```
## 多操作员使用
每个记录和清理的条目都会通过 `elog` 广播到 Cobalt Strike 事件日志,因此所有已连接的操作员都可以实时看到彼此的变更。在整个会话期间,该日志存在于 teamserver 内存中。
## 注意事项
- 日志**仅存在于内存中**,不会在 teamserver 重启后保留。请在关闭前导出。
- 导出的文件会写入包含 `ledger.cna` 的目录中。
- 支持覆盖评分:`dirty USER "net user ..." "my comment" 9` —— 最后一个参数会设置一个明确的评分。
- 两次加载脚本(例如一次通过 Script Manager 加载,一次手动加载)会注册重复的事件处理程序。如果你看到重复的输出,请检查 **Script Manager**。
该警告在每个 beacon 上触发一次,如果 beacon 恢复并再次签入,则会自动重置。链接的(子)beacon 和被操作员明确终止的 beacon 会被排除在外。警告时间会根据 beacon 的 sleep 设置进行缩放——60 秒的 sleep 会在约 2 分钟后触发,5 分钟的 sleep 会在约 10 分钟后触发。
## 导出格式
### 文本
```
LEDGER EXPORT -- 2026-05-21 19:50:34
HOST SCORE SUMMARY
================================================================================
Host Risk Score Pending Bar
--------------------------------------------------------------------------------
DESKTOP-RLP4KBJ (sally *) CRITICAL +21 2 pend [##########]
DESKTOP-FGN4LPG (Admin) CRITICAL +18 0 pend [#########]
================================================================================
CHANGE LOG
================================================================================
[000002] 2026-05-21 19:22:56 | neo | GROUP | MEDIUM +6 | CLEANED
Host : DESKTOP-FGN4LPG
User : Admin
Process : HTTP Listener_x64.exe (PID 4716)
Command : net group 'Domain Admins' svc_backup /add /domain
Comment : Added svc_backup to Domain Admins for lateral movement
```
### JSON
```
{
"exported": "2026-05-21 19:53:19",
"host_summary": [
{
"host": "DESKTOP-FGN4LPG (Admin)",
"risk": "CRITICAL",
"score": 18,
"pending": 0
},
{
"host": "DESKTOP-RLP4KBJ (sally *)",
"risk": "CRITICAL",
"score": 21,
"pending": 2
}
],
"entries": [
{
"id": "000004",
"timestamp": "2026-05-21 19:31:36",
"operator": "neo",
"beacon_id": "1607712302",
"computer": "DESKTOP-RLP4KBJ",
"beacon_user": "sally *",
"beacon_process": "HTTP Listener_x64.exe (PID 11540)",
"functionality": "USER",
"command": "net user svc_backup P@ssw0rd123! /add /domain",
"comment": "Created service account for persistence",
"score": 7,
"risk": "MEDIUM",
"cleaned": false
}
```
## 多操作员使用
每个记录和清理的条目都会通过 `elog` 广播到 Cobalt Strike 事件日志,因此所有已连接的操作员都可以实时看到彼此的变更。在整个会话期间,该日志存在于 teamserver 内存中。
## 注意事项
- 日志**仅存在于内存中**,不会在 teamserver 重启后保留。请在关闭前导出。
- 导出的文件会写入包含 `ledger.cna` 的目录中。
- 支持覆盖评分:`dirty USER "net user ..." "my comment" 9` —— 最后一个参数会设置一个明确的评分。
- 两次加载脚本(例如一次通过 Script Manager 加载,一次手动加载)会注册重复的事件处理程序。如果你看到重复的输出,请检查 **Script Manager**。标签:Cobalt Strike, JS文件枚举, 攻击诱捕, 痕迹清理, 运维跟踪