hacktricks/macos-hardening/macos-red-teaming/macos-keychain.md
2024-02-10 21:30:13 +00:00

9 KiB

macOS 키체인

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

주요 키체인

  • 사용자 키체인 (~/Library/Keychains/login.keycahin-db)은 사용자별 자격 증명 (애플리케이션 비밀번호, 인터넷 비밀번호, 사용자 생성 인증서, 네트워크 비밀번호 및 사용자 생성 공개/비공개 키)을 저장하는 데 사용됩니다.
  • 시스템 키체인 (/Library/Keychains/System.keychain)은 WiFi 비밀번호, 시스템 루트 인증서, 시스템 개인 키 및 시스템 애플리케이션 비밀번호와 같은 시스템 전체 자격 증명을 저장합니다.

비밀번호 키체인 액세스

이러한 파일은 내재적인 보호 기능은 없지만 암호화되어 있으며 사용자의 평문 암호를 복호화하는 데 필요합니다. Chainbreaker와 같은 도구를 사용하여 복호화할 수 있습니다.

키체인 항목 보호

ACLs

키체인의 각 항목은 **접근 제어 목록 (ACLs)**에 의해 관리됩니다. 이는 키체인 항목에서 수행할 수 있는 다양한 작업을 지시합니다. 이 작업에는 다음이 포함됩니다:

  • ACLAuhtorizationExportClear: 보안 정보의 평문을 가져올 수 있도록 허용합니다.
  • ACLAuhtorizationExportWrapped: 다른 제공된 암호로 암호화된 평문을 가져올 수 있도록 허용합니다.
  • ACLAuhtorizationAny: 모든 작업을 수행할 수 있도록 허용합니다.

ACLs는 이러한 작업을 프롬프트 없이 수행할 수 있는 신뢰할 수 있는 애플리케이션 목록과 함께 제공됩니다. 이 목록은 다음과 같을 수 있습니다:

  • Nil (인증이 필요하지 않음, 모두 신뢰함)
  • 목록 (아무도 신뢰하지 않음)
  • 특정 애플리케이션목록

또한 항목에는 ACLAuthorizationPartitionID 키가 포함될 수 있으며, 이는 teamid, applecdhash를 식별하는 데 사용됩니다.

  • teamid가 지정된 경우 사용된 애플리케이션이 동일한 teamid를 가져야 항목에 프롬프트 없이 액세스할 수 있습니다.
  • apple이 지정된 경우 앱은 Apple에 의해 서명되어야 합니다.
  • cdhash가 표시된 경우 은 특정 cdhash를 가져야 합니다.

키체인 항목 생성

**Keychain Access.app**을 사용하여 새로운 항목을 생성할 때 다음 규칙이 적용됩니다:

  • 모든 앱은 암호화할 수 있습니다.
  • 앱은 (사용자에게 프롬프트 없이) 내보내기/복호화할 수 없습니다.
  • 모든 앱은 무결성 검사를 볼 수 있습니다.
  • 앱은 ACL을 변경할 수 없습니다.
  • partitionID는 **apple**로 설정됩니다.

애플리케이션이 키체인에 항목을 생성하는 경우 규칙이 약간 다릅니다:

  • 모든 앱은 암호화할 수 있습니다.
  • 생성 애플리케이션 (또는 명시적으로 추가된 다른 앱)만 내보내기/복호화할 수 있습니다 (사용자에게 프롬프트 없이).
  • 모든 앱은 무결성 검사를 볼 수 있습니다.
  • 앱은 ACL을 변경할 수 없습니다.
  • partitionID는 **teamid:[teamID here]**로 설정됩니다.

키체인 액세스

security

# Dump all metadata and decrypted secrets (a lot of pop-ups)
security dump-keychain -a -d

# Find generic password for the "Slack" account and print the secrets
security find-generic-password -a "Slack" -g

# Change the specified entrys PartitionID entry
security set-generic-password-parition-list -s "test service" -a "test acount" -S

APIs

{% hint style="success" %} LockSmith라는 도구를 사용하여 프롬프트를 생성하지 않는 키체인 열거 및 덤프를 수행할 수 있습니다. LockSmith {% endhint %}

각 키체인 항목에 대한 정보를 나열하고 가져옵니다:

  • SecItemCopyMatching API는 각 항목에 대한 정보를 제공하며 사용할 때 설정할 수 있는 몇 가지 속성이 있습니다:
  • kSecReturnData: true로 설정하면 데이터를 복호화하려고 시도합니다 (팝업을 피하려면 false로 설정)
  • kSecReturnRef: 키체인 항목에 대한 참조도 가져옵니다 (나중에 팝업없이 복호화할 수 있는 경우 true로 설정)
  • kSecReturnAttributes: 항목에 대한 메타데이터 가져오기
  • kSecMatchLimit: 반환할 결과 수
  • kSecClass: 어떤 종류의 키체인 항목인지

각 항목의 **ACL(Access Control List)**을 가져옵니다:

  • SecAccessCopyACLList API를 사용하여 키체인 항목의 ACL을 가져올 수 있으며, 각 목록에는 다음과 같은 ACL(예: ACLAuhtorizationExportClear 및 이전에 언급된 기타 항목)이 포함됩니다:
  • 설명
  • 신뢰할 수 있는 애플리케이션 목록. 이는 다음과 같을 수 있습니다:
  • 앱: /Applications/Slack.app
  • 이진 파일: /usr/libexec/airportd
  • 그룹: group://AirPort

데이터 내보내기:

  • SecKeychainItemCopyContent API는 평문을 가져옵니다
  • SecItemExport API는 키와 인증서를 내보내지만 내용을 암호화하여 내보내려면 비밀번호를 설정해야 할 수도 있습니다

그리고 프롬프트를 생성하지 않고 비밀을 내보낼 수 있는 요구 사항은 다음과 같습니다:

  • 1개 이상의 신뢰할 수 있는 앱이 목록에 나열된 경우:
  • 적절한 권한이 필요합니다 (Nil 또는 비밀 정보에 액세스하기 위한 권한이 허용된 앱 목록에 속해야 함)
  • 코드 서명이 PartitionID와 일치해야 합니다
  • 코드 서명이 신뢰할 수 있는 앱 중 하나와 일치해야 합니다 (또는 올바른 KeychainAccessGroup의 구성원이어야 함)
  • 모든 애플리케이션이 신뢰된 경우:
  • 적절한 권한이 필요합니다
  • 코드 서명이 PartitionID와 일치해야 합니다
  • PartitionID가 없는 경우 이는 필요하지 않습니다

{% hint style="danger" %} 따라서 1개의 애플리케이션이 나열된 경우 해당 애플리케이션에 코드를 주입해야 합니다.

partitionIDapple이 지정된 경우 **osascript**를 사용하여 해당 partitionID에 apple이 포함된 모든 애플리케이션에 액세스할 수 있습니다. 이를 위해 **Python**도 사용할 수 있습니다. {% endhint %}

두 가지 추가 속성

  • Invisible: UI 키체인 앱에서 항목을 숨기는 불리언 플래그입니다.
  • General: 메타데이터를 저장하는 데 사용됩니다 (따라서 암호화되지 않음)
  • Microsoft는 모든 민감한 엔드포인트에 액세스하기 위한 갱신 토큰을 평문으로 저장하고 있었습니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로에서 영웅까지 AWS 해킹 배우기**!

HackTricks를 지원하는 다른 방법: