Security/Reversing

한미우호협회 사칭 hwp 악성 파일 분석해보기 (EPS, 코드 인젝션)

고간디 2024. 5. 25. 03:22

분석 환경

  • OS: Windows 7
  • 한컴오피스 한글 2014

 

 


 

파일 정보

  • MD5: f2e936ff1977d123809d167a2a51cdeb
  • SHA256: 5d9e5c7b1b71af3c5f058f8521d383dbee88c99ebe8d509ebc8aeb52d4b6267b
  • Type: Hangul Word Processor document (hwp)
  • Size: 47.5KB (48,640 Bytes)

 

 


 

기초 정적 분석

VirusTotal

VirusTotal에서 hwp파일을 업로드해 기초 정적 분석을 진행할 수 있다.

 


한컴 공식 사이트

MS 오피스의 매크로 기능과 유사하게 한글에서도 OLE 개체를 삽입할 수 있다.

한글 2018 아래 버전의 경우 OLE 개체를 악용하여 피해를 발생시킬 수 있다.

북한 등에서 우리나라 외교 및 안보 공직자나 대북관련 종사자들을 대상으로 OLE를 이용한 공격을 많이 시도한다.

 

OLE 개체가 삽입된 한글의 문서 구조는 복합 파일 구조이다.

따라서 위 이미지처럼 내부적으로 스토리지와 스트림을 여러 개 갖는다.

 

하나의 스트림에는 바이너리나 레코드 구조로 데이터가 저장되고, 스트림에 따라 압축 및 암호화가 되어 있다.

BinData 바이너리 데이터의 경우 .zlib으로 압축되어 있다.

 


BinText

BinText로 doc.hwp 파일의 문자열을 참조한 결과이다.

본 악성코드의 BinData 스토리지에 BIN0001, BIN0002라는 이름의 사진과, BIN0003.eps라는 스트림이 있다.

이 파일들은 모두 .zlib으로 압축되어 저장되어 있다.

 

EPS 파일은 PostScript로 작성된 그래픽 이미지이다.

OLE 개체를 악용한 hwp 문서로 된 악성 코드는 대부분 이렇게 EPS 파일을 삽입하여 공격을 수행한다.

 


SSView

SSView에서 hwp 파일의 구조와 스트림 헥스값들을 볼 수 있다.

zlib으로 압축되어 있는 상태라서 EPS 파일을 보려면 zlib 압축을 해제해주어야 한다.

 

hwpscan2라는 프로그램을 이용하면 압축이 해제된 상태로 바로 헥스를 뜰 수 있지만 현재 해당 서비스가 유료화가 되어서 귀찮아도 수동으로 압축 해제를 해주어야 한다.

 


import zlib

indata = open( 'BIN0003.eps.stream', 'rb' ).read()
outdate = zlib.decompress(indata, -15)

f = open('decompr_BIN0003', 'wb')
f.write(outdata)
f.close()

위 파이썬 코드로 zlib 압축을 해제할 수 있다.


BIN0001.jpeg / BIN0002.jpeg

eps 파일 외에 함께 있었던 jpeg 파일들을 압축 해제하여 얻은 사진들이다.

 


eps 파일을 압축 해제하고 보니 ar 변수에 인코딩된 데이터 값들이 잔뜩 들어가있다.

get 100 xor put ar 이라는 스크립트가 있는 것으로 보아 100으로 ar에 XOR 연산을 수행하면 될 것 같다.

 


복호화 후 결과를 보니 인코딩된 데이터가 하나 더 들어가있는 것을 볼 수 있다.

label77에 909090...으로 시작하는 것으로 보아 NOP Slide들로 추정해볼 수 있다.

NOP는 명령을 수행하지 않고 메모리 공간을 먹기 때문에 쉘코드 앞에 NOP Slide를 적당히 써두면 쉘코드의 주소를 정확하게 알지 못 해도 쉘코드의 주소 오차 범위를 줄일 수 있다.

 

그렇다면 이 숫자들은 인코딩된 데이터 값들이 아니라 쉘코드인 것이다.

shellcode2exe.py를 이용하거나 SC2EXE 사이트에서 쉘코드를 exe 파일로 변환할 수 있다.

 


VirusTotal

VirusTotal에서 exe로 변환된 쉘코드를 탐지한 모습이다.

 

쉘코드를 layer77에 저장하고 XOR 변환한 데이터를 EPS에 두고 해당 EPS 파일을 hwp에 삽입한 것으로 보인다.

반복적인 XOR 연산을 통해 백신의 탐지를 피하는 것으로 추정된다.

 


PEview

중요하지 않은 내용이지만 만든 날짜가 2005년으로 되어 있다.

이후 동적 분석을 통해 얻어낸 다른 쉘코드의 만든 날짜도 2004년으로 찍혀 있다.

본 hwp 파일이 유포된 시기는 2019년인데 일부러 날짜를 조작한 것인지 아니면 실제로 2004년 2005년에 만들어진 파일을 수정한 것인지는 모른다.

 

 


 

기초 동적 분석

doc.hwp

hwp 파일을 열었을 때의 모습이다.

겉보기에는 의심 가는 부분 없이 정상적인 파일인 것처럼 보인다.

 


doc.hwp

BinData에서 추출했던 이미지 두 개를 확인할 수 있다.

다만, EPS 파일의 경우 '초청의 글'이라는 문구의 왼쪽 아래에 아주 작은 점으로 숨겨놓은 것을 볼 수 있다.

 

EPS 파일을 악용한 hwp 악성 파일에서 EPS 파일은 이렇게 아주 작게 교묘하게 숨어 있기도 하고 문서 밖을 벗어나도록 아주 큰 크기로 삽입해놓아 감지되기 쉽지 않도록 한다.

 


 

ProcessHacker2

한글 프로그램은 EPS 파일이 삽입된 문서를 읽을 때 gbb.exe과 gswin32c.exe를 순차적으로 실행한다.

두 파일 모두 한글의 내장 프로그램이다.

 

gbb.exe는 PostScript Interpreter로 EPS 파일을 로드한다.

gswin32c.exe는 GhostScript Interpreter의 GUI 버전으로 문서 위에 EPS 이미지를 띄운다.

Hwp.exe는 EPS 파일의 압축을 해제하고 임시 파일을 만든 후 해당 파일의 경로를 앞서 말한 두 exe파일에 인자로 전달한다.

이때 두 실행 파일은 gsdll32.dll 라이브러리를 로드하여 사용하는데 Type Confusion 취약점이 존재하는 .eqproc함수를 사용한다.

 

상단 이미지처럼 hwp 파일을 실행하자마자 gbb.exe와 gswin32c.exe가 순차적으로 실행되는 것을 Process Hacker로 확인할 수 있다.

만약 EPS 파일에 악성 코드가 로드되어 있다면 hwp 파일을 실행하자마자 바로 감염이 되는 것이다.

 


ApateDNS
WireShark

hwp 파일을 실행 후 ApateDNS를 보면 특정 주소를 가진 서버에 수신한 흔적을 찾을 수 있다.

C&C 서버로 추정되는데 현재는 열려 있지 않다.

 

WireShark에서도 hwp 파일 실행 후 여러 네트워크 로그들이 등장하지만 본인은 아직 잘 무슨 의미인지 모르겠다.

특정 서버와 수신한 흔적인 것은 분명하긴 한 것 같다..

 

 


 

고급 정적 분석

IDA

hwp에서 뽑아낸 EPS 파일을 exe 실행 파일로 변환했었는데 고급 정적 분석을 위해 IDA에 돌려봤다.

상단 이미지에서도 볼 수 있듯이 XOR 연산을 반복해서 수행하는 부분이 있는데 이 때문에 디스어셈블리가 잘 되지 않는다.

 

따라서 고급 정적 분석보다는 고급 동적 분석을 통해 유의미한 결과를 얻을 수 있을 것이라 생각된다.

 

 


 

고급 동적 분석

동적 분석을 위해 x32dbg로 분석을 진행했다.

 


x32dbg

IDA에서도 확인했듯이 XOR 연산이 반복되고 있다.

백신 탐지를 우회하기 위해 암호화가 되어 있는 것으로 유추해볼 수 있다.

 


(발표 사용 X) 사용할 라이브러리들을 로드 (동적으로 API를 찾아 사용)

 


kernel32.dll을 참조하는 것을 볼 수 있는데 CreateProcessA 함수로 이동하면 iexplore.exe를 실행하는 명령어를 볼 수 있다.

 


ProcessHacker2

CreateProcessA 함수에 BreakPoint를 걸고 Process Hacker를 보면 iexplore.exe가 대기 상태인 것을 확인할 수 있다.

 


WriteProcessMemory, CreateRemoteThread 함수들을 참조하고 있다.

 


WriteProcessMemory 함수에 BP를 걸고 살펴보도록 하자.

 


BOOL WriteProcessMemory(
  [in]  HANDLE  hProcess,
  [in]  LPVOID  lpBaseAddress,
  [in]  LPCVOID lpBuffer,
  [in]  SIZE_T  nSize,
  [out] SIZE_T  *lpNumberOfBytesWritten
);

WriteProcessMemory는 인자를 5가지 가진다.

함수 이름만 봐도 어떤 기능을 수행하는 함수인지 알 수 있다.

 


스택에서 인자들을 볼 수 있다.

A8 핸들의 0x70000 주소에다가 0x4014D3의 주소에 있는 덤프들을 덮어씌운다.

 


x32dbg

A8 핸들은 PID가 1840인 iexplore.exe인 것을 알 수 있다.

(사진이 다른 시기에 찍혔는데 이 아래부터 A8 핸들 iexplore.exe의 PID는 4584이다.)

 


ProcessHacker2

Process Hacker에서 메모리를 확인할 수 있다.

두 번째 인자로 전달되었던 0x70000주소의 덤프를 보면 0으로 가득 차서 아무것도 없는 상태이다.

 


x32dbg
ProcessHacker2

BP를 걸었던 WriteProcessMemory 함수를 실행시키면 이렇게 0x70000 주소에 덤프가 덮어씌워지는 것을 확인할 수 있다.

여기서 Save를 누르면 덮어씌워진 덤프를 받을 수 있다.

 


HANDLE CreateRemoteThread(
  [in]  HANDLE                 hProcess,
  [in]  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  [in]  SIZE_T                 dwStackSize,
  [in]  LPTHREAD_START_ROUTINE lpStartAddress,
  [in]  LPVOID                 lpParameter,
  [in]  DWORD                  dwCreationFlags,
  [out] LPDWORD                lpThreadId
);

CreateRemoteThread는 프로세스의 가상 주소 공간에서 실행되는 스레드를 만드는 함수이다.

 


A8 핸들에서 0x70000의 값을 전달하고 쓰레드를 만든다.

 


ProcessHacker2

CreateRemoteThread 함수를 실행하고 ProcessHacker를 보면 대기 상태였던 iexplore.exe가 실행 중으로 변하게 된다.

 

정리하자면 악성 코드를 iexplore.exe에 injection하여 실행하는 EPS 파일을 hwp 파일에 삽입한 것이다.

백신의 탐지를 피하기 위해 반복적인 XOR 연산을 하도록 한다.

 


VirustTotal

아까 iexplore.exe의 0x70000에 주입된 페이로드 덤프를 bin 파일로 받았었다.

이번에도 shellcode2exe.py나 SC2EXE 사이트를 이용해 exe 실행 파일을 얻는다.

 

VirusTotal에서도 감지된다.

 


이것도 XOR 연산을 반복하여 암호화되어 있지만 아까와 마찬가지로 BP만 잘 잡으면 된다.

LoadLibraryA 함수를 실행해야 참조하는 dll이나 함수들을 찾을 수 있다.

 

InternetOpenURL 등의 함수를 참조한다.

 


BinText

아까 얻은 덤프를 exe로 변환하기 전 bin 파일을 BinText로 본 것이다.

여기서도 C&C 서버로 추정되는 서버 주소를 볼 수 있다.

 

InternetOpenURL 함수를 사용했던 것으로 보아 iexplore에서 down.php를 다운 받거나 접속하도록 하는 것 같다.

 


지금까지의 모든 내용을 종합해보자.

 

iexplore.exe 프로세스에 코드 인젝션을 할 코드를 암호화하여 작성한다.

코드 인젝션을 수행하도록 하는 코드를 암호화와 함께 PostScript로 작성하여 EPS 파일로 만든다.

hwp 파일에 EPS 파일을 잘 안 보이게 삽입하여 정상적인 hwp 파일인 것처럼 유포한다.

 

C&C 서버로 추정되는 서버가 현재 닫혀 있기 때문에 down.php가 무엇인지 정체를 알 수가 없고 추가적인 악성 행위 또한 볼 수 없다. 

728x90
반응형