본문 바로가기

정보보안/Spear-Phishing

[Spear-Phishing] Malicious HWP Document Triage, PostScript Analysis

728x90

1.  HWP 악성감염의 징후

  • OLE 스트림을 포함하고, 실행파일을 포함하고 있다.
    - BinData 스토리지에 OLE 확장자를 가지고 있는 스트림이 존재하는지 확인
    - HWP 파일의 압축을 푼 후, 패턴매칭을 활용해 실행 파일을 포함하고 있는 스트림이 존재하는지 확인
  • 포스트 스크립트를 포함한 스트림이 존재한다.
    - PS또는 EPS(Encapsulated PostScript) 확장자를 가지고 있는 스트림이 존재하는지 확인
    - 스트림 내용을 확인하여 정상적인 포스트 스크립트인지 확인
  • 동일한 내용(사이즈)의 스트림이 다수 존재한다.
  • 실행파일을 포함한 스트림이 존재한다.
    - HWP 파일의 압축을 푼 후, 패턴 매칭을 활용해 실행 파일을 포함한 스트림이 있는지 확인
  • 스크립트를 포함하고 있다.
    - 스크립트 스토리지를 조사하여 스크립트를 포함하고 있는 스트림이 존재하는지 확인

 

우선 앞선 포스팅에서는 실행파일 즉 PE파일이 있는 유형을 살펴보았다면

 

이번엔 다른 유형에 대해 알아볼 것이다.


2. 악성 HWP의 분석

 

HWP의 징후 중 동일한 내용의 스트림이 다수 존재하는 경우를 살펴보자.

 

일반적인 문서의 섹션은 크게 1~2개 정도로 볼 수 있다.

 

하지만 다음의 사진을 보면

 

oledump

 

섹션이 7개나 있는 것을 알 수 있다. 이상징후로 의심이 된다.

 

위 사진은 oledump라는 도구를 이용해 hwp파일을 분석한 것이다.

 

특히 각 섹션 파일을 열어보면 모두 동일한 내용임이 보이는데

 

이렇게 세션이 비이상적으로 많은데 똑같기까지 한 것은 일반적으로 만들어지기 어렵다.

 

심지어 HxD를 통해 살펴보면 섹션의 해시값까지 같다.

 

명백하게 인위적으로 만들어진 파일들이다.

 

따라서 BodyText 폴더에 동일한 섹션이 많은 것, 이상징후다.

 

다음으로 살펴볼 것은 eps파일이 있는 경우다.

 

eps

 

위 사진의 파일은 다른 이상징후는 보이지 않지만 .eps 확장자를 가진 파일이 보인다.

 

eps는 포스트스크립트로, eps파일이 존재하면 악성 파일일 확률이 높다.

 

oledump

먼저 oledump로 eps파일을 내려받고

 

decompress

 

zlib_decompress 도구를 이용해 디코딩해주면

 

decoded

 

디코딩된 결과를 볼 수 있는데, 여러 값들이 무작위로 들어있다.

 

원래 eps파일은 벡터 이미지를 나타내는 파일이라 객체와 좌표값이 들어있다.

 

하지만 이 경우 의심스러운 데이터가 나열되어있다.

 

따라서 이후 악성 파일 시그니처를 대조하는 형식으로 분석을 진행할 수 있다.


3. Post Script 분석 예제

 

Post Script

- 고스트 스크립트라는 인터프리터에 의해 해석되는 문법

 

고스트 스크립트를 통해 우선 해석을 해보자.

 

고스트 스크립트

 

우선 고스트 스크립트는 위와같이 스택에 값을 넣고 확인이 가능하다.

 

add

 

위 사진을 보면 간단한 add연산이 나타나있다.

 

스택이므로 아래에서 위로 값이 쌓이며 add 연산은 스택의 맨 위 두 값을 더하거나

 

주어진 값을 더해서 스택을 갱신하는 모습을 볼 수 있다.

 

만약 한컴오피스에 악성 포스트 스크립트가 존재하면 이러한 연산들을 자동적으로 수행하게 된다.

 

decoded

 

앞서 디코딩한 포스트 스크립트를 살펴보자.

 

변수의 선언은 우선 다음과 같다.

 

/변수명 def            # '/'는 변수를 선언할 때 사용, 선언이 끝날 시 def로 닫아준다.

 

다음으로 ar의 내용을 보면 엔트로피값이 굉장히 높고(무작위 문자들) 데이터가 길다.

 

--> 셸코드의 해시값이거나 인코딩된 포스트 스크립트일 가능성이 매우 높으므로 우선 추출해야 한다.

 

for문의 경우 스택에 0과 1을 삽입한 후 1바이트씩 이동하며,

 

xor연산을 통해 안의 내용이 하나하나 디코딩 되고, 이때 연산의 key값은 204가 되겠다.

 

이제 인코딩된 데이터값을 헥사 디코딩을 통해 binary로 만들어주고, xor을 실시해볼 것이다.

 

e3~6만 남긴 헥사 파일을 Hex2bin 툴을 통해 바이너리로 바꿔보자

 

hex2bin

 

이제 unxor.py를 사용해서 바이너리 파일을 디코딩해줄 것이다. 키값은 앞서 말했던 204(CC in Hex)이다.

 

bin_decoded

 

이제 디코딩된 셸코드를 보면 909090 즉 노오퍼레이션 이후e8 호출 혹은 jump 하는 것을 볼 수 있다.

 

notepad

 

이제 위 헥사인코딩된 셸코드의 값을 hex2bin으로 다시 binary로 바꿔준다.

 

그 후 IDA를 통해 코드를 어셈블리 형태로 바꿔주고 

 

assembly

 

어셈블리를 x32dbg로 가져가서 디코딩된 코드를 Dump 해주면 yara룰을 통해 API를 분석할 수 있다.

 

이후 strings -n 명령어를 통해 문자열 추출도 가능하고, type 명령어로 문자열 확인을 할 수도 있다.

 

셀코드를 x32dbg에서 디버깅할 때, 메모리주소를 옮겨줘야하는 경우도 있다.

 

 

728x90