macOS Apps - Inspecting, debugging and Fuzzing

htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요

HackTricks를 지원하는 다른 방법:

WhiteIntel다크 웹을 활용한 검색 엔진으로, 회사나 고객이 스틸러 악성 소프트웨어에 의해 침해당했는지 무료로 확인할 수 있는 기능을 제공합니다.

WhiteIntel의 주요 목표는 정보 도난 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.

그들의 웹사이트를 방문하여 엔진을 무료로 시험해 볼 수 있습니다:


정적 분석

otool

otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application

objdump

objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
objdump -m -h /bin/ls # Get headers information
objdump -m --syms /bin/ls # Check if the symbol table exists to get function names
objdump -m --full-contents /bin/ls # Dump every section
objdump -d /bin/ls # Dissasemble the binary
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour

jtool2

이 도구는 codesign, otool, objdump대체로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. 여기에서 다운로드하거나 brew로 설치할 수 있습니다.

# Install
brew install --cask jtool2

jtool2 -l /bin/ls # Get commands (headers)
jtool2 -L /bin/ls # Get libraries
jtool2 -S /bin/ls # Get symbol info
jtool2 -d /bin/ls # Dump binary
jtool2 -D /bin/ls # Decompile binary

# Get signature information
ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Automator

# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG

Codesign / ldid

**Codesign**은 macOS에 있고 **ldid**는 iOS에 있습니다.

# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

# Check if the app’s contents have been modified
codesign --verify --verbose /Applications/Safari.app

# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms

# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app

# Sign a binary
codesign -s <cert-name-keychain> toolsdemo

# Get signature info
ldid -h <binary>

# Get entitlements
ldid -e <binary>

# Change entilements
## /tmp/entl.xml is a XML file with the new entitlements to add
ldid -S/tmp/entl.xml <binary>

SuspiciousPackage

SuspiciousPackage.pkg 파일(설치 프로그램)을 설치하기 전에 내부를 확인하는 데 유용한 도구입니다. 이러한 설치 프로그램에는 일반적으로 악성 코드 제작자가 악용하는 preinstallpostinstall bash 스크립트가 포함되어 있습니다.

hdiutil

이 도구를 사용하면 Apple 디스크 이미지(.dmg) 파일을 실행하기 전에 내용을 확인할 수 있습니다:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

Objective-C

Metadata

Objective-C로 작성된 프로그램은 Mach-O 바이너리로 컴파일될 때 클래스 선언을 유지합니다. 이러한 클래스 선언에는 다음이 포함됩니다:

  • 클래스

  • 클래스 메소드

  • 클래스 인스턴스 변수

class-dump를 사용하여 이 정보를 얻을 수 있습니다:

class-dump Kindle.app

함수 호출

바이너리에서 Objective-C를 사용하는 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **objc_msgSend**를 호출합니다. 이는 최종 함수를 호출할 것입니다:

이 함수가 기대하는 매개변수는 다음과 같습니다:

  • 첫 번째 매개변수인 (self)은 "메시지를 수신할 클래스의 인스턴스를 가리키는 포인터"입니다. 간단히 말하면, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 객체로서 클래스의 인스턴스를 가리킵니다.

  • 두 번째 매개변수인 (op)은 "메시지를 처리하는 메소드의 셀렉터"입니다. 간단히 말하면, 이것은 메소드의 이름입니다.

  • 나머지 매개변수는 메소드에서 필요로 하는 값들입니다 (op).

ARM64에서 **lldb**를 사용하여 이 정보를 쉽게 얻는 방법은 이 페이지에서 확인할 수 있습니다:

pageIntroduction to ARM64v8

x64:

인자

레지스터

**(objc_msgSend용) **

1번째 인자

rdi

self: 메소드가 호출되는 객체

2번째 인자

rsi

op: 메소드의 이름

3번째 인자

rdx

메소드에 대한 1번째 인자

4번째 인자

rcx

메소드에 대한 2번째 인자

5번째 인자

r8

메소드에 대한 3번째 인자

6번째 인자

r9

메소드에 대한 4번째 인자

7번째+ 인자

rsp+ (스택 상에)

메소드에 대한 5번째+ 인자

Swift

Swift 바이너리의 경우, Objective-C 호환성이 있기 때문에 때로는 class-dump를 사용하여 선언을 추출할 수 있지만 항상 그렇지는 않습니다.

jtool -l 또는 otool -l 명령어를 사용하면 __swift5 접두어로 시작하는 여러 섹션을 찾을 수 있습니다:

jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64              Mem: 0x000000000-0x100000000    __PAGEZERO
LC 01: LC_SEGMENT_64              Mem: 0x100000000-0x100028000    __TEXT
[...]
Mem: 0x100026630-0x100026d54        __TEXT.__swift5_typeref
Mem: 0x100026d60-0x100027061        __TEXT.__swift5_reflstr
Mem: 0x100027064-0x1000274cc        __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608        __TEXT.__swift5_capture
[...]

더 많은 정보를 이 블로그 포스트에서 찾을 수 있습니다.

또한, Swift 이진 파일에는 심볼이 포함될 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). 심볼에는 일반적으로 함수 이름과 속성에 대한 정보가 포함되어 있으며 형식이 지저분하기 때문에 매우 유용하며 "**디멩글러"**가 원래 이름을 가져올 수 있습니다:

# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py

# Swift cli
swift demangle

패킹된 이진 파일

  • 고 엔트로피를 확인합니다.

  • 문자열을 확인합니다 (거의 이해할 수 없는 문자열이 있는지 확인하여 패킹 여부를 확인합니다).

  • MacOS용 UPX 패커는 "__XHDR"이라는 섹션을 생성합니다.

동적 분석

바이너리를 디버깅하려면 SIP를 비활성화해야 합니다 (csrutil disable 또는 csrutil enable --without debug) 또는 바이너리를 임시 폴더로 복사하고 codesign --remove-signature <binary-path>로 서명을 제거하거나 바이너리의 디버깅을 허용해야 합니다 (이 스크립트를 사용할 수 있습니다 여기).

시스템 바이너리를 (예: cloudconfigurationd) 분석하려면 macOS에서 SIP를 비활성화해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다).

통합 로그

MacOS는 어플리케이션 실행 중 무엇을 하는지 이해하는 데 유용한 많은 로그를 생성합니다.

또한, 일부 로그에는 <private> 태그가 포함되어 사용자 또는 컴퓨터 식별 가능한 정보를 숨기기 위한 것입니다. 그러나 이 정보를 공개하기 위해 인증서를 설치할 수 있습니다. 여기의 설명을 따르세요.

Hopper

왼쪽 패널

Hopper의 왼쪽 패널에서는 이진 파일의 심볼 (라벨), 프로시저 및 함수 목록 (Proc), 문자열 (Str)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분에서 정의된 문자열 중 일부이지만 모든 문자열은 아닙니다 (예: _cstring 또는 objc_methname).

가운데 패널

가운데 패널에서는 해석된 코드를 볼 수 있습니다. 원시 해석, 그래프, 디컴파일바이너리로 볼 수 있습니다. 각 아이콘을 클릭하여:

코드 객체를 마우스 오른쪽 버튼으로 클릭하면 해당 객체에 대한 참조/참조를 볼 수 있거나 이름을 변경할 수 있습니다 (디컴파일된 의사 코드에서는 작동하지 않음):

또한, 가운데 아래에서 파이썬 명령을 작성할 수 있습니다.

오른쪽 패널

오른쪽 패널에서는 탐색 기록 (현재 상황에 도달한 방법을 알 수 있음), 호출 그래프 (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있는 그래프) 및 로컬 변수 정보와 같은 흥미로운 정보를 볼 수 있습니다.

dtrace

Dtrace는 사용자가 매우 낮은 수준에서 응용 프로그램에 액세스할 수 있도록 하며 사용자가 프로그램을 추적하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 커널 전체에 배치된 프로브를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다.

DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 dtrace_probe_create 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 진입점과 종료점에서 발사될 수 있습니다. DTrace와의 상호 작용은 루트 사용자만 사용할 수 있는 /dev/dtrace를 통해 이루어집니다.

SIP 보호를 완전히 비활성화하지 않고 Dtrace를 활성화하려면 복구 모드에서 다음을 실행할 수 있습니다: csrutil enable --without dtrace

컴파일한 바이너리dtrace 또는 **dtruss**할 수도 있습니다.

dtrace의 사용 가능한 프로브는 다음과 같이 얻을 수 있습니다:

dtrace -l | head
ID   PROVIDER            MODULE                          FUNCTION NAME
1     dtrace                                                     BEGIN
2     dtrace                                                     END
3     dtrace                                                     ERROR
43    profile                                                     profile-97
44    profile                                                     profile-199

프로브 이름은 네 가지 부분으로 구성됩니다: 제공자, 모듈, 함수 및 이름(fbt:mach_kernel:ptrace:entry). 이름의 일부를 지정하지 않으면 Dtrace는 해당 부분을 와일드카드로 적용합니다.

프로브를 활성화하고 발생할 때 수행할 작업을 지정하려면 D 언어를 사용해야 합니다.

더 자세한 설명과 예제는 https://illumos.org/books/dtrace/chp-intro.html에서 찾을 수 있습니다.

예시

man -k dtrace를 실행하여 사용 가능한 DTrace 스크립트 목록을 확인합니다. 예: sudo dtruss -n binary

  • 한 줄에서

#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • 스크립트

syscall:::entry
/pid == $1/
{
}

#Log every syscall of a PID
sudo dtrace -s script.d 1234
syscall::open:entry
{
printf("%s(%s)", probefunc, copyinstr(arg0));
}
syscall::close:entry
{
printf("%s(%d)\n", probefunc, arg0);
}

#Log files opened and closed by a process
sudo dtrace -s b.d -c "cat /etc/hosts"
syscall:::entry
{
;
}
syscall:::return
{
printf("=%d\n", arg1);
}

#Log sys calls with values
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"

dtruss

dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000

ktrace

SIP가 활성화된 상태에서도 이를 사용할 수 있습니다.

ktrace trace -s -S -t c -c ls | grep "ls("

ProcessMonitor

ProcessMonitor은 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스를 모니터링).

SpriteTree

SpriteTree는 프로세스 간 관계를 출력하는 도구입니다. **sudo eslogger fork exec rename create > cap.json**과 같은 명령으로 맥을 모니터링해야 합니다 (이 명령을 실행하는 터미널은 FDA가 필요합니다). 그런 다음 이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:

FileMonitor

FileMonitor는 파일 이벤트 (생성, 수정, 삭제와 같은)를 모니터링하여 이러한 이벤트에 대한 자세한 정보를 제공합니다.

Crescendo

Crescendo는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 외관을 가진 GUI 도구입니다. 이 도구를 사용하면 다양한 이벤트 유형의 녹화를 시작하고 중지할 수 있으며 파일, 프로세스, 네트워크 등과 같은 범주별로 이러한 이벤트를 필터링하고 json 형식으로 기록된 이벤트를 저장할 수 있습니다.

Apple Instruments

Apple Instruments은 Xcode의 개발자 도구 일환으로, 애플리케이션 성능을 모니터링하고 메모리 누수를 식별하며 파일 시스템 활동을 추적하는 데 사용됩니다.

fs_usage

프로세스가 수행하는 작업을 따를 수 있게 합니다:

fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
fs_usage -w -f network curl #This tracks network actions

TaskExplorer

Taskexplorer는 이진 파일이 사용하는 라이브러리, 사용 중인 파일네트워크 연결을 볼 수 있는 유용한 도구입니다. 또한 바이너리 프로세스를 virustotal에 대해 확인하고 해당 바이너리에 대한 정보를 표시합니다.

PT_DENY_ATTACH

이 블로그 게시물에서는 SIP가 비활성화되어 있더라도 **PT_DENY_ATTACH**를 사용하여 디버깅을 방지하는 실행 중인 데몬을 디버깅하는 예제를 찾을 수 있습니다.

lldb

lldbmacOS 이진 파일 디버깅을 위한 사실상의 도구입니다.

lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor

다음 줄을 포함하는 홈 폴더에 **.lldbinit**이라는 파일을 만들어 lldb를 사용할 때 intel flavor를 설정할 수 있습니다:

settings set target.x86-disassembly-flavor intel

lldb 내에서 process save-core를 사용하여 프로세스 덤프

(lldb) 명령어

설명

run (r)

중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.

continue (c)

디버깅 중인 프로세스의 실행을 계속합니다.

nexti (n / ni)

다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.

stepi (s / si)

다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.

finish (f)

현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.

control + c

실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속되고 있다면, 현재 실행 중인 위치에서 프로세스를 중지시킵니다.

breakpoint (b)

b main # main 함수 호출

b <binname>`main # 바이너리의 main 함수

b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l # 중단점 목록

br e/dis <num> # 중단점 활성화/비활성화

breakpoint delete <num>

help

help breakpoint # 중단점 명령어 도움말

help memory write # 메모리 쓰기 도움말

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/memory address

메모리를 널 종료된 문자열로 표시합니다.

x/i <reg/memory address

어셈블리 명령으로 메모리를 표시합니다.

x/b <reg/memory address

바이트로 메모리를 표시합니다.

print object (po)

매개변수로 참조된 객체를 출력합니다.

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Apple의 대부분의 Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 나오지 않는 경우 x/b를 사용하세요.

memory

memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기 memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기

disassembly

dis # 현재 함수를 어셈블리로 표시합니다.

dis -n <funcname> # 함수를 어셈블리로 표시합니다.

dis -n <funcname> -b <basename> # 함수를 어셈블리로 표시합니다. dis -c 6 # 6줄을 어셈블리로 표시합니다. dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지 dis -p -c 4 # 현재 주소에서 어셈블리 시작

parray

parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인

objc_sendMsg 함수를 호출할 때, rsi 레지스터는 널 종료된 ("C") 문자열로 메서드의 이름을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 실행하십시오:

(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"

(lldb) print (char*)$rsi: (char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"

(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"

동적 분석 방지

VM 탐지

  • sysctl hw.model 명령은 호스트가 MacOS인 경우 "Mac"을 반환하고 VM인 경우 다른 값을 반환합니다.

  • 일부 악성 코드는 hw.logicalcpuhw.physicalcpu 값을 조작하여 VM인지 여부를 감지하려고 합니다.

  • 일부 악성 코드는 MAC 주소(00:50:56)를 기반으로 기계가 VMware인지 여부를 감지할 수 있습니다.

  • 간단한 코드로 프로세스가 디버깅되고 있는지 확인할 수 있습니다:

  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }

  • ptrace 시스템 호출을 PT_DENY_ATTACH 플래그와 함께 호출할 수도 있습니다. 이는 디버거가 첨부되고 추적되는 것을 방지합니다.

  • sysctl 또는 ptrace 함수가 **가져오기(imported)**되었는지 확인할 수 있습니다(그러나 악성 코드는 동적으로 가져올 수 있음).

  • 이 글에서 언급된 대로, “Defeating Anti-Debug Techniques: macOS ptrace variants” : “메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 PT_DENY_ATTACH를 사용하고 있음을 나타내는 신호입니다.

Fuzzing

ReportCrash 는 충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장합니다. 충돌 보고서에는 충돌 원인을 진단하는 데 도움이 되는 정보가 포함되어 있습니다. 응용 프로그램 및 다른 프로세스 사용자별 launchd 컨텍스트에서 실행 중인 경우, ReportCrash는 LaunchAgent로 실행되어 사용자의 ~/Library/Logs/DiagnosticReports/에 충돌 보고서를 저장합니다. 데몬, 시스템 launchd 컨텍스트에서 실행 중인 다른 프로세스 및 다른 권한이 있는 프로세스의 경우, ReportCrash는 LaunchDaemon으로 실행되어 시스템의 /Library/Logs/DiagnosticReports에 충돌 보고서를 저장합니다.

Apple로 보내지는 충돌 보고서에 대해 걱정된다면 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 서버가 어떻게 충돌했는지 파악하는 데 유용할 수 있습니다.

#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

#To re-enable crash reporting:
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

슬립

MacOS에서 퍼징을 할 때 Mac이 슬립 모드로 들어가지 않도록하는 것이 중요합니다:

SSH 연결 끊김

SSH 연결을 통해 퍼징을 하는 경우 세션이 종료되지 않도록하는 것이 중요합니다. 따라서 sshd_config 파일을 다음과 같이 변경하십시오:

  • TCPKeepAlive Yes

  • ClientAliveInterval 0

  • ClientAliveCountMax 0

sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

내부 핸들러

다음 페이지를 확인하여 특정 scheme 또는 protocol을 처리하는 앱을 찾는 방법을 알아보세요:

pagemacOS File Extension & URL scheme app handlers

네트워크 프로세스 열거

네트워크 데이터를 관리하는 프로세스를 찾는 것은 흥미로운 작업입니다:

dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
sort -u recv.log > procs.txt
cat procs.txt

또는 netstat 또는 lsof를 사용하십시오.

Libgmalloc

lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit"

Fuzzers

CLI 도구에 대해 작동합니다.

macOS GUI 도구와 "**그냥 작동"**합니다. 일부 macOS 앱은 고유한 파일 이름, 올바른 확장자, 샌드박스에서 파일을 읽어야 하는 등 특정 요구 사항이 있습니다 (~/Library/Containers/com.apple.Safari/Data)...

일부 예시:

# iBooks
litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i files/epub -o crashes/ibooks -t /Users/test/Library/Containers/com.apple.iBooksX/Data/tmp -x 10 -n 100000 -ez

# -l : Local
# -c : cmdline with FUZZ word (if not stdin is used)
# -i : input directory or file
# -o : Dir to output crashes
# -t : Dir to output runtime fuzzing artifacts
# -x : Tmeout for the run (default is 1)
# -n : Num of fuzzing iterations (default is 1)
# -e : enable second round fuzzing where any crashes found are reused as inputs
# -z : enable malloc debug helpers

# Font Book
litefuzz -l -c "/System/Applications/Font Book.app/Contents/MacOS/Font Book FUZZ" -i input/fonts -o crashes/font-book -x 2 -n 500000 -ez

# smbutil (using pcap capture)
litefuzz -lk -c "smbutil view smb://localhost:4455" -a tcp://localhost:4455 -i input/mac-smb-resp -p -n 100000 -z

# screensharingd (using pcap capture)
litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash screensharingd -p -n 100000

더 많은 Fuzzing MacOS 정보

참고 자료

WhiteIntel다크 웹을 기반으로 한 검색 엔진으로, 회사나 그 고객이 스틸러 악성 소프트웨어에 의해 침해를 당했는지 무료로 확인할 수 있는 기능을 제공합니다.

WhiteIntel의 주요 목표는 정보 탈취 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격에 대항하는 것입니다.

그들의 웹사이트를 방문하여 엔진을 무료로 사용해 볼 수 있습니다:

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **AWS 해킹**을 전문가로 배우세요!

HackTricks를 지원하는 다른 방법:

Last updated