Burp ์ธ์ฆ์„œ ์„ค์น˜

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

ADB๋ฅผ ํ†ตํ•œ ์‹œ์Šคํ…œ ์ „์ฒด ํ”„๋ก์‹œ

๋ชจ๋“  ์•ฑ์˜ ํŠธ๋ž˜ํ”ฝ์ด ์ธํ„ฐ์…‰ํ„ฐ(Burp/mitmproxy)๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋„๋ก ์ „์—ญ HTTP ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค:

# Set proxy (device/emulator must reach your host IP)
adb shell settings put global http_proxy 192.168.1.2:8080

# Clear proxy
adb shell settings put global http_proxy :0

ํŒ: Burp์—์„œ ๋ฆฌ์Šค๋„ˆ๋ฅผ 0.0.0.0์— ๋ฐ”์ธ๋“œํ•˜๋ฉด LAN์˜ ์žฅ์น˜๋“ค์ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Proxy -> Options -> Proxy Listeners).

๊ฐ€์ƒ ๋จธ์‹ ์—์„œ

๋จผ์ € Burp์—์„œ Der ์ธ์ฆ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Proxy โ€“> Options โ€“> _Import / Export CA certificate_์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Der ํ˜•์‹์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋‚ด๋ณด๋‚ธ ๋‹ค์Œ ์ด๋ฅผ Android๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ฉ์‹œ๋‹ค. ์ฐธ๊ณ ๋กœ AVD์˜ Android ๋จธ์‹ ์— burp ์ธ์ฆ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์ด ๋จธ์‹ ์„ -writable-system ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.\
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system

๊ทธ๋Ÿฐ ๋‹ค์Œ, burps ์ธ์ฆ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด:

openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
mv burp_cacert.pem $CERTHASHNAME #Correct name
adb root && sleep 2 && adb remount #Allow to write on /syste
adb push $CERTHASHNAME /sdcard/ #Upload certificate
adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correct location
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
adb reboot #Now, reboot the machine

Once the machine finish rebooting the burp certificate will be in use by it!

Magisc ์‚ฌ์šฉํ•˜๊ธฐ

If you rooted your device with Magisc (maybe an emulator), and you canโ€™t follow the previous steps to install the Burp cert because the filesystem is read-only and you cannot remount it writable, there is another way.

Explained in this video you need to:

  1. Install a CA certificate: Just ๋“œ๋ž˜๊ทธ&๋“œ๋กญ the DER Burp certificate changing the extension to .crt in the mobile so itโ€™s stored in the Downloads folder and go to Install a certificate -> CA certificate
  • ์ธ์ฆ์„œ๊ฐ€ ์ œ๋Œ€๋กœ ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Trusted credentials -> USER๋กœ ์ด๋™ํ•˜์„ธ์š”
  1. Make it System trusted: Download the Magisc module MagiskTrustUserCerts (a .zip file), ๋“œ๋ž˜๊ทธ&๋“œ๋กญ it in the phone, go to the Magics app in the phone to the Modules section, click on Install from storage, select the .zip module and once installed reboot the phone:
  • Reboot ํ›„ Trusted credentials -> SYSTEM์œผ๋กœ ๊ฐ€์„œ Postswigger cert๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”

Magisc ๋ชจ๋“ˆ ๋งŒ๋“œ๋Š” ๋ฒ• ๋ฐฐ์šฐ๊ธฐ

ํ™•์ธ: https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437

Android 14 ์ดํ›„

์ตœ์‹  Android 14 ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์‹œ์Šคํ…œ ์‹ ๋ขฐ Certificate Authority(CA) ์ธ์ฆ์„œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ํฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๊ฐ€ **/system/etc/security/cacerts/**์— ์œ„์น˜ํ•ด ์žˆ์–ด root ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์‹œ์Šคํ…œ ์ „์ฒด์— ์ฆ‰์‹œ ์ ์šฉ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Android 14์—์„œ๋Š” ์ €์žฅ ์œ„์น˜๊ฐ€ **/apex/com.android.conscrypt/cacerts**๋กœ ์ด๋™๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” /apex ๊ฒฝ๋กœ ๋‚ด์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณธ์งˆ์ ์œผ๋กœ ๋ถˆ๋ณ€(immutable)์ž…๋‹ˆ๋‹ค.

APEX cacerts path๋ฅผ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ remountํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์‹คํŒจ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tmpfs๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฒ„๋ ˆ์ดํ•˜๋ ค๋Š” ์‹œ๋„๋„ ๋ถˆ๋ณ€์„ฑ์„ ์šฐํšŒํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค; ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ๋ณ€๊ฒฝ๊ณผ ๊ด€๊ณ„์—†์ด ์›๋ž˜์˜ ์ธ์ฆ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” /apex ๋งˆ์šดํŠธ๊ฐ€ PRIVATE propagation์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด /apex ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Android ์ดˆ๊ธฐํ™” ๊ณผ์ •์€ init ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ Zygote ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ๋กœ์šด ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” private /apex ๋งˆ์šดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  /apex ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์‹œ์Šคํ…œ ์‹ ๋ขฐ CA ์ธ์ฆ์„œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ์šฐํšŒ ๋ฐฉ๋ฒ•์€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ PRIVATE propagation์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ **/apex**๋ฅผ ์žฌ๋งˆ์šดํŠธ(remount)ํ•˜์—ฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ณผ์ •์€ **/apex/com.android.conscrypt**์˜ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•˜๊ณ , ์ฝ๊ธฐ ์ „์šฉ ์ œ์•ฝ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด /apex/com.android.conscrypt ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•œ ๋‹ค์Œ, ๋‚ด์šฉ์„ ์›๋ž˜ ์œ„์น˜์ธ /apex ๋‚ด๋กœ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์‹œ์Šคํ…œ ํฌ๋ž˜์‹œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‹ ์†ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹œ์Šคํ…œ ์ „์ฒด์— ์ ์šฉํ•˜๋ ค๋ฉด system_server๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ์ด๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ๊ณผ์ ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ์ผ๊ด€๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

# Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore.
mkdir -p -m 700 /data/local/tmp/tmp-ca-copy

# Copy out the existing certificates
cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/tmp-ca-copy/

# Create the in-memory mount on top of the system certs folder
mount -t tmpfs tmpfs /system/etc/security/cacerts

# Copy the existing certs back into the tmpfs, so we keep trusting them
mv /data/local/tmp/tmp-ca-copy/* /system/etc/security/cacerts/

# Copy our new cert in, so we trust that too
mv $CERTIFICATE_PATH /system/etc/security/cacerts/

# Update the perms & selinux context labels
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*

# Deal with the APEX overrides, which need injecting into each namespace:

# First we get the Zygote process(es), which launch each app
ZYGOTE_PID=$(pidof zygote || true)
ZYGOTE64_PID=$(pidof zygote64 || true)
# N.b. some devices appear to have both!

# Apps inherit the Zygote's mounts at startup, so we inject here to ensure
# all newly started apps will see these certs straight away:
for Z_PID in "$ZYGOTE_PID" "$ZYGOTE64_PID"; do
if [ -n "$Z_PID" ]; then
nsenter --mount=/proc/$Z_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
fi
done

# Then we inject the mount into all already running apps, so they
# too see these CA certs immediately:

# Get the PID of every process whose parent is one of the Zygotes:
APP_PIDS=$(
echo "$ZYGOTE_PID $ZYGOTE64_PID" | \
xargs -n1 ps -o 'PID' -P | \
grep -v PID
)

# Inject into the mount namespace of each of those apps:
for PID in $APP_PIDS; do
nsenter --mount=/proc/$PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts &
done
wait # Launched in parallel - wait for completion here

echo "System certificate injected"

Bind-mounting through NSEnter

  1. ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ •: ์ฒ˜์Œ์— ๊ธฐ์กด์˜ non-APEX ์‹œ์Šคํ…œ ์ธ์ฆ์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์— tmpfs๋ฅผ ๋งˆ์šดํŠธํ•˜์—ฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
mount -t tmpfs tmpfs /system/etc/security/cacerts
  1. CA ์ธ์ฆ์„œ ์ค€๋น„: ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•œ ํ›„, ์‚ฌ์šฉํ•˜๋ ค๋Š” CA ์ธ์ฆ์„œ๋ฅผ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ /apex/com.android.conscrypt/cacerts/์— ์žˆ๋Š” ๊ธฐ๋ณธ ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๋“ค์˜ ๊ถŒํ•œ ๋ฐ SELinux ๋ผ๋ฒจ์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  2. Zygote๋ฅผ ์œ„ํ•œ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ: nsenter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Zygote์˜ ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ธ Zygote๋Š” ์ดํ›„ ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒˆ๋กœ ๊ตฌ์„ฑํ•œ CA ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์€:
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์ƒˆ๋กœ์šด ์•ฑ์ด ์—…๋ฐ์ดํŠธ๋œ CA ์ธ์ฆ์„œ ์„ค์ •์„ ๋”ฐ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. ์‹คํ–‰ ์ค‘์ธ ์•ฑ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ ์šฉํ•˜๊ธฐ: ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด nsenter๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด ๊ฐ ์•ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๊ฐœ๋ณ„์ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์œ ์‚ฌํ•œ bind mount๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ช…๋ น์€:
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
  1. ๋Œ€์ฒด ๋ฐฉ๋ฒ• - Soft Reboot: ๋Œ€์ฒด ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” init ํ”„๋กœ์„ธ์Šค (PID 1)์— bind mount๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ stop && start ๋ช…๋ น์œผ๋กœ ์šด์˜์ฒด์ œ๋ฅผ soft rebootํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ „ํŒŒ๋˜์–ด ์‹คํ–‰ ์ค‘์ธ ๊ฐ ์•ฑ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๋ฅผ ์—†์•ฑ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์žฌ๋ถ€ํŒ…์˜ ๋ฒˆ๊ฑฐ๋กœ์›€ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ํ˜ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

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