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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์ด ํ์ด์ง๋ ๋ฉ์์ง ์ฑ ์ฒจ๋ถํ์ผ์ ํตํ 0โclick ์ต์คํ๋ก์ ์ ๋ฌ ์งํ๋ฅผ ์ฌ๊ตฌ์ฑํ๊ณ ๋ถ์ํ๊ธฐ ์ํ iOS ๋ฐฑ์ ์ค๋ฌด ๋จ๊ณ๋ฅผ ์ค๋ช ํฉ๋๋ค. Apple์ ํด์๋ ๋ฐฑ์ ๋ ์ด์์์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๊ฒฝ๋ก๋ก ๋ณํํ ํ, ์ผ๋ฐ์ ์ธ ์ฑ ์ ๋ฐ์ ์ฒจ๋ถํ์ผ์ ์ด๊ฑฐํ๊ณ ์ค์บํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
Goals:
- Manifest.db์์ ์ฝ์ ์ ์๋ ๊ฒฝ๋ก ๋ณต์
- ๋ฉ์์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์ด (iMessage, WhatsApp, Signal, Telegram, Viber)
- ์ฒจ๋ถ ํ์ผ ๊ฒฝ๋ก ํด์, ์๋ฒ ๋๋ ๊ฐ์ฒด(PDF/Images/Fonts) ์ถ์ถ, ๊ตฌ์กฐ์ ํ์ง๊ธฐ๋ก ์ ์ก
iOS ๋ฐฑ์ ์ฌ๊ตฌ์ฑ
MobileSync ์๋์ ์ ์ฅ๋ ๋ฐฑ์ ์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํด์๋ ํ์ผ๋ช ์ ์ฌ์ฉํฉ๋๋ค. Manifest.db SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฐ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ ผ๋ฆฌ์ ๊ฒฝ๋ก์ ๋งคํํฉ๋๋ค.
๊ณ ์์ค ์ ์ฐจ:
- Manifest.db๋ฅผ ์ด์ด ํ์ผ ๋ ์ฝ๋ (domain, relativePath, flags, fileID/hash)๋ฅผ ์ฝ์ต๋๋ค
- domain + relativePath๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋์ ํด๋ ๊ณ์ธต ์ฌ๊ตฌ์ฑ
- ๊ฐ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ฌ๊ตฌ์ฑ๋ ๊ฒฝ๋ก๋ก ๋ณต์ฌํ๊ฑฐ๋ 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
- ELEGANTBOUNCER: When You Canโt Get the Samples but Still Need to Catch the Threat
- ElegantBouncer project (GitHub)
- MVT iOS backup workflow
- libimobiledevice 1.4.0 release notes
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


