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智能小助手)
公众号二维码