DPAPI
Data Protection API는 Windows에 내장된 구성 요소로 데이터를 암호화하고 복호화 할 수 있는 수단을 제공합니다. 이것은 Windows Credential Manager가 RDP 자격 증명과 같은 저장된 시크릿을 보관하는데 사용되며, Chrome 등의 서드파티 애플리케이션에 저장된 자격 증명 정보를 저장하기도 합니다. Windows에는 Vaults와 Credentials라는 두개의 개념이 사용됩니다.
Vaults
Windows의 크리덴셜을 저장하는 Vaults는 금고와 같은 개념입니다. 기본적으로 2가지 종류의 금고가 있는데 Windows Credentials와 Web Credentials를 따로 저장합니다. 사용자의 Vaults를 열거하기 위해서 Cobalt Strike에서 기본으로 제공하는 비콘 도구인 vaultcmd
를 사용할 수 있습니다.
Windows Credentials라고 하더라도 모두 같은 Vault에 저장된다고 보장할 수는 없습니다. 따라서 권한 상승 혹은 측면 이동에 꼭 필요한 사용자 계정 정보를 찾기 위해서 하나의 Vault를 복호화 했다고 모든 시도를 끝냈다고 말할 수는 없습니다. 일반적으로 어떤 정보가 어디에 암호화 되어있는지는 알 수 없기 때문에 모든 Vault를 복호화하는 수밖에 없습니다.
Windows Credentials
사용자가 cmdkey
명령이나 Credential Manager를 통해 로컬 자격 증명을 저장하거나 RDP, SMB 클라이언트에서 CredWrite()
를 호출할 경우 저장됩니다. 사용자가 로컬에서 저장한 크리덴셜은 모두 \AppData\Roaming\Microsoft\Credentials\
하위에 {GUID}
형식의 파일로 저장됩니다. Windows Credentials가 없는 경우 실습을 위해서 아래 명령어를 통해 가짜 자격 증명 정보를 저장합니다.
Windows 로컬 내에 저장된 크리덴셜은 사용자마다 모두 다른 마스터키를 가지고 있습니다. 내가 가진 마스터키의 GUID가 무엇인지 파악하기 쉽게 정리해주는 도구로 Seatbelt.exe가 있지만 이 도구를 사용하지 않더라도 기본적으로 mimikatz의 sekurlsa::dpapi
를 사용해서 나온 첫 번째 마스터키가 현재 사용자의 마스터키이기 때문에 mimikatz만 사용하더라도 복호화를 하는데 지장은 없습니다. 만약 코발트 스트라이크 환경이라면 내장된 명령어를 통해 저장된 크리덴셜 위치를 파악할 수 있고, 없다면 Seatbelt를 통해 편리하게 파악할 수 있습니다.
Web Credentials
Chrome와 같은 서드파티 브라우저 애플리케이션을 사용할 때 웹 사이트에 로그인하면 Chrome에 자격 증명을 저장할 것인지 묻는 팝업창을 경험해본 적이 있을 것입니다. 이때 Chrome에 내가 입력한 자격 증명을 저장한다면, DPAPI로 암호화되어 \AppData\Local\Google\Chrome\User Data\Default\
로 저장됩니다.
대표적인 웹 브라우저 구글 크롬에서, 사용자들은 매번 패스워드를 통한 로그인이 번거로워 브라우저 내에 크리덴셜 정보를 저장하는 기능을 한 번 쯤은 사용해봤을 것입니다. 우리가 입력한 크리덴셜 정보를 크롬 브라우저의 저장 기능으로 저장했다면 SQLite 포맷으로 Login Data 파일에 저장됩니다. 절대 경로는C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\
입니다. 그리고 이곳에 저장된 암호화된 정보를 복호화하는 키가 저장된 파일은 C:\Users\user\AppData\Local\Google\Chrome\User Data\Local State
입니다.
위 파일에 저장된 정보는 모두 키에 관련된 정보는 아니기 때문에 우리가 복호화를 원할 시에는 키 정보만을 출력해야 합니다. 키 파일을 Base64 인코딩 된 형태로 출력한 뒤, 출력된 문자를 그대로 복사하여 mimikatz의 Chrome 복호화 인자로 전달합니다.
References
Last updated
Was this helpful?