轩辕三官 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在最近的学习中,我发现Powershell命令的历史有时会包含系统的敏感信息,比如远程服务器的连接密码,于是我对Powershell的历史功能做了进一步的研究,总结了一些渗透测试中常用的导出历史记录的方法,并结合利用的思想,给出了一些防御建议。 0x01 简介 本文将介绍以下内容: 两个Powershell命令的历史 一种导出Powershell命令历史的方法 辩护建议 0x02 两种Powershell命令的历史记录 有两种方法可以记录Powershell命令的历史,可以分别使用Get-History和Get-PSReadlineOption读取。 1、Get-History 参考文件: https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Core/Get-History?view=powershell-3.0 默认情况下支持Powershell v2和更高版本 可以记录在当前会话中输入的命令,这些命令不会在多个Powershell进程之间共享。Powershell进程退出后,所有记录将被自动清除。 1. 常用命令 获取关于历史的完整信息: Get-History |格式-列表-属性* 包括: 身份 命令行 执行状态 StartExecutionTime EndExecutionTime 测试下图 删除所有历史记录: 清除历史记录 按ID号删除命令: 清除-历史记录-Id 3 2. 利用思路 得到了一个Windows系统的权限,在后台找到了Powershell进程,想读取Powershell进程的历史。 (1)Powershell进程无法接收键盘输入命令。 例如,Powershell加载一个在后台运行的脚本:Powershell -ep bypass -f 1.ps1 此时,您不能向Powershell进程发送键盘消息。这时,你可以通过读取进程的命令行参数来获得有用的信息。开放源代码: https://github . com/3g student/home-of-C-Language/blob/master/getprocesscommandline . CPP 该代码可以读取指定进程的命令行参数,并通常获得有用的信息。 (2)Powershell进程可以接收键盘输入命令。 您可以在这里模拟发送键盘消息和导出历史。 方案实现思路: 通过遍历枚举所有窗口。 通过GetWindowThreadProcessId从窗口(HWND)获取PID。 对比PID,找到满足条件的窗口。 向合格的窗口发送键盘消息(PostMessage)。 计划详情: 1.虚拟键码 每个键盘输入信息对应一个虚拟键码。 参考资料: https://docs . Microsoft . com/en-us/windows/desktop/input dev/virtual-key-codes 需要模拟键盘按下和键盘抬起两种操作,开源测试代码: https://github . com/3g student/home-of-C-Language/blob/master/sendkeyboardmessagetopowershell . CPP 代码实现了搜索指定pid的进程,并向该进程发送键盘消息,内容为whoami。 2.导出历史 该命令如下所示: get-History | export-CSV $ env:temp ' \ History . CSV ' 应该考虑字符“|”、“$”和“,”并且在模拟键盘输入时应该添加Shift键。 这里的实现方法是先用keybd_event按下Shift键,再用PostMessage发送键的字母,最后抬起两个键。 开源测试代码: https://github . com/3g student/home-of-C-Language/blob/master/SendKeyboardMessageToPowershell(Get-History)。卡片打印处理机(Card Print Processor的缩写) 该代码实现了搜索指定pid的过程,并向该过程发送一个键盘消息,内容为:get-history | export-CSV $ env:temp ' \ history . CSV ' 3. 补充:查看cmd.exe的历史记录 该命令如下所示: 多键/小时 空: doskey/重新安装 您也可以通过发送键盘信息来导出cmd.exe的命令历史。 2、Get-PSReadlineOption 参考文件: https://docs . Microsoft . com/en-us/powershell/module/PS readline/?view=powershell-5.1 默认Powershell v5支持 只有在安装了getting-psreadlineoption后,才能使用V3和Powershell v3。 安装后,所有Powershell命令的历史记录将保存在同一位置,并且可以随时查看。 1. Powershell v3和Powershell v4的安装和使用 以64位系统为例。安装方法如下: (1)安装PowerShellGet 下载: https://www.microsoft.com/en-us/download/details.aspx?id=51451 注: 安装前需要关闭Powershell进程。 隐藏安装可以通过命令行实现,命令如下: msiexec /q /i包管理_x64.msi 安装成功后,在控制面板的已安装程序列表(控制面板\程序\程序和功能)有显示:软件包管理预览- x64 可以通过删除对应的注册表项进行隐藏,更多细节可参考《渗透基础——获得当前系统已安装的程序列表》 软件包管理预览- x64的注册表路径为HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \当前版本\ Uninstall \ { 57 E5 A8 bb-41EB-4f 09-B332-b 535 c 5954 a 28 } 只需要删除这个注册表项及子项即可实现在已安装程序列表中隐藏 删除注册表项的煤矿管理局命令: 注册删除HKLM \软件\微软\ Windows \当前版本\卸载\ { 57 E5 A8 bb-41EB-4f 09-B332-b535c 5954 a 28 }/f (2)安装PSReadLine 通过安装模块命令安装 安装模块名称PSReadLine 弹出提示: 需要努格特提供程序才能继续 PowerShellGet需要努格特提供程序版本' 2.8.5.201 '或更高版本才能进行交互 基于努格特的存储库NuGet提供程序必须在中可用 c:\ Program Files \ package management \ provider assemblies '或 c:\ Users \ Administrator \ AppData \ Local \ package management \ provider assemblies . 您也可以通过运行"安装软件包提供者"来安装努格特提供程序 -Name nu get-最低版本2.8.5.201-Force .你想让PowerShellGet进入 现在安装并导入努格特提供程序吗? 是否暂停?]帮助(默认为y’): 需要再次输入Y进行安装 如果需要实现一键安装,可以先安装努杰,再安装PSReadLine,完整命令如下: install-package provider-Name NuGet-最低版本2.8.5.201-Force 设置-PS存储库-命名PS图库-安装策略可信 安装模块名称PSReadLine (3)使用 所有powershell命令将会保存在固定位置:% appdata % \ Microsoft \ Windows \ PowerShell \ PS readline \ console host _ history。文本文件(textfile) 查看命令的历史记录: Get-Content(Get-psreadline选项).历史保存路径 清除命令的历史记录: remove-Item(Get-psreadline选项).历史保存路径 2. 利用思路 获得了Windows操作系统操作系统系统的访问权限,首先查看Powershell版本,如果是v5,可通过读取文件% appdata % \ Microsoft \ Windows \ PowerShell \ PS readline \ console host _ history。文本文件(textfile)获得历史记录 如果系统是Powershell v3或Powershell v4,可通过命令行安装PSReadLine,这样就能记录后续系统所有的Powershell命令 0x03 防御建议 如果使用高版本的Windows操作系统操作系统系统,如Win10,默认Powershell版本为5.0,会记录Powershell的命令,建议定时进行清除,位置:% appdata % \ Microsoft \ Windows \ PowerShell \ PS readline \ console host _ history。文本文件(textfile) 清除命令的历史记录: remove-Item(Get-psreadline选项).历史保存路径 对于低版本的Powershell,如果命令中包含敏感信息(如远程连接的口令),需要及时清除,命令为:清除历史记录 对于cmd.exe,如果命令中包含敏感信息(如远程连接的口令),需要及时清除,命令为:doskey /reinstall 0x04 小结 本文介绍了两种Powershell命令的历史记录,总结常用导出历史记录的方法,结合利用思路,给出防御建议。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子