PowerShell历史记录防御规避新技术解析

PowerShell历史记录防御规避新技术

PowerShell内置了一项实用功能:将执行的命令写入文件以便后续查阅。该功能由PSReadline模块提供,虽然从用户体验角度很有帮助,但也可能被黑客利用。

例如,当密码等敏感信息被输入PowerShell命令行时,这些信息会同时被记录到历史文件中,攻击者通过查看历史记录即可获取敏感数据。

为解决此问题,PSReadline模块v2.0.4+版本引入敏感词过滤机制,当命令行包含以下关键词时将跳过历史记录(详情参见):

  • Password
  • Asplaintext
  • Token
  • Apikey
  • Secret

PowerShell v7.0.11+默认搭载支持此功能的PSReadline版本,而Windows PowerShell 5.1预装的PSReadline v2.0.0不支持该功能(但可手动更新)。

敏感历史记录清理实战演示

![演示截图]
如图所示,我们执行了三条命令,其中一条包含触发敏感过滤机制的词汇。当使用cat命令(即打印到屏幕)查看历史文件时,包含密码的命令行未被列出。

这种方式虽然巧妙,但也为攻击者提供了简易的防御规避技术——通过控制命令内容来决定哪些命令出现在历史文件中。

防御规避技术深化

![规避演示]
在上图中,我们通过在命令中添加包含敏感词的注释,成功阻止第二条命令被记录到历史文件。

这并非突破性发现(攻击者始终可以手动编辑历史文件),但确实使防御规避战术更加简便,值得在红队行动中应用。

自定义历史记录逻辑

更有趣的规避选项是自定义历史记录判断逻辑。可通过以下命令禁用当前会话的所有历史记录:

Set-PSReadLineOption -AddToHistoryHandler { return $false }

AddToHistoryHandler接收当前命令作为$line变量,返回$true时才会写入历史文件。此处直接返回$false阻止记录。防御方可监控AddToHistoryHandler参数的使用,实际上监控所有PSReadLineOption函数都是明智之举。

其他规避技术示例

  • 阻止日志记录Set-PSReadlineOption -HistorySaveStyle SaveNothing
  • 删除历史文件Remove-Item (Get-PSReadlineOption).HistorySavePath
  • 设置替代路径Set-PSReadLineOption -HistorySavePath $env:TEMP\out.txt
  • 使用约束语言模式$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"

如需深入了解PowerShell主题(如Just Enough Admin、PowerShell远程处理、语言模式等),可参考作者16小时的《PowerShell For InfoSec》课程。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-08-20 10:56  qife  阅读(12)  评论(0)    收藏  举报