macOS Thread Injection via Task port
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Code
- https://github.com/bazad/threadexec
- https://gist.github.com/knightsc/bd6dfeccb02b77eb6409db5601dcef36
1. Thread Hijacking
์ฒ์์, task_threads() ํจ์๊ฐ ์๊ฒฉ ์์
์์ ์ค๋ ๋ ๋ชฉ๋ก์ ์ป๊ธฐ ์ํด ์์
ํฌํธ์์ ํธ์ถ๋ฉ๋๋ค. ์ค๋ ๋๊ฐ ํ์ด์ฌํน์ ์ํด ์ ํ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ thread_create_running()์ ์ฐจ๋จํ๋ ์ํ ์กฐ์น๋ก ์ธํด ์๋ก์ด ์๊ฒฉ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ธ์ง๋๋ฏ๋ก ๊ธฐ์กด์ ์ฝ๋ ์ฃผ์
๋ฐฉ๋ฒ๊ณผ ๋ค๋ฆ
๋๋ค.
์ค๋ ๋๋ฅผ ์ ์ดํ๊ธฐ ์ํด thread_suspend()๊ฐ ํธ์ถ๋์ด ์คํ์ด ์ค๋จ๋ฉ๋๋ค.
์๊ฒฉ ์ค๋ ๋์์ ํ์ฉ๋๋ ์ ์ผํ ์์
์ ์ค์ง ๋ฐ ์์๊ณผ ๋ ์ง์คํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ /์์ ํ๋ ๊ฒ์
๋๋ค. ์๊ฒฉ ํจ์ ํธ์ถ์ ๋ ์ง์คํฐ x0์์ x7์ ์ธ์๋ก ์ค์ ํ๊ณ , pc๋ฅผ ์ํ๋ ํจ์๋ก ์ค์ ํ ํ ์ค๋ ๋๋ฅผ ์ฌ๊ฐํ์ฌ ์์๋ฉ๋๋ค. ๋ฐํ ํ ์ค๋ ๋๊ฐ ์ถฉ๋ํ์ง ์๋๋ก ํ๋ ค๋ฉด ๋ฐํ์ ๊ฐ์งํด์ผ ํฉ๋๋ค.
ํ ๊ฐ์ง ์ ๋ต์ thread_set_exception_ports()๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์ค๋ ๋์ ๋ํ ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฑ๋กํ๊ณ , ํจ์ ํธ์ถ ์ ์ lr ๋ ์ง์คํฐ๋ฅผ ์๋ชป๋ ์ฃผ์๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค. ์ด๋ ํจ์ ์คํ ํ ์์ธ๋ฅผ ๋ฐ์์์ผ ์์ธ ํฌํธ์ ๋ฉ์์ง๋ฅผ ์ ์กํ๊ณ , ์ค๋ ๋์ ์ํ๋ฅผ ๊ฒ์ฌํ์ฌ ๋ฐํ ๊ฐ์ ๋ณต๊ตฌํ ์ ์๊ฒ ํฉ๋๋ค. ๋๋ Ian Beer์ triple_fetch ์ต์คํ๋ก์์์ ์ฑํํ ๋๋ก, lr์ ๋ฌดํ ๋ฃจํ์ ์ค์ ํ์ฌ ์ค๋ ๋์ ๋ ์ง์คํฐ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ค๊ฐ pc๊ฐ ํด๋น ๋ช
๋ น์ด๋ฅผ ๊ฐ๋ฆฌํฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
2. Mach ports for communication
๋ค์ ๋จ๊ณ๋ ์๊ฒฉ ์ค๋ ๋์์ ํต์ ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด Mach ํฌํธ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ํฌํธ๋ ์์ ๊ฐ์ ์์์ ์ก์ /์์ ๊ถํ์ ์ ์กํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
์๋ฐฉํฅ ํต์ ์ ์ํด ๋ ๊ฐ์ Mach ์์ ๊ถํ์ด ์์ฑ๋ฉ๋๋ค: ํ๋๋ ๋ก์ปฌ ์์ ์, ๋ค๋ฅธ ํ๋๋ ์๊ฒฉ ์์ ์ ์์ต๋๋ค. ์ดํ ๊ฐ ํฌํธ์ ๋ํ ์ก์ ๊ถํ์ด ์๋ ์์ ์ผ๋ก ์ ์ก๋์ด ๋ฉ์์ง ๊ตํ์ด ๊ฐ๋ฅํด์ง๋๋ค.
๋ก์ปฌ ํฌํธ์ ์ง์คํ๋ฉด, ์์ ๊ถํ์ ๋ก์ปฌ ์์
์ ์ํด ๋ณด์ ๋ฉ๋๋ค. ํฌํธ๋ mach_port_allocate()๋ก ์์ฑ๋ฉ๋๋ค. ์ด ํฌํธ์ ์ก์ ๊ถํ์ ์๊ฒฉ ์์
์ผ๋ก ์ ์กํ๋ ๊ฒ์ด ๋์ ๊ณผ์ ๊ฐ ๋ฉ๋๋ค.
์ ๋ต์ thread_set_special_port()๋ฅผ ํ์ฉํ์ฌ ์๊ฒฉ ์ค๋ ๋์ THREAD_KERNEL_PORT์ ๋ก์ปฌ ํฌํธ์ ๋ํ ์ก์ ๊ถํ์ ๋ฐฐ์นํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์๊ฒฉ ์ค๋ ๋์ mach_thread_self()๋ฅผ ํธ์ถํ์ฌ ์ก์ ๊ถํ์ ๊ฐ์ ธ์ค๋๋ก ์ง์ํฉ๋๋ค.
์๊ฒฉ ํฌํธ์ ๊ฒฝ์ฐ, ๊ณผ์ ์ ๋ณธ์ง์ ์ผ๋ก ๋ฐ๋๋ก ์งํ๋ฉ๋๋ค. ์๊ฒฉ ์ค๋ ๋๋ mach_reply_port()๋ฅผ ํตํด Mach ํฌํธ๋ฅผ ์์ฑํ๋๋ก ์ง์๋ฐ์ต๋๋ค(๋ฐํ ๋ฉ์ปค๋์ฆ ๋๋ฌธ์ mach_port_allocate()๋ ์ ํฉํ์ง ์์). ํฌํธ๊ฐ ์์ฑ๋๋ฉด, ์๊ฒฉ ์ค๋ ๋์์ mach_port_insert_right()๊ฐ ํธ์ถ๋์ด ์ก์ ๊ถํ์ด ์ค์ ๋ฉ๋๋ค. ์ด ๊ถํ์ thread_set_special_port()๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋์ ์ ์ฅ๋ฉ๋๋ค. ๋ก์ปฌ ์์
์ผ๋ก ๋์๊ฐ์, thread_get_special_port()๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์์
์ ์๋ก ํ ๋น๋ Mach ํฌํธ์ ๋ํ ์ก์ ๊ถํ์ ํ๋ํฉ๋๋ค.
์ด ๋จ๊ณ๊ฐ ์๋ฃ๋๋ฉด Mach ํฌํธ๊ฐ ์ค์ ๋์ด ์๋ฐฉํฅ ํต์ ์ ์ํ ๊ธฐ์ด๊ฐ ๋ง๋ จ๋ฉ๋๋ค.
3. Basic Memory Read/Write Primitives
์ด ์น์ ์์๋ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์์ ์ ์ค์ ํ๊ธฐ ์ํด ์คํ ์์ ์์ ์ ํ์ฉํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ์ด๋ฌํ ์ด๊ธฐ ๋จ๊ณ๋ ์๊ฒฉ ํ๋ก์ธ์ค์ ๋ํ ๋ ๋ง์ ์ ์ด๋ฅผ ์ป๋ ๋ฐ ์ค์ํ์ง๋ง, ์ด ๋จ๊ณ์ ์์ ์์ ์ ๋ง์ ์ฉ๋๋ก ์ฌ์ฉ๋์ง ์์ ๊ฒ์ ๋๋ค. ๊ณง ๋ ๊ณ ๊ธ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋๋ ๊ฒ์ ๋๋ค.
Memory reading and writing using the execute primitive
๋ชฉํ๋ ํน์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ํํ๋ ๊ฒ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ:
uint64_t read_func(uint64_t *address) {
return *address;
}
๋ฉ๋ชจ๋ฆฌ ์ฐ๊ธฐ:
void write_func(uint64_t *address, uint64_t value) {
*address = value;
}
์ด ํจ์๋ค์ ๋ค์ ์ด์ ๋ธ๋ฆฌ์ ํด๋นํฉ๋๋ค:
_read_func:
ldr x0, [x0]
ret
_write_func:
str x1, [x0]
ret
์ ํฉํ ํจ์ ์๋ณ
์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์บํ ๊ฒฐ๊ณผ ์ด๋ฌํ ์์ ์ ์ ํฉํ ํ๋ณด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ โ
property_getName()(libobjc):
const char *property_getName(objc_property_t prop) {
return prop->name;
}
- ๋ฉ๋ชจ๋ฆฌ ์ฐ๊ธฐ โ
_xpc_int64_set_value()(libxpc):
__xpc_int64_set_value:
str x1, [x0, #0x18]
ret
์์์ ์ฃผ์์ 64๋นํธ ์ฐ๊ธฐ๋ฅผ ์ํํ๋ ค๋ฉด:
_xpc_int64_set_value(address - 0x18, value);
์ด๋ฌํ ์์ ๊ธฐ๋ฅ์ด ์ค์ ๋๋ฉด, ์๊ฒฉ ํ๋ก์ธ์ค๋ฅผ ์ ์ดํ๋ ๋ฐ ์์ด ์ค์ํ ์ง์ ์ ์ด๋ฃจ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํ ์ค๋น๊ฐ ๋ฉ๋๋ค.
4. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ค์
๋ชฉํ๋ ๋ก์ปฌ ๋ฐ ์๊ฒฉ ์์
๊ฐ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ ํ์ฌ ๋ฐ์ดํฐ ์ ์ก์ ๊ฐ์ํํ๊ณ ์ฌ๋ฌ ์ธ์๋ฅผ ๊ฐ์ง ํจ์ ํธ์ถ์ ์ฉ์ดํ๊ฒ ํ๋ ๊ฒ์
๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ libxpc์ Mach ๋ฉ๋ชจ๋ฆฌ ํญ๋ชฉ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ OS_xpc_shmem ๊ฐ์ฒด ์ ํ์ ํ์ฉํฉ๋๋ค.
ํ๋ก์ธ์ค ๊ฐ์
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น
mach_vm_allocate()๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.- ํ ๋น๋ ์์ญ์ ๋ํด
xpc_shmem_create()๋ฅผ ์ฌ์ฉํ์ฌOS_xpc_shmem๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ์๊ฒฉ ํ๋ก์ธ์ค์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ฑ
- ์๊ฒฉ ํ๋ก์ธ์ค์์
OS_xpc_shmem๊ฐ์ฒด๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค (remote_malloc). - ๋ก์ปฌ ํ
ํ๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํฉ๋๋ค;
0x18์คํ์ ์์ ๋ด์ฅ๋ Mach ์ ์ก ๊ถํ์ ์์ ์ด ์ฌ์ ํ ํ์ํฉ๋๋ค.
- Mach ๋ฉ๋ชจ๋ฆฌ ํญ๋ชฉ ์์
thread_set_special_port()๋ก ์ ์ก ๊ถํ์ ์ฝ์ ํ๊ณ0x18ํ๋๋ฅผ ์๊ฒฉ ํญ๋ชฉ์ ์ด๋ฆ์ผ๋ก ๋ฎ์ด์๋๋ค.
- ์ต์ข ํ
- ์๊ฒฉ ๊ฐ์ฒด๋ฅผ ๊ฒ์ฆํ๊ณ
xpc_shmem_remote()์ ๋ํ ์๊ฒฉ ํธ์ถ๋ก ๋งคํํฉ๋๋ค.
5. ์์ ํ ์ ์ด ๋ฌ์ฑ
์์ ์คํ ๋ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฐฑ ์ฑ๋์ด ๊ฐ๋ฅํด์ง๋ฉด, ํจ๊ณผ์ ์ผ๋ก ๋์ ํ๋ก์ธ์ค๋ฅผ ์์ ํ๊ฒ ๋ฉ๋๋ค:
- ์์ ๋ฉ๋ชจ๋ฆฌ R/W โ ๋ก์ปฌ ๋ฐ ๊ณต์ ์์ญ ๊ฐ์
memcpy()๋ฅผ ์ฌ์ฉํฉ๋๋ค. - 8๊ฐ ์ด์์ ์ธ์๋ฅผ ๊ฐ์ง ํจ์ ํธ์ถ โ arm64 ํธ์ถ ๊ท์ฝ์ ๋ฐ๋ผ ์คํ์ ์ถ๊ฐ ์ธ์๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
- Mach ํฌํธ ์ ์ก โ ์ค์ ๋ ํฌํธ๋ฅผ ํตํด Mach ๋ฉ์์ง์์ ๊ถํ์ ์ ๋ฌํฉ๋๋ค.
- ํ์ผ ์ค๋ช ์ ์ ์ก โ ํ์ผ ํฌํธ๋ฅผ ํ์ฉํฉ๋๋ค (์ฐธ์กฐ: triple_fetch).
์ด ๋ชจ๋ ๊ฒ์ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๋๋ก threadexec ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌ์ฅ๋์ด ์์ต๋๋ค.
6. Apple Silicon (arm64e) ๋์์ค
Apple Silicon ์ฅ์น(arm64e)์์๋ **ํฌ์ธํฐ ์ธ์ฆ ์ฝ๋(PAC)**๊ฐ ๋ชจ๋ ๋ฐํ ์ฃผ์์ ๋ง์ ํจ์ ํฌ์ธํฐ๋ฅผ ๋ณดํธํฉ๋๋ค. ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ์ค๋ ๋ ํ์ด์ฌํน ๊ธฐ์ ์ lr/pc์ ์๋ ๊ฐ์ด ์ด๋ฏธ ์ ํจํ PAC ์๋ช
์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ณ์ ์๋ํฉ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ํํ๋ ค๊ณ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค:
- ๋์ ๋ด๋ถ์ ์คํ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค (์๊ฒฉ
mach_vm_allocate+mprotect(PROT_EXEC)). - ํ์ด๋ก๋๋ฅผ ๋ณต์ฌํฉ๋๋ค.
- ์๊ฒฉ ํ๋ก์ธ์ค ๋ด์์ ํฌ์ธํฐ์ ์๋ช ํฉ๋๋ค:
uint64_t ptr = (uint64_t)payload;
ptr = ptrauth_sign_unauthenticated((void*)ptr, ptrauth_key_asia, 0);
- ํ์ด์ฌํน๋ ์ค๋ ๋ ์ํ์์
pc = ptr์ค์ .
๋๋ ๊ธฐ์กด์ ๊ฐ์ ฏ/ํจ์๋ฅผ ์ฐ๊ฒฐํ์ฌ PAC ์ค์๋ฅผ ์ ์งํฉ๋๋ค (์ ํต์ ์ธ ROP).
7. ํ์ง ๋ฐ EndpointSecurity๋ฅผ ํตํ ๊ฐํ
EndpointSecurity (ES) ํ๋ ์์ํฌ๋ ๋ฐฉ์ด์๊ฐ ์ค๋ ๋ ์ฃผ์ ์๋๋ฅผ ๊ด์ฐฐํ๊ฑฐ๋ ์ฐจ๋จํ ์ ์๋๋ก ํ๋ ์ปค๋ ์ด๋ฒคํธ๋ฅผ ๋ ธ์ถํฉ๋๋ค:
ES_EVENT_TYPE_AUTH_GET_TASKโ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ์์ ์ ํฌํธ๋ฅผ ์์ฒญํ ๋ ๋ฐ์ํฉ๋๋ค (์:task_for_pid()).ES_EVENT_TYPE_NOTIFY_REMOTE_THREAD_CREATEโ ๋ค๋ฅธ ์์ ์์ ์ค๋ ๋๊ฐ ์์ฑ๋ ๋๋ง๋ค ๋ฐ์ํฉ๋๋ค.ES_EVENT_TYPE_NOTIFY_THREAD_SET_STATE(macOS 14 Sonoma์ ์ถ๊ฐ๋จ) โ ๊ธฐ์กด ์ค๋ ๋์ ๋ ์ง์คํฐ ์กฐ์์ ๋ํ๋ ๋๋ค.
์๊ฒฉ ์ค๋ ๋ ์ด๋ฒคํธ๋ฅผ ์ถ๋ ฅํ๋ ์ต์ํ์ Swift ํด๋ผ์ด์ธํธ:
import EndpointSecurity
let client = try! ESClient(subscriptions: [.notifyRemoteThreadCreate]) {
(_, msg) in
if let evt = msg.remoteThreadCreate {
print("[ALERT] remote thread in pid \(evt.target.pid) by pid \(evt.thread.pid)")
}
}
RunLoop.main.run()
osquery โฅ 5.8๋ก ์ฟผ๋ฆฌํ๊ธฐ:
SELECT target_pid, source_pid, target_path
FROM es_process_events
WHERE event_type = 'REMOTE_THREAD_CREATE';
Hardened-runtime considerations
์ ํ๋ฆฌ์ผ์ด์
์ com.apple.security.get-task-allow ๊ถํ ์์ด ๋ฐฐํฌํ๋ฉด ๋น๋ฃจํธ ๊ณต๊ฒฉ์๊ฐ ํด๋น ์์
ํฌํธ๋ฅผ ์ป๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์์คํ
๋ฌด๊ฒฐ์ฑ ๋ณดํธ(SIP)๋ ์ฌ์ ํ ๋ง์ Apple ๋ฐ์ด๋์ค์ ๋ํ ์ ๊ทผ์ ์ฐจ๋จํ์ง๋ง, ์๋ํํฐ ์ํํธ์จ์ด๋ ๋ช
์์ ์ผ๋ก ์ตํธ์์ํด์ผ ํฉ๋๋ค.
8. Recent Public Tooling (2023-2025)
| Tool | Year | Remarks |
|---|---|---|
task_vaccine | 2023 | Ventura/Sonoma์์ PAC ์ธ์ ์ค๋ ๋ ํ์ด์ฌํน์ ๋ณด์ฌ์ฃผ๋ ๊ฐ๊ฒฐํ PoC |
remote_thread_es | 2024 | ์ฌ๋ฌ EDR ๊ณต๊ธ์๊ฐ REMOTE_THREAD_CREATE ์ด๋ฒคํธ๋ฅผ ํ์ถํ๋ ๋ฐ ์ฌ์ฉํ๋ EndpointSecurity ํฌํผ |
์ด๋ฌํ ํ๋ก์ ํธ์ ์์ค ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ macOS 13/14์์ ๋์ ๋ API ๋ณ๊ฒฝ ์ฌํญ์ ์ดํดํ๊ณ Intel โ Apple Silicon ๊ฐ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
References
- https://bazad.github.io/2018/10/bypassing-platform-binary-task-threads/
- https://github.com/rodionovd/task_vaccine
- https://developer.apple.com/documentation/endpointsecurity/es_event_type_notify_remote_thread_create
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


