macOS xpc_connection_get_audit_token ๊ณต๊ฒฉ

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

์ž์„ธํ•œ ์ •๋ณด๋Š” ์›๋ณธ ํฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜์„ธ์š”: https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/. ์š”์•ฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

Mach ๋ฉ”์‹œ์ง€ ๊ธฐ๋ณธ ์ •๋ณด

Mach Messages๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”:

macOS IPC - Inter Process Communication

์šฐ์„  (definition from here)๋ฅผ ๊ธฐ์–ตํ•˜์„ธ์š”:
Mach ๋ฉ”์‹œ์ง€๋Š” _mach port_์„ ํ†ตํ•ด ์ „์†ก๋˜๋ฉฐ, ์ด๋Š” mach ์ปค๋„์— ๋‚ด์žฅ๋œ ๋‹จ์ผ ์ˆ˜์‹ ์ž, ๋‹ค์ค‘ ์†ก์‹ ์ž ํ†ต์‹  ์ฑ„๋„์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ mach ํฌํŠธ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ธ์ œ๋“ ์ง€ ๋‹จ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ํ•ด๋‹น ํฌํŠธ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋‚˜ ์†Œ์ผ“์ฒ˜๋Ÿผ mach ํฌํŠธ๋Š” ์ปค๋„์— ์˜ํ•ด ํ• ๋‹น๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋ฉฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ •์ˆ˜ ํ•˜๋‚˜๋งŒ ๋ณด๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ปค๋„์— ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๋ ค๋Š” mach ํฌํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

XPC ์—ฐ๊ฒฐ

XPC ์—ฐ๊ฒฐ์ด ์–ด๋–ป๊ฒŒ ์„ฑ๋ฆฝ๋˜๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

macOS XPC

์ทจ์•ฝ์  ์š”์•ฝ

์•Œ์•„๋‘˜ ์ค‘์š”ํ•œ ์ ์€ XPC์˜ ์ถ”์ƒํ™”๋Š” ์ผ๋Œ€์ผ ์—ฐ๊ฒฐ์ด์ง€๋งŒ, ๊ทธ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์€ ๋‹ค์ค‘ ์†ก์‹ ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ:

  • Mach ํฌํŠธ๋Š” ๋‹จ์ผ ์ˆ˜์‹ ์ž, ๋‹ค์ค‘ ์†ก์‹ ์ž์ž…๋‹ˆ๋‹ค.
  • XPC ์—ฐ๊ฒฐ์˜ audit token์€ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ˆ˜์‹ ๋œ ๋ฉ”์‹œ์ง€์—์„œ ๋ณต์‚ฌ๋œ audit token์ž…๋‹ˆ๋‹ค.
  • XPC ์—ฐ๊ฒฐ์˜ audit token์„ ์–ป๋Š” ๊ฒƒ์€ ๋งŽ์€ ๋ณด์•ˆ ์ฒดํฌ์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์ƒํ™ฉ์€ ์œ ๋งํ•ด ๋ณด์ด์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (from here):

  • Audit token์€ ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ถŒํ•œ ๊ฒ€์‚ฌ์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” ์„œ๋น„์Šค ํฌํŠธ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด ํฌํŠธ๋กœ ๋” ๋งŽ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ถ”๊ฐ€ ์—ฐ๊ฒฐ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ ์ „์— ์ด๋ค„์ง€๋Š” ๋ชจ๋“  ์ฒดํฌ๋Š” ์ทจ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (-listener:shouldAcceptNewConnection: ๋‚ด๋ถ€์˜ audit token์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๋Š” ๋”ฐ๋ผ์„œ ํŠน์ • ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š” XPC ์—ฐ๊ฒฐ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • XPC ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•œ ๋ฉ”์‹œ์ง€์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์˜๋ฏธ๋กœ, ๋™์‹œ ๋””์ŠคํŒจ์น˜ ํ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ XPC ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์—์„œ๋Š” audit token์ด ๋‹ค๋ฅธ ์ผ๋ฐ˜(์‘๋‹ต์ด ์•„๋‹Œ!) ๋ฉ”์‹œ์ง€์— ์˜ํ•ด ๋ฎ์–ด์“ฐ์—ฌ์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ƒํ™ฉ์ด ์•…์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•:

  1. Variant1:
  • Exploit๊ฐ€ ์„œ๋น„์Šค A์™€ ์„œ๋น„์Šค B์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค B๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” privileged functionality๋ฅผ ์„œ๋น„์Šค A์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค A๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ, ์˜ˆ๋ฅผ ๋“ค์–ด **dispatch_async**์—์„œ xpc_connection_get_audit_token์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋””์ŠคํŒจ์น˜๋˜๋Š” ์™ธ๋ถ€์—์„œ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๊ฐ€ Audit Token์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ต์Šคํ”Œ๋กœ์ž‡์€ ์„œ๋น„์Šค A์— ๋Œ€ํ•œ SEND ๊ถŒํ•œ์„ service B์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ svc B๊ฐ€ ์‹ค์ œ๋กœ ์„œ๋น„์Šค A์— ๋ฉ”์‹œ์ง€๋“ค์„ ๋ณด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ต์Šคํ”Œ๋กœ์ž‡์€ privileged action์„ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. RC ์ƒํ™ฉ์—์„œ svc A๋Š” ์ด ๋™์ž‘์˜ ๊ถŒํ•œ์„ ๊ฒ€์‚ฌํ•˜๋Š”๋ฐ, ๊ทธ ์‹œ์ ์— svc B๊ฐ€ Audit token์„ ๋ฎ์–ด์ผ๋‹ค๋ฉด (์ต์Šคํ”Œ๋กœ์ž‡์ด privileged action์„ ํ˜ธ์ถœํ•  ๊ถŒํ•œ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค).
  1. Variant 2:
  • ์„œ๋น„์Šค B๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” privileged functionality๋ฅผ ์„œ๋น„์Šค A์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ต์Šคํ”Œ๋กœ์ž‡์€ service A์— ์—ฐ๊ฒฐํ•˜๊ณ , ์„œ๋น„์Šค A๋Š” ํŠน์ • reply ํฌํŠธ์—์„œ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ต์Šคํ”Œ๋กœ์ž‡์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์ต์Šคํ”Œ๋กœ์ž‡์€ ๊ทธ reply port๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋น„์Šค B์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค B๊ฐ€ ์‘๋‹ตํ•  ๋•Œ, ๊ทธ ๋ฉ”์‹œ์ง€๋Š” service A๋กœ ์ „์†ก๋˜๋ฉฐ, ๋™์‹œ์— ์ต์Šคํ”Œ๋กœ์ž‡์€ ์„œ๋น„์Šค A์— ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด privileged functionality์— ๋„๋‹ฌํ•˜๋ ค ์‹œ๋„ํ•˜๊ณ , ์„œ๋น„์Šค B์˜ ์‘๋‹ต์ด ์ •ํ™•ํ•œ ์ˆœ๊ฐ„์— Audit token์„ ๋ฎ์–ด์“ธ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค (Race Condition).

Variant 1: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์™ธ๋ถ€์—์„œ xpc_connection_get_audit_token ํ˜ธ์ถœ

์‹œ๋‚˜๋ฆฌ์˜ค:

  • ์ƒŒ๋“œ๋ฐ•์Šค ํ”„๋กœํ•„๊ณผ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ ์ „ ๊ถŒํ•œ ๊ฒ€์‚ฌ์— ๋”ฐ๋ผ ๋‘˜ ๋‹ค ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ mach ์„œ๋น„์Šค **A**์™€ B.
  • _A_๋Š” **B**๊ฐ€ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋™์ž‘์— ๋Œ€ํ•œ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์šฐ๋ฆฌ ์•ฑ์€ ํ•  ์ˆ˜ ์—†์Œ).
  • ์˜ˆ๋ฅผ ๋“ค์–ด, B๊ฐ€ ์ผ๋ถ€ entitlements๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ root๋กœ ์‹คํ–‰ ์ค‘์ด๋ฉด A์—๊ฒŒ privileged action์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ถŒํ•œ ๊ฒ€์‚ฌ์—์„œ **A**๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด **dispatch_async**์—์„œ xpc_connection_get_audit_token์„ ํ˜ธ์ถœํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ audit token์„ ์–ป์Šต๋‹ˆ๋‹ค.

Caution

์ด ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” Race Condition์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ต์Šคํ”Œ๋กœ์ž‡์€ A์—๊ฒŒ ์—ฌ๋Ÿฌ ๋ฒˆ ๋™์ž‘ ์ˆ˜ํ–‰์„ ์š”์ฒญํ•˜๋ฉด์„œ B๊ฐ€ A์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค. RC๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด, B์˜ audit token์ด ์šฐ๋ฆฌ์˜ ์š”์ฒญ์ด A์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌ๋˜์–ด ๋“ค์–ด๊ฐ€๋ฉฐ, ์ด๋Š” ์˜ค์ง B๋งŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋˜ privileged action์— ์šฐ๋ฆฌ์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์‚ฌ๋ก€๋Š” **A**๊ฐ€ smd์ด๊ณ  **B**๊ฐ€ diagnosticd์˜€์„ ๋•Œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. smb์˜ ํ•จ์ˆ˜ SMJobBless๋Š” ์ƒˆ๋กœ์šด privileged helper tool์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (root๋กœ์„œ). root๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ smd์— ์—ฐ๋ฝํ•˜๋ฉด ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์„œ๋น„์Šค B๋Š” root๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” diagnosticd์ด๋ฉฐ, ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์‹œ์ž‘๋˜๋ฉด ์ดˆ๋‹น ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ฒฉ ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•:

  1. ํ‘œ์ค€ XPC ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ smd๋ผ๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. diagnosticd์— ๋Œ€ํ•œ ๋ณด์กฐ ์—ฐ๊ฒฐ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ ˆ์ฐจ์™€ ๋‹ฌ๋ฆฌ, ํด๋ผ์ด์–ธํŠธ ํฌํŠธ send ๊ถŒํ•œ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ณด๋‚ด๋Š” ๋Œ€์‹  smd ์—ฐ๊ฒฐ๊ณผ ์—ฐ๊ด€๋œ send right์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ณผ์ ์œผ๋กœ XPC ๋ฉ”์‹œ์ง€๋Š” diagnosticd๋กœ ๋””์ŠคํŒจ์น˜๋  ์ˆ˜ ์žˆ์ง€๋งŒ, diagnosticd์˜ ์‘๋‹ต์€ smd๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฉ๋‹ˆ๋‹ค. smd ์ž…์žฅ์—์„œ๋Š” ์‚ฌ์šฉ์ž์™€ diagnosticd ์–‘์ชฝ์—์„œ ์˜ค๋Š” ๋ฉ”์‹œ์ง€๋“ค์ด ๊ฐ™์€ ์—ฐ๊ฒฐ์—์„œ ์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Image depicting the exploit process

  1. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” diagnosticd์—๊ฒŒ ์„ ํƒํ•œ ํ”„๋กœ์„ธ์Šค(์ž ์žฌ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ์„ธ์Šค)๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์— smd์— ์ผ์ƒ์ ์ธ 1004 ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๊ถŒํ•œ์ด ์ƒ์Šน๋œ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ด ๋™์ž‘์€ handle_bless ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ ˆ์ด์Šค ์ปจ๋””์…˜์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ด๋ฐ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค: xpc_connection_get_pid ํ˜ธ์ถœ์€ ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ์„ธ์Šค PID๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ถŒํ•œ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์•ฑ ๋ฒˆ๋“ค์— ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ connection_is_authorized ํ•˜์œ„ ๋ฃจํ‹ด ๋‚ด์˜ xpc_connection_get_audit_token์€ diagnosticd์˜ audit token์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Variant 2: reply ์ „๋‹ฌ

XPC ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€๋Š” ์•Š์ง€๋งŒ, reply ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋Š” ๊ณ ์œ ํ•œ ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. xpc_connection_send_message_with_reply: ์ด ๋ฐฉ์‹์—์„œ๋Š” XPC ๋ฉ”์‹œ์ง€๊ฐ€ ์ง€์ •๋œ ํ์—์„œ ์ˆ˜์‹ ๋˜๊ณ  ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  2. xpc_connection_send_message_with_reply_sync: ๋ฐ˜๋Œ€๋กœ ์ด ๋ฐฉ์‹์—์„œ๋Š” XPC ๋ฉ”์‹œ์ง€๊ฐ€ ํ˜„์žฌ ๋””์ŠคํŒจ์น˜ ํ์—์„œ ์ˆ˜์‹ ๋˜๊ณ  ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ถ„์€ reply ํŒจํ‚ท์ด XPC ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์‹คํ–‰๊ณผ ๋™์‹œ์— ํŒŒ์‹ฑ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ชฉํ•  ์ ์€ _xpc_connection_set_creds๊ฐ€ audit token์˜ ๋ถ€๋ถ„์  ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฝ์„ ์ ์šฉํ•˜์ง€๋งŒ, ์—ฐ๊ฒฐ ๊ฐ์ฒด ์ „์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๋ณดํ˜ธ๋ฅผ ํ™•์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํŒจํ‚ท ํŒŒ์‹ฑ๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์—์„œ audit token์ด ๊ต์ฒด๋  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด ์ƒ๊น๋‹ˆ๋‹ค.

์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค€๋น„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ mach ์„œ๋น„์Šค, **A**์™€ B.
  • ์„œ๋น„์Šค **A**๋Š” ์˜ค์ง **B**๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋™์ž‘์— ๋Œ€ํ•œ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ์•ฑ์€ ์•„๋‹˜).
  • ์„œ๋น„์Šค **A**๋Š” ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ์„œ๋น„์Šค **B**์— ์‘๋‹ตํ•  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•…์šฉ ์ ˆ์ฐจ:

  1. ์„œ๋น„์Šค **A**๊ฐ€ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ทธ ์‘๋‹ต์„ ์ง์ ‘ A์— ๋ณด๋‚ด์ง€ ์•Š๊ณ , reply ํฌํŠธ๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ์„œ๋น„์Šค **B**์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ทธ ํ›„ ๊ธˆ์ง€๋œ ๋™์ž‘์„ ํฌํ•จํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜์—ฌ, ๊ทธ๊ฒƒ์ด ์„œ๋น„์Šค B์˜ ์‘๋‹ต๊ณผ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๊ธธ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ์„ค๋ช…๋œ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์‹œ๊ฐ์  ํ‘œํ˜„์ž…๋‹ˆ๋‹ค:

![https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png](../../../../../../images/image (1) (1) (1) (1) (1) (1) (1).png)

https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/variant2.png

๋ฐœ๊ฒฌ์ƒ์˜ ๋ฌธ์ œ

  • ์ธ์Šคํ„ด์Šค ์ฐพ๊ธฐ์˜ ์–ด๋ ค์›€: xpc_connection_get_audit_token ์‚ฌ์šฉ ์ธ์Šคํ„ด์Šค๋ฅผ ์ •์ /๋™์ ์œผ๋กœ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฉ๋ฒ•๋ก : Frida๋ฅผ ์‚ฌ์šฉํ•ด xpc_connection_get_audit_token์„ ํ›„ํ‚นํ•˜๊ณ  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ํ˜ธ์ถœ์„ ํ•„ํ„ฐ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์€ ํ›„ํ‚นํ•œ ํ”„๋กœ์„ธ์Šค์—๋งŒ ์ ์šฉ๋˜๋ฉฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ์—๋งŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ„์„ ํˆด๋ง: IDA/Ghidra ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ mach ์„œ๋น„์Šค๋“ค์„ ์กฐ์‚ฌํ–ˆ์ง€๋งŒ, dyld shared cache ๊ด€๋ จ ํ˜ธ์ถœ๋กœ ์ธํ•ด ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๊ณ  ๋ณต์žกํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฝํŒ… ํ•œ๊ณ„: dispatch_async ๋ธ”๋ก์—์„œ xpc_connection_get_audit_token์œผ๋กœ์˜ ํ˜ธ์ถœ์„ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ถ„์„ํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ๋ธ”๋ก ํŒŒ์‹ฑ๊ณผ dyld shared cache์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋•Œ๋ฌธ์— ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ • ์‚ฌํ•ญ

  • ๋ณด๊ณ ๋œ ๋ฌธ์ œ: smd ๋‚ด์—์„œ ๋ฐœ๊ฒฌ๋œ ์ผ๋ฐ˜์  ๋ฐ ํŠน์ • ๋ฌธ์ œ๋ฅผ Apple์— ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Apple์˜ ๋Œ€์‘: Apple์€ smd์—์„œ xpc_connection_get_audit_token์„ xpc_dictionary_get_audit_token์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜์ •์˜ ์„ฑ๊ฒฉ: xpc_dictionary_get_audit_token ํ•จ์ˆ˜๋Š” ์ˆ˜์‹ ๋œ XPC ๋ฉ”์‹œ์ง€์™€ ์—ฐ๊ด€๋œ mach ๋ฉ”์‹œ์ง€์—์„œ ์ง์ ‘ audit token์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด ํ•จ์ˆ˜๋Š” xpc_connection_get_audit_token๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณต๊ฐœ API์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ด‘๋ฒ”์œ„ํ•œ ์ˆ˜์ • ๋ถ€์žฌ: ์™œ Apple์ด ์—ฐ๊ฒฐ์˜ ์ €์žฅ๋œ audit token๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ๊ธฐํ•˜๋Š” ๋“ฑ ๋” ํฌ๊ด„์ ์ธ ์ˆ˜์ •์„ ํ•˜์ง€ ์•Š์•˜๋Š”์ง€๋Š” ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค(์˜ˆ: setuid ์‚ฌ์šฉ)์—์„œ ์ •๋‹นํ•œ audit token ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ด์œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์ƒํƒœ: ์ด ๋ฌธ์ œ๋Š” iOS 17 ๋ฐ macOS 14์— ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋ฉฐ, ์ด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ดํ•ดํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์ „ ๊ณผ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์‹ค๋ฌด์—์„œ ์ทจ์•ฝ ์ฝ”๋“œ ๊ฒฝ๋กœ ์ฐพ๊ธฐ (2024โ€“2025)

XPC ์„œ๋น„์Šค๋ฅผ ๊ฐ์‚ฌํ•  ๋•Œ, ๋ฉ”์‹œ์ง€์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์™ธ๋ถ€์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ถŒํ•œ ๊ฒ€์‚ฌ๋‚˜ ์‘๋‹ต ์ฒ˜๋ฆฌ์™€ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๊ถŒํ•œ ๊ฒ€์‚ฌ์— ์ฃผ๋ชฉํ•˜์„ธ์š”.

์ •์  ํƒ์ƒ‰ ํžŒํŠธ:

  • dispatch_async/dispatch_after ๋˜๋Š” ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ์›Œ์ปค ํ๋ฅผ ํ†ตํ•ด ํ์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋ก์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ xpc_connection_get_audit_token ํ˜ธ์ถœ์„ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”.
  • per-connection๊ณผ per-message ์ƒํƒœ๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๊ถŒํ•œ ํ—ฌํผ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”(์˜ˆ: xpc_connection_get_pid์—์„œ PID๋ฅผ ๊ฐ€์ ธ์˜ค์ง€๋งŒ xpc_connection_get_audit_token์—์„œ audit token์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ).
  • NSXPC ์ฝ”๋“œ์—์„œ๋Š” -listener:shouldAcceptNewConnection:์—์„œ ์ฒดํฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๋ฉ”์‹œ์ง€๋ณ„ ์ฒดํฌ์˜ ๊ฒฝ์šฐ ๊ตฌํ˜„์ด per-message audit token์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(์˜ˆ: ํ•˜์œ„ ๋ ˆ๋ฒจ ์ฝ”๋“œ์—์„œ ๋ฉ”์‹œ์ง€์˜ dictionary๋ฅผ ํ†ตํ•ด xpc_dictionary_get_audit_token ์‚ฌ์šฉ).

๋™์  ํƒ์ƒ‰ ํŒ:

  • xpc_connection_get_audit_token์„ ํ›„ํ‚นํ•˜๊ณ , ์‚ฌ์šฉ์ž ์Šคํƒ์— ์ด๋ฒคํŠธ ์ „๋‹ฌ ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ํ˜ธ์ถœ์„ ํ”Œ๋ž˜๊ทธํ•˜์„ธ์š”(์˜ˆ: _xpc_connection_mach_event). ์˜ˆ์‹œ Frida ํ›„ํ‚น:
Interceptor.attach(Module.getExportByName(null, 'xpc_connection_get_audit_token'), {
onEnter(args) {
const bt = Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join('\n');
if (!bt.includes('_xpc_connection_mach_event')) {
console.log('[!] xpc_connection_get_audit_token outside handler\n' + bt);
}
}
});

์ฐธ๊ณ :

  • macOS์—์„œ๋Š” ๋ณดํ˜ธ๋œ/Apple ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ instrumentingํ•˜๋ ค๋ฉด SIP๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ์ž์ฒด ๋นŒ๋“œ๋‚˜ userland services๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • reply-forwarding races (Variant 2)์˜ ๊ฒฝ์šฐ, xpc_connection_send_message_with_reply์™€ ์ผ๋ฐ˜ ์š”์ฒญ์˜ ํƒ€์ด๋ฐ์„ ํผ์ง•ํ•˜์—ฌ ์‘๋‹ต ํŒจํ‚ท์˜ ๋™์‹œ ํŒŒ์‹ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ถŒํ•œ ๊ฒ€์‚ฌ(authorization) ๋™์•ˆ ์‚ฌ์šฉ๋˜๋Š” ์œ ํšจํ•œ audit token์ด ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Exploitation primitives you will likely need

  • Multi-sender setup (Variant 1): A์™€ B์— ๋Œ€ํ•œ connections๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค; A์˜ client port์˜ send right์„ ๋ณต์ œํ•˜์—ฌ B์˜ client port๋กœ ์‚ฌ์šฉํ•˜๋ฉด B์˜ replies๊ฐ€ A๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
// Duplicate a SEND right you already hold
mach_port_t dup;
mach_port_insert_right(mach_task_self(), a_client, a_client, MACH_MSG_TYPE_MAKE_SEND);
dup = a_client; // use `dup` when crafting Bโ€™s connect packet instead of a fresh client port
  • Reply hijack (Variant 2): A์˜ ๋Œ€๊ธฐ ์ค‘์ธ ์š”์ฒญ(reply port)์—์„œ send-once right๋ฅผ ๊ฐ€๋กœ์ฑ„๊ณ , ๊ทธ reply port๋ฅผ ์‚ฌ์šฉํ•ด B์—๊ฒŒ ์กฐ์ž‘๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด B์˜ ์‘๋‹ต์ด ๋‹น์‹ ์˜ ๊ถŒํ•œ ์žˆ๋Š” ์š”์ฒญ์ด ํŒŒ์‹ฑ๋˜๋Š” ๋™์•ˆ A๋กœ ๋„๋‹ฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋“ค์€ XPC bootstrap ๋ฐ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ์œ„ํ•œ ์ €์ˆ˜์ค€ mach message crafting์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค; ์ •ํ™•ํ•œ ํŒจํ‚ท ๋ ˆ์ด์•„์›ƒ๊ณผ ํ”Œ๋ž˜๊ทธ๋Š” ์ด ์„น์…˜์˜ mach/XPC primer ํŽ˜์ด์ง€๋ฅผ ๊ฒ€ํ† ํ•˜์„ธ์š”.

์œ ์šฉํ•œ ๋„๊ตฌ

  • XPC sniffing/dynamic inspection: gxpc (open-source XPC sniffer)๋Š” ์—ฐ๊ฒฐ์„ ์—ด๊ฑฐํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ๊ด€์ฐฐํ•˜์—ฌ multi-sender ์„ค์ •๊ณผ ํƒ€์ด๋ฐ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: gxpc -p <PID> --whitelist <service-name>.
  • Classic dyld interposing for libxpc: libxpc์— ๋Œ€ํ•œ ๊ณ ์ „์ ์ธ dyld interposing์„ ํ†ตํ•ด xpc_connection_send_message*์™€ xpc_connection_get_audit_token์„ interposeํ•˜์—ฌ ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŠธ ์ค‘์— ํ˜ธ์ถœ ์ง€์ ๊ณผ ์Šคํƒ์„ ๋กœ๊ทธํ•˜์„ธ์š”.

์ฐธ๊ณ ์ž๋ฃŒ

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