前言

学习过程中,发现Powershell命令的历史记录有时会包含系统敏感信息,例如远程服务器的连接口令,于是我对Powershell的历史记录功能做了进一步研究,总结一些渗透测试中常用导出历史记录的方法,结合利用思路,给出防御建议。

简介

本文将要介绍以下内容:

· 两种Powershell命令的历史记录

· 导出Powershell命令历史记录的方法

· 防御建议

两种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进程中的历史记录。

①Powershell进程无法接收键盘输入命令。

例如Powershell加载了一个在后台运行的脚本:Powershell -ep bypass -f 1.ps1

此时无法向Powershell进程发送键盘消息,这时可以通过读取进程的命令行参数获得有用的信息,开源代码:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/GetProcessCommandLine.cpp

代码实现了读取指定进程的命令行参数,通常能够获得有用的信息。

②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位系统为例,安装方法如下:

①安装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

②安装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

③使用

所有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命令.

防御建议

如果使用高版本的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

小结

本文介绍了两种Powershell命令的历史记录,总结常用导出历史记录的方法,结合利用思路,给出防御建议。

渗透技巧——获得Powershell命令的历史记录相关推荐

  1. c++ 服务 以当前用户拉起进程_渗透技巧——通过CredSSP导出用户的明文口令

    0x00 前言 在渗透测试中,为了获得Windows系统中的用户口令,通常会选择读取lsass进程的内存.这种方法不仅需要获得系统的管理员权限,而且在更多情况下需要绕过系统对lsass进程的保护. 我 ...

  2. 渗透技巧——程序的降权启动

    本文讲的是渗透技巧--程序的降权启动, 0x00 前言 在渗透测试中,常常会遇到需要改变程序启动权限(分为提权和降权)的情况. 提权包含从普通用户权限到管理员权限和从管理员权限到system权限,而渗 ...

  3. 渗透技巧——从远程桌面客户端提取明文凭据

    0x00 前言 在之前的文章<渗透技巧--获得Windows系统的远程桌面连接历史记录>曾介绍了获得远程桌面连接历史记录的方法. 在实际的渗透过程中,如果发现了远程桌面连接的历史记录,奇热 ...

  4. 【收藏】CMD命令提示符窗口中的快捷键、小技巧和常用命令

    快捷键: F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果已经是最后的一条的命令,则不进行任何切换操作. 例子:之前输入"dir",按F1一次后自动输入d,按两次自 ...

  5. SharePoint PowerShell命令系列

    (1) Backup-SPSite & Restore-SPSite 这两条命令可能是大家最先接触的PowerShell命令了吧, 一个是备份网站集, 另一个是还原网站集. Backup-SP ...

  6. base64 linux_渗透测试常用Linux命令总结

    作为一名网络安全工作者,一说到渗透测试,所有人都会想到Kali Linux,Kali Linux系统是一款预装了许多渗透测试软件的Linux系统,是最常用的一款渗透测试系统工具,既然是一款Linux系 ...

  7. 此计算机上的windows防火墙阻止了远程调试_除了防火墙,用PowerShell命令也可以屏蔽网站,这个方法更简单...

    PowerShell附带了一个Netsecurity网络安全模块,该模块可配置Windows防火墙,用户可以使用Netsecurity网络安全模块中的新网络防火墙规则功能(New NetFirewal ...

  8. 渗透技巧总结更新篇1

    本着共享之精神,方便各位黑阔童鞋,发表此文,希望抛砖引玉,童鞋们踊跃发言.使之更加完善,在交流中进步,形成良好的互动~ 旁站路径问题 1.读网站配置. 2.用以下VBS On Error Resume ...

  9. CMD命令提示符窗口中的快捷键、小技巧和常用命令

    快捷键: F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果已经是最后的一条的命令,则不进行任何切换操作. 例子:之前输入"dir",按F1一次后自动输入d,按两次自 ...

最新文章

  1. 1.3-date命令
  2. 初学 Python(十三)——匿名函数
  3. boost中的shared_ptr的一些理解
  4. 图像“位操作”有什么用?
  5. jQuery入口函数的四种写法【1分钟掌握】
  6. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
  7. AC-DC电源模块设计原理及10个常见疑问
  8. 有的时候看项目,和创业者交流,发现他们的企业
  9. 多线程经典模型-生产者消费
  10. ubuntu 强制结束 pycharm
  11. Mybatis 有坑,千万别踩!
  12. java考ccf_CCF考试试题之门禁系统java解题代码
  13. python自动答题助手_头脑王者python答题助手
  14. 08CMS之数据库操作
  15. 二十、融会贯通之全流程操作
  16. 解决Ubuntu18.04 / 16.04和Win10双系统系统时间时间不同步
  17. oracle按照in的顺序进行排序
  18. 1525D. Armchairs
  19. Java习题练习:幸运数
  20. Linux常用指令(命令)超级无敌全合集加图文说明

热门文章

  1. 如何选择适合自己的CAD/CAM软件
  2. 配置环境变量path(自用笔记)
  3. 帕金森和特发性震颤的区别
  4. 树形DP --算法竞赛专题解析(17)
  5. Android studio下载失败问题处理
  6. 【基于unity制作的游戏】《ZERO:天元》
  7. 大华测试笔试题_大华软件测试笔试题目 大华软件测试笔试题
  8. java 以时间戳生成编号_Java生成时间戳
  9. IOS开发之常用第三方框架(完善中)
  10. PE值、PB值、ROE和DCF值分别代表什么意思