ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Viper 防御规避实战:使用 DelLastByPython 模块清除 Linux last 登录日志

Viper 防御规避实战:使用 DelLastByPython 模块清除 Linux last 登录日志
  • 文档
  • 教程
  • 网络安全

【免费下载链接】Viper

Adversary simulation and Red teaming platform with AI

项目地址:https://gitcode.com/gh_mirrors/vip/Viper
点击查看免费下载

本文基于 Viper 开源红队平台内置模块DefenseEvasion_ClearCommandHistory_DelLastByPython(Last 日志删除),讲解 Linux 登录日志(last/wtmp)的底层存储机制、last命令显示与二进制文件内容不一致的根本原因,以及如何通过utmpdump精确定位待删除记录,并在 Viper 平台中安全、精准地清除目标主机上的登录痕迹。读完本文,你将掌握一套可复现的 Linux 登录日志清理流程,为红队评估中的防御规避(Defense Evasion)环节提供实战支撑。

模块概述与战术背景

DefenseEvasion_ClearCommandHistory_DelLastByPython是 Viper 内置的防御规避(Defense Evasion)类后渗透模块,其核心功能是删除目标机器上的last日志,即 Linux 系统记录的登录/登出历史。从模块命名可以看出,其实现语言为 Python,与 Viper 平台"支持通过 Python 编写自定义模块"的扩展能力一脉相承(参见 README_ZH.md)。

该模块在 MITRE ATT&CK 框架中对应防御规避战术下的"清除命令历史 / 日志"技术(Clear Command History,即 T1070 系列的日志清除类技术):攻击者在获取会话后,通过清除登录记录降低被入侵主机管理员发现外部登录行为的可能性。在 Viper 中,这类模块通过 模块索引页 的搜索与 ATT&CK 分类过滤即可快速定位。

Linux 登录日志机制:utmp、wtmp 与 btmp

要理解本模块为什么能"删除 last 日志",首先需要弄清 Linux 登录日志的存储体系。系统登录信息分布在三个核心二进制文件中:

  • /var/run/utmp:记录当前正在登录的用户信息,对应who、w命令;
  • /var/log/wtmp:记录所有登录与登出历史,对应last命令,是本文操作的核心对象;
  • /var/log/btmp:记录失败的登录尝试,对应lastb命令。

这三个文件均为定长二进制结构(struct utmp),每个结构体包含用户名字段、终端类型、登录 PID、登录来源主机/IP、登录时间戳等字段。正因如此,它们不能直接用文本编辑器查看,必须借助专用工具解析——这正是模块文档要求使用utmpdump检查待删除行的原因。

为什么 last 命令显示与实际文件内容不一致

模块文档特别强调了一个关键前提:

由于 last 命令显示和实际文件内容不一致,实际需要删除的行请通过utmpdump /var/log/wtmp |tail -20查看。

两者不一致的原因来自last命令的展示层处理,主要体现在以下几点:

  1. 字段截断与格式化:last按终端宽度格式化输出,过长的用户名、主机名或 IP 会被截断或省略,而utmpdump输出的则是记录中的原始字段值;
  2. 会话合并:同一终端上连续、短暂的登录记录,last可能会进行合并展示,而wtmp文件中每条记录是独立存在的;
  3. 时间戳表示:last展示的是人类可读时间,utmpdump则以时间戳(epoch)与可读时间并存的格式输出;
  4. 特殊记录:wtmp中还包含系统重启(reboot)、关机(shutdown)等特殊记录,last会以特定标记显示,而二进制层面它们与普通登录记录形态一致。

结论是:如果仅凭last命令的输出去"数行数"来删除记录,很容易删错或删漏。必须先用utmpdump把二进制记录解析为可读的行,逐条核对后再执行删除。

用 utmpdump 精确定位待删除记录

模块文档给出了标准的核查命令:

utmpdump /var/log/wtmp | tail -20

其作用是将/var/log/wtmp中的二进制登录记录解析为一行一行的结构化文本,并通过tail -20只查看最后 20 行——即最靠近当前时刻、最可能包含目标会话留下的登录痕迹的部分。

实际排查流程建议如下:

# 1. 查看当前会话对应的登录记录(如目标会话来源 IP / 时间) last -i | head -20 # 2. 解析二进制记录,定位目标行 utmpdump /var/log/wtmp | tail -50 # 3. 重点关注与当前会话时间、来源地址吻合的记录行 # 记录行中通常包含:用户、终端类型、登录 PID、来源 IP、时间戳等字段

在确认了需要删除的具体记录后,再在 Viper 中运行本模块完成删除。由于wtmp为系统核心日志文件,操作前务必保留utmpdump的输出备份,避免误删后无法恢复;同时模块文档的提示也说明,该模块的处理对象是"最后一条"(或最后一批)登录记录,因此适合在会话操作结束后、退出目标主机前执行清理。

在 Viper 中运行 DelLastByPython 模块

模块属于需要 Session 的模块,运行入口与 Viper 通用模块执行流程一致(详见 运行模块指南):

  1. 选择 Session:在主机与 Session 列表中找到目标 Linux 会话,点击该 Session 所在行并选择"运行模块",此时界面将展示全部可用模块(若在不存在的 Session 行点击,则默认只显示无需 Session 的模块);
  2. 搜索定位:在模块搜索框中输入DelLastByPython或ClearCommandHistory,Viper 的搜索会根据模块名称 / TTPs / 简介进行匹配,也可通过左侧 ATT&CK 分类栏选择 Defense Evasion 战术过滤;
  3. 确认参数与说明:左侧选中本模块后,右侧默认展示模块所需参数,鼠标悬停可查看参数说明;切换到"说明"选项卡可查看模块介绍——即"删除目标机器上的 last 日志,实际删除行请通过utmpdump /var/log/wtmp | tail -20查看";
  4. 执行与观察:点击运行后,切到"实时输出"选项卡观察模块运行状态;若模块在后台运行,可到"任务列表"页面查看;运行结束后,"平台日志"会显示模块进入后台、运行日志与结束提示,"模块结果"则展示运行结束时间、主机 IP、模块名称、模块参数与结果输出。

由于该模块以 Python 实现并在目标机器上执行,其底层逻辑与 Viper 的 Python 模块体系一致——可参考同类模块的运行方式(例如 Run Python Script (Kit) 中 Python 3.11 解释器的使用说明)理解其在目标端的执行环境。模块的具体实现源码位于独立的 Viper Python 模块仓库中,本文档仓库仅承载模块说明文档。

使用注意事项与安全边界

  1. 务必先核对再删除:严格遵守文档提示,删除前用utmpdump /var/log/wtmp | tail -20确认实际记录行,切勿直接按last的显示结果操作;
  2. 权限要求:写入/var/log/wtmp需要 root 权限,请确认当前 Meterpreter Session 已获得目标主机的高权限;
  3. 日志联动:wtmp只是登录历史的一部分,btmp(失败登录)、utmp(当前在线用户)以及/var/log/下其他审计日志(如auth.log/secure)仍可能暴露操作痕迹,清除时应结合目标主机的具体日志策略整体评估;
  4. 风险评估:删除系统登录日志本身可能触发主机异常告警,在红队评估中需权衡清理收益与暴露风险;如需进一步降低 Viper 服务端的可被识别性,可参考 反溯源指南 中的配置方案;
  5. 适用前提:本模块面向 Linux 目标主机的wtmp登录日志清理,Windows 主机的登录痕迹清理需选用平台中对应的 Windows 日志处理模块。

延伸阅读

  • 模块使用说明(搜索与定位模块)
  • 运行模块(Session 选择 / 参数 / 实时输出 / 任务列表)
  • Viper 平台能力总览
  • 反溯源配置(降低 Viper 服务端可识别性)
  • 文档
  • 教程
  • 网络安全

【免费下载链接】Viper

Adversary simulation and Red teaming platform with AI

项目地址:https://gitcode.com/gh_mirrors/vip/Viper
点击查看免费下载
上一篇:flexprice 生产部署审批门实战指南:Preprod 金丝雀 + GitHub Environments 手动审批门
下一篇:用树莓派调用 Custom Vision 目标检测器:把一张货架照片变成库存数量

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进