온라인게임 계정과 아이템은 직접 현금과 연관되기 때문에 언제나 악성코드 제작자들의 타겟이 된다. 온라인게임 계정 탈취를 위한 악성코드는 지속적으로 그리고 대량으로 등장하고 있으며 그 감염 기법과 AV 제품들의 정상 동작 방해 방법은 지속적으로 지능화되고 있다. 최근에는 MBR 영역을 감염시켜 부팅 과정에서 자동으로 실행되는 온라인게임 계정 탈취형 악성코드까지 등장하였다. 부족하나마 해당 악성코드에 대한 분석 내용을 정리하고자 한다.

 

○ 전체 감염도 및 특징

[전체 감염도]

- 루트킷에 의해 파일 IO를 숨겨 분석을 방해한다.

- 루트킷을 이용하여 생성한 파일에 대한 접근을 차단한다.

- MBR 영역 감염 및 Bootkit을 설치하여 파일을 삭제하더라도 재부팅시 다시 감염된다.

- 국내 유명 백신의 정상 실행을 방해한다.

 

○ Main Dropper 분석

Main dropper 실행시 [그림 1]과 같이 hp.sys 드라이버 파일을 생성한다.

[그림 1]

생성된 hp.sys 파일을 hprint라는 서비스 명으로 실행하여 메모리 상에 올린 뒤 hp.sys 파일 및 서비스는 삭제한다.

[그림 2]

hp.sys 드라이버 파일은 파일 시스템 드라이버를 변조하여 이후 파일 오퍼레이션에 대한 동작에 대하여 모니터링 할 수 없도록 방해한다.

[그림 3]

이 후 C:\Program Files\Common Files\Ram.exe 생성 후 CreateProcessA 함수를 이용하여 실행한다.

[그림 4]

   

○ Ram.exe 분석

Main Dropper에 의하여 생성된 Ram.exe가 실행되며 최초 중복 실행 방지를 위하여 BkInstalling Mutex 를 생성한다.

[그림 5]

이후에 사용되어질 AudioControl 및 FileEngine이라는 이름의 Device Object를 생성한다.

[그림 6] AudioControl Device Object 생성

[그림 7] FileEngine Device Object 생성

이어서 FileEngine.sys 파일을 생성한 뒤 서비스로 실행한다.

[그림 8]

[그림 9]

FileEngine.sys 파일의 경우 IoCreateFile을 후킹하여 지정된 파일에 대하여 Open을 방해한다. 따라서 해당 파일을 삭제할 수 없게 되며 백신 제품에 의한 스캔도 일부 제품에서는 불가능하다.

[그림 10] IoCreateFile 후킹 코드

[그림 11] 보호 대상 파일 목록

FileEngine.sys 파일은 Device Object를 생성하며 해당 Device Object를 통하여 Ram.exe에서 명령을 받아 수행하게 된다. Ram.exe에서는 DeviceIoControl 함수를 이용하여 서로 다른 Control code를 지정하여 작업을 수행하게 된다.

Ram.exe는 이어서 MBR 변조 및 Bootkit 기능 수행을 위한 데이터를 하드디스크에 직접 접근하여 기록한다. 먼저 하드디스크 직접 접근을 위해 PHYSICALDRIVE0에 대한 핸들을 얻어온다.

[그림 12]

이후 PHYSICALDRIVE0에 대하여 파일 포인터를 가장 앞으로 이동한다. 이제 파일 포인터는 첫번째 섹터의 가장 앞부분을 가르키게 된다.

[그림 13]

첫번째 섹터의 첫번째 바이트 부터 512바이트를 읽어 메모리 상에 저장한다. 512 바이트는 MBR 영역으로 원본 MBR을 특정 영역에 저장하기 위한 것으로 유추할 수 있다.

[그림 14]

메모리 상에 읽어온 MBR을 1바이트씩 이동하면서 "9C"로 XOR 연산을 수행하여 변형한다.

[그림 15]

메모리상에서 변조한 MBR 값을 위에서 생성한 FileEngine Device로 전송하며 이때 Control code를 보면 222014인 것을 확인할 수 있다. 이후에도 확인 가능하지만 Control code가 222014일 경우 전달되어진 데이터를 특정 디스크 영역에 기록하는 것을 확인할 수 있다.

[그림 16]

[그림 17] 0x6C00에 저장된 변형된 Original MBR

이어서 악의적인 MBR을 디스크 첫번째 섹터에 기록한다. 마찬가지로 222014 Control code를 전송하는 것을 확인할 수 있다. DeviceIoControl이 수행된 이후 MBR 영역을 확인해보면 [그림 19]과 같이 MBR의 내용이 변경되어 있는 것을 확인할 수 있다.

[그림 18]

[그림 19] 변경된 MBR

MBR 영역 변경 후 동일 방법으로 0x400 영역에 특정 데이터를 저장한다.

[그림 20]

[그림 21] 0x400 주소에 저장된 값

이어서 디스크의 0x600부터 400byte를 저장한다.

[그림 22]

[그림 23] 0x600에 저장된 값

이어서 PE 파일 형태의 데이터 2개를 저장하게 된다. 첫번째로 저장되는 PE 파일은 드라이버 파일로 Bootkit의 기능을 위한 것이며 두번째로 저장되는 PE 파일은 DLL 형태의 파일로 이후 생성되는 halc.dll 파일과 동일한 파일임을 알 수 있다.

[그림 24] 0xA00부터 저장된 드라이버 파일

[그림 25] 0X1A00부터 저장된 DLL 파일

디스크에 직접 접근하여 Bootkit 기능을 위한 데이터를 기록한 뒤에 %system%DiskSystem.exe 파일 존재시 삭제한 뒤 Ram.exe 파일을 DiskSystem.exe로 복사한다.

[그림 26]

생성된 DiskSystem.exe 파일은 DiskSystem이라는 서비스로 실행된다.

[그림 27]

Ram.exe과 동일한 파일이지만 DiskSystem.exe가 서비스로 실행시 별도의 행위를 하게 되며 이는 밑에 정리하기로 한다.

이후 rundll32.exe를 이용하여 halc.dll 실행하며 파라미터로 LpkEditTextOut 및 현재 실행 파일의 경로를 넘기는 것을 확인할 수 있다. 해당 함수는 [그림 28]과 같이 두 번째로 넘긴 파일을 삭제하는 함수인 것을 확인할 수 있다.

[그림 28]

   

○ DiskSystem.exe 분석(서비스로 실행시)

DiskSystem.exe 파일이 서비스로 실행시 실행 파일의 경로가 %system%DiskSystem.exe가 맞는지 비교하게 되며 해당 경로가 맞을 경우 [그림 30]과 같이 StartServiceCtrlDispatcherA 함수를 이용하여 DiskSystem 서비스의 ServiceMain을 지정하게 된다.

[그림 29] 실행 경로에 따른 분기

[그림 30]

위에서 서비스 루틴으로 지정된 부분은 [그림 31]과 같이 %system%halc.dll 파일 생성하게 되며 rundll32.exe를 이용하여 LpkExtTextIn export 함수를 실행하는 것을 확인할 수 있다.

[그림 31]

   

○ halc.dll 분석(LpkExtTextIn export 함수 호출시)

halc.dll 파일의 LpkExtTextIn export 함수는 먼저 temp 파일을 생성한다. 특이점으로 prefix로 fuck를 지정하므로 생성되는 tmp 파일의 첫 3글자는 항상 fuc로 시작하게된다. prefix로 지정된 부분의 문자열을 보아 악성코드 제작자의 취향이 특이해 보인다.

[그림 32]

이후 특정 경로에 접속하여 20110916b.jpg 파일을 다운받아 온다. 해당 파일은 암호화된 상태로 되어 있으며 이후 복호화 과정이 이루어진다.

[그림 33]

특이 사항으로 해당 halc.dll에 의해 추가 악성코드 다운로드 시 감염된 PC에 설정된 DNS 서버를 사용하지 않고 [그림 34]와 같이 내부에 별도의 DNS 서버 주소를 갖고 있으며 해당 DNS 서버에서 접속할 경로의 IP 주소를 얻어온다. 따라서 국내 ISP에 의해 해당 주소를 차단하더라도 감염 동작은 이루어 질 수 있다.

[그림 34]

다운로드한 20110916b.jpg 파일을 메모리에 올린 뒤 미리 갖고 있는 값과 XOR하여 원래의 값을 복원한다. 복원하는 과정은 [그림 35]와 같다.

[그림 35]

메모리 상에서 복원된 값은 다시 tmp 파일로 저장되며 복원된 값에서는 [그림 36]과 같은 설정값들이 저장되어 있는 것을 확인할 수 있다.

[그림 36]

이 후 설정 파일의 softurl0 필드에 저장된 추가 다운로드 URL을 참조하여 파일 다운로드 후 tmp.exe로 저장 한 뒤 실행한다.

[그림 37]

   

○ 다운로드 된 fucXX.tmp.exe 분석

다운로드된 fucXX.tmp.exe 파일 실행시 온라인 게임 계정 탈취 악성코드들이 사용하는 방법으로 SfcFileException 함수 주소를 얻어온 뒤 imm32.dll의 WFP를 해제한 뒤 %system%imm32.dll과 %system%dllcache\imm32.dll 파일을 교체한다.

[그림 38]

[그림 39]

이후 %system%dnetcom.dll 파일을 생성한다.

변조된 imm32.dll 파일의 경우 [그림 40]과 같이 dnetcom.dll을 로드하는 기능을 수행하며 dnetcom.dll은 온라인게임 계정 탈취를 목적으로 한다.

[그림 40]

   

○ infected MBR의 기능

악성코드가 윈도우 부팅시 자동 실행을 위해 생성한 Blob의 구조는 [그림 41]과 같다.

[그림 41]

부팅과정에서 감염된 MBR 실행시 [그림 42]와 같이 Bootkit loader를 메모리에 로드하는 것을 확인할 수 있다.

[그림 42]

이후 하드디스크의 0x6C00에 저장된 original MBR을 로드한 뒤 0x9C와 XOR하여 복원한 뒤 실행하는 것을 확인할 수 있다. 감염된 MBR 영역 중 Original MBR을 로드한 뒤 복원하는 부분은 [그림 44]의 짙은 색의 부분임을 알 수 있다.

[그림 43]

[그림 44]

Boorkit loader에 의해 로드된 Bootkit Driver의 경우 추가 다운로드 기능이 있는 것으로 추정되며 하드디스크의 0x1A00 영역에 저장된 DLL 파일을 C:\WINDOWS\lpk.dll로 복사한다. 또한 국내 특정 보안제품의 실행을 방해하는 역할을 한다. Bootkit loader와 Bootkit Driver에 대한 부분은 좀 더 분석이 필요할 듯 하다.

[그림 45]

C:\WINDOWS에 생성된 lpk.dll 파일은 halc.dll 파일과 동일한 파일로 DLL Hijacking에 의해 로드되며 위에서 설명한 것과 동일한 다운로드 및 시스템 파일 감염 동작을 수행한다.


                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : reverseinsight@gmail.com    |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP, SIS1급                             |
                                                                                                    +----------------------------------+

신고
Posted by By. PHR34K

티스토리 툴바