mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
123 lines
7.9 KiB
Markdown
123 lines
7.9 KiB
Markdown
# Форензика резервних копій iOS (триаж, орієнтований на повідомлення)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
Ця сторінка описує практичні кроки для відтворення та аналізу резервних копій iOS на предмет ознак доставки 0‑click експлойтів через вкладення в месенджерах. Зосереджено на перетворенні хешованої структури резервної копії Apple у людино‑читабельні шляхи, а також на переліченні та скануванні вкладень у поширених додатках.
|
||
|
||
Цілі:
|
||
- Відновити читабельні шляхи з 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 для кожного збереженого об'єкта до його відновленого шляху
|
||
|
||
Приклад робочого процесу з інструментом, що реалізує це end‑to‑end (ElegantBouncer):
|
||
```bash
|
||
# 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!
|
||
```
|
||
Примітки:
|
||
- Обробляйте зашифровані резервні копії, передаючи пароль резервної копії вашому екстрактору
|
||
- Зберігайте оригінальні часові відмітки/ACLs коли це можливо для доказової цінності
|
||
|
||
|
||
## Перерахування вкладень у додатках обміну повідомленнями
|
||
|
||
Після реконструкції перераховуйте вкладення для популярних додатків. Конкретна схема залежить від додатка/версії, але підхід схожий: запитуйте базу даних повідомлень, зв'язуйте повідомлення з вкладеннями й визначайте шляхи на диску.
|
||
|
||
### iMessage (sms.db)
|
||
Ключові таблиці: message, attachment, message_attachment_join (MAJ), chat, chat_message_join (CMJ)
|
||
|
||
Приклади запитів:
|
||
```sql
|
||
-- 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 table ↔ media/attachment table (іменування може відрізнятися залежно від версії). Запитуйте media rows, щоб отримати on‑disk paths.
|
||
```sql
|
||
SELECT
|
||
m.Z_PK AS message_pk,
|
||
mi.ZMEDIALOCALPATH AS media_path,
|
||
m.ZMESSAGEDATE AS message_date
|
||
FROM ZWAMESSAGE m
|
||
LEFT JOIN ZWAMEDIAITEM mi ON mi.ZMESSAGE = m.Z_PK
|
||
WHERE mi.ZMEDIALOCALPATH IS NOT NULL
|
||
ORDER BY m.ZMESSAGEDATE DESC;
|
||
```
|
||
Adjust table/column names to your app version (ZWAMESSAGE/ZWAMEDIAITEM are common in iOS builds).
|
||
|
||
### Signal / Telegram / Viber
|
||
- Signal: база даних повідомлень (DB) зашифрована; проте вкладення, кешовані на диску (та мініатюри), зазвичай піддаються скануванню
|
||
- Telegram: перевіряйте каталоги кешу (photo/video/document caches) і по можливості зіставляйте їх з чатами
|
||
- Viber: Viber.sqlite містить таблиці message/attachment з посиланнями на диску
|
||
|
||
Tip: навіть коли метадані зашифровані, сканування каталогів медіа/кеш (media/cache directories) все ще виявляє шкідливі об'єкти.
|
||
|
||
|
||
## Scanning attachments for structural exploits
|
||
|
||
Once you have attachment paths, feed them into structural detectors that validate file‑format invariants instead of signatures. Example with ElegantBouncer:
|
||
```bash
|
||
# 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)
|
||
```
|
||
Виявлення, покриті структурними правилами, включають:
|
||
- PDF/JBIG2 FORCEDENTRY (CVE‑2021‑30860): неможливі стани словника JBIG2
|
||
- WebP/VP8L BLASTPASS (CVE‑2023‑4863): надмірно великі конструкції таблиць Huffman
|
||
- TrueType TRIANGULATION (CVE‑2023‑41990): незадокументовані опкоди bytecode
|
||
- DNG/TIFF CVE‑2025‑43300: невідповідності між metadata та компонентами потоку
|
||
|
||
|
||
## Валідація, застереження та помилкові спрацьовування
|
||
|
||
- Перетворення часу: iMessage зберігає дати в епохах/одиницях Apple у деяких версіях; перетворюйте відповідно під час звітування
|
||
- Schema drift: схеми SQLite додатку змінюються з часом; підтверджуйте імена таблиць/стовпців для конкретної збірки пристрою
|
||
- Recursive extraction: PDFs можуть містити вбудовані потоки JBIG2 та шрифти; витягуйте та скануйте внутрішні об'єкти
|
||
- False positives: структурні евристики є консервативними, але можуть позначати рідкісні пошкоджені, але нешкідливі медіафайли
|
||
|
||
|
||
## References
|
||
|
||
- [ELEGANTBOUNCER: When You Can't Get the Samples but Still Need to Catch the Threat](https://www.msuiche.com/posts/elegantbouncer-when-you-cant-get-the-samples-but-still-need-to-catch-the-threat/)
|
||
- [ElegantBouncer project (GitHub)](https://github.com/msuiche/elegant-bouncer)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|