软件包安装历史
包管理器会记录每次安装、升级与卸载的时间,是判断「什么时候被装上了什么」最可靠的来源之一。相比文件时间戳,这类日志带上下文:apt 的 history.log 会保留完整命令行。取证价值在于它能回答攻击者是否装了工具,而系统状态只能告诉你当前装了什么。
基本信息
| Debian/Ubuntu | /var/log/dpkg.log*、/var/log/apt/history.log、/var/log/apt/term.log |
|---|---|
| RHEL/CentOS | /var/log/dnf.log、/var/log/yum.log、dnf history list |
| 关键字段 | 时间戳、动作(install/upgrade/remove)、包名、版本 |
| 轮转方式 | dpkg.log 按 .1、.2 顺序轮转,旧记录在 .gz 压缩包 |
| 典型工具包 | nmap、socat、gcc、tcpdump 等常被用于横向与嗅探 |
| 描述文件 | /var/lib/dpkg/status 只反映当前状态,不含卸载历史 |
典型使用场景
- 定位入侵窗口内被额外安装的渗透与嗅探工具
- 核对系统是否在变更窗口之外被动过包
- 确认某组件被卸载前的原始版本,便于恢复
- 与文件 mtime 互证可疑文件的来源
- 输出主机变更时间线的包维度视图
最小示例
最小示例
grep -E ' (install|remove|upgrade) ' /var/log/dpkg.log* | tail -30 # 含已轮转的日志
grep -E ' (install|remove|upgrade) ' /var/log/dpkg.log | head -20 # 只看当前日志的开头
grep -A3 'Start-Date' /var/log/apt/history.log | tail -40 # apt 记录包含完整命令行
dnf history list | head -20 # RHEL 系按事务号列出
dnf history info 42 # 查看某次事务的明细
dpkg -l | awk '$1=="ii"{print $2, $3}' | head # 当前已安装列表(状态不是历史)输出逐列读法
| 列 | 含义 | 异常信号 |
|---|---|---|
| 时间戳 | 操作发生时刻 | 落在夜间或非变更窗口内 |
| 动作 | install、upgrade、remove | 同一时间段先装后删 |
| 包名 | 软件包名称 | 与主机角色无关的嗅探或隧道工具 |
| 版本 | 操作后的版本号 | 版本被回退到比发行版更旧 |
| 命令行 | apt history 记录的完整命令 | 由非运维账号或异常终端发起 |
日志为空不等于没被植入:手工解压的二进制与静态编译的样本不经过包管理器,必须与文件系统时间线互补判断。
RHEL 系还可以用 rpm -qa --last 按安装时间倒序输出,作为 dnf 历史的快速交叉验证。
用 dnf history undo 或 apt 回滚会直接改变系统状态并可能中断业务;取证阶段先复制日志与状态文件,处置动作另行评估。