Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Pentesting

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

Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ์ดˆ

์ด ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ์ฝ์–ด Android ๋ณด์•ˆ๊ณผ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋“ค๊ณผ ๊ด€๋ จ๋œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋“ค์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

Android Applications Basics

ADB (Android Debug Bridge)

์ด๊ฒƒ์€ emulated ๋˜๋Š” physical Android device์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ฃผ์š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
ADB๋ฅผ ํ†ตํ•ด ์ปดํ“จํ„ฐ์—์„œ USB ๋˜๋Š” Network๋ฅผ ํ†ตํ•ด ์žฅ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํŒŒ์ผ์˜ ์–‘๋ฐฉํ–ฅ copying, ์•ฑ์˜ installation ๋ฐ uninstallation, shell commands์˜ execution, ๋ฐ์ดํ„ฐ์˜ backing up, ๋กœ๊ทธ์˜ reading ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

adb ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šฐ๋ ค๋ฉด ๋‹ค์Œ ADB Commands ๋ชฉ๋ก์„ ํ™•์ธํ•˜์„ธ์š”.

Smali

๋•Œ๋•Œ๋กœ ์ˆจ๊ฒจ์ง„ ์ •๋ณด(์˜ˆ: ์ž˜ ๋‚œ๋…ํ™”๋œ passwords ๋˜๋Š” flags)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ modifyํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ apk๋ฅผ decompileํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ๋‹ค์‹œ recompileํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
In this tutorial you can learn how to decompile and APK, modify Smali code and recompile the APK with the new functionality. ์ด ๋ฐฉ๋ฒ•์€ ์ดํ›„์— ์ œ์‹œ๋  dynamic analysis ๋™์•ˆ์˜ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ด ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘์— ๋‘์„ธ์š”.

๊ธฐํƒ€ ํฅ๋ฏธ๋กœ์šด ํŠธ๋ฆญ

adb shell pm list packages
com.android.insecurebankv2

adb shell pm path com.android.insecurebankv2
package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk

adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
  • ๋ชจ๋“  splits ๋ฐ base apks๋ฅผ APKEditor๋กœ ๋ณ‘ํ•ฉ:
mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
java -jar ../APKEditor.jar m -i splits/ -o merged.apk

# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed

Android Enterprise & Work Profile Attacks

Android Enterprise Work Profile Bypass

์‚ฌ๋ก€ ์—ฐ๊ตฌ ๋ฐ ์ทจ์•ฝ์ 

Air Keyboard Remote Input Injection

Android Rooting Frameworks Manager Auth Bypass Syscall Hook

Abusing Android Media Pipelines Image Parsers

Arm64 Static Linear Map Kaslr Bypass

์ •์  ๋ถ„์„

๋ฌด์—‡๋ณด๋‹ค๋„, APK๋ฅผ ๋ถ„์„ํ•  ๋•Œ๋Š” ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด Java ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋””์ปดํŒŒ์ผ๋Ÿฌ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์ฝ์–ด๋ณด์„ธ์š”.

ํฅ๋ฏธ๋กœ์šด ์ •๋ณด ์ฐพ๊ธฐ

APK์˜ ๋ฌธ์ž์—ด๋งŒ ์‚ดํŽด๋ด๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ, URL, API ํ‚ค, ์•”ํ˜ธํ™” ๊ด€๋ จ ํ•ญ๋ชฉ, bluetooth uuids, ํ† ํฐ ๋“ฑ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ ์ฝ”๋“œ ์‹คํ–‰์šฉ ๋ฐฑ๋„์–ด๋‚˜ ์ธ์ฆ ๋ฐฑ๋„์–ด(์•ฑ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ด€๋ฆฌ์ž ์ž๊ฒฉ์ฆ๋ช…)๋„ ์ฐพ์•„๋ณด์„ธ์š”.

Firebase

firebase URLs์— ํŠนํžˆ ์ฃผ์˜ํ•˜๊ณ  ์„ค์ •์ด ์ž˜๋ชป๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. Firebase๊ฐ€ ๋ฌด์—‡์ด๋ฉฐ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ์ดํ•ด - Manifest.xml, strings.xml

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Manifest.xml ๋ฐ strings.xml ํŒŒ์ผ์„ ๊ฒ€์‚ฌํ•˜๋ฉด ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์€ ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ APK ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ .zip์œผ๋กœ ๋ฐ”๊พผ ๋’ค ์••์ถ•์„ ํ’€์–ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Manifest.xml์—์„œ ์‹๋ณ„๋˜๋Š” ์ทจ์•ฝ์ ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • Debuggable Applications: Manifest.xml ํŒŒ์ผ์—์„œ debuggable="true"๋กœ ์„ค์ •๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์—ฌ ์•…์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฐพ์•„ ์žฅ์น˜์—์„œ ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • Backup Settings: ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ android:allowBackup="false" ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ํŠนํžˆ USB ๋””๋ฒ„๊น…์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ adb๋ฅผ ํ†ตํ•œ ๋ฌด๋‹จ ๋ฐ์ดํ„ฐ ๋ฐฑ์—…์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Network Security: android:networkSecurityConfig="@xml/network_security_config" ๊ฐ™์€ ๋งž์ถค ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ตฌ์„ฑ(res/xml/)์€ ์ธ์ฆ์„œ ํ•€ ๋ฐ HTTP ํŠธ๋ž˜ํ”ฝ ์„ค์ • ๋“ฑ ๋ณด์•ˆ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด HTTP ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Exported Activities and Services: ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ๋‚ด๋ณด๋‚ด์ง„ Activities์™€ Services๋ฅผ ์‹๋ณ„ํ•˜๋ฉด ์˜ค์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ํ…Œ์ŠคํŠธ ์ค‘ ์ถ”๊ฐ€ ๋ถ„์„์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • Content Providers and FileProviders: ๋…ธ์ถœ๋œ content provider๋Š” ๋ฌด๋‹จ์œผ๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FileProviders์˜ ๊ตฌ์„ฑ๋„ ๋ฉด๋ฐ€ํžˆ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Broadcast Receivers and URL Schemes: ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ์•…์šฉ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ URL ์Šคํ‚ด์ด ์ž…๋ ฅ ์ทจ์•ฝ์ ์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์ฃผ์˜ ๊นŠ๊ฒŒ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • SDK Versions: minSdkVersion, targetSDKVersion, maxSdkVersion ์†์„ฑ์€ ์ง€์›๋˜๋Š” Android ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์˜ค๋ž˜๋˜๊ณ  ์ทจ์•ฝํ•œ Android ๋ฒ„์ „์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

strings.xml ํŒŒ์ผ์—์„œ๋Š” API ํ‚ค, ์ปค์Šคํ…€ ์Šคํ‚ค๋งˆ ๋ฐ ๊ธฐํƒ€ ๊ฐœ๋ฐœ์ž ๋…ธํŠธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tapjacking

Tapjacking์€ ์•…์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์–ด ํ”ผํ•ด์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ„์— ์ž์‹ ์„ ์œ„์น˜์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ํ”ผํ•ด์ž ์•ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐ€๋ฆฌ๊ณ  ๋‚˜๋ฉด, ๊ณต๊ฒฉ์ž์˜ UI๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์†์—ฌ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์ƒํ˜ธ์ž‘์šฉ์„ ํ”ผํ•ด์ž ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์‹ค์ œ๋กœ ํ”ผํ•ด์ž ์•ฑ์—์„œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”:

Tapjacking

Task Hijacking

launchMode๊ฐ€ **singleTask**๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  taskAffinity๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ activity๋Š” task Hijacking์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์•…์„ฑ application์ด ์„ค์น˜๋˜์–ด ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜๋ฉด ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํƒœ์Šคํฌ๋ฅผ ํ•˜์ด์žฌํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด์„œ ์•…์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค).

์ž์„ธํ•œ ์ •๋ณด:

Android Task Hijacking

Insecure data storage

Internal Storage

Android์—์„œ ๋‚ด๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ํŒŒ์ผ์€ ์ด๋ฅผ ์ƒ์„ฑํ•œ ์•ฑ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณด์•ˆ ์กฐ์น˜๋Š” Android OS์— ์˜ํ•ด ๊ฐ•์ œ๋˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ์š”๊ตฌ์‚ฌํ•ญ์— ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๋Š” ๋•Œ๋•Œ๋กœ MODE_WORLD_READABLE ๋ฐ MODE_WORLD_WRITABLE๊ณผ ๊ฐ™์€ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์„ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๊ณต์œ ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ๋“ค์€ ์ž ์žฌ์ ์œผ๋กœ ์•…์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋Ÿฌํ•œ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

  1. ์ •์  ๋ถ„์„:
  • MODE_WORLD_READABLE ๋ฐ MODE_WORLD_WRITABLE์˜ ์‚ฌ์šฉ์„ ์‹ ์ค‘ํžˆ ๊ฒ€ํ† ํ•˜์„ธ์š”. ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๋Š” ํŒŒ์ผ์„ ์›์น˜ ์•Š๊ฑฐ๋‚˜ ๋ฌด๋‹จ์ธ ์ ‘๊ทผ์— ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋™์  ๋ถ„์„:
  • ์•ฑ์ด ์ƒ์„ฑํ•œ ํŒŒ์ผ์— ์„ค์ •๋œ ๊ถŒํ•œ์„ ๊ฒ€์ฆํ•˜์„ธ์š”. ํŠนํžˆ ์–ด๋–ค ํŒŒ์ผ์ด ์ „์—ญ์ ์œผ๋กœ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ด๋Š” ์žฅ์น˜์— ์„ค์น˜๋œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฏ€๋กœ ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์œ„ํ—˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

External Storage

SD ์นด๋“œ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋‹ค์Œ ์ ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

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

์™ธ๋ถ€ ์ €์žฅ์†Œ๋Š” /storage/emulated/0 , /sdcard , /mnt/sdcard ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tip

Android 4.4(API 17)๋ถ€ํ„ฐ SD ์นด๋“œ์—๋Š” ์•ฑ๋ณ„๋กœ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•…์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์•ฑ์˜ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ

  • Shared preferences: Android๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด /data/data/<packagename>/shared_prefs/ ๊ฒฝ๋กœ์— XML ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ๋•Œ๋•Œ๋กœ ํ•ด๋‹น ํด๋”์—์„œ ํ‰๋ฌธ์œผ๋กœ ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Databases: Android๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด /data/data/<packagename>/databases/ ๊ฒฝ๋กœ์— sqlite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ๋•Œ๋•Œ๋กœ ํ•ด๋‹น ํด๋”์—์„œ ํ‰๋ฌธ์œผ๋กœ ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Broken TLS

Accept All Certificates

์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ˜ธ์ŠคํŠธ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ชจ๋“  ์ธ์ฆ์„œ๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ๋ผ์ธ๊ณผ ๊ฐ™์ด:

SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.

์ทจ์•ฝํ•œ ์•”ํ˜ธํ™”

๋น„์ ์ ˆํ•œ ํ‚ค ๊ด€๋ฆฌ ์ ˆ์ฐจ

์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ  ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ๋‹ค. ์—ญ๊ณตํ•™์œผ๋กœ ์ธํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜/๋˜๋Š” ํ๊ธฐ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ

๊ฐœ๋ฐœ์ž๋Š” ๊ถŒํ•œ ํ™•์ธ(authorisation checks), ๋ฐ์ดํ„ฐ ์ €์žฅ ๋˜๋Š” ์ „์†ก์— ํ๊ธฐ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์˜ˆ๋กœ RC4, MD4, MD5, SHA1 ๋“ฑ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ์— ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์†”ํŠธ์™€ ํ•จ๊ป˜ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ์— ๊ฐ•ํ•œ ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ธฐํƒ€ ์ ๊ฒ€

  • APK๋ฅผ ๋‚œ๋…ํ™”ํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.
  • ์•ฑ์ด ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ(์˜ˆ: ์€ํ–‰ ์•ฑ) ์ž์ฒด์ ์œผ๋กœ ๊ธฐ๊ธฐ๊ฐ€ ๋ฃจํŒ…๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  • ์•ฑ์ด ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ(์˜ˆ: ์€ํ–‰ ์•ฑ) ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • ์•ฑ์ด ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ(์˜ˆ: ์€ํ–‰ ์•ฑ) ์‹คํ–‰ ์ „์— ์ž์ฒด ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
  • APKiD๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ค compiler/packer/obfuscator๊ฐ€ APK ๋นŒ๋“œ์— ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

React Native Application

Read the following page to learn how to easily access javascript code of React applications:

React Native Application

Xamarin Applications

Read the following page to learn how to easily access C# code of a xamarin applications:

Xamarin Apps

Superpacked Applications

According to this blog post superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of appsโ€ฆ and a faster way which involves to execute the application and gather the decompressed files from the filesystem.

์ž๋™ํ™”๋œ ์ •์  ์ฝ”๋“œ ๋ถ„์„

๋„๊ตฌ mariana-trench๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ๋„๊ตฌ์— ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ œ์–ด๋˜๋Š” ์ž…๋ ฅ์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ง€์‹œํ•˜๋Š” ์—ฌ๋Ÿฌ known sources, ์•…์˜์  ์ž…๋ ฅ์ด ํ”ผํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜ํ•œ ์œ„์น˜๋ฅผ ์ง€์‹œํ•˜๋Š” sinks, ๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ถœ ๊ทœ์น™์„ ์ œ๊ณตํ•˜๋Š” rules๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™๋“ค์€ ์ทจ์•ฝ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” sources-sinks์˜ ์กฐํ•ฉ์„ ์ •์˜ํ•œ๋‹ค.

์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ mariana-trench๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋‚ธ๋‹ค.

Secrets leaked

An application may contain secrets (API keys, passwords, hidden urls, subdomainsโ€ฆ) inside of it that you might be able to discover. You could us a tool such as https://github.com/dwisiswant0/apkleaks

Bypass Biometric Authentication

Bypass Biometric Authentication (Android)

๊ธฐํƒ€ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ

In Memory Jni Shellcode Execution

Other tricks

content:// protocol



๋™์  ๋ถ„์„

๋ฌด์—‡๋ณด๋‹ค๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ชจ๋“  ํ™˜๊ฒฝ(Burp CA cert, Drozer ๋ฐ Frida ๋“ฑ)์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํŒ…๋œ ๊ธฐ๊ธฐ(์—๋ฎฌ๋ ˆ์ดํ„ฐ ํฌํ•จ)๊ฐ€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋œ๋‹ค.

์˜จ๋ผ์ธ ๋™์  ๋ถ„์„

๋‹ค์Œ์—์„œ ๋ฌด๋ฃŒ ๊ณ„์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค: https://appetize.io/. ์ด ํ”Œ๋žซํผ์€ APK๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฏ€๋กœ APK์˜ ๋™์ž‘์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

์›น์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ณ  adb๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ADB ์—ฐ๊ฒฐ ๋•๋ถ„์— ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋‚ด์—์„œ Drozer์™€ Frida๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กœ์ปฌ ๋™์  ๋ถ„์„

์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ

  • Android Studio (x86 ๋ฐ arm ๋””๋ฐ”์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, this์— ๋”ฐ๋ฅด๋ฉด ์ตœ์‹  x86 ๋ฒ„์ „์€ ๋А๋ฆฐ arm ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์—†์ด๋„ ARM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค).
  • ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ:

AVD - Android Virtual Device

  • Genymotion (Free version: Personal Edition, ๊ณ„์ • ์ƒ์„ฑ ํ•„์š”. ์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋ ค๋ฉด VirtualBox๊ฐ€ ํฌํ•จ๋œ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.)
  • Nox (๋ฌด๋ฃŒ์ง€๋งŒ Frida๋‚˜ Drozer๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค).

Tip

์ƒˆ๋กœ์šด ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ™”๋ฉด์ด ํด์ˆ˜๋ก ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋А๋ ค์ง„๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋ผ. ๊ฐ€๋Šฅํ•˜๋ฉด ์ž‘์€ ํ™”๋ฉด์„ ์„ ํƒํ•˜๋ผ.

Genymotion์— google services(์˜ˆ: AppStore)๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ด๋ฏธ์ง€์˜ ๋นจ๊ฐ„ ํ‘œ์‹œ๋œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ ํ•œ๋‹ค:

๋˜ํ•œ Genymotion์˜ Android VM ์„ค์ •์—์„œ Bridge Network mode๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋ผ(๋„๊ตฌ๊ฐ€ ์„ค์น˜๋œ ๋‹ค๋ฅธ VM์—์„œ Android VM์— ์—ฐ๊ฒฐํ•  ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค).

๋ฌผ๋ฆฌ์  ๊ธฐ๊ธฐ ์‚ฌ์šฉ

๋””๋ฒ„๊น… ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฃจํŒ…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค:

  1. ์„ค์ •.
  2. (Android 8.0๋ถ€ํ„ฐ) ์‹œ์Šคํ…œ์„ ์„ ํƒํ•œ๋‹ค.
  3. ์ „ํ™” ์ •๋ณด๋ฅผ ์„ ํƒํ•œ๋‹ค.
  4. ๋นŒ๋“œ ๋ฒˆํ˜ธ๋ฅผ 7๋ฒˆ ๋ˆ„๋ฅธ๋‹ค.
  5. ๋’ค๋กœ ๊ฐ€๋ฉด ๊ฐœ๋ฐœ์ž ์˜ต์…˜์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•œ ํ›„ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์•ฑ์„ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๋ฌด์—‡์„ ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•˜์—ฌ ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค. ๋‚˜๋Š” ์ด ์ดˆ๊ธฐ ๋™์  ๋ถ„์„์„ MobSF dynamic analysis + pidcat์„ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด MobSF๊ฐ€ ๋‚˜์ค‘์— ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋™์•ˆ ์•ฑ์˜ ๋™์ž‘์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

Magisk/Zygisk ๊ฐ„๋‹จ ๋ฉ”๋ชจ (Pixel ๊ธฐ๊ธฐ ๊ถŒ์žฅ)

  • Magisk ์•ฑ์œผ๋กœ boot.img๋ฅผ ํŒจ์น˜ํ•˜๊ณ  fastboot๋กœ ํ”Œ๋ž˜์‹œํ•˜์—ฌ systemless root๋ฅผ ์–ป๋Š”๋‹ค
  • ๋ฃจํŠธ ์ˆจ๊ธฐ๊ธฐ๋ฅผ ์œ„ํ•ด Zygisk + DenyList๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ผ; ๋” ๊ฐ•๋ ฅํ•œ ์ˆจ๊น€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ LSPosed/Shamiko๋ฅผ ๊ณ ๋ คํ•˜๋ผ
  • OTA ์—…๋ฐ์ดํŠธ์—์„œ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์›๋ณธ boot.img๋ฅผ ๋ณด๊ด€ํ•˜๊ณ , OTA ํ›„์—๋Š” ๋‹ค์‹œ ํŒจ์น˜ํ•˜๋ผ
  • ์Šคํฌ๋ฆฐ ๋ฏธ๋Ÿฌ๋ง์€ ํ˜ธ์ŠคํŠธ์—์„œ scrcpy๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

Unintended Data Leakage

Logging

๊ฐœ๋ฐœ์ž๋Š” ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค, ์ด๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ leaks๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด pidcat๊ณผ adb logcat์„ ๊ถŒ์žฅํ•œ๋‹ค. Pidcat์€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ๋•Œ๋ฌธ์— ์„ ํ˜ธ๋œ๋‹ค.

Warning

Android 4.0 ์ดํ›„ ๋ฒ„์ „๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ์˜ ๋กœ๊ทธ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฑ์€ ๋‹ค๋ฅธ ์•ฑ์˜ ๋กœ๊ทธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
์–ด์จŒ๋“  ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฒ„ํผ ์บ์‹ฑ

Android์˜ ํด๋ฆฝ๋ณด๋“œ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์•ฑ์—์„œ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํด๋ฆฝ๋ณด๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค. ์‹ ์šฉ์นด๋“œ ์ •๋ณด์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์„น์…˜์— ๋Œ€ํ•ด์„œ๋Š” ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

ํฌ๋ž˜์‹œ ๋กœ๊ทธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํฌ๋ž˜์‹œํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋ฉด, ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ญ๊ณตํ•™ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ์œ„ํ—˜์„ ์™„ํ™”ํ•˜๋ ค๋ฉด ํฌ๋ž˜์‹œ ์‹œ ๋กœ๊น…์„ ํ”ผํ•˜๊ณ , ๋กœ๊ทธ๋ฅผ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•ด์•ผ ํ•  ๊ฒฝ์šฐ SSL ์ฑ„๋„๋กœ ์ „์†ก๋˜๋„๋ก ํ•˜๋ผ.

Pentester๋กœ์„œ ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ผ.

์ œ3์ž์—๊ฒŒ ์ „์†ก๋œ ๋ถ„์„ ๋ฐ์ดํ„ฐ

์•ฑ์€ ์ข…์ข… Google Adsense์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž์˜ ์ž˜๋ชป๋œ ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ์œ ์ถœ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„ ์ œ3์ž ์„œ๋น„์Šค๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์ „์†ก๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

SQLite DBs

๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. pentest ์ค‘์—๋Š” ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ…Œ์ด๋ธ” ๋ฐ ์ปฌ๋Ÿผ ์ด๋ฆ„๊ณผ ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๋ผ. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ทจ์•ฝ์ ์ด๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” /data/data/the.package.name/databases์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ์˜ˆ: /data/data/com.mwr.example.sieve/databases

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์•”ํ˜ธํ™”๋˜์–ด ์žˆ๋”๋ผ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ์ „ํžˆ ์ทจ์•ฝ์ ์ด๋‹ค.

ํ…Œ์ด๋ธ”์€ .tables๋กœ ์—ด๊ฑฐํ•˜๊ณ , ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์€ .schema <table_name>๋กœ ํ™•์ธํ•˜๋ผ

Drozer (Exploit Activities, Content Providers and Services)

From Drozer Docs: Drozer allows you to assume the role of an Android app and interact with other apps. It can do anything that an installed application can do, such as make use of Androidโ€™s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .
Drozer is s useful tool to exploit exported activities, exported services and Content Providers as you will learn in the following sections.

Exploiting exported Activities

Read this if you want to refresh what is an Android Activity.
๋˜ํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ฝ”๋“œ๋Š” onCreate ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.

Authorisation bypass

์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ exported ๋˜์–ด ์žˆ์œผ๋ฉด ์™ธ๋ถ€ ์•ฑ์—์„œ ํ•ด๋‹น ํ™”๋ฉด์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ exported ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Learn how to exploit exported activities with Drozer.

You can also start an exported activity from adb:

  • PackageName is com.example.demo
  • Exported ActivityName is com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity

NOTE: MobSF๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ android:launchMode๋กœ singleTask/singleInstance ์‚ฌ์šฉ์„ ์•…์„ฑ์œผ๋กœ ๊ฐ์ง€ํ•˜์ง€๋งŒ, this ๋•Œ๋ฌธ์—, ๋ณด์ด๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์ด๋Š” ๊ตฌ๋ฒ„์ „(API versions < 21)์—์„œ๋งŒ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

Tip

๊ถŒํ•œ ์šฐํšŒ(authorisation bypass)๊ฐ€ ํ•ญ์ƒ ์ทจ์•ฝ์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐํšŒ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์™€ ์–ด๋–ค ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Sensitive information leakage

Activities๋„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. export๋˜์–ด ์žˆ๊ณ  ๋ณดํ˜ธ๋˜์ง€ ์•Š์€ activity๊ฐ€ setResult ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜(returning sensitive information) ํ•œ๋‹ค๋ฉด, sensitive information leakage๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Tapjacking

Tapjacking์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š์œผ๋ฉด, export๋œ activity๋ฅผ ์•…์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Tapjacking์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” what is Tapjacking follow the link๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Exploiting Content Providers - Accessing and manipulating sensitive information

Read this if you want to refresh what is a Content Provider.
Content providers๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ **๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ (share data)**ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ content providers๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ **๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ(extract sensitive)**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ SQL injections ๋ฐ Path Traversals๋„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Learn how to exploit Content Providers with Drozer.

Exploiting Services

Read this if you want to refresh what is a Service.
Service์˜ ๋™์ž‘์€ onStartCommand ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

Service๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ **๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ (receive data)**ํ•˜๊ณ , **์ฒ˜๋ฆฌ(process)**ํ•˜๋ฉฐ, ์‘๋‹ต์„ ๋ฐ˜ํ™˜(return)(๋˜๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ exportํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ **๊ฒ€ํ† (check)**ํ•˜๊ณ  ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ์ธ์ฆ ์šฐํšŒ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด **๋™์  ํ…Œ์ŠคํŠธ(test dynamically)**๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Learn how to exploit Services with Drozer.

Exploiting Broadcast Receivers

Read this if you want to refresh what is a Broadcast Receiver.
Broadcast Receiver์˜ ๋™์ž‘์€ onReceive ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

Broadcast receiver๋Š” ํŠน์ • ํƒ€์ž…์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ทจ์•ฝํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Learn how to exploit Broadcast Receivers with Drozer.

deep links๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, MobSF ๊ฐ™์€ ๋„๊ตฌ๋‚˜ this one ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ ์–ธ๋œ scheme์€ adb๋‚˜ browser๋ฅผ ์‚ฌ์šฉํ•ด ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]

์ฐธ๊ณ : omit the package name์„(๋ฅผ) ์ƒ๋žตํ•˜๋ฉด ๋ชจ๋ฐ”์ผ์ด ํ•ด๋‹น ๋งํฌ๋ฅผ ์—ด ์•ฑ์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>

์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ

์•ฑ์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด deeplink์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” activity๋กœ ๊ฐ€์„œ ํ•จ์ˆ˜ **onNewIntent**์„ ์ฐพ์•„๋ณด์„ธ์š”.

๋ฏผ๊ฐํ•œ ์ •๋ณด

deep link๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ๋งˆ๋‹ค URL parameters๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น deep link๋ฅผ ๊ฐ€์žฅํ•ด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!

๊ฒฝ๋กœ ๋‚ด ํŒŒ๋ผ๋ฏธํ„ฐ

https://api.example.com/v1/users/{username} ๊ฐ™์€ URL ๊ฒฝ๋กœ ์•ˆ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” deep link๊ฐ€ ์žˆ๋Š”์ง€๋„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” example://app/users?username=../../unwanted-endpoint%3fparam=value ๊ฐ™์€ ๊ฐ’์„ ์ด์šฉํ•ด path traversal์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฐพ์œผ๋ฉด, ๊ฒฝ๋กœ์˜ ์ผ๋ถ€๊ฐ€ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ Open Redirect๋ฅผ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜(๋˜๋Š”), CSRF ํ† ํฐ ์—†์ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์ทจ์•ฝํ•œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด account takeover์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ทจ์•ฝ์ ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ info about this here๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ถ”๊ฐ€ ์˜ˆ์‹œ

An interesting bug bounty report about links (/.well-known/assetlinks.json).

์ „์†ก ๊ณ„์ธต ๊ฒ€์‚ฌ ๋ฐ ๊ฒ€์ฆ ์‹คํŒจ

  • Certificates๊ฐ€ ํ•ญ์ƒ ์ œ๋Œ€๋กœ ๊ฒ€์‚ฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค โ€” Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  self-signed certificates๋ฅผ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ HTTP ์—ฐ๊ฒฐ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ์ผ์ด ํ”ํ•ฉ๋‹ˆ๋‹ค.
  • SSL/TLS ํ•ธ๋“œ์…ฐ์ดํฌ ์ค‘ ํ˜‘์ƒ์ด ๋•Œ๋•Œ๋กœ ์ทจ์•ฝํ•˜๋‹ค โ€” ์ทจ์•ฝํ•œ cipher suites๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ์ด man-in-the-middle (MITM) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•ด์ ธ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Leakage of private information์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธ์ฆ์€ ๋ณด์•ˆ ์ฑ„๋„๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ํ†ต์‹ ์€ ๋น„๋ณด์•ˆ ์ฑ„๋„๋กœ ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์„ธ์…˜ ์ฟ ํ‚ค๋‚˜ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•…์˜์  ์ฃผ์ฒด๊ฐ€ ๊ฐ€๋กœ์ฑ„๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ๊ฒ€์ฆ

์šฐ๋ฆฌ๋Š” ์ธ์ฆ์„œ ๊ฒ€์ฆ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋ถˆ์•ˆ์ „ํ•œ TLS ์„ค์ •๊ณผ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ์ฑ„๋„์„ ํ†ตํ•œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์€ ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธ์ฆ์„œ ๊ฒ€์ฆ ๋ฐ ์ทจ์•ฝ์  ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‹จ๊ณ„๋Š” this resource๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

SSL Pinning

SSL Pinning์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์— ์ €์žฅ๋œ ์•Œ๋ ค์ง„ ์‚ฌ๋ณธ๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ MITM ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋ฉฐ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” SSL Pinning ๊ตฌํ˜„์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ๊ฒ€์‚ฌ

HTTP ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ํ”„๋ก์‹œ ๋„๊ตฌ์˜ ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜(์˜ˆ: Burp)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์•”ํ˜ธํ™”๋œ ํŠธ๋ž˜ํ”ฝ์ด ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ CA ์ธ์ฆ์„œ ์„ค์น˜ ๊ฐ€์ด๋“œ๋Š” click here๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

API Level 24 ์ด์ƒ์„ ํƒ€๊นƒ์œผ๋กœ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ”„๋ก์‹œ์˜ CA ์ธ์ฆ์„œ๋ฅผ ์ˆ˜๋ฝํ•˜๋„๋ก Network Security Config๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ์•”ํ˜ธํ™”๋œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Network Security Config ์ˆ˜์ • ๋ฐฉ๋ฒ•์€ refer to this tutorial๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋งŒ์•ฝ Flutter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด this page์˜ ์ง€์นจ์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ธ์ฆ์„œ๋ฅผ ์Šคํ† ์–ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋ฐ, Flutter๋Š” ์ž์ฒด ์œ ํšจ CA ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Static detection of SSL/TLS pinning

๋Ÿฐํƒ€์ž„ ์šฐํšŒ ์‹œ๋„๋ฅผ ํ•˜๊ธฐ ์ „์— APK์—์„œ pinning์ด ์ ์šฉ๋œ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งคํ•‘ํ•˜์„ธ์š”. ์ •์  ํƒ์ง€๋Š” ํ›…/ํŒจ์น˜ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ์— ์ง‘์ค‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Tool: SSLPinDetect

  • ์˜คํ”ˆ์†Œ์Šค ์ •์  ๋ถ„์„ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ, APK๋ฅผ Smali๋กœ ๋””์ปดํŒŒ์ผ(apktool ์‚ฌ์šฉ)ํ•˜๊ณ  SSL/TLS pinning ๊ตฌํ˜„์˜ ์ปค๋ ˆ์ดํŒ…๋œ regex ํŒจํ„ด์„ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋งค์น˜์— ๋Œ€ํ•ด ์ •ํ™•ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ, ๋ผ์ธ ๋ฒˆํ˜ธ ๋ฐ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ๋ฆฌํฌํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ์ปค์Šคํ…€ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, ๊ทธ๋ฆฌ๊ณ  Network Security Config XML pins.

์„ค์น˜

  • Prereqs: Python >= 3.8, Java on PATH, apktool
git clone https://github.com/aancw/SSLPinDetect
cd SSLPinDetect
pip install -r requirements.txt

์‚ฌ์šฉ๋ฒ•

# Basic
python sslpindetect.py -f app.apk -a apktool.jar

# Verbose (timings + per-match path:line + snippet)
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v

์˜ˆ์ œ ํŒจํ„ด ๊ทœ์น™ (JSON) signatures๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์—ฌ ๋…์ /์ปค์Šคํ…€ pinning ์Šคํƒ€์ผ์„ ํƒ์ง€ํ•˜์„ธ์š”. ์ž์‹ ์˜ JSON์„ ๋กœ๋“œํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ๋กœ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
"OkHttp Certificate Pinning": [
"Lcom/squareup/okhttp/CertificatePinner;",
"Lokhttp3/CertificatePinner;",
"setCertificatePinner"
],
"TrustManager Override": [
"Ljavax/net/ssl/X509TrustManager;",
"checkServerTrusted"
]
}

๋…ธํŠธ ๋ฐ ํŒ

  • ๋Œ€๊ทœ๋ชจ ์•ฑ์„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ฐ memory-mapped I/O๋กœ ๋น ๋ฅด๊ฒŒ ์Šค์บ”; ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ regex๋Š” ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์˜คํƒ์„ ์ค„์—ฌ์ค€๋‹ค.
  • Pattern collection: https://github.com/aancw/smali-sslpin-patterns
  • ๋‹ค์Œ์œผ๋กœ ์šฐ์„  ๋ถ„๋ฅ˜ํ•  ์ผ๋ฐ˜์ ์ธ ํƒ์ง€ ๋Œ€์ƒ:
  • OkHttp: CertificatePinner ์‚ฌ์šฉ, setCertificatePinner, okhttp3/okhttp ํŒจํ‚ค์ง€ ์ฐธ์กฐ
  • Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted ์˜ค๋ฒ„๋ผ์ด๋“œ
  • Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers
  • res/xml์˜ ์„ ์–ธ์  pins ๋ฐ manifest ์ฐธ์กฐ
  • ์ผ์น˜ํ•œ ์œ„์น˜๋ฅผ ์ด์šฉํ•ด dynamic testing ์ „์— Frida hooks, static patches ๋˜๋Š” ์„ค์ • ๋ฆฌ๋ทฐ๋ฅผ ๊ณ„ํšํ•˜๋ผ.

SSL Pinning ์šฐํšŒ

์•ฑ์— SSL Pinning์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉด HTTPS ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค:

  • ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ apk๋ฅผ ์šฐํšŒ(bypass)ํ•˜๋ ค๋ฉด apk-mitm์„ ์‚ฌ์šฉํ•˜๋ผ. ์ด ์˜ต์…˜์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ SSL Pinning์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด root๊ฐ€ ํ•„์š” ์—†๋‹ค๋Š” ์ ์ด์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ํ•ญ์ƒ ์ž‘๋™ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ์ด ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•˜๋ ค๋ฉด Frida(์•„๋ž˜ ์ฐธ์กฐ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Burp+Frida+Genymotion ์‚ฌ์šฉ ๊ฐ€์ด๋“œ๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐ: https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/
  • objection๋ฅผ ์‚ฌ์šฉํ•ด ์ž๋™์œผ๋กœ SSL Pinning์„ ์šฐํšŒํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค:: objection --gadget com.package.app explore --startup-command "android sslpinning disable"
  • MobSF dynamic analysis(์•„๋ž˜ ์„ค๋ช…)๋กœ ์ž๋™์œผ๋กœ SSL Pinning์„ ์šฐํšŒํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์—ฌ์ „ํžˆ ์บก์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด iptables๋ฅผ ์‚ฌ์šฉํ•ด ํŠธ๋ž˜ํ”ฝ์„ burp๋กœ ํฌ์›Œ๋”ฉํ•ด ๋ณด๋ผ. ๊ด€๋ จ ๋ธ”๋กœ๊ทธ: https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62

์ผ๋ฐ˜์ ์ธ ์›น ์ทจ์•ฝ์  ์ฐพ๊ธฐ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์ผ๋ฐ˜์ ์ธ ์›น ์ทจ์•ฝ์ ๋„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๊ณ  ์™„ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ์š”์•ฝ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€๋งŒ ๋‹ค๋ฅธ ์ž๋ฃŒ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

Frida

Frida๋Š” ๊ฐœ๋ฐœ์ž, ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด, ๋ณด์•ˆ ์—ฐ๊ตฌ์ž๋ฅผ ์œ„ํ•œ ๋™์  ์ธ์ŠคํŠธ๋ฃจ๋จผํ…Œ์ด์…˜ ํˆดํ‚ท์ด๋‹ค.
์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•ด ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ hookํ•˜์—ฌ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฐ’ ์ถ”์ถœยท๋ณ€๊ฒฝ, ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹คโ€ฆ
Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ pentestํ•˜๋ ค๋ฉด Frida ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

Anti-instrumentation & SSL pinning ์šฐํšŒ ์›Œํฌํ”Œ๋กœ์šฐ

Android Anti Instrumentation And Ssl Pinning Bypass

๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ - Fridump

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๋‹ˆ๋ชจ๋‹‰ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ผ.

Fridump3๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋คํ”„ํ•  ์ˆ˜ ์žˆ๋‹ค:

# With PID
python3 fridump3.py -u <PID>

# With name
frida-ps -Uai
python3 fridump3.py -u "<Name>"

์ด๊ฒƒ์€ ./dump ํด๋”์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ dumpํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด grepํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"

Keystore์˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ

Android์—์„œ Keystore๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์žฅ์†Œ์ด์ง€๋งŒ, ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์—ฌ์ „ํžˆ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ ์—ฌ๊ธฐ์— ํ‰๋ฌธ์œผ๋กœ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ, pentests๋Š” ์ด๋ฅผ root user ๊ถŒํ•œ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ธฐ์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ์ด keystore์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋”๋ผ๋„, ๋ฐ์ดํ„ฐ๋Š” ์•”ํ˜ธํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

keystore ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ด Frida script๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js

frida -U -f com.example.app -l frida-scripts/tracer-cipher.js

Fingerprint/Biometrics Bypass

๋‹ค์Œ Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ • ๋ฏผ๊ฐํ•œ ์˜์—ญ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” bypass fingerprint authentication์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ด๋ฏธ์ง€

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณด๋‚ผ ๋•Œ, Android๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ snapshot of the application์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํฌ์–ด๊ทธ๋ผ์šด๋“œ๋กœ ๋ณต์›๋  ๋•Œ ์•ฑ์ด ๋กœ๋“œ๋˜๊ธฐ ์ „์— ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋จผ์ € ๋ถˆ๋Ÿฌ์™€ ์•ฑ์ด ๋” ๋นจ๋ฆฌ ๋กœ๋“œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด snapshot์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, snapshot์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ ‘๊ทผํ•˜๋ ค๋ฉด root๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค).

์ด snapshot๋“ค์€ ๋ณดํ†ต ๋‹ค์Œ ๊ฒฝ๋กœ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค: /data/system_ce/0/snapshots

Android๋Š” FLAG_SECURE ๋ ˆ์ด์•„์›ƒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜์—ฌ screenshot capture๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฐฝ ๋‚ด์šฉ์ด ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋˜์–ด screenshots์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ๋น„๋ณด์•ˆ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

Android Application Analyzer

์ด ๋„๊ตฌ๋Š” ๋™์  ๋ถ„์„ ์ค‘ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค: https://github.com/NotSoSecure/android_application_analyzer

Intent Injection

๊ฐœ๋ฐœ์ž๋“ค์€ ์ข…์ข… activities, services, ๊ทธ๋ฆฌ๊ณ  broadcast receivers ๊ฐ™์€ ํ”„๋ก์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ด๋Ÿฌํ•œ Intents๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  startActivity(...)๋‚˜ sendBroadcast(...) ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์ด๋Š” ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ํ—˜์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ Intents๋ฅผ ์ž˜๋ชป ์œ ๋„ํ•˜์—ฌ non-exported app components๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ content providers์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ WebView ์ปดํฌ๋„ŒํŠธ๊ฐ€ URL์„ Intent ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด Intent.parseUri(...)๋ฅผ ์‚ฌ์šฉํ•œ ๋’ค ์‹คํ–‰ํ•˜๋ฉด, ์•…์˜์ ์ธ Intent ์ฃผ์ž…์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์ 

  • Intent Injection์€ ์›น์˜ Open Redirect ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ต์Šคํ”Œ๋กœ์ž‡์€ Intent ๊ฐ์ฒด๋ฅผ extras๋กœ ์ „๋‹ฌํ•˜์—ฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋„๋ก ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง‘๋‹ˆ๋‹ค.
  • ๋น„๋…ธ์ถœ(non-exported) ์ปดํฌ๋„ŒํŠธ์™€ content providers๋ฅผ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • WebView์˜ URL โ†’ Intent ๋ณ€ํ™˜์€ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Android ํด๋ผ์ด์–ธํŠธ ์ธก ์ธ์ ์…˜ ๋ฐ ๊ธฐํƒ€

์•„๋งˆ ์›น์—์„œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ทจ์•ฝ์ ์„ ์ ‘ํ•ด๋ณด์…จ์„ ๊ฒ๋‹ˆ๋‹ค. Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋‹ค์Œ ์ทจ์•ฝ์ ๋“ค์— ํŠนํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • SQL Injection: ๋™์  ์ฟผ๋ฆฌ๋‚˜ Content-Providers๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • JavaScript Injection (XSS): ๋ชจ๋“  WebViews์— ๋Œ€ํ•ด JavaScript ๋ฐ Plugin ์ง€์›์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ). More info here.
  • Local File Inclusion: WebViews๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ) - (webview.getSettings().setAllowFileAccess(false);). More info here.
  • Eternal cookies: ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์—์„œ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ธ์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ ์ฟ ํ‚ค๊ฐ€ ์ทจ์†Œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Secure Flag in cookies

์ž๋™ ๋ถ„์„

MobSF

์ •์  ๋ถ„์„

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ทจ์•ฝ์  ํ‰๊ฐ€๋ฅผ ์›น ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋™์  ๋ถ„์„๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜(๋™์  ๋ถ„์„์„ ์œ„ํ•ด์„œ๋Š” ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•ด์•ผ ํ•จ) ํ™˜๊ฒฝ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest

์ฃผ์˜: MobSF๋Š” Android(apk), IOS(ipa) and Windows(apx) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Windows applications must be analyzed from a MobSF installed in a Windows host).
๋˜ํ•œ, Android ๋˜๋Š” IOS ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ๋กœ ZIP ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฃจํŠธ ํด๋”๋กœ ์ด๋™ํ•ด ๋ชจ๋“  ํŒŒ์ผ์„ ์„ ํƒํ•œ ๋’ค ZIPfile ์ƒ์„ฑ) ๊ทธ๊ฒƒ๋„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MobSF๋Š” ๋˜ํ•œ diff/Compare ๋ถ„์„์„ ์ง€์›ํ•˜๊ณ  VirusTotal๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (API ํ‚ค๋ฅผ _MobSF/settings.py_์— ์„ค์ •ํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: VT_ENABLED = TRUE VT_API_KEY = <Your API key> VT_UPLOAD = TRUE). VT_UPLOAD์„ False๋กœ ์„ค์ •ํ•˜๋ฉด ํŒŒ์ผ ๋Œ€์‹  hash๊ฐ€ upload๋ฉ๋‹ˆ๋‹ค.

Assisted Dynamic analysis with MobSF

MobSF๋Š” Android์˜ dynamic analysis์—์„œ๋„ ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ์— MobSF์™€ genymotion์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ฐ€์ƒ๋จธ์‹  ๋˜๋Š” Docker์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). Note: You need to start first a VM in genymotion and then MobSF.
MobSF dynamic analyser๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Dump application data (URLs, ๋กœ๊ทธ, ํด๋ฆฝ๋ณด๋“œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ฐ์€ ์Šคํฌ๋ฆฐ์ƒท, โ€œExported Activity Testerโ€œ๋กœ ์ƒ์„ฑํ•œ ์Šคํฌ๋ฆฐ์ƒท, ์ด๋ฉ”์ผ, SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, XML ํŒŒ์ผ ๋ฐ ๊ธฐํƒ€ ์ƒ์„ฑ๋œ ํŒŒ์ผ). ์ด๋“ค ๋Œ€๋ถ€๋ถ„์€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€๋งŒ, ์Šคํฌ๋ฆฐ์ƒท์€ ์ˆ˜๋™์œผ๋กœ ์ฐ์–ด์•ผ ํ•˜๋ฉฐ ๋ชจ๋“  exported activities์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์–ป์œผ๋ ค๋ฉด โ€œExported Activity Testerโ€œ๋ฅผ ๋ˆŒ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Capture HTTPS traffic
  • Frida๋ฅผ ์‚ฌ์šฉํ•ด runtime information ํš๋“

android versions > 5๋ถ€ํ„ฐ๋Š” Frida๋ฅผ ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ proxy ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ๋งŒ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

Frida

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช‡๋ช‡ Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด bypass SSL pinning, root detection, debugger detection์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด API๋ฅผ monitorํ•ฉ๋‹ˆ๋‹ค.
MobSF๋Š” ๋˜ํ•œ invoke exported activitiesํ•˜๊ณ  ํ•ด๋‹น ํ™œ๋™์˜ screenshots์„ ์บก์ฒ˜ํ•˜์—ฌ ๋ณด๊ณ ์„œ์— saveํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์  ํ…Œ์ŠคํŠธ๋ฅผ startํ•˜๋ ค๋ฉด ์ดˆ๋ก์ƒ‰ ๋ฒ„ํŠผ: โ€œStart Instrumentationโ€œ์„ ๋ˆ„๋ฅด์‹ญ์‹œ์˜ค. โ€œFrida Live Logsโ€œ๋ฅผ ๋ˆŒ๋Ÿฌ Frida ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ณ  โ€œLive API Monitorโ€œ๋ฅผ ๋ˆŒ๋Ÿฌ ํ›„ํ‚น๋œ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ, ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์€ โ€œStart Instrumentationโ€œ์„ ๋ˆ„๋ฅธ ํ›„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค).
MobSF๋Š” ์ž์ฒด Frida scripts๋ฅผ ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(Frida ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ MobSF๋กœ ๋ณด๋‚ด๋ ค๋ฉด send() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค). ๋˜ํ•œ ๋ช‡๋ช‡ pre-written scripts๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ(์ถ”๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋Š” MobSF/DynamicAnalyzer/tools/frida_scripts/others/์— ์ถ”๊ฐ€ ๊ฐ€๋Šฅ), ์Šคํฌ๋ฆฝํŠธ๋ฅผ selectํ•œ ๋’ค โ€œLoadโ€œ์™€ โ€œStart Instrumentationโ€œ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์˜ ๋กœ๊ทธ๋ฅผ โ€œFrida Live Logsโ€œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ณด์กฐ Frida ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • Enumerate Loaded Classes: ๋กœ๋“œ๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค
  • Capture Strings: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ ์ค‘ ์บก์ฒ˜๋œ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค(๋งค์šฐ ๋งŽ์€ ์žก์Œ ๋ฐœ์ƒ)
  • Capture String Comparisons: ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต๋˜๋Š” ๋‘ ๋ฌธ์ž์—ด๊ณผ ๊ทธ ๊ฒฐ๊ณผ(True/False)๋ฅผ showํ•ฉ๋‹ˆ๋‹ค.
  • Enumerate Class Methods: ํด๋ž˜์Šค ์ด๋ฆ„(์˜ˆ: โ€œjava.io.Fileโ€)์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • Search Class Pattern: ํŒจํ„ด์œผ๋กœ ํด๋ž˜์Šค ๊ฒ€์ƒ‰
  • Trace Class Methods: Trace ์ „์ฒด ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ํ™•์ธ). ๊ธฐ๋ณธ์ ์œผ๋กœ MobSF๋Š” ์—ฌ๋Ÿฌ ํฅ๋ฏธ๋กœ์šด Android Api ๋ฉ”์„œ๋“œ๋ฅผ traceํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•  ๋ณด์กฐ ๋ชจ๋“ˆ์„ ์„ ํƒํ•œ ํ›„ โ€œStart Intrumentationโ€œ์„ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋“  ์ถœ๋ ฅ์ด โ€œFrida Live Logsโ€œ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Shell

MobSF๋Š” ๋™์  ๋ถ„์„ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋ช‡ ๊ฐ€์ง€ adb ๋ช…๋ น, MobSF commands, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ shell commands๋ฅผ ์ œ๊ณตํ•˜๋Š” shell์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋ช…๋ น:

help
shell ls
activities
exported_activities
services
receivers

HTTP ๋„๊ตฌ

When http traffic is capture you can see an ugly view of the captured traffic on โ€œHTTP(S) Trafficโ€ bottom or a nicer view in โ€œStart HTTPToolsโ€ green bottom. From the second option, you can send the captured requests to proxies like Burp or Owasp ZAP.
To do so, power on Burp โ€“> turn off Intercept โ€“> in MobSB HTTPTools select the request โ€“> press โ€œSend to Fuzzerโ€ โ€“> select the proxy address (http://127.0.0.1:8080\).

Once you finish the dynamic analysis with MobSF you can press on โ€œStart Web API Fuzzerโ€ to fuzz http requests an look for vulnerabilities.

Tip

After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you wonโ€™t be able to fix them from the GUI. You can fix the proxy settings by doing:

adb shell settings put global http_proxy :0

Inspeckage๋ฅผ ์ด์šฉํ•œ Assisted Dynamic Analysis

You can get the tool from Inspeckage.
This tool with use some Hooks to let you know what is happening in the application while you perform a dynamic analysis.

Yaazhini

This is a great tool to perform static analysis with a GUI

Qark

This tool is designed to look for several security related Android application vulnerabilities, either in source code or packaged APKs. The tool is also capable of creating a โ€œProof-of-Conceptโ€ deployable APK and ADB commands, to exploit some of the found vulnerabilities (Exposed activities, intents, tapjackingโ€ฆ). As with Drozer, there is no need to root the test device.

pip3 install --user qark  # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
qark --java path/to/parent/java/folder
qark --java path/to/specific/java/file.java

ReverseAPK

  • ์ฐธ๊ณ ํ•˜๊ธฐ ์‰ฝ๋„๋ก ์ถ”์ถœ๋œ ๋ชจ๋“  ํŒŒ์ผ์„ ํ‘œ์‹œ
  • APK ํŒŒ์ผ์„ Java ๋ฐ Smali ํ˜•์‹์œผ๋กœ ์ž๋™์œผ๋กœ ๋””์ปดํŒŒ์ผ
  • AndroidManifest.xml์„ ๋ถ„์„ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์  ๋ฐ ๋™์ž‘ ํ™•์ธ
  • ์ •์  ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์  ๋ฐ ๋™์ž‘ ๊ฒ€์‚ฌ
  • ๊ธฐ๊ธฐ ์ •๋ณด
  • ๊ทธ ์™ธ
reverse-apk relative/path/to/APP.apk

SUPER Android Analyzer

SUPER๋Š” Windows, MacOS X ๋ฐ Linux์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ๋ผ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ, ์ทจ์•ฝ์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด .apk ํŒŒ์ผ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” APKs๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๊ณ  ์ผ๋ จ์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ทœ์น™์€ rules.json ํŒŒ์ผ์— ์ง‘์ค‘๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ํšŒ์‚ฌ๋‚˜ ํ…Œ์Šคํ„ฐ๋Š” ํ•„์š”ํ•œ ๋ถ„์„์„ ์œ„ํ•ด ์ž์ฒด ๊ทœ์น™์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” download page์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”.

super-analyzer {apk_file}

StaCoAn

StaCoAn์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ static code analysis๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž, bugbounty hunters ๋ฐ ethical hackers๋ฅผ ๋•๋Š” crossplatform ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ฐœ๋…์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ(.apk ๋˜๋Š” .ipa ํŒŒ์ผ)์„ StaCoAn ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋ฉด ์‹œ๊ฐ์ ์ด๊ณ  ํœด๋Œ€ ๊ฐ€๋Šฅํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ด ์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค์ •๊ณผ wordlists๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋งž์ถคํ˜• ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ latest release:

./stacoan

AndroBugs

AndroBugs Framework๋Š” Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž ์žฌ์ ์ธ security vulnerabilities๋ฅผ ๊ฐœ๋ฐœ์ž ๋˜๋Š” hackers๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” vulnerability analysis ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
Windows releases

python androbugs.py -f [APK file]
androbugs.exe -f [APK file]

Androwarn

Androwarn์€ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐœ๋ฐœํ•œ ์ž ์žฌ์ ์ธ ์•…์„ฑ ๋™์ž‘์„ ํƒ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ๋œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

ํƒ์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Dalvik bytecode๋ฅผ Smali๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ androguard ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ static analysis๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ๋„๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ โ€˜์•…์„ฑโ€™ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ฐ˜์ ์ธ ๋™์ž‘์„ ์ฐพ์Šต๋‹ˆ๋‹ค: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code executionโ€ฆ

python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3

MARA Framework

MARA is a Mobile Application Reverse engineering and Analysis Framework. ์ด ๋„๊ตฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” mobile application reverse engineering and analysis tools๋ฅผ ๋ชจ์•„ OWASP mobile security threats์— ๋Œ€ํ•ด ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์„ ๋•์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์™€ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋“ค์ด ์ด ์ž‘์—…์„ ๋” ์‰ฝ๊ณ  ์นœํ™”์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

It is able to:

Koodous

Useful to detect malware: https://koodous.com/

Obfuscating/Deobfuscating code

Note that depending the service and configuration you use to obfuscate the code. Secrets may or may not ended obfuscated.

ProGuard

From Wikipedia: ProGuard is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2.

ProGuard is distributed as part of the Android SDK and runs when building the application in release mode.

DexGuard

Find a step-by-step guide to deobfuscate the apk in https://blog.lexfo.fr/dexguard.html

(From that guide) Last time we checked, the Dexguard mode of operation was:

  • load a resource as an InputStream;
  • feed the result to a class inheriting from FilterInputStream to decrypt it;
  • do some useless obfuscation to waste a few minutes of time from a reverser;
  • feed the decrypted result to a ZipInputStream to get a DEX file;
  • finally load the resulting DEX as a Resource using the loadDex method.

DeGuard

DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.

You can upload an obfuscated APK to their platform.

[Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app

This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Googleโ€™s Gemini public API.

Simplify

It is a generic android deobfuscator. Simplify virtually executes an app to understand its behavior and then tries to optimize the code so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesnโ€™t matter what the specific type of obfuscation is used.

APKiD

APKiD gives you information about how an APK was made. It identifies many compilers, packers, obfuscators, and other weird stuff. Itโ€™s PEiD for Android.

Manual

Read this tutorial to learn some tricks on how to reverse custom obfuscation

Labs

Androl4b

AndroL4b is an Android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from different security geeks and researchers for reverse engineering and malware analysis.

References

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