---
name: persistence-linux
description: 在管理员显式启用、演练 ROE 允许且用户精确授权后，为 Linux Puppet 目标部署一项与红队任务匹配、可验证、限时且可完整回滚的持久化机制。当需要在既定存续窗口内维持对指定账号或主机的访问，并已提供载荷、路径和清理要求时使用。
---

# Linux 红队持久化

此 skill 默认禁用。启用只表示能力可见，不代表本次演练授权。每次写入必须绑定精确目标、机制、载荷、存续窗口和回滚动作确认。

## 行动目标

- 在 ROE 允许的时间窗口内维持对指定主机或账号的访问。
- 选择能满足目标的最小机制，不追求隐蔽性而增加复杂度。
- 记录变更前值、本次唯一标识、验证结果、到期时间和清理责任。
- 演练目标完成或窗口到期时可靠回滚。

## 必要输入

- 演练目标、授权主机、目标账号和当前权限。
- 允许的机制：SSH 公钥、用户 crontab 或 systemd 服务。
- 用户提供并批准的精确公钥或命令载荷。
- 写入路径、服务名或唯一任务标识。
- 生效时间、到期/清理时间和责任人。
- 验证方法、变更前备份方式和完整回滚命令。

任何一项缺失时停留在方案阶段，不自行生成 C2 地址、载荷或基础设施参数。

## 授权与 ROE

- 风险等级：high；访问模式：write-destructive。
- 只部署一种机制，不建立冗余后门。
- 不使用 SUID 副本、shell profile 注入、二进制替换、日志清理或伪装系统组件。
- 不自动生成反弹 Shell、C2 载荷或隐藏命名。
- 不覆盖既有 unit、任务或 authorized_keys 内容，不修改未批准的行。
- 不保存私钥、密码、Token 或完整载荷到侦察摘要。
- 用户只要求评估方案时，不执行任何写入。

## OPSEC 与变更预算

- 最多一次配置写入、一次原生状态验证；失败时不叠加第二机制。
- 优先选择现有服务能力和最小文件改动。
- 写入前采集目标对象存在性、权限、哈希/内容摘要和相关安全策略。
- 不关闭 SELinux、AppArmor、审计、安全产品或文件完整性监控。
- 明确产生的文件、配置、服务、认证和网络痕迹。

## 机制选择

按任务需求选择，不按“最隐蔽”排序：

1. SSH authorized_keys：需要运维式交互访问、SSH 已启用、目标账号允许公钥登录。
2. 用户 crontab：需要在明确时间窗口运行用户批准的非交互命令。
3. systemd 服务：root 权限、需要开机/服务级存续、用户提供精确 ExecStart。

如果一次性访问已经足够完成目标，建议不部署持久化。

## 工作流

1. 读取摘要和演练目标，确认持久化是否必要、目标是否在授权范围。
2. 创建计划：环境与前值、机制/窗口/回滚、用户确认、写入与验证、到期交接。
3. 用只读命令确认身份、HOME、SSH、cron、systemd、容器、挂载和安全策略。
4. 选择一种机制，生成精确变更计划和回滚计划，不执行。
5. 调用 `request_user_input`，列出每条写命令、目标、前值摘要、载荷标识、存续窗口、痕迹、验证和回滚命令；随后停止本轮。
6. 用户确认后只执行批准参数；任何参数变化都重新确认。
7. 写入后验证目标配置只包含本次批准变更。失败时执行已批准回滚并验证恢复。
8. 摘要保存变更台账和到期责任，不保存秘密与完整载荷。

## 只读环境确认

```bash
id; whoami; printf 'HOME=%s\n' "$HOME"; test -w "$HOME" && echo HOME_WRITABLE
command -v crontab; crontab -l 2>/dev/null
ps -p 1 -o comm= 2>/dev/null; command -v systemctl
ss -tln 2>/dev/null | grep -E '(:22[[:space:]]|:22$)' || true
grep -E '^(PubkeyAuthentication|AuthorizedKeysFile)' /etc/ssh/sshd_config 2>/dev/null
test -f /.dockerenv && echo IN_DOCKER; findmnt -no TARGET,OPTIONS "$HOME" 2>/dev/null
command -v getenforce >/dev/null && getenforce; command -v aa-status >/dev/null && aa-status 2>/dev/null | head -20
```

## 机制要求

### SSH authorized_keys

- 写入前计算用户提供公钥的指纹，检查是否已存在。
- 保留原文件，按唯一注释或完整公钥精确追加和删除。
- 验证目录/文件权限、sshd 生效配置和目标账号。
- 不传输、读取或保存攻击者私钥。

### 用户 crontab

- 使用绝对路径和本次唯一注释，保留所有原任务。
- 明确运行用户、执行频率、开始/结束窗口、日志与网络行为。
- 回滚只删除唯一标识对应任务；禁止脆弱的整表覆盖管道。

### systemd 服务

- 仅 root 且 PID 1/systemd 条件满足时使用。
- 服务名必须用户批准、可归因于演练，不伪装系统组件。
- unit 已存在时停止，不覆盖；明确 User、WorkingDirectory、ExecStart、Restart 和日志。
- 回滚顺序：停止、禁用、删除本次 unit、daemon-reload，并核对原状态。

## 成功与停止条件

成功：唯一机制已按批准参数部署，原生状态验证通过，变更前值、到期时间和回滚命令均已记录。

立即停止并报告/回滚：

- 发现目标、账号、机制或载荷超出 ROE。
- 目标配置与确认前发生变化，可能有并发修改。
- 写入影响既有服务、账号或任务。
- SELinux/AppArmor/只读挂载等阻止执行。
- 验证失败、产生未批准网络连接或出现异常系统影响。
- 演练目标已可在不持久化情况下完成。

## 变更台账与交接

```markdown
## Linux 红队持久化变更
- 目标、账号和演练目的：...
- 机制、路径和唯一标识/公钥指纹：...
- 变更前值摘要：...
- 确认范围与执行时间：...
- 生效/到期时间与清理责任：...
- 验证结果和产生痕迹：...
- 完整回滚命令与回滚状态：...
- 未保存：秘密值和完整载荷
```

最终输出必须明确：修改了什么、为何需要、何时清理、谁负责、如何验证和如何回滚。不得宣称删除系统安全日志是清理步骤。
