@@ -4670,9 +4670,14 @@ Required Dependencies: None
4670
4670
4671
4671
Executes all functions that check for various Windows privilege escalation opportunities.
4672
4672
4673
+ .PARAMETER Format
4674
+
4675
+ String. Format to decide on what is returned from the command, an Object Array, List, or HTML Report.
4676
+
4673
4677
.PARAMETER HTMLReport
4674
4678
4675
- Switch. Write a HTML version of the report to SYSTEM.username.html.
4679
+ DEPRECATED - Switch. Write a HTML version of the report to SYSTEM.username.html.
4680
+ Superseded by the Format parameter.
4676
4681
4677
4682
.EXAMPLE
4678
4683
@@ -4682,25 +4687,26 @@ Runs all escalation checks and outputs a status report for discovered issues.
4682
4687
4683
4688
.EXAMPLE
4684
4689
4685
- Invoke-PrivescAudit -HTMLReport
4690
+ Invoke-PrivescAudit -Format HTML
4686
4691
4687
4692
Runs all escalation checks and outputs a status report to SYSTEM.username.html
4688
4693
detailing any discovered issues.
4689
4694
4690
- .OUTPUTS
4691
-
4692
- System.String
4693
4695
#>
4694
4696
4695
4697
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')]
4696
- [OutputType('System.String')]
4697
4698
[CmdletBinding()]
4698
4699
Param(
4700
+ [ValidateSet('Object','List','HTML')]
4701
+ [String]
4702
+ $Format = 'Object',
4699
4703
[Switch]
4700
4704
$HTMLReport
4701
4705
)
4702
4706
4703
- if ($HTMLReport) {
4707
+ if($HTMLReport){ $Format = 'HTML' }
4708
+
4709
+ if ($Format -eq 'HTML') {
4704
4710
$HtmlReportFile = "$($Env:ComputerName).$($Env:UserName).html"
4705
4711
$Header = "<style>"
4706
4712
$Header = $Header + "BODY{background-color:peachpuff;}"
@@ -4711,153 +4717,101 @@ System.String
4711
4717
ConvertTo-HTML -Head $Header -Body "<H1>PowerUp report for '$($Env:ComputerName).$($Env:UserName)'</H1>" | Out-File $HtmlReportFile
4712
4718
}
4713
4719
4714
- # initial admin checks
4715
-
4716
- "`n[*] Running Invoke-AllChecks"
4717
-
4718
- $IsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
4719
-
4720
- if ($IsAdmin){
4721
- "[+] Current user already has local administrative privileges!"
4722
-
4723
- if ($HTMLReport) {
4724
- ConvertTo-HTML -Head $Header -Body "<H2>User Has Local Admin Privileges!</H2>" | Out-File -Append $HtmlReportFile
4720
+ Write-Verbose "Running Invoke-PrivescAudit"
4721
+
4722
+ $Checks = @(
4723
+ # Initial admin checks
4724
+ @{
4725
+ Type = 'User Has Local Admin Privileges'
4726
+ Command = { if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")){ New-Object PSObject } }
4727
+ },
4728
+ @{
4729
+ Type = 'User In Local Group with Admin Privileges'
4730
+ Command = { if ((Get-ProcessTokenGroup | Select-Object -ExpandProperty SID) -contains 'S-1-5-32-544'){ New-Object PSObject } }
4731
+ AbuseScript = { 'Invoke-WScriptUACBypass -Command "..."' }
4732
+ },
4733
+ @{
4734
+ Type = 'Process Token Privileges'
4735
+ Command = { Get-ProcessTokenPrivilege -Special | Where-Object {$_} }
4736
+ },
4737
+ # Service checks
4738
+ @{
4739
+ Type = 'Unquoted Service Paths'
4740
+ Command = { Get-UnquotedService }
4741
+ },
4742
+ @{
4743
+ Type = 'Modifiable Service Files'
4744
+ Command = { Get-ModifiableServiceFile }
4745
+ },
4746
+ @{
4747
+ Type = 'Modifiable Services'
4748
+ Command = { Get-ModifiableService }
4749
+ },
4750
+ # DLL hijacking
4751
+ @{
4752
+ Type = '%PATH% .dll Hijacks'
4753
+ Command = { Find-PathDLLHijack }
4754
+ AbuseScript = { "Write-HijackDll -DllPath '$($_.ModifiablePath)\wlbsctrl.dll'" }
4755
+ },
4756
+ # Registry checks
4757
+ @{
4758
+ Type = 'AlwaysInstallElevated Registry Key'
4759
+ Command = { if (Get-RegistryAlwaysInstallElevated){ New-Object PSObject } }
4760
+ AbuseScript = { 'Write-UserAddMSI' }
4761
+ },
4762
+ @{
4763
+ Type = 'Registry Autologons'
4764
+ Command = { Get-RegistryAutoLogon }
4765
+ },
4766
+ @{
4767
+ Type = 'Modifiable Registry Autorun'
4768
+ Command = { Get-ModifiableRegistryAutoRun }
4769
+ },
4770
+ # Other checks
4771
+ @{
4772
+ Type = 'Modifiable Scheduled Task Files'
4773
+ Command = { Get-ModifiableScheduledTaskFile }
4774
+ },
4775
+ @{
4776
+ Type = 'Unattended Install Files'
4777
+ Command = { Get-UnattendedInstallFile }
4778
+ },
4779
+ @{
4780
+ Type = 'Encrypted web.config Strings'
4781
+ Command = { Get-WebConfig | Where-Object {$_} }
4782
+ },
4783
+ @{
4784
+ Type = 'Encrypted Application Pool Passwords'
4785
+ Command = { Get-ApplicationHost | Where-Object {$_} }
4786
+ },
4787
+ @{
4788
+ Type = 'McAfee SiteList.xml files'
4789
+ Command = { Get-SiteListPassword | Where-Object {$_} }
4790
+ },
4791
+ @{
4792
+ Type = 'Cached GPP Files'
4793
+ Command = { Get-CachedGPPPassword | Where-Object {$_} }
4725
4794
}
4726
- }
4727
- else{
4728
- "`n`n[*] Checking if user is in a local group with administrative privileges..."
4729
-
4730
- $CurrentUserSids = Get-ProcessTokenGroup | Select-Object -ExpandProperty SID
4731
- if ($CurrentUserSids -Contains 'S-1-5-32-544') {
4732
- "[+] User is in a local group that grants administrative privileges!"
4733
- "[+] Run 'Invoke-WScriptUACBypass -Command `"...`"' to elevate privileges to admin."
4734
- if ($HTMLReport) {
4735
- ConvertTo-HTML -Head $Header -Body "<H2> User In Local Group With Administrative Privileges</H2>" | Out-File -Append $HtmlReportFile
4795
+ )
4796
+
4797
+ ForEach($Check in $Checks){
4798
+ Write-Verbose "Checking for $($Check.Type)..."
4799
+ $Results = . $Check.Command
4800
+ $Results | Where-Object {$_} | ForEach-Object {
4801
+ $_ | Add-Member Noteproperty 'Check' $Check.Type
4802
+ if ($Check.AbuseScript){
4803
+ $_ | Add-Member Noteproperty 'AbuseFunction' (. $Check.AbuseScript)
4736
4804
}
4737
4805
}
4738
- }
4739
-
4740
- "`n`n[*] Checking current process token permissions..."
4741
- $Results = Get-ProcessTokenPrivilege -Special | Where-Object {$_}
4742
- $Results | Format-List
4743
- if ($HTMLReport) {
4744
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Cached GPP Files</H2>" | Out-File -Append $HtmlReportFile
4745
- }
4746
-
4747
- # Service checks
4748
-
4749
- "`n`n[*] Checking for unquoted service paths..."
4750
- $Results = Get-UnquotedService
4751
- $Results | Format-List
4752
- if ($HTMLReport) {
4753
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Unquoted Service Paths</H2>" | Out-File -Append $HtmlReportFile
4754
- }
4755
-
4756
- "`n`n[*] Checking service executable and argument permissions..."
4757
- $Results = Get-ModifiableServiceFile
4758
- $Results | Format-List
4759
- if ($HTMLReport) {
4760
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Service File Permissions</H2>" | Out-File -Append $HtmlReportFile
4761
- }
4762
-
4763
- "`n`n[*] Checking service permissions..."
4764
- $Results = Get-ModifiableService
4765
- $Results | Format-List
4766
- if ($HTMLReport) {
4767
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Modifiable Services</H2>" | Out-File -Append $HtmlReportFile
4768
- }
4769
-
4770
-
4771
- # DLL hijacking
4772
-
4773
- "`n`n[*] Checking %PATH% for potentially hijackable DLL locations..."
4774
- $Results = Find-PathDLLHijack
4775
- $Results | Where-Object {$_} | Foreach-Object {
4776
- $AbuseString = "Write-HijackDll -DllPath '$($_.ModifiablePath)\wlbsctrl.dll'"
4777
- $_ | Add-Member Noteproperty 'AbuseFunction' $AbuseString
4778
- $_
4779
- } | Format-List
4780
- if ($HTMLReport) {
4781
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>%PATH% .dll Hijacks</H2>" | Out-File -Append $HtmlReportFile
4782
- }
4783
-
4784
-
4785
- # registry checks
4786
-
4787
- "`n`n[*] Checking for AlwaysInstallElevated registry key..."
4788
- if (Get-RegistryAlwaysInstallElevated) {
4789
- $Out = New-Object PSObject
4790
- $Out | Add-Member Noteproperty 'AbuseFunction' "Write-UserAddMSI"
4791
- $Results = $Out
4792
-
4793
- $Results | Format-List
4794
- if ($HTMLReport) {
4795
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>AlwaysInstallElevated</H2>" | Out-File -Append $HtmlReportFile
4806
+ switch($Format){
4807
+ Object { $Results }
4808
+ List { "`n`n[*] Checking for $($Check.Type)..."; $Results | Format-List }
4809
+ HTML { $Results | ConvertTo-HTML -Head $Header -Body "<H2>$($Check.Type)</H2>" | Out-File -Append $HtmlReportFile }
4796
4810
}
4797
4811
}
4798
4812
4799
- "`n`n[*] Checking for Autologon credentials in registry..."
4800
- $Results = Get-RegistryAutoLogon
4801
- $Results | Format-List
4802
- if ($HTMLReport) {
4803
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Registry Autologons</H2>" | Out-File -Append $HtmlReportFile
4804
- }
4805
-
4806
-
4807
- "`n`n[*] Checking for modifidable registry autoruns and configs..."
4808
- $Results = Get-ModifiableRegistryAutoRun
4809
- $Results | Format-List
4810
- if ($HTMLReport) {
4811
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Registry Autoruns</H2>" | Out-File -Append $HtmlReportFile
4812
- }
4813
-
4814
- # other checks
4815
-
4816
- "`n`n[*] Checking for modifiable schtask files/configs..."
4817
- $Results = Get-ModifiableScheduledTaskFile
4818
- $Results | Format-List
4819
- if ($HTMLReport) {
4820
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Modifidable Schask Files</H2>" | Out-File -Append $HtmlReportFile
4821
- }
4822
-
4823
- "`n`n[*] Checking for unattended install files..."
4824
- $Results = Get-UnattendedInstallFile
4825
- $Results | Format-List
4826
- if ($HTMLReport) {
4827
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Unattended Install Files</H2>" | Out-File -Append $HtmlReportFile
4828
- }
4829
-
4830
- "`n`n[*] Checking for encrypted web.config strings..."
4831
- $Results = Get-Webconfig | Where-Object {$_}
4832
- $Results | Format-List
4833
- if ($HTMLReport) {
4834
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Encrypted 'web.config' String</H2>" | Out-File -Append $HtmlReportFile
4835
- }
4836
-
4837
- "`n`n[*] Checking for encrypted application pool and virtual directory passwords..."
4838
- $Results = Get-ApplicationHost | Where-Object {$_}
4839
- $Results | Format-List
4840
- if ($HTMLReport) {
4841
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Encrypted Application Pool Passwords</H2>" | Out-File -Append $HtmlReportFile
4842
- }
4843
-
4844
- "`n`n[*] Checking for plaintext passwords in McAfee SiteList.xml files..."
4845
- $Results = Get-SiteListPassword | Where-Object {$_}
4846
- $Results | Format-List
4847
- if ($HTMLReport) {
4848
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>McAfee's SiteList.xml's</H2>" | Out-File -Append $HtmlReportFile
4849
- }
4850
-
4851
- "`n`n[*] Checking for cached Group Policy Preferences .xml files..."
4852
- $Results = Get-CachedGPPPassword | Where-Object {$_}
4853
- $Results | Format-List
4854
- if ($HTMLReport) {
4855
- $Results | ConvertTo-HTML -Head $Header -Body "<H2>Cached GPP Files</H2>" | Out-File -Append $HtmlReportFile
4856
- }
4857
- "`n"
4858
-
4859
- if ($HTMLReport) {
4860
- "[*] Report written to '$HtmlReportFile' `n"
4813
+ if ($Format -eq 'HTML') {
4814
+ Write-Verbose "[*] Report written to '$HtmlReportFile' `n"
4861
4815
}
4862
4816
}
4863
4817
@@ -5012,5 +4966,4 @@ $Kernel32 = $Types['kernel32']
5012
4966
$NTDll = $Types['ntdll']
5013
4967
5014
4968
Set-Alias Get-CurrentUserTokenGroupSid Get-ProcessTokenGroup
5015
- Set-Alias Get-UnquotedService Get-UnquotedService
5016
4969
Set-Alias Invoke-AllChecks Invoke-PrivescAudit
0 commit comments