Xamarin ์•ฑ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

Xamarin์€ ์˜คํ”ˆ ์†Œ์Šค ํ”Œ๋žซํผ์œผ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ .NET ๋ฐ C# ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด iOS, Android, Windows์šฉ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋žซํผ์€ ํ˜„๋Œ€์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ํ™•์žฅ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Xamarin์˜ ์•„ํ‚คํ…์ฒ˜

  • For Android, Xamarin์€ .NET ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด Android ๋ฐ Java ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ํ†ตํ•ฉ๋˜๋ฉฐ, Mono ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ Android Runtime (ART)์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. Managed Callable Wrappers (MCW)์™€ Android Callable Wrappers (ACW)๋Š” Mono์™€ ART ๊ฐ„์˜ ํ†ต์‹ ์„ ์ค‘๊ฐœํ•˜๋ฉฐ, ๋‘˜ ๋‹ค Linux ์ปค๋„ ์œ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • For iOS, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Mono ๋Ÿฐํƒ€์ž„ ํ•˜์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์ „์ฒด Ahead of Time (AOT) ์ปดํŒŒ์ผ์„ ํ†ตํ•ด C# .NET ์ฝ”๋“œ๋ฅผ ARM ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ Objective-C Runtime๊ณผ ํ•จ๊ป˜ UNIX ๊ณ„์—ด ์ปค๋„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

.NET Runtime and Mono Framework

.NET framework๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ assemblies, classes, namespaces ๋“ฑ์„ ํฌํ•จํ•˜๋ฉฐ, .NET Runtime์ด ์ฝ”๋“œ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ๊ณผ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Mono Framework๋Š” .NET framework์˜ ์˜คํ”ˆ ์†Œ์Šค ๊ตฌํ˜„์œผ๋กœ, 2005๋…„์— .NET์„ Linux๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์ž‘๋˜์—ˆ๊ณ  ํ˜„์žฌ Microsoft์˜ ์ง€์›์„ ๋ฐ›์œผ๋ฉฐ Xamarin์ด ์ฃผ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Reverse Engineering Xamarin Apps

Decompilation of Xamarin Assemblies

Decompilation์€ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์†Œ์Šค ์ฝ”๋“œ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. Windows์—์„œ๋Š” Visual Studio์˜ Modules window๋ฅผ ํ†ตํ•ด ๋””์ปดํŒŒ์ผ ๋Œ€์ƒ ๋ชจ๋“ˆ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์„œ๋“œํŒŒํ‹ฐ ์ฝ”๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ณ  ๋ถ„์„์„ ์œ„ํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JIT vs AOT Compilation

  • Android๋Š” Just-In-Time (JIT) ๋ฐ Ahead-Of-Time (AOT) ์ปดํŒŒ์ผ์„ ์ง€์›ํ•˜๋ฉฐ, ์‹คํ–‰ ์†๋„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด Hybrid AOT ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Full AOT๋Š” Enterprise ๋ผ์ด์„ ์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • iOS๋Š” Apple์˜ ๋™์  ์ฝ”๋“œ ์‹คํ–‰ ์ œํ•œ ๋•Œ๋ฌธ์— AOT ์ปดํŒŒ์ผ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

APK/IPA์—์„œ dll ํŒŒ์ผ ์ถ”์ถœ

APK/IPA์— ํฌํ•จ๋œ assemblies์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ํŒŒ์ผ์„ ์••์ถ• ํ•ด์ œ(unzip)ํ•œ ํ›„ assemblies ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜์„ธ์š”. Android์˜ ๊ฒฝ์šฐ XamAsmUnZ ๋ฐ xamarin-decompress ๊ฐ™์€ ๋„๊ตฌ๋กœ dll ํŒŒ์ผ์˜ ์••์ถ•์„ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

python3 xamarin-decompress.py -o /path/to/decompressed/apk

APK๋ฅผ decompileํ•œ ํ›„ unknown/assemblies/ ํด๋” ์•ˆ์— .dll ํŒŒ์ผ๋“ค์ด ๋ณด์ด๋Š” ๊ฒฝ์šฐ, dnSpy๋ฅผ ์‚ฌ์šฉํ•ด .dlls๋ฅผ ์ง์ ‘ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ unknown/assemblies/ ํด๋”์— assemblies.blob ๋ฐ assemblies.manifest ํŒŒ์ผ์ด ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pyxamstore ๋„๊ตฌ๋Š” Xamarin apps์—์„œ assemblies.blob ํŒŒ์ผ์„ unpackํ•˜์—ฌ .NET assemblies์— ์ ‘๊ทผํ•ด ์ถ”๊ฐ€ ๋ถ„์„์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack

์ผ๋ถ€ ์ตœ์‹  Xamarin/MAUI ๋นŒ๋“œ๋Š” /assemblies.blob ๋˜๋Š” /resources/assemblies ๋‚ด๋ถ€์— XALZ ํ˜•์‹์œผ๋กœ ์••์ถ•๋œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. xamarout ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋น ๋ฅด๊ฒŒ ์••์ถ•์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

from xamarout import xalz
import os
for root, _, files in os.walk("."):
for f in files:
if open(os.path.join(root, f), 'rb').read(4) == b"XALZ":
xa = xalz.XamarinCompressedAssembly(os.path.join(root, f))
xa.write("decompressed/" + f)

iOS dll files are readily accessible for decompilation, revealing significant portions of the application code, which often shares a common base across different platforms.

AOT on iOS: managed IL์€ ๋„ค์ดํ‹ฐ๋ธŒ *.aotdata.* ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. DLL๋งŒ ํŒจ์น˜ํ•ด์„œ๋Š” ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค; IL ๋ณธ๋ฌธ์ด ๋นˆ ํ”Œ๋ ˆ์ด์Šคํ™€๋”์ด๋ฏ€๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํ…์„ ํ›„ํ‚นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Frida ์‚ฌ์šฉ).

์ •์  ๋ถ„์„

ํ•œ ๋ฒˆ .dlls๋ฅผ ํ™•๋ณดํ•˜๋ฉด dnSpy ๋˜๋Š” ILSpy ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด .Net ์ฝ”๋“œ๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์•ฑ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณ€์กฐํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ˆ˜์ • ํ›„์—๋Š” ์•ฑ์„ ๋‹ค์‹œ ํŒจํ‚ค์ง•ํ•˜๊ณ  ๋‹ค์‹œ ์„œ๋ช…ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”.

dnSpy๋Š” ์•„์นด์ด๋ธŒ๋˜์—ˆ์œผ๋ฉฐ; dnSpyEx ๊ฐ™์€ ์œ ์ง€๋˜๋Š” ํฌํฌ๋Š” .NET 8/MAUI ์–ด์…ˆ๋ธ”๋ฆฌ์™€ ํ•จ๊ป˜ ๊ณ„์† ์ž‘๋™ํ•˜๋ฉฐ ๋‹ค์‹œ ์ €์žฅํ•  ๋•Œ ๋””๋ฒ„๊ทธ ์‹ฌ๋ณผ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

๋™์  ๋ถ„์„

๋™์  ๋ถ„์„์€ SSL pinning ํ™•์ธ๊ณผ Xamarin ์•ฑ์˜ .NET ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด Fridax ๊ฐ™์€ ๋„๊ตฌ ์‚ฌ์šฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Frida ์Šคํฌ๋ฆฝํŠธ๋Š” root detection ๋˜๋Š” SSL pinning์„ ๋ฐ”์ดํŒจ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ถ„์„ ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

Other interesting Frida scripts:

Updated Frida-xamarin-unpin (Mono >=6) hooks System.Net.Http.HttpClient.SendAsync and swaps the handler to a permissive one, so it still works even when pinning is implemented in custom handlers. Run it after the app starts:

frida -U -l dist/xamarin-unpin.js com.target.app --no-pause

๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” frida-mono-api๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ›„ํ‚นํ•˜๊ธฐ ์œ„ํ•œ ๋น ๋ฅธ ํ…œํ”Œ๋ฆฟ:

const mono = require('frida-mono-api');
Mono.ensureInitialized();
Mono.enumerateLoadedImages().forEach(i => console.log(i.name));
const klass = Mono.classFromName("Namespace", "Class");
const m = Mono.methodFromName(klass, "Method", 2);
Mono.intercept(m, { onEnter(args){ console.log(args[1].toInt32()); } });

์žฌ์„œ๋ช…

๋„๊ตฌ Uber APK Signer๋Š” ๋™์ผํ•œ ํ‚ค๋กœ ์—ฌ๋Ÿฌ APK์— ์„œ๋ช…ํ•˜๋Š” ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•˜๋ฉฐ, ์•ฑ์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•œ ํ›„ ์•ฑ์„ ์žฌ์„œ๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ