iOS ๋ฐฑ์—… ํฌ๋ Œ์‹ (๋ฉ”์‹œ์ง• ์ค‘์‹ฌ ํŠธ๋ฆฌ์•„์ง€)

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

์ด ํŽ˜์ด์ง€๋Š” ๋ฉ”์‹œ์ง• ์•ฑ ์ฒจ๋ถ€ํŒŒ์ผ์„ ํ†ตํ•œ 0โ€‘click ์ต์Šคํ”Œ๋กœ์ž‡ ์ „๋‹ฌ ์ง•ํ›„๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ iOS ๋ฐฑ์—… ์‹ค๋ฌด ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Apple์˜ ํ•ด์‹œ๋œ ๋ฐฑ์—… ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, ์ผ๋ฐ˜์ ์ธ ์•ฑ ์ „๋ฐ˜์˜ ์ฒจ๋ถ€ํŒŒ์ผ์„ ์—ด๊ฑฐํ•˜๊ณ  ์Šค์บ”ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

Goals:

  • Manifest.db์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ ๋ณต์›
  • ๋ฉ”์‹œ์ง• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚˜์—ด (iMessage, WhatsApp, Signal, Telegram, Viber)
  • ์ฒจ๋ถ€ ํŒŒ์ผ ๊ฒฝ๋กœ ํ•ด์„, ์ž„๋ฒ ๋””๋“œ ๊ฐ์ฒด(PDF/Images/Fonts) ์ถ”์ถœ, ๊ตฌ์กฐ์  ํƒ์ง€๊ธฐ๋กœ ์ „์†ก

iOS ๋ฐฑ์—… ์žฌ๊ตฌ์„ฑ

MobileSync ์•„๋ž˜์— ์ €์žฅ๋œ ๋ฐฑ์—…์€ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์—†๋Š” ํ•ด์‹œ๋œ ํŒŒ์ผ๋ช…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Manifest.db SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ฐ ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๋…ผ๋ฆฌ์  ๊ฒฝ๋กœ์™€ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์ˆ˜์ค€ ์ ˆ์ฐจ:

  1. Manifest.db๋ฅผ ์—ด์–ด ํŒŒ์ผ ๋ ˆ์ฝ”๋“œ (domain, relativePath, flags, fileID/hash)๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค
  2. domain + relativePath๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์›๋ž˜์˜ ํด๋” ๊ณ„์ธต ์žฌ๊ตฌ์„ฑ
  3. ๊ฐ ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์žฌ๊ตฌ์„ฑ๋œ ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ hardlink ์ƒ์„ฑ

Example workflow with a tool that implements this endโ€‘toโ€‘end (ElegantBouncer):

# Rebuild the backup into a readable folder tree
$ elegant-bouncer --ios-extract /path/to/backup --output /tmp/reconstructed
[+] Reading Manifest.db ...
โœ“ iOS backup extraction completed successfully!

์ฐธ๊ณ :

  • ์•”ํ˜ธํ™”๋œ ๋ฐฑ์—…์€ ๋ฐฑ์—… ์•”ํ˜ธ๋ฅผ ์ถ”์ถœ ๋„๊ตฌ์— ์ œ๊ณตํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜์„ธ์š”
  • ์ฆ๊ฑฐ ๊ฐ€์น˜๋ฅผ ์œ„ํ•ด ๊ฐ€๋Šฅํ•˜๋ฉด ์›๋ณธ ํƒ€์ž„์Šคํƒฌํ”„/ACL์„ ๋ณด์กดํ•˜์„ธ์š”

๋ฐฑ์—… ํš๋“ ๋ฐ ๋ณตํ˜ธํ™” (USB / Finder / libimobiledevice)

  • On macOS/Finder์—์„œ โ€œEncrypt local backupโ€œ์„ ์„ค์ •ํ•˜๊ณ  ํ‚ค์ฒด์ธ ํ•ญ๋ชฉ์ด ํฌํ•จ๋˜๋„๋ก ์ƒˆ๋กœ์šด ์•”ํ˜ธํ™”๋œ ๋ฐฑ์—…์„ ์ƒ์„ฑํ•˜์„ธ์š”.
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ: idevicebackup2 (libimobiledevice โ‰ฅ1.4.0)์€ iOSโ€ฏ17/18 ๋ฐฑ์—… ํ”„๋กœํ† ์ฝœ ๋ณ€๊ฒฝ์„ ์ดํ•ดํ•˜๊ณ  ์ด์ „์˜ ๋ณต์›/๋ฐฑ์—… ํ•ธ๋“œ์…ฐ์ดํฌ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
# Pair then create a full encrypted backup over USB
$ idevicepair pair
$ idevicebackup2 backup --full --encrypt --password '<pwd>' ~/backups/iphone17

MVT๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” IOCโ€‘๊ธฐ๋ฐ˜ ๋ถ„๋ฅ˜

Amnestyโ€™s Mobile Verification Toolkit (mvt-ios)๋Š” ์ด์ œ ์•”ํ˜ธํ™”๋œ iTunes/Finder ๋ฐฑ์—…์—์„œ ์ง์ ‘ ์ž‘๋™ํ•˜์—ฌ, ์ƒ์—…์šฉ ์ŠคํŒŒ์ด์›จ์–ด ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋ณตํ˜ธํ™” ๋ฐ IOC ๋งค์นญ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

# Optionally extract a reusable key file
$ mvt-ios extract-key -k /tmp/keyfile ~/backups/iphone17

# Decrypt in-place copy of the backup
$ mvt-ios decrypt-backup -p '<pwd>' -d /tmp/dec-backup ~/backups/iphone17

# Run IOC scanning on the decrypted tree
$ mvt-ios check-backup -i indicators.csv /tmp/dec-backup

์ถœ๋ ฅ์€ mvt-results/์— ์ €์žฅ๋˜๋ฉฐ(์˜ˆ: analytics_detected.json, safari_history_detected.json), ์•„๋ž˜์—์„œ ๋ณต๊ตฌ๋œ ์ฒจ๋ถ€ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ์—ฐ๊ด€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์•„ํ‹ฐํŒฉํŠธ ํŒŒ์‹ฑ (iLEAPP)

๋ฉ”์‹œ์ง•์„ ๋„˜์–ด์„  ํƒ€์ž„๋ผ์ธ/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ฐฑ์—… ํด๋”์—์„œ ์ง์ ‘ iLEAPP๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ˆ˜์ง‘ํ•˜์„ธ์š” (iOS 11โ€‘17 ์Šคํ‚ค๋งˆ ์ง€์›):

$ python3 ileapp.py -b /tmp/dec-backup -o /tmp/ileapp-report

๋ฉ”์‹œ์ง• ์•ฑ ์ฒจ๋ถ€ํŒŒ์ผ ์—ด๊ฑฐ

์žฌ๊ตฌ์„ฑ ํ›„, ์ธ๊ธฐ ์•ฑ๋“ค์˜ ์ฒจ๋ถ€ํŒŒ์ผ์„ ์—ด๊ฑฐํ•œ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” ์•ฑ/๋ฒ„์ „๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์œ ์‚ฌํ•˜๋‹ค: ๋ฉ”์‹œ์ง• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ queryํ•˜๊ณ , ๋ฉ”์‹œ์ง€์™€ ์ฒจ๋ถ€ํŒŒ์ผ์„ joinํ•˜๋ฉฐ, ๋””์Šคํฌ์ƒ์˜ ๊ฒฝ๋กœ๋ฅผ resolveํ•œ๋‹ค.

iMessage (sms.db)

Key tables: message, attachment, message_attachment_join (MAJ), chat, chat_message_join (CMJ)

์˜ˆ์ œ ์ฟผ๋ฆฌ:

-- List attachments with basic message linkage
SELECT
m.ROWID            AS message_rowid,
a.ROWID            AS attachment_rowid,
a.filename         AS attachment_path,
m.handle_id,
m.date,
m.is_from_me
FROM message m
JOIN message_attachment_join maj ON maj.message_id = m.ROWID
JOIN attachment a ON a.ROWID = maj.attachment_id
ORDER BY m.date DESC;

-- Include chat names via chat_message_join
SELECT
c.display_name,
a.filename AS attachment_path,
m.date
FROM chat c
JOIN chat_message_join cmj ON cmj.chat_id = c.ROWID
JOIN message m ON m.ROWID = cmj.message_id
JOIN message_attachment_join maj ON maj.message_id = m.ROWID
JOIN attachment a ON a.ROWID = maj.attachment_id
ORDER BY m.date DESC;

์ฒจ๋ถ€ ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” Library/SMS/Attachments/ ์•„๋ž˜์˜ ๋ณต์›๋œ ํŠธ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ˆ๋Œ€ ๊ฒฝ๋กœ์ด๊ฑฐ๋‚˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WhatsApp (ChatStorage.sqlite)

์ผ๋ฐ˜์ ์ธ ์—ฐ๊ฒฐ: message ํ…Œ์ด๋ธ” โ†” media/attachment ํ…Œ์ด๋ธ”(๋ช…์นญ์€ ๋ฒ„์ „๋ณ„๋กœ ๋‹ค๋ฆ„). ๋ฏธ๋””์–ด ํ–‰์„ ์ฟผ๋ฆฌํ•˜์—ฌ ๋””์Šคํฌ์ƒ์˜ ๊ฒฝ๋กœ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ iOS ๋นŒ๋“œ์—์„œ๋Š” ์—ฌ์ „ํžˆ ZMEDIALOCALPATH๊ฐ€ ZWAMEDIAITEM์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

SELECT
m.Z_PK                 AS message_pk,
mi.ZMEDIALOCALPATH     AS media_path,
datetime(m.ZMESSAGEDATE + 978307200, 'unixepoch') AS message_date,
CASE m.ZISFROMME WHEN 1 THEN 'outgoing' ELSE 'incoming' END AS direction
FROM ZWAMESSAGE m
LEFT JOIN ZWAMEDIAITEM mi ON mi.Z_PK = m.ZMEDIAITEM
WHERE mi.ZMEDIALOCALPATH IS NOT NULL
ORDER BY m.ZMESSAGEDATE DESC;

Paths usually resolve under AppDomainGroup-group.net.whatsapp.WhatsApp.shared/Message/Media/ inside the reconstructed backup.

Signal / Telegram / Viber

  • Signal: ๋ฉ”์‹œ์ง€ DB๋Š” ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค; ๊ทธ๋Ÿฌ๋‚˜ ๋””์Šคํฌ์— ์บ์‹œ๋œ ์ฒจ๋ถ€ํŒŒ์ผ(๋ฐ ์ธ๋„ค์ผ)์€ ๋Œ€๊ฐœ ์Šค์บ” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
  • Telegram: ์บ์‹œ๋Š” sandbox ๋‚ด๋ถ€์˜ Library/Caches/์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค; iOSย 18 ๋นŒ๋“œ์—์„œ ์บ์‹œ ์ •๋ฆฌ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด ๋Œ€๊ทœ๋ชจ ์ž”๋ฅ˜ ๋ฏธ๋””์–ด ์บ์‹œ๊ฐ€ ํ”ํ•œ ์ฆ๊ฑฐ์›์ด ๋ฉ๋‹ˆ๋‹ค
  • Viber: Viber.sqlite์—๋Š” ๋””์Šคํฌ์ƒ์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฉ”์‹œ์ง€/์ฒจ๋ถ€ ํ…Œ์ด๋ธ”์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

Tip: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์•”ํ˜ธํ™”๋˜์–ด ์žˆ์–ด๋„ ๋ฏธ๋””์–ด/์บ์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์Šค์บ”ํ•˜๋ฉด ์•…์„ฑ ๊ฐ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

Scanning attachments for structural exploits

ํ•œ ๋ฒˆ ์ฒจ๋ถ€ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•๋ณดํ•˜๋ฉด, ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋Œ€์‹  ํŒŒ์ผ ํฌ๋งท์˜ ๋ถˆ๋ณ€์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ตฌ์กฐ์  ํƒ์ง€๊ธฐ์— ์ž…๋ ฅํ•˜์„ธ์š”. ElegantBouncer ์˜ˆ:

# Recursively scan only messaging attachments under the reconstructed tree
$ elegant-bouncer --scan --messaging /tmp/reconstructed
[+] Found N messaging app attachments to scan
โœ— THREAT in WhatsApp chat 'John Doe': suspicious_document.pdf โ†’ FORCEDENTRY (JBIG2)
โœ— THREAT in iMessage: photo.webp โ†’ BLASTPASS (VP8L)

Detections covered by structural rules include:

  • PDF/JBIG2 FORCEDENTRY (CVEโ€‘2021โ€‘30860): ๋ถˆ๊ฐ€๋Šฅํ•œ JBIG2 ๋”•์…”๋„ˆ๋ฆฌ ์ƒํƒœ
  • WebP/VP8L BLASTPASS (CVEโ€‘2023โ€‘4863): ๊ณผ๋„ํ•˜๊ฒŒ ํฐ Huffman ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ
  • TrueType TRIANGULATION (CVEโ€‘2023โ€‘41990): ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ bytecode opcodes
  • DNG/TIFF CVEโ€‘2025โ€‘43300: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ์š”์†Œ ๊ฐ„ ๋ถˆ์ผ์น˜

๊ฒ€์ฆ, ์ฃผ์˜์‚ฌํ•ญ ๋ฐ ์˜คํƒ

  • ์‹œ๊ฐ„ ๋ณ€ํ™˜: iMessage๋Š” ์ผ๋ถ€ ๋ฒ„์ „์—์„œ ๋‚ ์งœ๋ฅผ Apple epochs/units๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค; ๋ณด๊ณ  ์‹œ ์ ์ ˆํžˆ ๋ณ€ํ™˜ํ•˜์„ธ์š”
  • ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ: ์•ฑ์˜ SQLite ์Šคํ‚ค๋งˆ๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉฐ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค; ๋””๋ฐ”์ด์Šค ๋นŒ๋“œ๋ณ„๋กœ ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ ์ด๋ฆ„์„ ํ™•์ธํ•˜์„ธ์š”
  • ์žฌ๊ท€์  ์ถ”์ถœ: PDFs๋Š” JBIG2 ์ŠคํŠธ๋ฆผ๊ณผ ํฐํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ๋‚ด๋ถ€ ๊ฐ์ฒด๋ฅผ ์ถ”์ถœํ•ด ์Šค์บ”ํ•˜์„ธ์š”
  • ์˜คํƒ: ๊ตฌ์กฐ์  ํœด๋ฆฌ์Šคํ‹ฑ์€ ๋ณด์ˆ˜์ ์ด์ง€๋งŒ ๋“œ๋ฌผ๊ฒŒ ์†์ƒ๋˜์—ˆ์ง€๋งŒ ๋ฌดํ•ดํ•œ ๋ฏธ๋””์–ด๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

References

Tip

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

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