后渗透痕迹清理 --- 事了拂衣去,深藏身与名
渗透成功了,权限拿到了。但别急着庆祝------你的每一步操作都在服务器上留下了痕迹:登录日志、远程桌面连接记录、上传过的文件、执行过的命令......如果不清掉这些,蓝队半天就能追到你第一台跳板机。痕迹清理不是渗透的收尾工作,而是伴随渗透全过程的操作。
一、痕迹清理的核心认知
1.1 什么是痕迹清理?
抹除或替换因渗透操作而遗留的渗透痕迹,通常发生在后渗透阶段或目标已达成时,也用于隐蔽持久化操作。
1.2 三个关键认知
| 认知 | 说明 |
|---|---|
| 🔴 无法绝对清除 | 只要和计算机有接触,就一定会有痕迹 |
| 🔴 第三方日志无解 | 远程日志平台(ELK/Splunk)的结构对本地清理基本免疫 |
| 🟢 边渗透边清理 | 痕迹清理伴随渗透全程,而不是事后补救 |
目的:
- 为下一步渗透争取时间
- 提高隐蔽性,降低被发现的概率
二、Windows 痕迹清理
2.1 Windows 日志机制
知己知彼------要先知道日志怎么产生,才知道怎么清理。
操作发生 → 缓存为内存内容 → wevtutil.exe 解析为 XML → 转换为可读日志
日志基本结构: 时间 + 地点 + 用户 + 操作
2.2 Windows 日志类型
| 日志类别 | 内容 | 路径 |
|---|---|---|
| 系统 | 驱动程序、内核、服务、注册表操作 | %SystemRoot%\System32\Winevt\Logs\System.evtx |
| 安全 | 登录、注销、权限使用、账户管理 | %SystemRoot%\System32\Winevt\Logs\Security.evtx |
| 应用程序 | 应用程序记录的事件 | %SystemRoot%\System32\Winevt\Logs\Application.evtx |
2.3 蓝队必知事件 ID(清理时重点关照)
| 事件 ID | 含义 |
|---|---|
| 4624 | 成功登录 |
| 4625 | 登录失败 |
| 4634 | 用户注销 |
| 4648 | 使用明文凭据登录 |
| 1074 | 系统即将关闭 |
| 6005 / 6006 | 系统启动 / 关闭 |
2.4 清理用户操作痕迹
日志级别:
| 级别 | 含义 |
|---|---|
| 信息 | 正常操作 |
| 警告 | 潜在问题 |
| 错误 | 发生问题 |
| 关键 | 严重故障 |
⚠️ 清理日志这个操作本身也是一条日志。完全清除不可能,追求的是最大化隐蔽。
2.5 清理 3389 远程桌面痕迹
RDP 连接会在系统多个位置留下痕迹。
痕迹位置:
| 位置 | 内容 |
|---|---|
文档\Default.rdp |
RDP 连接文件 |
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\ |
连接目标账号密码 |
批处理清理脚本核心逻辑:
bash
# 删除注册表中的 RDP 记录
reg delete "HKCU\Software\Microsoft\Terminal Server Client\Default" /va /f
reg delete "HKCU\Software\Microsoft\Terminal Server Client\Servers" /f
# 删除 Default.rdp
attrib Default.rdp -s -h
del Default.rdp
2.6 日志文件的全面清理
方法一:wevtutil 命令行
bash
# 列出所有日志名称
wevtutil el
# 清理三大核心日志
wevtutil cl system
wevtutil cl application
wevtutil cl security
方法二:PowerShell
powershell
Powershell -Command "&{clear-Eventlog -Log Application,System,Security}"
Get-WinEvent -ListLog Application,Setup,Security -Force | %{Wevtutil.exe cl $_.Logname}
方法三:MSF / CS
bash
# MSF 一键清理
meterpreter> clearev
# CS 使用相关插件
2.7 停止日志记录 --- 核心技巧
与其一条条清理,不如让日志根本不产生。
Invoke-Phant0m(PowerShell 版)
专门定位
svchost.exe中负责记录日志的线程,将其全部 Kill。
powershell
powershell
import-module .\Invoke-Phant0m.ps1
Invoke-Phant0m
缺点: Kill 线程后,必须重启设备才能恢复日志功能。
EventCleaner(C 版,强烈推荐)
能够挂起日志记录线程而非杀死,渗透完成后可恢复。
bash
EventCleaner.exe suspend # 挂起日志线程 → 不再产生日志
EventCleaner.exe normal # 恢复线程 → 日志功能恢复
2.8 最近使用的文件清理
即使删除了文件,「最近使用的文件」中仍会保留最近 20 个文件的记录。
bash
del /f /s /q "%userprofile%\Recent\*"
2.9 文件的覆写删除
普通删除可以在短时间内被恢复。用覆写方式让恢复变得不可能。
bash
# 覆写单个文件
cipher /w:C:\test
# 格式化整个盘符
format 盘符
2.10 伪造时间戳
不光要清理痕迹,还要让文件看起来一直都那样。
powershell
# 核心逻辑:随机选择系统中已有文件的时间戳,覆盖到目标文件上
$(Get-Item $path).LastAccessTime = $随机时间
$(Get-Item $path).LastWriteTime = $随机时间
$(Get-Item $path).CreationTime = $随机时间
三、Linux 痕迹清理
Linux 万物皆文件------日志是文件,历史记录是文件。比 Windows 更容易清理,但也更容易因批量删除而引起怀疑。
3.1 SSH 连接痕迹
bash
# 不记录 SSH 公钥在本地
ssh -o UserKnownHostsFile=/dev/null -T root@xxx.xxx.xxx.xxx /bin/bash -i
3.2 History 命令历史清理
History 运行原理:
1. 登录 Shell → 从 .bash_history 加载历史记录到内存
2. 执行命令 → 追加到内存中的历史记录缓冲区
3. 退出 Shell → 将缓冲区写回 .bash_history 文件
清理方式:
bash
# 清空当前缓存(伪删除)
history -c
# 用空缓存覆盖文件(真删除)
history -w
# 删除指定命令
history | grep "keyword" # 找到目标命令编号
history -d 编号 # 逐条删除
# 批量删除(只保留前 15 行)
sed -i '15,$d' .bash_history
# 当前 Shell 不再记录历史
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTLOG
# 禁用所有历史记录
echo "HISTSIZE=0" >> /etc/profile
source /etc/profile
HISTSIZE=0 && HISTFILESIZE=0
3.3 Linux 日志文件清理
核心日志文件:
| 文件 | 内容 |
|---|---|
/var/log/lastlog |
所有用户最后一次登录时间 |
/var/log/utmp |
当前登录用户信息 |
/var/log/wtmp |
用户登录历史记录 |
/var/log/secure |
安全相关日志(SSH 登录等) |
/var/log/messages |
系统通用日志 |
~/.bash_history |
命令历史 |
清理命令:
bash
# 清空各类日志
echo > /var/log/lastlog
echo > /var/log/utmp
cat /dev/null > /var/log/secure
cat /dev/null > /var/log/messages
3.4 针对性修改/删除 --- 高级手法
直接清空整文件太明显,精准修改特定行才是隐蔽之道。
sed 替换
bash
# 修改:替换特定字符串
sed -i 's/原始IP/伪造IP/g' 目标日志文件
# 删除:移除包含特定内容的行
sed -i '/要删除的内容/'d 目标日志文件
grep -v 反选删除
bash
# 把不含关键词的行保留为新文件
cat 目标文件 | grep -v 要删除的关键字 > 篡改后文件
cat 篡改后文件 > 目标文件
3.5 二进制日志文件修改
wtmp、btmp等是二进制文件,不能直接 sed。需要先转换再改。
bash
# 二进制 → 文本
utmpdump /var/log/wtmp > /var/log/wtmp.txt
# 编辑文本
vim /var/log/wtmp.txt
:%s/10.0.0.1/192.168.5.5/g # 全文替换 IP
# 文本 → 二进制
utmpdump -r < /var/log/wtmp.txt > /var/log/wtmp
3.6 文件强力删除 --- 无法恢复
bash
shred -f -u -z -v -n 6 目标文件
| 参数 | 说明 |
|---|---|
-f |
必要时强制修改权限 |
-n 6 |
覆盖 6 次(默认 3 次) |
-u |
覆盖后删除 |
-z |
最后一次用 0 覆盖以隐藏操作 |
-v |
显示详细信息 |
3.7 时间戳修改
bash
# 查看文件时间戳
stat 文件名
# 修改系统时间 → 修改文件时间
date -s "20230201 16:43:53"
touch -r 参考文件 目标文件 # 把参考文件的时间赋给目标文件
hwclock --hctosys # 硬件时间同步给系统
3.8 Moonwalk --- Linux 日志快照与恢复
Moonwalk 是一个 400KB 的单二进制文件,能保存渗透前系统日志状态并在渗透后恢复。
bash
moonwalk start # 备份当前日志状态
# ... 进行渗透操作 ...
moonwalk stop # 恢复日志到渗透前状态!
特性:
- 极小体积,curl 快速拉取
- 5 毫秒内执行所有命令
- 不留 Shell 痕迹
3.9 BleachBit --- 全面清理工具
开源的系统清理工具,支持 Windows 和 Linux。清理缓存、Cookies、历史记录、临时文件。相当于 Linux 上的 CCleaner。
四、Windows vs Linux 痕迹清理对比
| 对比维度 | Windows | Linux |
|---|---|---|
| 日志形态 | EVTX 二进制文件 | 文本文件为主 |
| 清理难度 | 高(二进制 + 注册表) | 低(万物皆文件) |
| 停止日志 | EventCleaner 挂起线程 | 停 rsyslog 服务 |
| 核心工具 | wevtutil / EventCleaner / MSF clearev | sed / grep / shred / moonwalk |
| 注意事项 | 365 日志也有记录 | 直接清空易被察觉 |
五、痕迹清理核心原则
1. 能单条删除就单条删 --- 不要整文件清空,太明显
2. 文件删除用覆写 --- 普通删除可能被恢复
3. 伪造时间痕迹 --- 让文件看起来像一直存在
4. 伪造 IP / 用户名 --- 用 sed 替换真实 IP 为假 IP
5. 边渗透边清理 --- 不是事后一次性操作
6. 停日志 > 清日志 --- EventCleaner suspend 才是王道
7. 网络隧道也是隐藏 --- 端口转发 = 网络连接痕迹隐藏
写在最后: 痕迹清理是渗透测试中最被低估的环节。蓝队逆向追踪你的能力,取决于你留下的痕迹有多少。一个合格的渗透测试工程师,进攻时知道怎么打,撤退时更知道怎么抹掉脚印。不留痕迹,才是最高级的渗透。
后渗透痕迹清理至此结束。至此,从 Web 打到内网、从提权到横向移动、从权限维持到痕迹清理------整套渗透测试攻防链笔记已全部完成。