본문 바로가기

정보보안/Spear-Phishing

[Spear-Phishing] Malicious HWP Document Macro Analysis

728x90

1. Basic

  • HWP문서는 5.0 이후부터 컴파운드 파일 포멧이라는 규격을 사용
  • 파일의 첫 8바이트가 D0 CF 11 E0 A1 B1 1A E1로 이루어짐
  • 파일 헤더 스트림에 파일 인식 정보인 HWP Document File이 존재

2. Triage

 

먼저 이번에 살펴볼 파일을 certutil을 사용해 16진수로 변환해준다.

 

Hex

 

위와 같이 변환해준 후 powershell을 통해 파일의 첫 8바이트를 보면 위에서 설명한 것과 같이

 

HWP 5.0의 시그니처가 보인다. 또한 헤더 스트림에 HWP Document File이 있는 것이 보인다.

 

.hwp

위 코드는 hwp 확장자가 가진 정보를 알아본 것이다.

 

hwp 파일은 여러 스트림과 스토리지로 구성되어 있는데

 

이중 스크립트 스토리지 속 JScriptVersion에는 Script Version이 저장되고

 

DefaultJScript 스트림에는 Script 헤더, 소스, Pre 소스, Post 소스가 저장된다.

 

decompress

 

이번엔 oledump를 이용해 hwp파일을 분석했다. 앞서 말한 DefaultJScript에 스크립트가 들어있으므로 조사해볼만하다.

 

따라서 DefaultJScript를 추출해서 zlib_decompress로 decompress해줬다.

 

JS

파일을 열어보면 JS코드가 보인다.

 

이중 OnDocument_new 함수와 OnDocument_Open은 HWP에 기본적으로 내장된 함수다.

 

하지만 OnDocument_Open의 경우 한글 문서를 실행했을 때 악성 스크립트가 바로 실행되도록

 

자바스크립트 코드가 삽입되었을 수 있다.

 

확인해보면 commandtoRun 함수를 통해 tmp.exe를 실행하는 것을 알 수 있고

 

이는 Createbin함수에 파라미터로 들어가게 된다.

 

그리고 이 CreateBin함수에는 알수없는 Hex값이 무수히 많다. 아마도 셸코드일 가능성이 높다.

 

CreateBin

 

함수를 자세히 보면, Character Set을 iso-8859-1로 바꾼 후 hex값을 write하고 파일에 저장하는 것을 알 수 있다.

 

이후 OnDocument_open함수에서 oShell을 통해 ActiveXobject를 만들고, ShellExecute로 open한다.

 

결론적으로 이 매크로는 악성 exe파일을 임베디드된 hex값으로 생성한 후 실행한다.

 


3. Macro Analysis

 

우선 notepad++로 \x를 전부 공백으로 바꿔준 후 데이터값을 HxD에 입력하고 exe파일로 저장한다.

 

tmp.exe

 

이제 생성된 exe파일을 Yara 룰을 통해 분석해보자.

 

yara

위 결과를 보면 Cobalt_functions라는 함수가 탐지되었고, 탐지된 API 해시데이터 두 개를 찾아보면

 

각각 VirtualAllocEx와 LoadLibraryEx인 것을 알 수 있다.

 

그렇다면 이제 C2 주소를 찾기위해 Process monitor를 활용해보자.

 

Process monitor

파일 시스템, 레지스트리 활동을 실시간 모니터링하는 도구

 

monitoring

 

모니터링을 위해 프로세스 이름을 tmp.exe, 그리고 Operation을 TCP만 contains하도록 필터링해준다.

 

 

C2

 

C2통신은 192.168.0.100과 연결하려는 것을 알 수 있고, 지금은 연결되지 않는 상태라는 것을 알 수 있다.

 


4. Macro Analysis 2

 

다음 예제를 살펴보자.

 

먼저 file 명령어를 통해 문서의 타입을 확인해보았다.

 

 

file : 파일 시그니처 정보들이 저장된 파일을 참조하여 대상 파일의 형식 확인

 

우선 file 명령어를 윈도우에서 쓰기 위해서는 Gnuwin을 시스템 환경변수 Path에 지정해놔야한다.

 

CDF v2 Document형식은 Compound Document Format의 약자로

Object Linking and Embedding - OLE 파일 형식이라고도 불린다.

OLE - 문서, 동영상, 소리, 그림, 수식, 표 등을 표현가능

 

그 후 oledir을 통해 파일에 들어있는 스토리지와 스트림에 대해 살펴보았고

 

앞선 예제와 마찬가지로 매크로가 악성 자바스크립트를 실행시킬 가능성을 고려해

 

스크립트 소스가 들어있는 DefaultJscript를 살펴보기로 한다.

 

oledump

 

oledump로 DefaultJScript의 위치를 알아내고 -s로 섹션 지정 -d로 추출해 저장했다.

 

strings

 

strings 명령어로 살펴본 결과 한글문서는 zlib방식으로 압축되어있기 떄문에 유의미한 문자열이 보이지 않는다.

 

decompress해주고 다시 살펴보면 다음과 같다.

 

decompress

 

위 코드는 ActiveXObject를 이용해 Wscript 실행파일의 셸 명령어를 수행하고,

 

Run으로 powershell을 실행시키고 있다.

 

wcript란

윈도우를 구동하는 셸 프로그램, 스크립트 실행 환경 제공 ( 커맨드와 동일 )

위에 쓰인 옵션은

-noP(프로필 로드 X), -sta(단일 스레드), -w 1(윈도우 숨김), -enc(Base64 해석, 실행)

 

이제 셸코드를 certutil의 decode 명령어로 디코딩해보자.

 

decode

 

셸코드를 따로 긁어 텍스트파일로 만든 후 디코딩한 모습은 위와 같다. 

 

상당히 가독성이 없는 코드가 나왔으므로 notepad++를 통해 줄바꿈(\r\n)해주고, 중괄호 기준으로도 나눠준다.

 

code

 

이제 이 코드를 파워셸 뷰티퍼를 사용해 조금만 더 가독성있게 만들어주도록 한다.

 

powershell

 

powershell을 이용해 StandardOutput으로 IndentType은 Tabs로 설정해줬다.

 

gpf

$gpf를 실행해보면 cachedGroupPolicySetting이 보이는데 이 필드는

 

로딩된 그룹정책으로, 실행되는 아래 코드들을 보면 파워셸 스크립트 블록 로깅의 키값에 0을 설정해

 

이벤트로그에 저장되지 않도록 한다.

 

다음으로는 AMSI(Anti-Malware Scan Interface)의 테이블 값을 변경하려고 시도한다.

 

AMSI

 

따라서 AMSI 관련 명령어를 긁어서 Value값을 빼고 실행시켜주면

 

amsiInitFailed 테이블을 변경하려는 것을 알 수 있다.

 

이 테이블은 AMSI 초기화에 관여하는 테이블로, 초기화 실패로 설정해 AMSI기능을 우회하려는 것으로 보인다.

 

따라서 스크립트 로깅을 비활성화, AMSI의 우회를 통해 최정적으로

 

웹 클라이언트를 만들고 프록시를 사용하여 C2 도메인의 리소스에서 자원을 요청한다.

 

invoke

 

마지막으로 invoke expression으로 다운로드 받은 문자열을 명령구문으로 인식하여 실행한다.

 

이 C2 도메인의 리소스에는 파워셸 명령으로 구성된 또다른 페이로드가 존재할 것이다.

728x90