Skip to content

Commit cd9d08b

Browse files
authored
Merge pull request #2073 from HackTricks-wiki/research_update_src_windows-hardening_windows-local-privilege-escalation_abusing-auto-updaters-and-ipc_20260330_134745
Research Update Enhanced src/windows-hardening/windows-local...
2 parents 43bb15d + 209349b commit cd9d08b

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,41 @@ Because you never used PROCESS_CREATE_THREAD or PROCESS_SUSPEND_RESUME on an alr
102102
- NachoVPN (Netskope plugin) automates a rogue CA, malicious MSI signing, and serves the needed endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
103103
- UpSkope is a custom IPC client that crafts arbitrary (optionally AES-encrypted) IPC messages and includes the suspended-process injection to originate from an allow-listed binary.
104104

105+
## 7) Fast triage workflow for unknown updater/IPC surfaces
106+
107+
When facing a new endpoint agent or motherboard “helper” suite, a quick workflow is usually enough to tell whether you are looking at a promising privesc target:
108+
109+
1) Enumerate loopback listeners and map them back to vendor processes:
110+
111+
```powershell
112+
Get-NetTCPConnection -State Listen |
113+
Where-Object {$_.LocalAddress -in @('127.0.0.1', '::1', '0.0.0.0', '::')} |
114+
Select-Object LocalAddress,LocalPort,OwningProcess,
115+
@{n='Process';e={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Path}}
116+
```
117+
118+
2) Enumerate candidate named pipes:
119+
120+
```powershell
121+
[System.IO.Directory]::GetFiles("\\.\pipe\") | Select-String -Pattern 'asus|msi|razer|acer|agent|update'
122+
```
123+
124+
3) Mine registry-backed routing data used by plugin-based IPC servers:
125+
126+
```powershell
127+
Get-ChildItem 'HKLM:\SOFTWARE\WOW6432Node\MSI\MSI Center\Component' |
128+
Select-Object PSChildName
129+
```
130+
131+
4) Extract endpoint names, JSON keys, and command IDs from the user-mode client first. Packed Electron/.NET frontends frequently leak the full schema:
132+
133+
```powershell
134+
Select-String -Path 'C:\Program Files\Vendor\**\*.js','C:\Program Files\Vendor\**\*.dll' `
135+
-Pattern '127.0.0.1|localhost|UpdateApp|checkupdate|NamedPipe|LaunchProcess|Origin'
136+
```
137+
138+
If the target authenticates callers only by PID, image path, or process name, treat that as a speed bump rather than a boundary: injecting into the legitimate client, or making the connection from an allow-listed process, is often enough to satisfy the server’s checks. For named pipes specifically, [this page about client impersonation and pipe abuse](named-pipe-client-impersonation.md) covers the primitive in more depth.
139+
105140
---
106141
## 1) Browser-to-localhost CSRF against privileged HTTP APIs (ASUS DriverHub)
107142

@@ -172,6 +207,25 @@ When the scheduler fires, it executes the overwritten payload under SYSTEM despi
172207

173208
These IPC bugs highlight why localhost services must enforce mutual authentication (ALPC SIDs, `ImpersonationLevel=Impersonation` filters, token filtering) and why every module’s “run arbitrary binary” helper must share the same signer verifications.
174209

210+
---
211+
## 3) COM/IPC “elevator” helpers backed by weak user-mode validation (Razer Synapse 4)
212+
213+
Razer Synapse 4 added another useful pattern to this family: a low-privileged user can ask a COM helper to launch a process through `RzUtility.Elevator`, while the trust decision is delegated to a user-mode DLL (`simple_service.dll`) rather than being enforced robustly inside the privileged boundary.
214+
215+
Observed exploitation path:
216+
- Instantiate the COM object `RzUtility.Elevator`.
217+
- Call `LaunchProcessNoWait(<path>, "", 1)` to request an elevated launch.
218+
- In the public PoC, the PE-signature gate inside `simple_service.dll` is patched out before issuing the request, allowing an arbitrary attacker-chosen executable to be launched.
219+
220+
Minimal PowerShell invocation:
221+
222+
```powershell
223+
$com = New-Object -ComObject 'RzUtility.Elevator'
224+
$com.LaunchProcessNoWait("C:\Users\Public\payload.exe", "", 1)
225+
```
226+
227+
General takeaway: when reversing “helper” suites, do not stop at localhost TCP or named pipes. Check for COM classes with names such as `Elevator`, `Launcher`, `Updater`, or `Utility`, then verify whether the privileged service actually validates the target binary itself or merely trusts a result computed by a patchable user-mode client DLL. This pattern generalizes beyond Razer: any split design where the high-privilege broker consumes an allow/deny decision from the low-privilege side is a candidate privesc surface.
228+
175229
---
176230
## Remote supply-chain hijack via weak updater validation (WinGUp / Notepad++)
177231

@@ -223,6 +277,7 @@ These patterns generalize to any updater that accepts unsigned manifests or fail
223277
---
224278
## References
225279
- [Advisory – Netskope Client for Windows – Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/)
280+
- [Netskope Security Advisory NSKPSA-2025-002](https://www.netskope.com/resources/netskope-resources/netskope-security-advisory-nskpsa-2025-002)
226281
- [NachoVPN – Netskope plugin](https://github.com/AmberWolfCyber/NachoVPN)
227282
- [UpSkope – Netskope IPC client/exploit](https://github.com/AmberWolfCyber/UpSkope)
228283
- [NVD – CVE-2025-0309](https://nvd.nist.gov/vuln/detail/CVE-2025-0309)

0 commit comments

Comments
 (0)