Keychain Analysis with Mac OS X Memory Forensics

Keychain Analysis with Mac OS X Memory Forensics.pdf
1231.3KB

소개

MAC OS 에서는 Keychain 이라는 기능을 지원한다.
Keychain 은 user 계정 정보, key, 자격 증명, 암호화 볼륨 비밀번호와 같은 정보를 담고 있다.
이러한 Keychain 을 관리하는 암호화 방식은 TDES-CBC 이다.
어떤 방식으로 관리되는지를 알아보도록 하자.

KeyChain 구조

KeyChain 구조를 도식화하면 다음과 같다.
Key Table 에서는 record key 와 그에 해당하는 SSGP label이 함께 있다. 이러한 키체인 구조를 해석함으로써 사용자 크리덴셜 정보를 얻을 수 있음
여기서 마스터키가 필수적으로 필요한데, 마스터키를 얻는 방법을 메모리에서획득하는 방법을 제안한다.
(1) Security Server 프로세스를 탐색
(2) MALLOC_TINY 구조를 VMAP 에서 찾기
(3) Master Key 후보를 추출하기
다른 방법으로도 키 값을 구할 수 있었는데, 유저 세션 정보를 말하는 것 같더라. 유저 세션 정보는 [경로] 에서 찾아볼수 있는데 역시 별도의 복호화 과정? XOR 과정을 거쳐야 한다.
이렇게 추출한 마스터 키를 가지고, 이제 Keychain 을 복호화해야한다.
먼저 keychain 파일은 다음 경로에 존재한다
1. /Library/KeyChains/System.keychain 2. /Library/Keychains/login.keychain
Python
1은 MAC OS의 전체적인 자격 증명을 요구하는 파일이고, 지금 공부하는데 있어서 주가 되는 파일은 아니다.
2의 경우 사용자가 생성한 크리덴셜 정보들이 들어있다. user account, WiFi Password, Volume Password 와 같은 정보를 확인할 수 있다.
이러한 파일들은 User 별로 생성된다.
이제 Keychain 자체를 복호화/파싱 해보면
3가지의 암호화 정보를 알아낼 수 있다.
1.
E1
E1 은 DbBlob 레코드이다.
DB Key 값을 마스터 키로 암호화한 값이다.
2.
E2
KeyBlob 레코드로,
각각의 SSGP 라벨을 마스터키로 암호화된 user 크리덴셜의 레코드 키와 과 쌍을 이룬 리스트의 형태로 있다.
3.
E3
user 크리덴셜의 평문 형태를 확인할 수 있다. 각각의 레코드 키로 암호화되어 있으며, SSGP 라벨과 쌍을 이룬 정보로 이루어져 있다.
즉 우리는 E3의 평문 형태의 정보를 확인해야 하기 때무넹 순차적으로 E1 부터 복호화하며 데이터를 얻어야 한다.
물론 구현해놓은 코드는 항상 있기 마련. github을 잘 뒤져보자
Keychain 구조를 이제 바이너리 단위에서 바라보면 다음과 같다.
헤더 다음부터는 스키마가 존재하는데, 테이블에 대한 정보를 담고 있다.
그럼 테이블에는 어떤 정보가 있는가?
다음 그림을 참고합시다
레코드 하나하나에 대한 정보가 담겨 있다. 오프셋 형태로 잘 따라간다면 쉽게 따라갈 수 있을 것이다.

Decryption

이제 실질적인 복호화 과정을 볼 것이다.
Record Data 에서의 DbBlob 부분을 참고하자 이는 테이블 이름이 CSSM_DB_DL_RECORD_METADATA 인 곳을 찾으면 된다.
하단에 Encrypted DB Key 에 대한 정보를 찾아볼 수 있다.
위에 언급한 대로 마스터 키 값을 이용해서 복호화할 수 있다 암호화 형식은 TDES-CBC 이다.
E1을 해결했으니 이제 E2를 보자
KeyBlob에서 정보를 뽑아내는 것이다. 어떤 테이블이 KeyBlob 데이터를 가지고 있는지 보았을 때
CSSM_DB_DL_PUBLIC_KEY CSSM_DB_DL_PRIVATE_KEY CSSM_DB_DL_SYMMETRIC_KEY
가 있다. 논문에서는 3번째 것을 예시로 들었다. 테이블 구조를 보면 아래와 같다
KeyBlob 위치를 찾아갈 수 있다. 오프셋이 여러개 존재하는데, 이는 아까 위에서 말했듯, 레코드 안에 여러 정보가 있기 때문이다.
오프셋을 따라가보면 다음과 같은 구조를 마주할 수 있는데,
역시 같은 방법으로 Record Key를 복호화 할 수 있다.
어떤 SSGP 라벨이 있는지도 가져올 수 있다. 이는 마지막으로 얻을 정보와 매칭해보면 된다.
비슷한 방법으로 마지막 데이터도 복호화할 수 있다.

결론(생각)

이제 애플같은 경우는 이미징이 어렵기 때문에 메모리 덤프를 통해서 마스터키를 얻을 수 있는 경우에 다른 아티팩트(어플리케이션 크리덴셜)을 얻을 수 있을 것 같다.