칼림 백도어 악성코드 분석 보고서

이 보고서는 칼림 백도어 악성코드의 기능에 대해 다룹니다.
목차:
- 백도어란?
- 기술적 분석.
- 요약.
- 전술 및 기법 (MITRE ATT&CK).
- 침해 지표 (IOC).
- 야라 규칙.
백도어(Backdoor)란 무엇인가?
백도어는 정상적인 인증 및 보안 제어를 우회하여 시스템에 접근할 수 있는 숨겨진 방법입니다.
기술적 분석:
기본 정적 분석:
먼저 초기 분석을 위해 VirusTotal에 업로드합니다. 결과에 따르면 파일은 64비트 DLL이며, Kalim 악성코드 패밀리로 식별됩니다. 또한 여러 탐지 결과에서 MuddyWater 위협 그룹과의 연관 가능성이 제기됩니다.
일부 파일을 드롭합니다:

이제 Die(Detect it Easy)에서 열어봅니다:
샘플은 많은 수의 Windows API를 임포트하며, 이는 패킹되지 않았음을 나타냅니다. 총 6개의 DLL(KERNEL32.dll, USER32.dll, ADVAPI32.dll, SHELL32.dll, ole32.dll, WININET.dll)에서 함수를 임포트합니다.
각 DLL에서 여러 API가 임포트되지만, 악성코드의 행동에서 중요한 역할을 하는 몇 가지 함수가 특히 주목할 만합니다.
고급 정적 분석:
DllMain에서 수행되는 유일한 작업은 새 스레드를 생성하는 것입니다. 이 스레드 내에서 두 개의 함수인 sub_1800063A0와 StartAddress가 실행됩니다.
sub_1800063A0 함수를 분석한 결과, 두 개의 개별 단계로 구성되어 있음을 발견했습니다. 첫 번째 단계에서 악성코드는 자신의 복사본을 AppData\Roaming 디렉터리에 드롭합니다. 이를 위해 Updates라는 새 하위 디렉터리를 만든 후 update.exe라는 실행 파일을 생성합니다. 이 파일에 기록되는 바이너리 페이로드는 unk_18002AA10에 위치한 임베디드 데이터에서 직접 가져옵니다. 결과적으로 최종 파일은 "C:\Users<사용자명>\AppData\Roaming\Update\update.exe" 경로에 기록됩니다.
StartAddress 함수 분석
악성코드는 세 가지 개별 함수를 통해 네트워크 통신 로직을 구현하고 두 개의 별도 스레드를 생성합니다. 하나의 스레드는 명령 셸을 생성하고 관리하는 역할을 하며, 두 번째 스레드는 악성코드 실행 완료 후 수집된 데이터를 업로드하는 역할을 합니다.
세 가지 함수는 감염된 호스트와 명령 및 제어(C2) 서버 간의 통신을 총괄하며, 세 개의 논리적 계층으로 구성됩니다.
첫 번째 계층은 손상된 시스템에서 호스트 기반 핑거프린팅 정보를 수집하는 역할을 합니다. 두 번째 계층은 이 데이터를 암호화하고 전송을 위한 추가 조작을 수행하여 처리합니다. 세 번째 계층은 C2 도메인 moodleuni[.]com과 네트워크 통신을 설정하고 처리된 데이터를 전송합니다.
처음 두 개의 네트워크 관련 함수는 특히 인증 및 HTTP POST 요청 구성, 그리고 원격 서버로의 인증된 데이터 전송을 가능하게 합니다.
세 번째 함수는 C2 서버로부터 명령을 수신하는 역할을 합니다. 서버의 응답에 따라 악성코드는 다음 동작을 결정합니다—즉, 숨겨진 명령 셸을 생성하거나 C2로부터 받은 명령에 따라 수집된 데이터를 업로드합니다.
두 스레드를 분석하여 각각의 기능을 완전히 이해합니다.
첫 번째 스레드에서 악성코드는 작업 개체(Job Object)와 두 개의 파이프를 생성한 후 특정 속성을 설정합니다.
그런 다음 일부 속성을 가진 CMD를 생성합니다:
네 번째 인수의 값 1은 CMD가 파이프 핸들을 상속할 수 있음을 의미합니다.
다섯 번째 인수의 값 0x1000200u는 CMD에 다음이 있음을 의미합니다:
CREATE_NO_WINDOW = 0x0000000u
CREATE_NEW_PROCESS_GROUP = 0x0000200u
CREATE_UNICODE_ENVIRONMENT = 0x0000400u
셸을 생성한 후 작업 개체에 할당하고 C2로부터 명령을 기다리며 대기 상태로 전환합니다.

셸은 공유 메모리를 통해 전송된 제어 명령을 확인합니다:
Pending: 정상 실행.
Terminate: 셸 종료 및 정리. 셸이 완전히 파괴되고 재설정됩니다.
Ctrlc: 남아있는 모든 자식 프로세스를 강제 종료합니다.
정상 작동에서는 명령이 존재하면 해당 명령을 CMD에 쓰고 PeekNamedPipe를 사용하여 출력을 확인한 후 버퍼에 저장합니다.

두 번째 스레드.
스레드는 지정된 경로에 새 파일을 생성하는 것으로 시작합니다. 이 파일은 C2 서버에 업로드되기 전에 데이터를 임시로 저장하는 데 사용됩니다. 파일을 생성할 수 없거나 초기화 중 오류가 발생하면 함수는 공유 메모리에 상태 문자열 "error"를 설정하고 종료됩니다. 파일은 사용자 정의 헤더와 세션 식별자를 사용하여 합법적인 트래픽처럼 위장한 HTTPS를 통해 악성코드의 명령 및 제어 서버(moodleuni[.]com)로 전송됩니다. 업로드가 완료되면 함수는 공유 메모리를 업데이트하여 성공 또는 실패를 나타냅니다:
- 업로드 실패 시 "error".
- 업로드 성공 시 "done".
요약:
칼림 백도어 악성코드는 먼저 지속성을 확보하여 피해 시스템에 장기간 존재하는 것을 목표로 합니다. 이를 위해 시작 디렉터리(CSIDL_STARTUP) 내에 악성 바로 가기를 생성합니다:
C:\Users<사용자명>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
이 메커니즘은 시스템이 부팅될 때마다 악성코드가 자동으로 실행되도록 보장합니다.
지속성이 확보되면 악성코드는 명령 및 제어(C2) 서버인 moodleuni[.]com과의 통신을 시작합니다. 초기 인증 및 시스템 핑거프린팅 단계를 수행하며, 이 동안 호스트 기반 정보를 수집, 처리 및 암호화합니다. 그런 다음 악성코드는 명령 대기 상태에 진입하여 지속적으로 C2의 명령을 폴링합니다.
수신된 명령에 따라 악성코드는 동적으로 다음 동작을 결정할 수 있으며, 여기에는 대화형 제어를 위한 숨겨진 명령 셸 생성 또는 수집된 데이터를 C2 서버로 업로드하는 것이 포함됩니다. 이 모듈식 설계는 원격 명령 실행과 데이터 유출을 모두 가능하게 하여 칼림을 유연하고 지속적인 백도어로 만듭니다.
전술 및 기법 (MITRE ATT&CK):
침해 지표(IOC):
- 패밀리 이름: Kalim
- 위협 행위자: MuddyWater
- SHA256 = 0c8071494bc155c96f2cee998200f63efffcb5a064c021de0925504271806229
- C2 = moodleuni[.]com
- MicrosoftUpdateSerice.lnk
- 150.171.27.12 (VirusTotal에서 확인)
야라 규칙(Yara rule):
rule kalim{
meta:
description = "Kalim 악성코드 탐지"
author = "SalahEldin Fikri"
strings:
$m1 = "kalim.pdb" wide ascii
$s1 = "UPLOAD"
$s2 = "isHidden"
$s3 = "/command"
$s4 = "sleepTime"
$s5 = "hardwareId"
$s6 = "pending"
$s7 = "ctrlc"
$s8 = "terminate"
$s9 = { 8D 01 02 04 08 10 20 40 80 1B 36 }
$s10 = "KifHsNH6Xhgyebsr"
condition:
uint16(0) == 0x5A4D and
filesize < 500KB and
($m1) and
7 of ($s*)
}