新型PowerShell历史记录防御规避技术
PowerShell内置了一项实用功能:将执行的命令写入文件以便后续参考。该功能由PSReadline模块提供。虽然从可用性角度来看很有帮助,但这也可能成为黑客利用的工具。
例如,如果在PowerShell命令行中输入密码等敏感信息,这些信息也会被添加到历史文件中,黑客可以通过查看历史记录发现这些敏感信息。
为解决此问题,PSReadline模块v2.0.4+版本会在命令行包含以下敏感词时跳过将其添加到历史文件:
- Password
- Asplaintext
- Token
- Apikey
- Secret
PowerShell v7.0.11+自带的PSReadline版本支持此功能,但Windows PowerShell 5.1附带的PSReadline版本为2.0.0,不支持此功能,不过可以轻松更新。
敏感历史记录清理实战演示
在上方图片中,我们运行了三个命令,其中一个包含触发"敏感"过滤器的单词。请注意,当我们"cat"(即打印到屏幕)历史文件时,密码行并未列出。
这虽然很巧妙,但也为防御规避提供了极其简单的方法:黑客可以控制哪些命令出现在历史文件中。
防御规避技术
在上方图片中,我们通过简单添加包含"敏感"词的注释,成功阻止了第二个命令被记录到历史文件中。
这并非突破性发现,因为攻击者始终可以打开历史文件并手动删除命令。然而,这确实使防御规避战术更加简单,是我在下次红队行动中会使用的技巧。
另一个有趣的防御规避选项是自定义代码来决定是否将命令写入历史文件。我们可以按以下方式禁用当前会话的所有历史记录:
|
|
“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"。