본문 바로가기
정보보안/악성코드 분석

라자루스 에어컨 계약 hwp 악성코드 분석 정리

by meanjung 2021. 8. 19.

https://www.youtube.com/watch?v=qA5GNwSuqb0 

[분석 보고서 : https://www.notion.so/hwp-b78761785f6a4428935c4c087ecbd181 ]

[악성코드 : https://app.any.run/tasks/496f832b-fee2-4224-8b0e-bed22d171354/ ]

 

유튜브 분석 따라하면서 그대로 해결되지 않는 점들을 기록하기 위해 작성했다.


hybrid-analysis

난 이걸보고 아직 감이 오진 않는다. 아 그냥 실행파일이 숨겨져 있구나..

 

 

hwpscan2 대신 SSView

분석 보고서에서는 hwpscan2를 이용해 분석했다고 하는데, 이게 지금 유료화되면서 막혔다.

대신 나는 SSView를 사용했다.

※ 주의사항

파일을 열 때, new 누르고 분석할 hwp 파일 선택하면 분석할 hwp 파일 날라간다...

무조건!! open으로 열기

 

여기 보면, postscript 파일이 나온다.

내가 알기론, hwpscan2에서는 postscript를 자동으로 추출해주는데, SSView는 더 많은 과정을 거쳐야 한다.

 

PostScript

란...??

 

 

SSView에서 PostScript 추출하기

SSView > BinData > BIN0001.ps에서 오른쪽 마우스 클릭해서 Save stream 클릭하면

BIN0001.ps.stream이 다운 받아진다.

 

이를 hxd에 올려 보면 뭔가 압축되어있는 느낌(?)이 든다.

압축을 해제하려고 하는데, 어떻게 해제해야 할 지 모르겠다...

 

######

처음에 이걸 보고 그대로 따라했다. https://rninche01.tistory.com/entry/HWP-%ED%95%9C%EA%B8%80-%EB%AC%B8%EC%84%9C%ED%98%95-%EC%95%85%EC%84%B1%EC%BD%94%EB%93%9C

 

HWP 한글 문서형 악성코드

0. 목차 Contents 0. 목차 1. 소개 1.1 CVE-2017-8291 1.2 한글 파일 구조 1.3 EPS파일 로드 과정 1) Process 2) 추가 설명 3 ) 요약 2. 분석환경 3. 분석 3.1 문서 확인 3.2 PS파일 추출 3.3 포스트 스크립트 분..

rninche01.tistory.com

######

 

이 코드가 위 블로그에 나온 코드 그대로이다.

import zlib
 
item = "BIN0001.ps.stream"
with open(item, "rb") as f:
	buf = f.read()
    unzlibed = zlib.decompress(buf, -9)
    with open(item+".unzlib", "wb") as f:
        f.write(unzlibed)

 

근데, 계속 오류가 뜬다.. too far 머시기... 그래서 이것저것 구글링하다가 솔루션 발견

https://stackoverflow.com/questions/3122145/zlib-error-error-3-while-decompressing-incorrect-header-check

 

 

그렇게 나온 내 unzip 코드

import zlib
 
item = "./BIN0001.PS.stream"
with open(item, "rb") as f:
    buf = f.read()
    unzlibed = zlib.decompress(buf, -zlib.MAX_WBITS)
    with open(item+".bin", "wb") as f:
        f.write(unzlibed)

뭐가 어떻게 다른 건지, 뭐로 압축되어있었던건지는 아직 모르겠다...

 

 

어쨌든,

 

 

여기서 잠깐!

☞ 알아두고 가기 ☜

취약점이 발생하는 원인은 한글 문서에 삽입된 악성 EPS(Encapsulated PostScript) 파일에 있다. 
사용자 눈에 보이지 않을 정도의 작은 크기로 문서에 삽입된 비정상적인 이미지 포맷인 악성 EPS 객체가 있고,
고스트스크립트 인터프리터가 각 페이지를 화면에 표현하기 위해 
EPS 객체를 처리하는 과정에서 악성코드가 실행된다. 

이러한 EPS 파일은 포스트스크립트(PostScript) 언어로 작성되는데, 
공격자는 이전부터 스크립트 언어의 특징을 이용하여 그 코드 형태를 다양하게 변경하여 은폐하고 있었다. 

또한 취약점을 유발하는 핵심적인 부분이 스크립트로 그대로 노출되지 않도록 
< > 안에 16진수 데이터 값에 저장한 뒤 XOR 인코딩을 하거나 

변수 치환, 불필요한 코드 삽입 등의 방식으로 난독화한다.

출처 : https://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=29358

 

BIN0001.PS.stream.bin에서 복호화 키 알아내기

복호화 키

 

복호화 결과를 파일로 추출하기 위해 exec를 print로 변경해 저장

Before.

After.

 

이제 After.ghost script를 통해 복호화하려고 하는데 not working....

[ ghost script shell 다운로드 : https://github.com/ArtifexSoftware/ghostpdl-downloads/releases ]

 

이거 다운받아서

이걸 바로 클릭해서 실행하니까 안된다..

 

개고생을 하다가 해결함

 

- cmd에서 cd "gswint4c.exe가 있는 위치"

- gswin64c.exe 복호화할 파일 run

※ 주의

경로 쓸 때 \ 아니고 /

BIN0001.PS_decom.bin > BIN0001.PS.stream.bin

이걸 그대로 드래그 복붙해서 second.ps로 저장(notepad++ 이용)

 

이 긴 코드 안에 꺽쇠가 또 있다.

그 꺽쇠 안에 있는 쉘 코드를 드래그해서 hxd에 붙여넣기 하고 shellcode.bin으로 저장

이게 shellcode인지 어떻게 알아??

 


아직 한참 남았다

 

shellcode 실행하기

한글 파일을 다운로드 하면 gbb.exe가 있다. 이것을 이용해 쉘 코드를 실행할 것이다.

 

나는 gbb.exe가 여기 있다.

 

 

1. win32dbg에서 이 gbb.exe를 연다.

 

2-1. BIN0001.PS.stream.bin의 마지막을 print가 아닌 exec로 바꾼다.

 

2-2. File > 명령줄 바꾸기 클릭하면 "C:\Program Files (x86)\Hnc\HOffice9\Bin\ImgFilters\GS\gs8.71\bin\gbb.exe" 일 것이다.

 

2-3. 이를 "C:\Program Files (x86)\Hnc\HOffice9\Bin\ImgFilters\GS\gs8.71\bin\gbb.exe" "C:\Users\meanj\Desktop\malwares\hwp_mal\BIN0001.PS.stream.bin" 와 같이 바꾼다.

 

3-1. ctrl + G > virtualProtect 를 따라가서 bp(f2키)를 건다.

3-2. 그리고 bp를 건 virtualProtect에 eip가 걸릴 때까지 실행

 

4-1. 그 상태에서 스택 부분(파란 동그라미)의 위에서 두 번째 값에서 오른쪽 마우스 클릭

4-2. Follow DWORD in Current Dump 클릭

 

4-3. 위에서 따라간 덤프 부분에서 주소에 대고 다시 마우스 오른쪽 버튼을 눌러 디스어셈블러에서 따라가기를 누른다.

 

4-4. shellcode 부분에 진입한 것을 볼 수 있다.

 

5-1. jmp 260F41C 에 breakpoint를 걸고 다시 실행

악분님의 동영상에서는 "사용자 코드로 실행" 버튼을 눌러 바로 진입했지만,
나는 그렇게 하면 파일이 끝나버려서 다르게 진입했다.

5-2. f8을 눌러 jmp 260F41C를 실행하면 다음과 같이 나온다. 

여기가 바로 쉘 코드의 실행 부분이다.

 

6. call 21FE489에서 f7을 눌러 함수 내부로 진입해보면, shellcode.bin과 동일한 코드가 나오는 것을 알 수 있다.

 

 

 

여기서부터 쉘 코드 분석하기

 

쭉 따라 들어가다보면(f8), API resolving과 똑같은 과정임을 파악할 수 있다.

왜 api 리졸빙과 똑같은 과정인지 파악하는 것은 이 강의를 들어보기로 했다.
""" https://www.youtube.com/watch?v=90y-fnR0Sxg """
일단은,,, 그렇다고 가정하고 계속 진행한다.

 

여기 call 21FEFF9에서 enter 쳐서 들어가면, API 함수를 불러오는 코드임을 파악할 수 있다.

"fs[30]", "C", "14"가 보이면 실행 중 api 주소를 가져오는 것이라고 생각해도 된다!!!...

이것도 api 리졸빙 강의를 들으면 왜인지 알 수 있지 않을까?

 

대충 그렇게 파악하고 다시 eip로 돌아와서 f8을 눌러 call 21FEFF9를 실행하도록 한다.

 

call 실행 전
call 실행 후

call 실행 후 사진을 보면 EAX에 GetModuleFileNameA라는 함수를 불러온 것을 알 수 있다.

 

 

그렇게 또 쭉 따라가다가.... 이 부분에서 멈춰 덤프를 뜨면 explorer.exe가 있는 것을 볼 수 있다.

 

 

그리고 아까 EAX에 GetModuleFileNameA를 불러온 함수의 이름을 get function address로 바꾼다.

방법 : 마우스 오른쪽 > label > 두 번째 클릭

 

그리고 여기서 진입하기(f7)

 

 

그래서 이걸 보면 여러 api 주소를 갖고 온다는 것을 알 수 있다.

 

이렇게 get function address 함수를 호출하는 곳이 여기 뿐만 아니라 다른 곳에도 많기 때문에, 하나하나 호출해 값을 확인하는 것은 무리가 있다.

 

때문에, get function address 함수의 내부로 들어가서, graph를 다시 확인한다.

왼쪽 맨 아래 bp를 걸고

이렇게 저장하고, 실행하면 아래와 같이 나온다.

 

이 악성코드는 스크립트를 짜지 않고도 호출된 함수가 모두 출력되는 것을 확인할 수 있다.

 

이 뒤는.. 못 알아듣겠다...ㅜ.ㅜ

 

헤븐즈 게이트와

api 리졸빙을 공부하면 알아들을 수 있을 것 같다!

댓글