MS-SQL 서버를 공격하는 HiddenGh0st 악성코드

Gh0st RAT은 중국의 C. Rufus Security Team에서 개발한 원격 제어 악성코드이다. [1] 소스 코드가 공개되어 있기 때문에 악성코드 개발자들이 이를 참고하여 다양한 변종들을 개발하고 있으며 최근까지도 지속적으로 공격에 사용되고 있다. 비록 소스 코드가 공개되어 있지만 Gh0st RAT은 중국 기반의 공격자들이 주로 사용하는 것이 특징이다. 이전 블로그에서도 데이터베이스 서버(MS-SQL, MySQL 서버)를 대상으로 Gh0st RAT의 변종인 Gh0stCringe RAT이 유포된 사례를 공개한 바 있다. [2]

다양한 Gh0st RAT 변종들은 MS-SQL 서버를 대상으로 하는 공격에도 자주 사용된다. AhnLab Security Emergency response Center(ASEC)에서는 부적절하게 관리되고 있는 MS-SQL 서버를 대상으로 하는 공격을 모니터링하고 있으며 ASEC Report를 통해 분기 별 통계를 공개하고 있다. 통계는 Backdoor, Trojan, HackTool, CoinMiner 등 대분류에 맞게 악성코드들을 분류하고, 각 분류 내에서도 공격에 사용된 구체적인 악성코드들을 다룬다. 2023년 2분기 통계에 따르면 29.0%를 차지한 Gh0st RAT 변종은 Remcos RAT 다음으로 많은 공격 사례가 확인되었다. [3]

Figure 1. MS-SQL 서버 공격에 사용된 백도어 악성코드 통계 (2023년 2분기)

ASEC에서는 최근 부적절하게 관리되고 있는 MS-SQL 서버를 대상으로 Hidden 루트킷을 설치하는 Gh0st RAT이 유포되고 있는 것을 확인하였다. Hidden은 깃허브에 공개된 오픈 소스 루트킷으로서 자기 자신을 포함하여 파일 및 레지스트리 은폐 기능과 프로세스 보호 기능을 지원한다. [4] 이러한 기능들은 공격자들이 사용자로부터 악성코드 감염 여부를 숨기거나 악성코드를 삭제하는 것을 방해하는 목적으로 악용할 수 있다.

본 블로그에서는 Hidden 루트킷을 설치하는 Gh0st RAT 변종을 HiddenGh0st라고 분류한다. HiddenGh0st는 최소한 2022년 경부터 확인되기 시작해 최근까지도 유포되고 있다. 공격자가 추가한 기능들 중 중국어 사용자들이 주로 사용하는 QQ 메신저 정보 탈취 기능이 함께 포함된 것을 보면 중국어 사용자들을 주요 공격 대상으로 하는 것으로 추정된다.

Figure 2. MS-SQL 서버 프로세스에 의해 생성되는 HiddenGh0st


1. HiddenGh0st 분석

1.1. 초기 설정

HiddenGh0st는 파일 진단을 우회하기 위해 패킹된 상태로 유포된다. DATA 섹션에 암호화되어 있는 실제 PE를 복호화 한 이후 메모리 상에서 실행하는데 이때 0x848 크기의 설정 데이터도 함께 전달한다.

Figure 3. 복호화된 쉘코드 실행 시 전달하는 설정 데이터

전달되는 설정 데이터는 다음과 같으며 C&C 주소뿐만 아니라 설치 방식, 설치 경로 / 파일 이름, 루트킷 활성화 여부 등 다양한 설정들이 지원된다.

오프셋데이터설명
0x0000“leifenghackyuankong.e3.luyouxia[.]net”C&C 서버 주소
0x012CNULL사용되지 않음
0x02580x3960 (14688)C&C 서버 포트 번호
0x025C0x0EE0사용되지 않음
0x0260“6gkIBfkS+qY=”키로깅 파일 이름 (복호화 시 “Default”)
0x0292“tdC2pg==”버전 정보 (복호화 시 “1.0”)
0x02b2“QQ进程保护程序”서비스 이름 (서비스 모드)
0x0316“TX QQ”서비스 Display 이름 (서비스 모드)
0x0396SERVICE_DESCRIPTION서비스 설정 데이터 (서비스 모드)
0x0496“5750b8de793d50a8f9eaa777adbf58d4”BITS 서비스 레지스트리 설정 데이터
0x05980x0000External IP 조회 여부
0x059C0x0001설치 모드 #1 : 서비스
0x05A00x0000설치 모드 #2 : 시작 폴더
0x05A40x0000without Rootkit
0x05A8“%SystemRoot%\System32\”설치 경로 이름 (서비스 모드)
0x060C“QQ进程保护程序.exe”설치 파일 이름
0x063E0x0008덧붙일 더미 데이터의 크기
0x06400x0007악성코드 부여 속성 (서비스 모드)
FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM
0x0648NULL다운로드 URL 주소
Table 1. 초기 설정 데이터

설정 데이터 중에는 비활성화된 것들도 많으며 대표적으로 다운로더 쓰레드에서 사용하는 URL 주소가 있다. 공격자가 다운로드 URL 주소를 설정했다면 해당 HiddeGh0st 실행 시 외부에서 추가적인 악성코드를 설치하는 과정도 함께 수행되었을 것이다.

이외에도 비활성화된 설정 데이터 중에 감염 시스템의 공인 IP 주소를 얻어오는 기능을 활성화하는 설정도 있다. 만약 활성화되어 있을 경우에는 “http://www.taobao.com/help/getip.php” 주소에서 공인 IP 주소를 획득하여 C&C 서버에 전달할 데이터에 포함한다.


1.2. 설치 과정

1.2.1. 설치 모드 #1 – 서비스

설정 데이터에 지정된 설치 모드가 서비스 방식인 경우 먼저 HKLM\SYSTEM\Select 키의 MarkTime 값에 현재 악성코드가 설치된 시간을 저장한다. 악성코드는 이후 설정 데이터를 참고해 자신을 복사하고 서비스에 등록한다. 서비스 등록 시 “-auto” 인자를 지정하기 때문에 이후 서비스로서 동작하는 악성코드는 “-auto” 인자와 함께 실행된다.

Figure 4. 설치 시간이 저장된 MarkTime 값

참고로 설정 데이터 중에는 덧붙일 더미 데이터의 크기도 존재하는데 설정값이 0x0008인 경우 악성코드의 뒷부분에 0x00800000 크기의 더미 데이터를 덧붙이게 된다. 여기까지의 과정이 끝나면 서비스를 실행하고 다음과 같은 명령을 이용해 원본 파일을 삭제한다. 참고로 서비스로 동작할 경우 다시 자신을 인자 “-acsi”와 함께 실행한다. 여기까지의 과정이 끝나면 메인 루틴이 진행된다.

> C:\Windows\system32\cmd.exe /c ping -n 2 127.0.0.1 > nul && del [악성코드 경로] > nul

1.2.2. 설치 모드 #2 – 시작 폴더

악성코드 실행 시 전달되는 설정 데이터에서 설치 방식이 시작 폴더로 설정되어 있는 경우에는 서비스 등록 대신 시작 폴더에 복사하는 방식으로 지속성을 유지시킨다. 먼저 HKLM\SYSTEM\Select 키의 MarkTime 값에 설치 시간을 저장하는 것은 동일하다. 이후 현재 실행 중인 악성코드를 시작 폴더에 복사하는데 DefineDosDeviceA() API를 이용해 복사 대상 경로에 대한 심볼릭 링크를 생성하여 복사 과정에서 사용하는 것이 특징이다. 심볼릭 링크의 이름으로 “\.\agmkis2″라는 문자열이 사용된다.

Figure 5. 심볼릭 링크를 이용한 파일 복사

이후 복사한 악성코드에 숨김 속성을 부여하고 설정에 맞게 더미 데이터를 추가한다. 여기까지의 과정이 끝나면 복사한 악성코드를 실행하고 원본 악성코드는 자가 삭제한다.


1.3. 감염 시스템 정보 전달

HiddenGh0st는 일반적인 Gh0st RAT과 유사하게 C&C 서버와 통신이 확립된 이후 감염 시스템의 기본적인 정보들을 수집해 전송한다.

오프셋수집 데이터
0x00000x66
0x0004윈도우 버전 정보
0x00A0CPU 속도
0x00A4CPU 개수
0x00A8공인 IP 주소
0x00AC사설 IP 주소
0x00B0감염 시스템 호스트 이름
0x01B0웹캠 개수
0x01B4인터넷 연결 지연 시간
0x01B8네트워크 인터페이스 속도
0x01BC메모리 용량
0x01C0로컬 디스크 용량
0x01C4“Default” 문자열 (설정 데이터에서 복호화) 또는 BITS 서비스 레지스트리의 “5750b8de793d50a8f9eaa777adbf58d4” 값
0x01F6시스템 부팅 시간
0x0216“1.0” (버전)
0x0236설치된 보안 제품 목록
0x0268Wow64 여부
0x026C악성코드 설치 시간 (MarkTime)
0x029E로그인한 QQ 메신저 번호
0x03A0최근 키 입력 시간이 3분 이상 지났는지 여부
0x03A4인터넷 연결 상태 (MODEM, LAN, PROXY)
Table 2. C&C 서버에 전달하는 정보 목록

설치된 보안 제품 정보는 현재 실행 중인 프로세스들의 이름을 구해서 다음과 같은 키워드를 갖는지를 검사하는 방식으로 구한다.

“360tray.exe”, “360sd.exe”, “kxetray.exe”, “KSafeTray.exe”, “QQPCRTP.exe” ,”HipsTray.exe” ,”BaiduSd.exe” ,”baiduSafeTray.exe” ,”KvMonXP.exe” ,”RavMonD.exe” ,”QUHLPSVC.EXE” ,”QuickHeal” ,”mssecess.exe” ,”cfp.exe”, “SPIDer.exe”, “DR.WEB”, “acs.exe”, “Outpost”, “V3Svc.exe” ,”AYAgent.aye” ,”avgwdsvc.exe” ,”AVG” ,”f-secure.exe” ,”F-Secure” ,”avp.exe” ,”Mcshield.exe”, “NOD32”, “knsdtray.exe”, “TMBMSRV.exe”, “avcenter.exe”, “ashDisp.exe” ,”rtvscan.exe” ,”remupd.exe” ,”vsserv.exe”, “BitDefender”, “PSafeSysTray.exe”, “ad-watch.exe”, “K7TSecurity.exe”, “UnThreat.exe”, “UnThreat”

HiddenGh0st가 C&C 서버에 전송하는 데이터로는 이외에도 현재 실행 중인 QQ 메신저의 QQ 번호가 있다. QQ 메신저의 주 사용층은 주로 중국어를 사용할 수 있는 사용자들이기 때문에 공격자의 주 공격 대상이 중국어 사용자들인 것으로 추정된다.

Figure 6. QQ 메신저에서 QQ 번호를 구하는 루틴

HiddenGh0st는 이렇게 구한 0x3BC 크기의 데이터를 압축하고 이후 0x0F 크기의 데이터를 앞에 덧붙인다. 덧붙이는 데이터로는 시그니처 문자열 “hx ”, 보낼 데이터의 크기, 원본 데이터의 크기 등의 정보가 있다. 원본 Gh0st RAT은 이름과 같이 C&C 서버와의 통신에 “Gh0st”라는 시그니처 문자열을 사용하였다. 하지만 소스 코드가 공개되어 있는 Gh0st RAT은 수많은 변종들이 존재하며 과거 Gh0stCringe RAT도 “xy “를 시그니처 문자열로 사용하였다.

오프셋사이즈데이터설명
0x000x03“hx “시그니처 문자열
0x030x040x000000AB보낼 데이터의 사이즈 (압축 파일의 크기인 0x9C + 0x0F)
0x070x040x000003BC원본 데이터의 크기
0x0B0x040x00000002하드코딩
Table 3. 전달되는 데이터 (암호화 이전)

데이터는 최종적으로 암호화 과정을 거쳐 C&C 서버에 전달된다.

Figure 7. 패킷 암호화 루틴
Figure 8. C&C 서버와의 통신 패킷


1.4. 명령 수행

공격자는 HiddenGh0st를 제작할 때 기존 Gh0st RAT을 기반으로 제작하였기 때문에 FileManager, ScreenManager, KeyboardManager, SystemManager, ShellManager 등 기존 Gh0st RAT에서 지원하는 기본적인 명령들을 지원한다. 물론 HiddenGh0st가 지원하는 명령들은 훨씬 많다. 다음은 C&C 서버로부터 전달받아 수행할 수 있는 명령들에 대한 목록이며 대분류만을 정리하였기 때문에 실제 각 명령에서 담당하는 기능들은 훨씬 많다. 명령들 중 쓰레드로 동작하면서 C&C 서버에 지속적으로 데이터를 전달하는 명령들은 C&C 서버의 80번 포트를 이용한다.

명령기능
0x00대기
0x01[FileManager] 파일 관리 : 파일 조회, 업로드, 다운로드, 삭제, 이름 변경, 실행, WinRAR를 이용한 압축 해제 등
0x08채팅
0x0A서비스 관리 : 서비스 조회, 시작, 삭제, 설정 변경 등
0x0B프로세스 검사 : 현재 실행 중인지 여부
0x0C윈도우 검사 : 현재 실행 중인지 여부
0x10[ScreenManager] 스크린 캡쳐, 클립보드 탈취 및 변경
0x1C파일 실행
0x1D탐색기(explorer.exe) 종료
0x1EInternet Explorer 캐시 삭제
0x1F포트 포워딩
0x2D[KeyboardManager] 키로거
0x33오디오 출력
0x34QQ 메신저 정보 탈취
0x36[SystemManager] 시스템 관리 : Gh0st RAT에서 지원하는 프로세스 / 윈도우 목록 수집, Dialup 계정 정보 탈취, 프로세스 종료 기능들. 그리고 명령 실행, 쓰레드 제어, 호스트 파일 수집 / 변조 등
0x48메시지 팝업
0x49HKLM\SYSTEM\CurrentControlSet\Services\BITS / 5750b8de793d50a8f9eaa777adbf58d4 값 설정
0x4A[ShellManager] 원격 셸 : Gh0st RAT에서 지원하는 원격 셸 기능. 그리고 미미카츠를 이용한 계정 정보 탈취
0x4B컴퓨터 종료
0x4C재실행
0x4D언인스톨
0x4E이벤트 클린업
0x52Etc : CD-ROM 열기 / 닫기, 작업 표시줄 숨기기 / 보이기, 마우스 좌우 버튼 바꾸기 등
0x60외부에서 파일 다운로드 및 실행
0x62악성코드를 시작 폴더에 복사
0x63해상도 설정
0x64파일 생성 및 실행 (HIDE)
0x65파일 생성 및 실행 (SHOW)
0x66플러그인 설치 : plugin.dll 파일을 다운로드해 실행
0x67URL 접속 : 인터넷 익스플로러를 이용해 특정 사이트에 접속 (HIDE)
0x68URL 접속 : 인터넷 익스플로러를 이용해 특정 사이트에 접속 (SHOW)
0x69HKLM\SYSTEM\Setup / Host 값 설정
0x6A대기
0x6D원격 제어 관련 : 원격 데스크톱 활성화 / 비활성화, 원격 데스크톱 포트 번호 변경, 게스트 계정 활성화, 인터넷 공유 활성화, 사용자 계정 설정 / 삭제 등
0x82레지스트리 관리
0x8A플러그인 관련 추정 : 파일 조회, 다운로드 / 업로드, 메모리 상에서 로드하여 실행
Table 4. HiddenGh0st가 지원하는 명령 목록

HiddenGh0st는 다양한 기능들을 제공하다 보니 원본 Gh0st RAT이 지원하거나 기본적인 RAT 악성코드들이 지원하는 기능들 외에도 여러 가지 특징들이 존재한다.

최초 실행 시점에 인자로 전달받은 설정 데이터에서 인코딩된 문자열은 두 개였다. 하나는 “1.0” 문자열로서 악성코드의 버전 정보로 추정되며 다른 하나는 “Default” 문자열로서 이후 감염 시스템에 대한 정보를 C&C 서버에 전달할 때 함께 전달되는 것으로 보아 악성코드의 식별자로 추정된다. 공격자가 키로거 명령을 활성화할 경우 수집한 키로깅 데이터는 %SystemDirectory% 경로에 저장되는데 이때 “Default” 문자열을 복호화 하기 이전 문자열인 “6gkIBfkS+qY=.key”라는 이름이 파일명으로 사용된다.

Figure 9. 키로깅 데이터가 저장되는 위치

HiddenGh0st는 미미카츠를 설치해 감염 시스템의 계정 정보를 탈취할 수 있는 기능을 가지고 있다. 원본 Gh0st RAT에서 원격 셸 기능을 담당하는 ShellManager 클래스에는 원격 셸 외에도 “GetMP.exe”라는 이름으로 미미카츠를 설치한 후 다음과 같은 명령을 실행하는 명령이 함께 포함되어 있다. 악성코드는 이러한 과정을 통해 수집한 감염 시스템의 계정 정보를 C&C 서버에 전송한다.

> GetMP privilege::debug sekurlsa::logonpasswords exit\r\n
Figure 10. 미미카츠 실행 루틴

새롭게 추가된 명령 중에는 RDP를 이용한 원격 제어와 관련된 기능들이 많다. 감염 시스템에서 원격 데스크톱이나 인터넷 공유 기능을 활성화하거나 원격 데스크톱의 포트 번호를 변경할 수 있으며 다음과 같은 명령을 이용해 게스트 계정을 활성화하고 관리자 그룹에 등록하는 기능도 존재한다.

> net user guest /active:yes && net user guest 123456 && net localgroup administrators guest /add
Figure 11. 원격 데스크톱을 활성화하고 포트 번호를 변경하는 루틴

이외에도 인터넷 익스플로러의 캐시를 삭제하는 명령이나 CD-ROM을 열거나 닫는 명령이라든지 작업 표시줄을 숨기고 마우스 좌우 버튼을 바꾸는 등 과거 RAT 악성코드들에서 지원할 만한 기능들도 포함되어 있다.

> cmd.exe /c RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255

구체적인 목적은 확인되지 않지만 명령들 중에는 다음과 같은 레지스트리 키의 값을 설정하는 기능이 존재한다. 만약 공격자의 명령을 통해 “5750b8de793d50a8f9eaa777adbf58d4” 값이 설정되어 있을 경우에는 HiddenGh0st가 C&C 서버에 전달하는 기본 정보에 함께 포함되어 전송된다.

  • HKLM\SYSTEM\CurrentControlSet\Services\BITS / 5750b8de793d50a8f9eaa777adbf58d4
  • HKLM\SYSTEM\Setup / Host
Figure 12. 공격자로부터 전달받은 데이터가 써지는 레지스트리 키


2. HiddenGh0st의 루트킷 분석

Hidden은 깃허브에 공개된 오픈 소스 루트킷 드라이버로서 최신 운영체제에서 제공하는 미니 필터 드라이버와 커널 콜백 함수들을 이용해 파일 및 레지스트리를 은폐하고 프로세스를 보호한다. 이러한 기능들 때문에 공격자는 악성코드를 은폐하고 악성 프로세스를 종료할 수 없도록 Hidden 드라이버를 악의적인 목적으로 사용하기도 한다. 실제 코인 마이너 악성코드인 PurpleFox도 Hidden을 커스터마이징하여 공격에 사용함으로써 악성코드를 은폐하고 치료를 방해하였다. [5]

HiddenGh0st는 내부에 포함된 Hidden 루트킷을 실행 과정에서 설치하여 백도어 기능을 담당하는 악성코드를 은폐하고 보호하는 목적으로 사용한다. 여기에서는 먼저 Hidden 루트킷에 대한 기본적인 기능을 분석한 후 HiddenGh0st가 Hidden을 사용하는 과정을 정리한다.


2.1. Hidden 루트킷 분석

2.1.1. 기본 동작

Hidden은 먼저 설치 레지스트리에 등록된 Config를 읽는다. 해당 레지스트리 값들은 루트킷 드라이브가 로드될 때 자동으로 읽어와 적용하는 설정 데이터들이다. 예를 들어 다음과 같이 설정된 레지스트리 값들은 4가지 명령을 전달하기 위해 생성되었다.

Figure 13. 명령이 포함된 설정 데이터

초기 설정 데이터를 읽어온 후에는 프로세스 모니터, 미니 필터, 레지스트리 필터 등의 초기화 과정을 거친다. 각각의 초기화 과정이 끝나면 읽어온 설정 데이터에 따라 보호 및 은폐 기능을 수행한다. 마지막으로 은폐 설정 즉 위의 레지스트리에서 설정 가능한 “Hid_StealthMode” 값을 참고하여 Stealth Mode를 진행할 수 있는데 이는 드라이버 자체에 대한 은폐를 담당한다. Stealth Mode는 Hidden의 파일 및 레지스트리 키를 은폐시켜 주며 이에 따라 해당 서비스를 정지시키는 것도 불가능하다. 대신 HiddenCLI.exe라는 도구를 이용해 명령을 전달하여 드라이버를 비활성화시킨 후 복구시킬 수 있다.

레지스트리기능
Hid_State드라이버 활성화
Hid_StealthMode자가 은폐 모드
Hid_HideFsDirs디렉터리 은폐
Hid_HideFsFiles파일 은폐
Hid_HideRegKeys레지스트리 키 은폐
Hid_HideRegValues레지스트리 값 은폐
Hid_IgnoredImages예외 프로세스 지정
Hid_ProtectedImages보호 프로세스 지정
Hid_HideImages프로세스 은폐
Table 5. Hidden이 참조하는 레지스트리 명령

참고로 HiddenCLI.exe는 Hidden 드라이버에 명령을 전달할 때 다음과 같은 IOCTL을 사용한다.

IOCTLNumber기능
HID_IOCTL_SET_DRIVER_STATE0x800드라이버 상태 설정 (활성화 / 비활성화)
HID_IOCTL_GET_DRIVER_STATE0x801현재 드라이버 상태 반환
HID_IOCTL_SET_STEALTH_MODE0x802스텔스 모드 설정
HID_IOCTL_ADD_HIDDEN_OBJECT0x83C은폐 대상 추가
HID_IOCTL_REMOVE_HIDDEN_OBJECT0x83D은폐 대상 제거
HID_IOCTL_REMOVE_ALL_HIDDEN_OBJECT0x83E모든 은폐 대상 제거
HID_IOCTL_ADD_OBJECT0x846예외 / 보호 프로세스 추가
HID_IOCTL_GET_OBJECT_STATE0x847예외 / 보호 프로세스 상태 반환
HID_IOCTL_SET_OBJECT_STATE0x848예외 / 보호 프로세스 상태 설정
HID_IOCTL_REMOVE_OBJECT0x849예외 / 보호 프로세스 제거
HID_IOCTL_REMOVE_ALL_OBJECT0x84A모든 예외 / 보호 프로세스 제거
Table 6. Hidden이 명령 전달에 사용하는 IOCTL 번호 목록

2.1.2. 파일 은폐

Hidden은 파일 은폐를 위해 파일 시스템 미니 필터 드라이버를 사용한다. 파일 시스템 필터 드라이버는 윈도우에서 제공하는 커널 모드 구성 요소로서 파일 시스템 요청들에 대한 모니터링 및 수정과 같은 제어를 제공해 준다. 파일 시스템 요청들로는 파일 및 디렉터리에 대한 오픈, 읽기, 수정 행위들이 있다. 미니 필터 드라이버는 윈도우의 필터 관리자를 이용해 파일 시스템을 제어할 수 있는 모델로서 이를 이용하여 위에서 언급한 바와 같이 커널 모드 후킹 방식을 사용하지 않고 파일 관련 행위를 모니터링 및 제어할 수 있다.

Hidden에서 모니터링 대상이 되는 I/O 동작은 IRP_MJ_CREATE 와 IRP_MJ_DIRECTORY_CONTROL 이다. IRP_MJ_CREATE는 파일이나 디바이스 객체에 대한 핸들을 오픈할 때 발생하며 Hidden은 해당 요청에 대한 Pre Operation 콜백을 등록한다. IRP_MJ_DIRECTORY_CONTROL은 디렉터리를 조회할 때 발생하며 Pre Operation 및 Post Operation에 대한 콜백을 등록한다.

IRP_MJ_CREATE를 모니터링하면서 핸들 오픈 대상 파일 및 디렉터리의 이름이 은폐 대상 목록에 존재할 경우에는 STATUS_NO_SUCH_FILE을 반환시키는 방식으로 접근을 막는다. 디렉터리 조회의 경우 IRP_MJ_DIRECTORY_CONTROL를 모니터링하면서 은폐 대상 목록에 해당할 경우 요청의 결과로 받아온 정보에서 은폐 대상 파일 및 디렉터리를 제거함으로써 사용자가 인지할 수 없게 한다.

Figure 14. 은폐 대상의 경우 STATUS_NO_SUCH_FILE을 반환

필터 관리자는 미니 필터 드라이버를 등록할 때 각각의 미니 필터 드라이버 별로 고유한 고도(Altitude)에 로드한다. 미니필터 드라이버는 중복된 값을 가질 경우 로드할 수 없으며 마이크로소프트는 드라이버 파일들에 대해 이러한 고도를 관리하고 있다. 참고로 Hidden은 공식적으로 서명되어 등록된 드라이버는 아니지만 오픈 소스에서는 370030을 고도로 사용하고 있다. ( passThrough.sys 라는 마이크로소프트의 예제 미니필터 드라이버의 고도와 동일한 값 )

Figure 15. Hidden.inf 파일에서 확인 가능한 Altitude

2.1.3. 프로세스 보호 및 은폐

Hidden은 프로세스 보호 기능을 제공하며 이러한 동작을 위해 ObRegisterCallbacks() 함수를 이용한다. 이 함수는 프로세스 및 쓰레드 객체에 대한 특정한 사전 / 사후 동작에 관한 통지를 받는 Callback 루틴을 등록한다. 즉 각 객체에 대한 핸들의 생성 및 복사 등의 동작에 대해 Callback 루틴을 등록하여 관련 동작이 이루어질 때마다 등록된 Callbkack 루틴이 먼저 호출되는 방식으로 제어를 제공한다. ObRegisterCallbacks() 함수는 미니 필터 드라이버와 같이 Altitude를 지정해야하며 1000을 지정하는 것이 특징이다.

ObRegisterCallbacks() 함수 호출 시 지정하는 OB_OPERATION_REGISTRATION 구조체를 보면 프로세스와 쓰레드에 대한 핸들 생성 및 복사와 관련한 (OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE) 사전 동작에 대해서 (ProcessPreCallback, ThreadPreCallback) 콜백 함수들을 등록하는 것을 확인할 수 있다. 이 Callback 함수에서는 다음과 같이 보호 대상 프로세스의 핸들을 얻을 때 설정했던 접근 권한을 최소 권한으로 수정함에 따라 메모리 읽기 / 쓰기 및 프로세스 종료와 같은 작업을 수행할 수 없도록 한다

Figure 16. 권한 변경 루틴

참고로 Hidden이 지원하는 명령 중에는 지정한 특정 프로세스를 은폐 대상에서 제외하는 기능도 존재하는데, 이러한 예외 프로세스들을 관리하기 위해 따로 프로세스 테이블을 관리한다. 이 테이블은 PsSetCreateProcessNotifyRoutineEx() 함수를 이용해 프로세스의 생성과 종료를 모니터링하는 방식으로 구현한다.

HiddenGh0st가 사용하는 루트킷에는 포함되어 있지 않지만 소스 코드에는 DKOM(Direct Kernel Object Manipulation)을 이용한 프로세스 은폐 기능을 지원한다. 윈도우 커널은 프로세스를 관리하기 위해 ‘EPROCESS’라는 구조체를 사용한다. EPROCESS는 이중 연결 리스트 구조로 서로 다른 프로세스끼리 연결되어 있는데, 루트킷은 숨길 대상의 프로세스 PID를 인자로 받아 해당 프로세스의 EPROCESS에 접근하여 Flink와 Blink에 연결된 프로세스를 확인한다. 다음으로 자신에게 연결된 앞, 뒤 프로세스를 서로 연결시키고 자신의 Flink와 Blink는 자신을 가리키도록 하여 EPROCESS의 이중 연결 리스트에 포함되지 않도록 하는 방식이다.

Figure 17. Hidden 소스 코드에서 지원하는 프로세스 은폐 기능

2.1.4. 레지스트리 은폐

Hidden은 레지스트리 키와 값이 대한 은폐 기능을 제공하며 이러한 동작을 위해 CmRegisterCallbackEx() 함수를 이용한다. 이 함수는 레지스트리 Callback 루틴을 등록하는 함수로서 레지스트리 관련 동작이 이루어질 때마다 등록된 콜백 루틴이 먼저 호출되는 방식으로 제어를 제공한다. CmRegisterCallbackEx() 함수도 미니 필터 드라이버처럼 Altitude를 지정해야 하며 Hidden에서는 임의의 값인 320000을 지정한다

Hidden은 콜백 함수 내부에서 다음과 같이 10개의 레지스트리 동작들에 대해 모니터링을 수행한다. 각각의 함수들에서는 각 동작의 대상이 되는 레지스트리 키 및 값들이 은폐 명령에 의해 보호되고 있는지와 호출하는 주체가 예외 프로세스인지 여부에 따라 STATUS_ACCESS_DENIED, STATUS_NOT_FOUND 와 같은 값을 반환하여 조회 시 에러를 발생시키거나 수정을 불가능하게 한다.

Figure 18. 모니터링 대상이 되는 레지스트리 동작 목록


2.2. HiddenGh0st의 Hidden 루트킷

HiddenGh0st는 DATA 섹션에 포함된 루트킷 파일을 “%SystemDirectory%\drivers\QAssist.sys” 경로에 생성하는데 x86, x64 아키텍처에 따라 각각의 루트킷을 설치한다. 이후 생성한 루트킷을 QAssist 서비스로 등록하고 NtLoadDriver() 함수를 이용해 드라이버를 로드한다.

Figure 19. 고도를 370030으로 설정하는 루틴

HicdenGh0st가 생성한 Hidden 루트킷과 원본 소스 코드와 차이점은 두 개 존재한다. 하나는 “Hid_StealthMode”를 읽어와 은폐 모드를 설정하는 루틴이 수정되어 해당 값이 설정되어 있지 않다고 하더라도 기본적으로 드라이버 로드 시 은폐 기능을 활성화한다는 점이다. 다른 하나는 프로세스 은폐 기능 즉 “Hid_HideImages” 설정이 비활성화되어 있다는 점이다. 참고로 이는 깃허브에 업로드된 Hidden 바이너리와 동일한데 개발자가 빌드 한 바이너리를 업로드한 이후에 프로세스 은폐 기능을 추가했기 때문이다.

HiddenGh0st가 설정하는 데이터는 IgnoredImages이며 서비스로서 동작하기 때문에 예외 프로세스로 서비스 프로세스를 지정하였다.

Figure 20. 등록된 QAssis 루트킷 서비스

기본 설정은 Hid_IgnoredImages 뿐이지만 이후에는 IOCTL 명령을 이용해 은폐 및 예외 대상을 지정한다. 먼저 HiddenGh0st 악성코드 파일과 레지스트리에 등록된 HiddenGh0st 서비스를 은폐 대상에 추가한다. 그리고 HiddenGh0st 프로세스와 시스템 프로세스 “lsass.exe”, “lsm.exe”, “audiodg.exe”를 예외 프로세스에 추가한다.

Figure 21. LSASS 프로세스를 예외 프로세스에 등록하는 명령


3. 결론

MS-SQL 서버를 대상으로 하는 공격에는 대표적으로 부적절하게 계정 정보를 관리하고 있는 시스템들에 대한 무차별 대입 공격(Brute Forcing)과 사전 공격(Dictionary Attack)이 있다. 관리자들은 계정의 비밀번호를 추측하기 어려운 형태로 사용하고 주기적으로 변경하여 무차별 대입 공격과 사전 공격으로부터 데이터베이스 서버를 보호해야 한다.

그리고 V3를 최신 버전으로 업데이트하여 악성코드의 감염을 사전에 차단할 수 있도록 신경 써야 한다. 또한 외부에 공개되어 접근 가능한 데이터베이스 서버에 대해 방화벽과 같은 보안 제품을 이용해 외부 공격자로부터의 접근을 통제해야 한다. 위와 같은 조치가 선행되지 않을 경우 공격자 및 악성코드들에 의해 계속적인 감염이 이루어질 수 있다.

파일 진단
– Malware/Win32.RL_Generic.R356012 (2020.11.22.01)
– Trojan/Win.Generic.C4446276 (2021.04.30.03)
– Malware/Gen.Generic.C3228648 (2019.05.09.04)

행위 진단
– Malware/MDP.Behavior.M29
– DefenseEvasion/MDP.Event.M1423

IOC
MD5

– 69cafef1e25734dea3ade462fead3cc9 : HiddenGh0st
– 0d92b5f7a0f338472d59c5f2208475a3 : Hidden x86 Rootkit (QAssist.sys)
– 4e34c068e764ad0ff0cb58bc4f143197 : Hidden x64 Rootkit (QAssist.sys)

C&C
– leifenghackyuankong.e3.luyouxia[.]net:14688

연관 IOC 및 관련 상세 분석 정보는 안랩의 차세대 위협 인텔리전스 플랫폼 ‘AhnLab TIP’ 구독 서비스를 통해 확인 가능하다.

0 0 votes
별점 주기
Subscribe
Notify of
guest

1 댓글
Inline Feedbacks
View all comments
trackback

[…] ASEC에서는 과거 Gh0st RAT의 변종인 Gh0stCringe RAT 악성코드가 데이터베이스 서버(MS-SQL, MySQL 서버)를 대상으로 이 유포된 사례를 공개한 바 있으며, [3] 이후에도 Hidden 루트킷을 함께 설치하는 Gh0st RAT 변종인 HiddenGh0st가 부적절하게 관리되고 있는 MS-SQL 서버를 대상으로 한 공격에 사용되었던 사례를 다루었다. [4] […]