内容简介:我在最近的学习过程中,发现Powershell命令的历史记录有时会包含系统敏感信息,例如远程服务器的连接口令,于是我对Powershell的历史记录功能做了进一步研究,总结一些渗透测试中常用导出历史记录的方法,结合利用思路,给出防御建议。本文将要介绍以下内容:记录Powershell命令的历史记录有两种方式,可分别使用
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 | Format-List -Property *
包括:
- Id
- CommandLine
- ExecutionStatus
- StartExecutionTime
- EndExecutionTime
测试如下图
删除所有历史记录:
Clear-History
按ID号删除命令:
Clear-History -Id 3
2. 利用思路
获得了一台Windows系统的权限,发现后台有Powershell进程,想要读取Powershell进程中的历史记录
(1)Powershell进程无法接收键盘输入命令
例如Powershell加载了一个在后台运行的脚本: Powershell -ep bypass -f 1.ps1
此时无法向Powershell进程发送键盘消息,这时可以通过读取进程的命令行参数获得有用的信息,开源代码:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/GetProcessCommandLine.cpp
代码实现了读取指定进程的命令行参数,通常能够获得有用的信息
(2)Powershell进程能够接收键盘输入命令
这里可以模拟发送键盘消息,导出历史记录
程序实现思路:
- 通过遍历枚举所有窗口
- 通过GetWindowThreadProcessId从窗口(HWND)获得PID
- 比较PID,找到符合条件的窗口
- 向符合条件的窗口发送键盘消息(PostMessage)
程序细节:
1.Virtual-Key Codes
每一个键盘输入消息对应一个Virtual-Key Code
参考资料: https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes
需要模拟键盘按下和键盘抬起两个操作,开源的测试代码:
https://github.com/3gstudent/Homework-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/3gstudent/Homework-of-C-Language/blob/master/SendKeyboardMessageToPowershell(Get-History).cpp
代码实现了搜索指定pid的进程,向进程发送键盘消息,内容为: Get-History|export-csv $env:temp"\history.csv"
3. 补充:查看cmd.exe的历史记录
命令如下:
doskey /h
清空:
doskey /reinstall
也可以通过发送键盘消息的方式导出cmd.exe的命令历史记录
2、Get-PSReadlineOption
参考文档:
https://docs.microsoft.com/en-us/powershell/module/psreadline/?view=powershell-5.1
默认Powershell v5支持
Powershell v3和Powershell v4需要安装Get-PSReadlineOption后才可以使用
安装后,所有Powershell命令的历史记录会保存在同一位置,可随时查看
1. Powershell v3和Powershell v4的安装和使用
这里以64位系统为例,安装方法如下:
(1)安装PowerShellGet
下载:
https://www.microsoft.com/en-us/download/details.aspx?id=51451
注:
安装前需要关闭powershell进程
可以通过命令行实现隐蔽安装,命令如下:
msiexec /q /i PackageManagement_x64.msi
安装成功后,在控制面板的已安装程序列表(Control Panel\Programs\Programs and Features)有显示: Package Management Preview - x64
可以通过删除对应的注册表项进行隐藏,更多细节可参考 《渗透基础——获得当前系统已安装的程序列表》
Package Management Preview - x64
的注册表路径为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{57E5A8BB-41EB-4F09-B332-B535C5954A28}
只需要删除这个注册表项及子项即可实现在已安装程序列表中隐藏
删除注册表项的cmd命令:
reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{57E5A8BB-41EB-4F09-B332-B535C5954A28} /f
(2)安装PSReadLine
通过Install-Module命令安装
Install-Module -Name PSReadLine
弹出提示:
NuGet provider is required to continue PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or 'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install and import the NuGet provider now? [Y] Yes [N] No [S] Suspend [?] Help (default is "Y"):
需要再次输入 Y
进行安装
如果需要实现一键安装,可以先安装NuGet,再安装PSReadLine,完整命令如下:
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Set-PSRepository -Name PSGallery -InstallationPolicy Trusted Install-Module -Name PSReadLine
(3)使用
所有powershell命令将会保存在固定位置: %appdata%\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
查看命令的历史记录:
Get-Content (Get-PSReadlineOption).HistorySavePath
清除命令的历史记录:
Remove-Item (Get-PSReadlineOption).HistorySavePath
2. 利用思路
获得了Windows系统的访问权限,首先查看Powershell版本,如果是v5,可通过读取文件 %appdata%\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
获得历史记录
如果系统是Powershell v3或Powershell v4,可通过命令行安装PSReadLine,这样就能记录后续系统所有的Powershell命令
0x03 防御建议
如果使用高版本的Windows系统,如Win10,默认Powershell版本为5.0,会记录Powershell的命令,建议定时进行清除,位置: %appdata%\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
清除命令的历史记录:
Remove-Item (Get-PSReadlineOption).HistorySavePath
对于低版本的Powershell,如果命令中包含敏感信息(如远程连接的口令),需要及时清除,命令为: Clear-History
对于cmd.exe,如果命令中包含敏感信息(如远程连接的口令),需要及时清除,命令为: doskey /reinstall
0x04 小结
本文介绍了两种Powershell命令的历史记录,总结常用导出历史记录的方法,结合利用思路,给出防御建议。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 渗透测试之反弹shell命令分析
- 比CMD更强大的命令行:WMIC后渗透利用(系统命令)
- 渗透技巧——获得Powershell命令的历史记录
- NetUse命令在渗透测试中的连接条件测试
- 域渗透——利用GPO中的计划任务实现远程执行(命令行实现原理与脚本细节)
- Web渗透测试笔记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Computational Advertising
by Kushal Dave、Vasudeva Varma / Now Publishers Inc / 2014
Computational Advertising (CA), popularly known as online advertising or Web advertising, refers to finding the most relevant ads matching a particular context on the Web. The context depends on the t......一起来看看 《Computational Advertising》 这本书的介绍吧!