4월 11일 발견된 Locky 랜섬웨어를 다운로드하는 악성코드에서 "CVE-2015-1701" 취약점이 사용된 것이 확인되었다. "CVE-2015-1701" 취약점은 2015년 4월, 'Operation RussianDoll' 이름으로 명명된 러시아발 APT(Advanced Persistent Threat) 공격에 사용되어 알려진 취약점이다. 참고로 Locky 랜섬웨어는 발견 당시부터 현재까지 윈도우 설치언어가 러시아어 인 경우, 동작하지 않는 특징을 갖는다. 즉, Locky 랜섬웨어는 러시아에서 제작/배포되는 것으로 추정되며, APT 공격에 사용된 취약점이 랜섬웨어에서도 동일하게 사용된 것이 흥미로운 부분이다. 또한, "CVE-2015-1701" 취약점과 관련하여 기 알려진 함수("ClientCopyImage") 외에 Win8 이상의 경우에는 새로운 공격기법도 확인되어 추가분석이 필요한 상황이다.

"CVE-2015-1701" 취약점은 Win7 환경에서만 동작하며 "CreateWindowsEx" API 를 통해 시스템 권한을 획득하는 것이 주 기능이다. 기존에 알려진 Locky 랜섬웨어 다운로드는 주로 이메일의 첨부파일(MS오피스문서, 자바스크립트 파일)을 통해 이루어진다. 하지만, 이번에 발견된 악성코드는 EXE 파일 형태로 Locky 랜섬웨어를 다운로드 하는 기능과 "CVE-2015-1701" 취약점이 포함된 특징을 갖는다. 이러한 다운로드 방식의 변화는 향후 Locky 랜섬웨어가 이메일이 아닌 다양한 방식을 통해 감염이 시도될 수 있음을 나타낸다.

 

1. Locky 다운로드

해당 다운로더는 "URLDownloadToCacheFileW" 함수를 사용하여 아래의 사이트로 접속 및 Locky 랜섬웨어 다운로드가 이루어진다.

- http://[xxxx].nussvital.com.ar/read.php 

 

2. CVE-2015-1701 취약점

 

(1) 취약점 대상

1차 조건은 OSMajorVersion 값이 6인 경우이며, 2차 조건은 대상 시스템의 "win32k.sys" 파일의 "수정날짜" 정보를 바탕으로 이루어지며, 지정된 날짜 이전 인 경우가 공격대상이다. 운영체제 버전 별로 악성코드 내부에 저장된 비교대상 날짜는 다음과 같다.

  • 2015년 5월 14일 (이전) - Win7

  • 2015년 2월 20일 (이전) - Win8 이상

날짜 정보를 얻어오는 방식은 "NtQueryInformationFile" API 호출을 통해 이루어지며, 운영체제 버전에 따라 비교하는 날짜가 다름을 알 수 있다. [그림-1]에서 악성코드에서 사용하는 [4113CC] 주소의 상수 값은 PEB(Process Environment Block) 구조체의 OSMajorVersion, OSMinorVersion 정보를 통해 얻은 운영체제 버전에 따라 설정되는 값이다. 좀 더 구체적으로 운영체제 마다 [4113CC] 주소의 상수 값이 설정되는 내용은 다음과 같다.

즉, 아래의 [그림-1]의 코드에서 Win7의 경우 14 값이 설정되며, "win32k.sys" 파일의 비교날짜는 2015년 5월 13일이다. 반면, 6.2 버전의 Win8의 경우는 2015년 2월 20일이 취약점 여부를 판단하는 기준날짜가 된다. 취약점 공격 대상 시스템은 OSMajorVersion 값이 6 인 환경이며, OSMinorVersion 값에 따라 [411404] 주소의 상수 값이 1과 2 로 설정되는 구조이다. [411404] 주소의 1, 2 값은 이후 후킹대상이 되는 함수를 결정하는 정보로 활용된다.

2 값으로 설정된 경우 "CVE-2015-1701" 취약점으로 알려진 KernelCallbackTable[0x36] 의 함수 주소 4바이트가 변경된다. (KernelCallbackTable[0x36] 에 해당하는 함수는 "ClientCopyImage" 임)

1 값으로 설정된 경우, KernelCallbackTable[0x02] 위치의 주소 4바이트가 변경되며 이 위치 값의 변경은 "CVE-2015-1701" 과 관련하여 알려지지 않은 상태이다.

 

[그림-1] 취약점 발생대상 (win32k.sys 날짜정보)

 

아래의 [그림-2]에서 "win32k.sys" 파일의 날짜정보를 얻기위해 "NtQueryInformationFile" API가 사용된 것을 알 수 있으며, 5번째 인자값 4는 FileBasicInformation 을 나타낸다.

[그림-2] 날짜 비교부분

 

(2) ClientCopyImage 주소 변경

아래의 [그림-3]은 CreateWindowExA 함수호출 시, 해당 윈도우에 대한 프로시저 구동 전 호출되는 ClientCopyImage 라는 이름의 Callback 함수 주소를 변경하는 코드이다. 악성코드는 우선 PEB 구조체의 0x2C 위치에 존재하는 KernelCallbackTable 주소를 얻어오며, [그림-1]에서 설정된 [411404] 주소의 상수 값에 따라 후킹대상 테이블의 인덱스가 다르게 설정되는 것을 확인할 수 있다.

4바이트 주소값 변경 시, "InterlockedExchange" API가 사용된다.

[그림-3] PEB's KernelCallbackTable 후킹

 

Win7 환경에서 아래의 붉은색 주소 4바이트 값이 PEB의 KernelCallbackTable[0x36] 에 위치한 함수주소에 해당하며, 수정 전의 값을 나타낸다. (USER32.DLL 영역)

77CF2A48  09 EB D0 77 92 8F D3 77 F6 19 D1 77 F3 28 D0 77
77CF2A58  4C 8E D3 77 FF 82 D0 77 B2 F4 CF 77 83 8E D3 77 

아래의 파란색 주소가 변경 후의 값을 나타낸다. 00403BFD 주소로 악성코드 영역으로 설정된 것을 알 수 있다.

77CF2A48  FD 3B 40 00 92 8F D3 77 F6 19 D1 77 F3 28 D0 77
77CF2A58  4C 8E D3 77 FF 82 D0 77 B2 F4 CF 77 83 8E D3 77 

아래의 [그림-4]는 ClientCopyImage 함수 후킹을 통해 분기한 곳에서 "SetWindowLongA" API 호출하는 부분으로 윈도우 프로시저를 커널영역의 디폴트 윈도우 프로시저(Default Window Procedure)로 변경하는 코드를 나타낸다. (GWL_WNDPROC(-4) -> "Sets a new address for the window procedure")

 

 

[그림-4] 윈도우 프로시저 주소변경

 

(3) 새로운 공격기법(?)

위의 [그림-3]에서 PEB 구조체의 KernelCallbackTable의 0x36(54) 위치의 함수인 "ClientCopyImage" 주소값이 후킹되는 것은 "CVE-2015-1701" 취약점과 관련하여 기 알려진 공격방식이다. 하지만, Win8 이상의 경우에 변경되는 KernelCallbackTable의 0x02 위치는 아직 알려지지 않는 공격기법으로 추가 분석이 필요한 상황이다.

 

[참고 사이트]

- https://www.fireeye.com/blog/threat-research/2015/04/probable_apt28_useo.html

- https://github.com/hfiref0x/CVE-2015-1701/

- http://blog.trendmicro.com/trendlabs-security-intelligence/exploring-cve-2015-1701-a-win32k-elevation-of-privilege-vulnerability-used-in-targeted-attacks/

 

 

Creative Commons License
Creative Commons License
Posted by yhayoung