본문 바로가기

악성코드 정보

Ammyy 해킹툴에서 확인된 Shim Database(SDB) 인젝션 공격

ASECFlawedAmmyy 백도어에서 Clop 랜섬웨어까지의 흐름을 확인 중 흔치 않은 방식의 공격 기법이 확인되어 알리고자 한다.

 

Ammyy 백도어는 이전 블로그(https://asec.ahnlab.com/1237) 에서 언급한 바와 같이 사회공학적인 방법으로 시작하여 다운로더를 거쳐 최종적으로 백도어 악성코드가 설치되는 방식으로 동작한다. 이후 일종의 잠복기를 거쳐 CLOP 랜섬웨어가 설치되어 사용자의 시스템을 암호화하는데, Ammyy 백도어가 생성한 악성코드들 중 윈도우 어플리케이션 Shim Database sdb 파일을 악용하여 시스템에 또 다른 백도어를 사용자가 인식하기 힘든 방식으로 설치하는 종류의 악성코드들이 확인되었다. loader32.exe 등의 이름으로 생성되는 Injector 악성코드와 sdb_msf_32_crypted.dll 등의 이름으로 생성되는 악성 sdb 설치 기능을 갖는 악성코드이다.

 

sdb 파일은 윈도우 운영체제 환경에서 소프트웨어에 대한 하위 호환을 지원하기 위한 용도로 만들어진 메커니즘으로서, 다양한 형태의 Compatibility Fix 들을 사용할 수 있다. 응용프로그램이 DLL을 호출하여 사용할 때 그 중간에서 sdb 파일의 코드를 통해 수정되어 동작하는 방식이다. 악성코드는 이러한 정상적인 목적으로 제공된 어플리케이션 패치 메커니즘을 악용하여 동작한다. 

 

[그림1] - sdb를 이용한 백도어 설치

 

이 악성코드의 흐름을 간략히 정리하면 아래와 같다.

 

1. Ammyy 백도어가 loader32.exesdb_msf_32_crypted.dll을 생성한다.
2. loader32.exesdb_msf_32_crypted.dll를 직접 로드하거나 다른 프로세스에 인젝션한다.
3. loader32.exe는 인코딩 된 백도어 PE를 특정 레지스트리에 쓴다.
4. 이후 악성 sdb 파일을 생성하고 sdbinst.exe를 이용해 등록한다. 해당 sdb 파일의 대상은 services.exe, 구체적으로 이 프로그램의 함수인 ScRegisterTCPEndpoint()이다.
5. 시스템 재부팅 시 services.exe가 실행되며, 이 때 등록한 악성 sdb가 적용된다.
6. 함수 ScRegisterTCPEndpoint()services.exe의 초기 루틴에 실행된다. services.exe의 패치된 셸코드는 services.exe 실행 후 바로 실행된다.
7. 셸코드는 인코딩 된 백도어 PE가 포함된 레지스트리를 읽어 복호화 후 메모리 상에서 실행한다.
8. 최종적으로 재부팅 시 마다 services.exe 내부에는 백도어 악성코드가 동작하게 된다.

 

위의 설명과 같이 이 악성코드는 먼저 인코딩 된 실제 백도어 악성코드를 아래와 같은 레지스트리에 쓴다.

인코딩 된 백도어가 등록되는 레지스트리 : HKLM\SOFTWARE\Microsoft\[랜덤]

 

[그림2] - 레지스트리에 등록된 인코딩 된 백도어 PE

 

이후 악성 sdb 파일을 생성하고, sdbinst.exe 유틸리티 프로그램을 이용해 이 sdb 파일을 등록한다. 이렇게 등록된 sdb 파일은 C:\Windows\AppPatch\Custom 경로에 위치하게 된다.

 

악성 Sdb 파일은 대상 프로세스가 services.exe이며, 특정 오프셋을 내부에 포함한 셸코드로 대체하는 기능을 갖는다. 이 방식은 Shim에 의해 공식적으로 지원되는 기능이 아니며, 구체적으로 특정 주소의 메모리를 패치하는 목적으로 악성코드 제작자가 직접적으로 구현하여 sdb 파일을 생성한다.

 

[그림3] - 생성된 악성 sdb의 구조

 

이 특정 오프셋은 services.exe의 내부 함수인 ScRegisterTCPEndpoint() 함수로서 만약 services.exe 실행 중 해당 함수 호출 시에 이 함수 대신 셸코드가 실행되는 방식이다. 셸코드는 이전에 레지스트리에 등록한 인코딩 된 PE를 디코딩하여 메모리 상에서 실행시켜 준다.

 

[그림4] - services.exe의 메모리 상에서 패치할 오프셋 주소

 

[그림5] - 해당 오프셋은 함수 ScRegisterTCPEndpoint()이다

 

참고로 ScRegisterTCPEndpoint() 함수의 오프셋은 운영체제의 버전마다 다를 수 있기 때문에 악성코드에서는 sdb 파일을 만들 때 직접 해당 오프셋을 구한 후 생성한다. 먼저 윈도우의 시스템 경로에서 services.exe를 메모리로 읽어들인다.

 

[그림6] - services.exe를 직접 읽어들이는 루틴

 

이후 ScRegisterTCPEndpoint() 함수의 특징이라고 할 수 있는 하드코딩된 문자열 "DisableRPCOverTCP"를 찾는다. 이 문자열은 함수 ScRegisterTCPEndpoint() 함수의 끝에 위치한다. 이후 이 위치를 시작으로 위로 탐색하며 함수의 시작 루틴을 구한다.

 

[그림7] - ScRegisterTCPEndpoint() 함수의 끝에 위치하는 하드코딩된 문자열

 

Shim은 프로세스가 생성될 때 적용된다. 현재 대상이 Services.exe이므로 이후 재부팅 시에 악성 sdb가 적용되어 악성 행위가 수행된다. 또한 악성 행위를 수행하는 주체는 결국 정상 시스템 프로세스인 services.exe가 된다.

 

백도어 악성코드는 감염된 시스템의 기본 정보를 습득한 후 C2 서버로 전송하며, C2와의 연결이 확립된다면 이후 명령을 수행할 수 있다. 명령에는 파일 조회, 생성 및 삭제, Pipe를 통하여 CMD 명령 수행 및 그 결과를 다시 C2로 전송하는 백도어의 기본적인 기능들이 존재한다.

 

[그림8] - 감염 된 시스템의 정보를 직접 구하는 루틴

 

이에 따라 Ammyy 백도어에 의해 이미 악성 sdb 파일이 시스템에 설치되었다면 Ammyy, Injector 등의 악성코드들 외에 설치된 sdb 파일도 치료되어야 하며, 그렇지 않으면 백도어는 재부팅 이후 정상 프로세스인 services.exe 내부에서 동작하게 된다. 즉 명령을 받아 악성 행위를 수행하는 백도어 주체가 services.exe가 됨에 따라 시스템의 감염 사실을 인지하기 힘들게 된다.

 

이러한 sdb를 이용한 공격 방식은 공격 그룹 FIN7, 또는 다른 이름으로 Carbanak이 사용했던 기법과 유사하다.
https://www.fireeye.com/blog/threat-research/2017/05/fin7-shim-databases-persistence.html

 

자사 제품에는 이러한 sdb 파일들에 대한 제네릭(Generic)한 진단이 반영되어 "sdbinst.exe" 프로세스를 통해 해당 sdb 파일이 동작되기 전 사전 차단이 가능하다.

 

이와 관련한 자사의 진단명들은 아래와 같다.

 

진단명

- FlawedAmmyy RAT : Backdoor/Win32.Flawedammyy
- sdb
설치 악성코드 : Trojan/Win32.Loader, Trojan/Win32.Injector
-
악성 sdb 파일 : BinImage/Sdb.Gen, BinImage/Malsdb.S1, BimImage/Malsdb.S2
-
백도어 악성코드 : Backdoor/Win32.Agent

 

행위탐지 진단명

- Malware/MDP.SystemManipulation.M2265