DO NOT CROSS  ·  DO NOT CROSS  ·  DO NOT CROSS  ·  DO NOT CROSS  ·  DO NOT CROSS
macOS Internals Series · Vol. 5 · Classified

CONFIDENTIAL FORENSICS Кой · Какво · Кога · Как

Всяко действие на macOS оставя следа. Unified logs, filesystem timestamps, browser артефакти, USB история, изтрити файлове, мрежови конекции. Знаеш ли как да ги четеш?

Тази страница те учи да разследваш machine активност като digital forensics investigator — без специален софтуер, само с вградените инструменти.
Серия:Vol. 5
Категория:Forensics
Команди:42+
Артефакти:8 типа
macOS:12–15
Статус:ACTIVE
Артефакт 01 · System Logs

Unified Log — Всичко е записано

macOS Unified Log е централизираната logging система от macOS 10.12+. Записва буквално всяко системно събитие с наносекундна точност.

📁 Местоположение
Live log: log stream. Записани: /var/db/diagnostics/ и /private/var/db/uuidtext/. Запазват се до 7 дни на диск по default. Може да се архивира с log collect.
// Unified Log — базови forensics заявки
logs
# Всички log events от последния час
$ log show --last 1h --info | head -100

# Кога е стартирала/спряла система (boot/shutdown история)
$ log show --predicate 'eventMessage contains "Wake reason"' --last 7d
$ log show --predicate 'eventMessage contains "shutdown cause"' --last 30d

# Кога е отключван екранът (логин история)
$ log show --predicate 'subsystem == "com.apple.loginwindow"' \
    --last 7d --info | grep "Authentication\|Login\|Logout"

# Намери конкретна app по subsystem
$ log show --predicate 'process == "Safari"' --last 24h --info

# Sudo използване — кой е ескалирал привилегии
$ log show --predicate 'process == "sudo"' --last 30d --info
2024-03-15 02:47:33 sudo: alex : TTY=ttys001 ; PWD=/root ; USER=root ; COMMAND=/bin/bash
Последната команда е ключова — вижда кога, кой и каква команда е изпълнил с sudo. Timestamp + username + exact command. Ако видиш COMMAND=/bin/bash в 3 часа нощем → investigate.
// Специфични forensics предикати
critical
# App инсталации и uninstall-и
$ log show --predicate 'subsystem == "com.apple.commerce"' --last 30d

# SSH login опити (успешни и неуспешни)
$ log show --predicate 'process == "sshd"' --last 7d --info \
    | grep "Accepted\|Failed\|Invalid"
Accepted publickey for alex from 192.168.1.10
Failed password for root from 185.234.x.x (brute force?)

# VPN конекции
$ log show --predicate 'subsystem == "com.apple.networkextension"' \
    --last 7d | grep "connected\|disconnected"

# Time Machine backup история
$ log show --predicate 'subsystem == "com.apple.TimeMachine"' \
    --last 30d | grep "Starting\|Completed\|Failed"

# Spotlight индексиране — кои файлове са добавени
$ log show --predicate 'process == "mdworker_shared"' \
    --last 1h --debug | grep "Indexing"
// Архивирай logs преди да изчезнат
logs
# Събери всички logs в архив (за offline анализ)
$ sudo log collect --last 7d --output ~/Desktop/system_logs.logarchive

# Отвори архива с Console.app за GUI анализ
$ open ~/Desktop/system_logs.logarchive

# Или анализирай от CLI
$ log show --archive ~/Desktop/system_logs.logarchive \
    --predicate 'process == "sudo"' --info
Logs изчезват след 7 дни — ако разследваш инцидент, първото нещо е sudo log collect. Архивът може да се копира на друга машина и анализира offline.
Артефакт 02 · Filesystem

Filesystem Timestamps

APFS записва 4 timestamp-а за всеки файл. Знаейки как да ги четеш — знаеш точно кога файлът е създаден, достъпен и модифициран.

APFS timestamps — 4 вида

atime (Access Time) — последно прочитане на файла
mtime (Modify Time) — последна промяна на съдържанието
ctime (Change Time) — последна промяна на metadata/permissions
btime (Birth Time) — дата на създаване (само APFS, HFS+ нямаше)

// Timestamp forensics
files
# Всички 4 timestamp-а на файл
$ stat ~/Desktop/suspicious_file.zip
16777234 12345678 -rw-r--r-- 1 alex staff 0 2048000 "Mar 15 03:22:14 2024" "Mar 15 03:18:41 2024" "Mar 15 03:18:41 2024" "Mar 14 23:44:02 2024" 4096 4000 0 suspicious_file.zip
#  atime (accessed)^      mtime (modified)^  ctime (changed)^    btime (born)^

# Само дата на създаване (birth time)
$ GetFileInfo -d ~/Desktop/suspicious_file.zip
# или:
$ mdls -name kMDItemFSCreationDate ~/Desktop/suspicious_file.zip
kMDItemFSCreationDate = 2024-03-14 23:44:02 +0000

# Намери всички файлове създадени ДНЕС
$ find ~ -newer "$(date -v0H -v0M -v0S +%Y-%m-%d)" -type f 2>/dev/null

# Файлове модифицирани в последните 24 часа (suspicious)
$ find /usr/local/bin /usr/bin /bin -mtime -1 -type f 2>/dev/null
# Ако system binaries са модифицирани → RED FLAG

# Намери ОГРОМНИ файлове създадени наскоро
$ find ~ -mtime -7 -size +100M -type f 2>/dev/null | sort -k5 -rn
// Recent Items — какво е отваряно
files
# Recent documents (от NSRecentDocumentsDirectory)
$ ls -lt ~/Library/Application\ Support/com.apple.sharedfilelist/ | head -10

# Recent files за конкретна app
$ defaults read com.apple.finder FXRecentFolders 2>/dev/null
$ defaults read com.apple.recentitems | grep "Name\|Alias"

# Quick Look cache — файлове, разгледани с Space в Finder
$ ls -lt ~/Library/Caches/com.apple.QuickLook.thumbnailcache/

# Spotlight metadata — пълна история на достъпвани файлове
$ mdls -name kMDItemLastUsedDate -name kMDItemDisplayName \
    ~/Documents/*.pdf 2>/dev/null
kMDItemLastUsedDate = 2024-03-15 14:22:08 +0000
kMDItemDisplayName = "Q4_Financial_Report.pdf"
Quick Look cache е underrated forensics артефакт. Дори файлът да е изтрит, thumbnail-ът му може да остане в кеша — доказателство, че е бил разгледан.
Артефакт 03 · External Devices

USB & Device История

Всяко устройство, свързано към Mac-а, оставя следа в system log-овете и IOKit registry-то.

// USB история — кога, кое устройство
critical
# Всички USB устройства свързвани исторически
$ log show --predicate 'subsystem == "com.apple.iokit.IOUSBFamily"' \
    --last 30d | grep "New device\|USB Device"

# Текущо свързани USB устройства
$ system_profiler SPUSBDataType

# Компактна версия — само имена и IDs
$ system_profiler SPUSBDataType | grep -E "Product ID|Vendor ID|Serial Number|Manufacturer:|^    [A-Z]"

# Thunderbolt / USB-C история
$ system_profiler SPThunderboltDataType | grep "Device Name\|UID"

# Намери кога е монтиран external диск
$ log show --predicate 'eventMessage contains "disk" AND eventMessage contains "mounted"' \
    --last 30d
2024-03-15 02:31:14 kernel: disk3s1: mounted
2024-03-15 02:31:14 kernel: Filesystem "SanDisk 64GB" mounted at /Volumes/SANDISK
2024-03-15 02:47:22 kernel: disk3s1: unmounted
# 16 минути след монтиране → unmount. Какво е копирано?
Времевият прозорец mount → unmount е ключов. 16 минути са достатъчни за копиране на гигабайти данни. Комбинирай с filesystem timestamps, за да видиш кои файлове са модифицирани в същия период.
// Bluetooth история
network
# Paired Bluetooth устройства (с history)
$ defaults read /Library/Preferences/com.apple.Bluetooth \
    | grep -A 5 "DeviceName\|LastNameUsed"

# Bluetooth свързвания от logs
$ log show --predicate 'subsystem == "com.apple.bluetooth"' \
    --last 7d | grep "Connected\|Disconnected" | head -30

# AirDrop история (приети/изпратени файлове)
$ log show --predicate 'subsystem == "com.apple.sharing"' \
    --last 30d | grep "AirDrop\|received\|sent"
AirDrop forensics — macOS логва всеки AirDrop transfer включително device name на изпращача. Ако файл е получен по AirDrop, logs пазят кога и от кое устройство.
Артефакт 04 · Network

Network История

Wi-Fi мрежи, DNS заявки, мрежови конекции — macOS ги записва на множество места.

// Wi-Fi история — всички мрежи
network
# Всички Wi-Fi мрежи, към които е свързван Mac-ът
$ defaults read /Library/Preferences/SystemConfiguration/com.apple.airport.preferences \
    | grep "SSIDString\|LastConnected\|SecurityType"

# По-четим формат
$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

# Wi-Fi connection история от logs
$ log show --predicate 'subsystem == "com.apple.wifi" AND eventMessage contains "Joined"' \
    --last 30d
2024-03-15 02:29:44 WiFi: Joined SSID: "CoffeeShop_Free" BSSID: aa:bb:cc:dd:ee:ff
2024-03-15 03:01:22 WiFi: Joined SSID: "HomeNetwork_5G"  BSSID: 11:22:33:44:55:66

# Кога и кое мрежово устройство е ползвано
$ log show --predicate 'process == "configd" AND eventMessage contains "Interface"' \
    --last 7d | grep "active\|inactive"
Wi-Fi история разкрива физическото местоположение на машината. SSID + timestamp → Google/Apple location database → GPS координати. Ако виждаш непознати мрежи в 3 часа нощем → интересно.
// DNS и network connection история
network
# Network connection история (не е пълна, но полезна)
$ log show --predicate 'process == "mDNSResponder"' \
    --last 24h --debug | grep "Question" | head -50

# Провери /etc/hosts за манипулация
$ cat /etc/hosts
$ stat /etc/hosts   # кога е модифициран?

# Little Snitch / Lulu logs (ако е инсталиран)
$ ls ~/Library/Logs/ | grep -i "snitch\|lulu\|firewall"

# Firewall logs
$ sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps
$ cat /var/log/appfirewall.log | tail -50

# Намери DNS prefetch history (Safari)
$ log show --predicate 'process == "Safari" AND eventMessage contains "DNS"' \
    --last 24h --debug
Артефакт 05 · Browser Artifacts

Browser Артефакти

История, downloads, bookmarks, cached credentials — всичко е на диска в SQLite файлове.

⚠ Правни бележки
Достъпването до browser history на чуждо устройство без разрешение е незаконно. Тази информация е за forensics на собствени устройства, incident response или с изрично разрешение.
// Safari история от SQLite
critical
# Safari history е SQLite database
$ sqlite3 ~/Library/Safari/History.db \
    "SELECT datetime(visit_time + 978307200, 'unixepoch', 'localtime') as time,
     url, title
     FROM history_visits
     JOIN history_items ON history_visits.history_item = history_items.id
     ORDER BY visit_time DESC LIMIT 50;"
2024-03-15 03:12:44 | https://pastebin.com/xK2mN8qP | Untitled
2024-03-15 03:08:11 | https://wetransfer.com/downloads/... | Download
2024-03-15 02:55:30 | https://news.ycombinator.com | Hacker News

# Safari downloads
$ sqlite3 ~/Library/Safari/Downloads.db \
    "SELECT datetime(start_date + 978307200, 'unixepoch', 'localtime'),
     url, path, total_data_received
     FROM Downloads ORDER BY start_date DESC LIMIT 20;"

# Safari Top Sites (бързо overview)
$ defaults read ~/Library/Safari/TopSites.plist 2>/dev/null \
    | grep "TopSiteURLString"
// Chrome / Firefox история
critical
# Chrome history (SQLite)
$ cp ~/Library/Application\ Support/Google/Chrome/Default/History /tmp/chrome_history.db
$ sqlite3 /tmp/chrome_history.db \
    "SELECT datetime(last_visit_time/1000000-11644473600, 'unixepoch', 'localtime'),
     url, title, visit_count
     FROM urls ORDER BY last_visit_time DESC LIMIT 30;"

# Chrome downloads
$ sqlite3 /tmp/chrome_history.db \
    "SELECT datetime(start_time/1000000-11644473600, 'unixepoch', 'localtime'),
     target_path, tab_url, received_bytes
     FROM downloads ORDER BY start_time DESC LIMIT 20;"

# Firefox история
$ find ~/Library/Application\ Support/Firefox/Profiles -name "places.sqlite"
$ sqlite3 "~/Library/Application Support/Firefox/Profiles/XXXXX.default/places.sqlite" \
    "SELECT datetime(last_visit_date/1000000, 'unixepoch', 'localtime'),
     url, title FROM moz_places
     ORDER BY last_visit_date DESC LIMIT 30;"
Chrome timestamp магия: Chrome пази timestamps като микросекунди от 1601-01-01. Затова -11644473600 — конвертира към Unix epoch (1970-01-01). Safari ползва seconds от 2001-01-01, затова +978307200.
Артефакт 06 · Deleted Files

Изтрити Файлове

Изтритото не е изчезнало. macOS оставя следи от изтрити файлове на множество места.

// Следи от изтрити файлове
critical
# .Trash — изтритото минало през Trash (с timestamp)
$ ls -laht ~/.Trash/
$ ls -laht /.Trashes/   # external drives

# Spotlight знае за изтрити файлове (metadata остава)
$ mdfind "kMDItemDateDeleted == '*'" 2>/dev/null

# Time Machine — намери изтрити файлове в backups
$ tmutil listbackups
$ ls /Volumes/Time\ Machine\ Backups/Backups.backupdb/MacName/YYYY-MM-DD/

# APFS snapshots — локални snapshots (Time Machine)
$ tmutil listlocalsnapshots /
com.apple.TimeMachine.2024-03-14-230012
com.apple.TimeMachine.2024-03-15-010023

# Монтирай snapshot и разгледай
$ sudo tmutil mount com.apple.TimeMachine.2024-03-14-230012

# Файлове отворени от deleted процеси (lsof trick)
$ sudo lsof | grep "(deleted)"
python3  1234  alex  3r  REG  disk1  2048000  /tmp/secret_data.csv (deleted)
Последната команда е forensics gold — файл е изтрит, но процесът все още го държи отворен. Файлът е "deleted" но данните са още там докато процесът не се затвори. Можеш да ги възстановиш от /proc/PID/fd/ аналога.
// Thumbnail и preview кешове
files
# Quick Look thumbnails на изтрити файлове
$ ls -lah ~/Library/Caches/com.apple.QuickLook.thumbnailcache/

# Icon cache — съдържа thumbnails на изтрити файлове
$ sqlite3 ~/Library/Caches/com.apple.iconservices.store \
    ".tables"

# iCloud "Recently Deleted" (30 дни)
$ ls ~/Library/Mobile\ Documents/com~apple~CloudDocs/.Trash/ 2>/dev/null

# Photos library — изтрити снимки (30 дни)
$ sqlite3 ~/Pictures/Photos\ Library.photoslibrary/database/Photos.sqlite \
    "SELECT datetime(ZDATEDELETED + 978307200, 'unixepoch', 'localtime'),
     ZORIGINALFILENAME FROM ZASSET
     WHERE ZTRASHEDSTATE = 1 ORDER BY ZDATEDELETED DESC LIMIT 20;"
Артефакт 07 · User Activity

Потребителска Активност

Shell история, application usage, screen time данни и login records.

// Shell история и команди
critical
# Zsh история с timestamps (ако е включено EXTENDED_HISTORY)
$ cat ~/.zsh_history | grep "^:" | awk -F':' '{print strftime("%Y-%m-%d %H:%M:%S", $2), $NF}'
2024-03-15 02:33:11  rm -rf /Users/boss/Documents/Q4_Report/
2024-03-15 02:34:02  cp -r ~/Projects/secret_algo/ /Volumes/SANDISK/
2024-03-15 02:47:18  history -c   # опит за изчистване!

# Bash история
$ cat ~/.bash_history

# История на всички shells на системата
$ find /Users -name ".*_history" -type f 2>/dev/null | xargs ls -lah

# Last логин за всеки потребител
$ last
alex     ttys001  Fri Mar 15 02:28   still logged in
alex     ttys000  Thu Mar 14 23:44 - 02:28  (02:44)
reboot   ~        Thu Mar 14 22:01

# Детайлен login log
$ last -F | head -30   # -F = пълни timestamps
Забелязваш ли? history -c в историята → потребителят е опитал да изтрие history. Но самата команда за изтриване е записана! Доказателство за опит за прикриване.
// Application usage история
files
# Screen Time данни (Application usage)
$ sqlite3 ~/Library/Application\ Support/Knowledge/knowledgeC.db \
    "SELECT datetime(ZOBJECT.ZSTARTDATE + 978307200, 'unixepoch', 'localtime') as start,
     datetime(ZOBJECT.ZENDDATE + 978307200, 'unixepoch', 'localtime') as end,
     ZOBJECT.ZVALUESTRING as app
     FROM ZOBJECT
     WHERE ZOBJECT.ZSTREAMNAME = '/app/usage'
     ORDER BY ZOBJECT.ZSTARTDATE DESC LIMIT 40;"
2024-03-15 03:01:44 | 2024-03-15 03:12:22 | com.apple.Safari
2024-03-15 02:47:18 | 2024-03-15 03:01:44 | com.apple.Terminal
2024-03-15 02:31:02 | 2024-03-15 02:47:18 | com.apple.finder

# Кои устройства са използвали iCloud акаунта
$ defaults read MobileMeAccounts 2>/dev/null | grep "DeviceName\|AccountID"

# Clipboard история (ако е включена Universal Clipboard)
$ log show --predicate 'process == "pboard"' --last 24h --debug | head -20
knowledgeC.db е най-богатият forensics артефакт за потребителска активност. Записва app usage, device wake/sleep, location, дори колко е гледал телефона. Screen Time е всъщност surveillance database.
Артефакт 08 · Reconstruction

Timeline Реконструкция

Комбинирай всички артефакти в хронологична картина на събитията.

🔍 Case Study — Пример за разследване
Сценарий: Шефът пита "Имаше ли някой достъп до машината снощи между 2 и 4 часа?". Ето как отговаряш за 5 минути.
2024-03-15 · 23:44
Login — потребител "alex" влиза в системата (last -F)
2024-03-15 · 02:29
Wi-Fi join — свързване към "CoffeeShop_Free" (unified log) — нова мрежа в 2 нощем?
2024-03-15 · 02:31
USB mount — "SanDisk 64GB" монтиран на /Volumes/SANDISK (disk logs)
2024-03-15 · 02:33
Shell команда: rm -rf /Users/boss/Documents/Q4_Report/ (zsh_history)
2024-03-15 · 02:34
Shell команда: cp -r ~/Projects/secret_algo/ /Volumes/SANDISK/ (zsh_history)
2024-03-15 · 02:47
USB unmount — SANDISK демонтиран (16 мин след mount)
2024-03-15 · 02:47
Shell команда: history -c — опит за изтриване на следи
2024-03-15 · 03:08
Safari — visit wetransfer.com (browser history DB)
2024-03-15 · 03:12
Safari — visit pastebin.com/xK2mN8qP (browser history DB)
// Автоматизирай timeline collection
critical
#!/bin/bash
# forensics_collect.sh — събира всички артефакти наведнъж

OUTPUT=~/Desktop/forensics_$(date +%Y%m%d_%H%M%S)
mkdir -p $OUTPUT

echo "[*] Collecting system logs..."
sudo log collect --last 7d --output $OUTPUT/system.logarchive

echo "[*] Collecting Wi-Fi history..."
log show --predicate 'subsystem == "com.apple.wifi"' --last 7d \
    > $OUTPUT/wifi_history.txt

echo "[*] Collecting sudo usage..."
log show --predicate 'process == "sudo"' --last 30d --info \
    > $OUTPUT/sudo_history.txt

echo "[*] Collecting login records..."
last -F > $OUTPUT/login_history.txt

echo "[*] Collecting shell history..."
cp ~/.zsh_history $OUTPUT/zsh_history.txt 2>/dev/null
cp ~/.bash_history $OUTPUT/bash_history.txt 2>/dev/null

echo "[*] Collecting USB history..."
system_profiler SPUSBDataType > $OUTPUT/usb_current.txt

echo "[*] Collecting browser history..."
cp ~/Library/Safari/History.db $OUTPUT/safari_history.db 2>/dev/null
cp ~/Library/Application\ Support/Google/Chrome/Default/History \
    $OUTPUT/chrome_history.db 2>/dev/null

echo "[*] Collecting app usage (knowledgeC)..."
cp ~/Library/Application\ Support/Knowledge/knowledgeC.db \
    $OUTPUT/knowledgeC.db 2>/dev/null

echo "[✓] Done. Evidence collected in: $OUTPUT"
ls -lah $OUTPUT/
Стартирай скрипта веднага след инцидент преди logs да се ротират. chmod +x forensics_collect.sh && sudo ./forensics_collect.sh. Резултатът е папка с всички артефакти, готова за offline анализ.