패스워드 매니저
패스워드 매니저란
사용자의 비밀 정보를 암호화하여 데이터베이스에 저장하고, 사용자는 하나의 마스터 패스워드만을 사용하여 암호화된 데이터베이스에 접근하므로 사용자는 마스터 패스워드만 기억하면 된다.
패스워드 매니저의 문제점
사용자의 비밀 정보가 담긴 데이터베이스를 로컬 컴퓨터에 저장하는 경우)
패스워드 저장소의 보안 취약점 발생
→ 데이터 베이스를 인터넷 서버에 암호화하여 저장하고 필요할 때마다 서버에 접속하여 사용
BUT, 공격자가 패스워드 매니저와 서버 간의 통신 메시지를 스니핑하여 해독하는 경우 사용자의 비밀 정보가 공격자에게 노출
LastPass 클라이언트-서버 통신 취약점
LastPass 개요
LastPass는 대표적인 상용 패스워드 매니저 프로그램들 중에서 가장 많이 사용되는 프로그램이다.
아래 이미지와 같은 로그인 화면에서 '암호 기억' 옵션에 따라 사용자의 비밀 정보 데이터베이스 저장 위치를 달리한다.
- 옵션 선택할 때 : 사용자 로컬 컴퓨터에 저장
- 옵션 선택하지 않을 때 : 서버에 저장 ▶ 본 논문에서 사용된 방식
LastPass는 사용자가 로그인 과정을 수행하면, 서버로부터 암호화된 사용자의 비밀 정보 데이터베이스를 수신받아 로컬 컴퓨터에 저장한다. 그리고 응답 메시지로 암호화된 데이터베이스를 복호화할 수 있는 정보를 수신하는 과정을 거친다.
LastPass 클라이언트-서버 송수신 과정 및 복호화 분석
- LastPass와 서버 간의 송수신 과정
사용자 컴퓨터에 설치된 LastPass는 사용자의 아이디와 패스워드의 해쉬값을 포함하여 서버로 요청 메시지를 보낸다. 서버는 클라이언트가 보낸 요청 메시지의 아이디와 패스워드를 확인한 후, 클라이언트에 보내는 응답 메시지에 사용자의 비밀 정보 데이터베이스를 복호화할 수 있는 'pwdeckey'를 포함하여 전송한다.
- LastPass 클라이언트 프로그램
로그인 완료 후, 서버로부터 사용자 비밀 정보 데이터베이스를 수신하여 로컬 컴퓨터에 저장한다. 데이터베이스가 저장되는 파일 경로는 브라우저에 따라 다르다. 데이터베이스 파일 포맷은 SQLite 데이터베이스 형식.
- 사용자의 비밀 정보 데이터베이스
데이터베이스 type이 key에 해당하는 data)
encryptedVaultKey : 암호화된 vault를 복호화할 수 있는 키가 암호화된 것
데이터베이스 type이 accts에 해당하는 data)
encryptedVault : 사용자의 웹사이트 로그인 정보 및 패스워드들이 암호화되어 있음
- 암호화된 데이터베이스의 복호화 과정
서버로부터 수신한 응답 메시지에 있는 pwdeckey의 해쉬값을 AES256-CBC 암호키로 하여 encryptedVaultKey를 복호화한다. 복호화된 정보를 Vault Key로 하여 로컬 컴퓨터에 저장된 암호화된 비밀 정보 데이터베이스 encryptedVault를 복호화한다.
LastPass 클라이언트-서버 통신 취약점
LastPass의 암호화된 데이터베이스를 복호화하기 위해서는 pwdeckey 값을 추출해야 한다.
BUT, LastPass 클라이언트-서버 통신은 TLS 기반으로 데이터를 암호화하여 송수신하므로 메시지를 스니핑하더라도 pwdeckey 값을 추출하기 어렵다. 또한, LastPass 클라이언트 프로그램은 메시지 송수신 내용을 로컬 컴퓨터 메모리에 남겨두는 취약점이 존재한다.
공격자는 pwdeckey 값을 탈취하기 위해 사용자가 로그인 과정을 종료하였을 때 메모리 공격을 통해 사용자 컴퓨터의 메모리 헥사 데이터를 탈취한다.
사용자가 LastPass 서버로 보내는 로그인 메시지는 사용자 아이디와 loglogins="0" 값을 포함한다. 이후 로그인 메시지를 수신한 서버는 LastPass 클라이언트에 pwdeckey를 포함하는 응답 메시지를 전송한다. 따라서 'Quick Memory Editor' 프로그램에서 사용자 로그인 아이디와 loglogins="0"을 키워드로 메시지 검색 후 다음 메시지를 열면 위 사진의 우측과 같이 로그인 메시지에 대한 응답 메시지의 헥사 데이터를 확인할 수 있다.
서버로부터 수신한 응답 메시지 바이트 단위 분석)
ASCII 값으로 "pwdeckey="를 발견할 수 있고, '=' 뒤의 비트 값이 encryptedVault 복호화 과정에 사용되는 pwdeckey 값이다. 이후 pwdeckey를 사용하여 암호화된 데이터베이스의 복호화 과정으로 사용자의 비밀 정보 데이터베이스를 복호화할 수 있다.
LastPass 클라이언트-서버 통신 취약점 시험
- 시험 시나리오
LastPass 사용자는 Table2와 같이 아이디를 'test', 패스워드를 'test1234*'로 하여 해당 URL에 접속
LastPass 클라이언트-서버 통신 취약점 공격 시나리오를 Fig. 8 이미지를 통해 확인할 수 있다.
- 공격자는 피공격자 컴퓨터에 메모리 공격을 하여 메모리상에 남아있는 pwdeckey를 탈취
- 피공격자 컴퓨터의 특정 위치에 저장된 데이터베이스 파일을 탈취
- 본 연구를 위해 개발한 HPassPlus 프로그램으로 피공격자의 암호화된 데이터베이스를 복호화
- 암호화된 데이터베이스 복호화
사용자의 비밀 정보 데이터는 데이터베이스 type이 'accts'에 해당하는 data에 저장된다.
accts 데이터는 반복 횟수 정보 iteration=x;로 시작하며, 이후 사용자 비밀 정보를 AES256으로 암호화한 것을 Base64로 인코딩한 것이다.
Fig. 10은 accts 데이터를 Base64 디코딩한 것이다. HEX 데이터에서 ASCII 값 "ACCT" 이후에 "!!"가 나오는 곳에 각각 name, URL, username, password 정보가 담겨있다.
- name : 사용자가 사이트별 로그인 정보를 저장할 때 지정하는 이름으로 설정하지 않으면 사이트의 도메인으로 저장
- URL 정보 : 암호화되어 저장되어 있지 않으므로 HEX 데이터를 ASCII 문자로 변환하여 얻을 수 있음
name, username, password는 각각 AES256-CBC로 암호화되어 있고, 길이는 16바이트 IV 값과 16 바이트 암호문으로 구성된다.
예시) password 복호화
Fig 11과 같이 32 바이트 데이터에서 앞 16 바이트를 IV로, 뒤 16 바이트를 암호문으로 하고, Vault Key는 암호화된 데이터베이스의 복호화 과정에서 얻은 값을 사용하면 로그인에 사용한 패스워드를 복호화할 수 있다.
(동일한 방법으로 name, username을 복호화 가능)
본 논문에서는 accts 데이터로부터 'name, URL, username, password' 정보를 복호화하는 프로그램을 C# 언어로 개발했으며, 이를 HPassPlus라고 지칭한다. Fig. 12는 개발한 프로그램을 사용하여 사용자의 비밀 정보를 복호화한 결과이다.
KeyPass 클라이언트-서버 통신 취약점
KeePass 개요
KeePass 패스워드 매니저는 2003년에 배포된 대표적인 오픈 소스 프로그램이지만, KeePass 프로그램은 독립적으로 동작하는 로컬 프로그램으로 웹 브라우저와 연동되지 않는다.
사용자는 로컬 컴퓨터에서 KeePass 프로그램을 실행한 후, KeePass 프로그램에서 웹사이트 주소를 키워드로 검색하여 사용자의 아이디와 패스워드를 복사하여 웹 브라우저의 해당 입력란에 각각 붙여넣어야 하는 불편함 발생
▶ 불편함 해소를 위해 사용자는 KeePass 프로그램에 KeePassHttp 서버 플러그인을 설치하고 웹 브라우저에 확장 프로그램을 설치하여 사용
KeePass 프로그램과 웹 브라우저 간은 HTTP 통신으로 데이터를 주고 받는다.
KeePassHttp-Connector는 ChromeIPass와 동일하다. 사용자가 웹사이트를 방문하면 ChromeIPass 클라이언트는 로그인 정보를 HTTP 프로토콜을 사용하여 KeePassHttp 서버에 요청한다. KeePassHttp 서버는 KeePass 패스워드 매니저가 저장한 로그인 정보를 검색하여 응답 메시지로 전송한다.
KeePass 클라이언트-서버 송수신 과정 및 복호화 분석
크롬 브라우저 플러그인으로 설치된 ChromeIPass 클라이언트와 KeePassHttp 서버간의 통신은 연결 수립 과정과 로그인 정보를 저장하는 과정으로 구분된다.
ChromeIPass는 서버로 보내는 요청 메시지에 연결 수립을 나타내는 "RequestType":"associate"와 "Key" 값을 포함한다. 이때, "Key" 값은 추후 암호문을 해독하는 암호키로 사용된다. 서버는 클라이언트에 보내는 응답 메시지에 클라이언트의 연결을 구별할 수 있도록 "Key"에 대응하는 "Id"를 할당한다.
연결이 수립된 이후, 로그인 정보를 전달하는 과정은 Fig 15와 같다.
사용자가 로그인 정보를 요구하는 웹사이트에 방문하면 ChromeIPass는 서버로 보내는 요청 메시지에 <Nonce, 암호화된 URL>을 포함한다. 이때, IV는 함께 전송되는 Nonce 값이 사용되고, 암호키는 접속과정에서 전송한 Key가 사용된다.
※ URL 암호화 알고리듬 : AES256-CBC 사용
서버는 클라이언트가 보낸 암호화된 URL을 복호화한 후, 클라이언트에 보내는 응답 메시지에 <None, Entries>을 포함하여 전송한다. 이때, IV는 함께 전송되는 Nonce 값이 사용되고, 암호키는 접속 과정에서 전송된 Key가 사용된다.
※ Entries : 암호화된 로그인 아이디와 패스워드 정보를 포함하고 있고, 암호화 알고리듬은 AES256-CBC가 사용
KeePass 클라이언트-서버 통신 취약점
사용자의 암호화된 로그인 정보를 복호화하기 위해서는 연결 수립 과정에서 클라이언트가 서버로 전송하는 "Key" 값과 사용자가 로그인 정보를 요구하는 웹사이트를 방문하였을 때 서버가 클라이언트로 전송하는 <Nonce, Entries> 데이터가 필요.
BUT, 공격자는 메시지 스니핑 공격을 통해 해당 정보들을 모두 탈취할 수 있음
▶ 클라이언트-서버 통신 과정에 암호화되지 않은 HTTP 프로토콜을 사용하기 때문
또한, 메모리 상에 해당 내용을 남겨두기 때문에 메모리 공격으로도 해당 정보들을 모두 탈취할 수 있는 심각한 취약점이 있다.
KeePass 클라이언트-서버 통신 취약점 시험
- 시험 시나리오
시험 시나리오에서 KeePass 사용자는 Table2의 정보를 사용한다.
클라이언트-서버 통신 취약점 공격 방법은 2가지이다.
1. HTTP 메시지 스나핑 공격
KeePass 서버가 원격에 위치하면서, 사용자가 암호화하지 않은 Wi-Fi를 이용하는 경우 무선 스니핑을 통해 HTTP 메시지를 탈취할 수 있다. Fig. 16은 HTTP 스니핑을 통해 연결 수립 과정에서 "Key"를 탈취한 화면이다.
2. 컴퓨터 메모리 공격
메모리 공격으로 공격자는 메모리에 남겨진 HTTP 메시지 내용을 탈취할 수 있다.
- 메모리 공격
ChromeIPass와 KeePassHttp 서버 간 연결 수립 후 메모리 내용을 "HxD" 프로그램을 사용하여 공격하면 Fig. 17과 같이 메모리에 "Key" 값이 남아 있음을 확인할 수 있다.
사용자가 로그인 정보를 요구하는 웹사이트 방문후 메모리 공격을 취하면 Fig. 18과 같이 메모리에 <Nonce, Entries> 데이터를 확인할 수 있다. 해당 데이터들은 문자열 시작과 끝에 큰 따옴표(0x22)를 기준으로 파싱할 수 있다.
메모리에 있는 데이터들은 Base64 디코딩 후에 AES256-CBC 복호화를 수행한다.
password 복호화를 예로 들면 Fig 19와 같다.
결론
본 논문은 상용 패스워드 매니저인 LastPass와 대표적인 오픈 소스 패스워드 매니저인 KeePass의 클라이언트-서버 통신 취약점을 분석하였다.
LastPass 프로그램은 서버와의 통신에서 암호화된 HTTPS 프로토콜을 사용함으로써 인터넷 스니핑 공격을 방어하였지만, 컴퓨터 메모리에 메시지 내용을 남겨둠으로써 메모리 공격에 취약하였다. 메모리 공격을 통해 사용자 비밀 정보 데이터베이스를 복호화하는데 필요한 암호키를 탈취하였으며, 사용자 비밀 정보 데이터베이스 파일의 데이터 파싱을 통해 웹사이트 로그인 패스워드를 복호화할 수 있었다.
KeePass 이용자들은 편의를 위해 ChromeIPass와 KeePassHttp 서버를 함께 사용한다. 그러나 ChromeIPass와 KeePassHttp 서버간의 통신은 암호화되지 않는 HTTP 프로토콜을 사용함으로써 인터넷 스니핑 공격에 취약하다. 또한, 컴퓨터 메모리에 메시지 내용을 남겨둠으로써 메모리 공격에도 취약하다.
패스워드 매니저의 클라이언트-서버 통신 취약점 해결 방안)
1. 통신 메시지 내용이 공격자에게 노출되지 않도록 스니핑 및 중간자 공격에 안전한 전송 계층 보안 프로토콜 사용
2. 통신 메시지 내용을 메모리에 저장할 때는 암호화하여 저장하거나 메모리 내용을 즉각 삭제하는 등 메모리 공격에 안전
'Security > Web hacking' 카테고리의 다른 글
[WebGoat] 실습 환경 구축하기 (3) | 2024.09.05 |
---|---|
[웹해킹 기초] Webpack (0) | 2023.09.23 |
[논문 분석] 패스워드 매니저의 보안성 분석 (0) | 2023.01.23 |
실전 웹 모의해킹 (0) | 2023.01.14 |
XSS 공격 (0) | 2023.01.13 |