[상세보고서] APT : 악성 한글 파일을 통해 확산되는 악성코드

malwares.com 악성코드 분석팀 분석 자료


< 부제 : 진단명을 알면 악성코드가 보인다. >


1. 개요


한글과 컴퓨터(이하 한컴)의 한글 에디터는 국내에서 가장 많이 사용하는 문서 에디터일 것이다. 특히 관공서에서 적극적으로 활용한다는 점은 이를 대상으로 하는 악성코드가 많이 발견되는 이유이기도 하다. 주로 메일을 통해 전달된 악성 한글 파일을 열람하는 사람의 PC를 공격대상으로 하거나 한글 에디터 자체를 공격 대상으로 삼는다. 


악성 한글 파일은 대부분은 한글 에디터에서 한글 문서 파일을 읽어들이는 과정에서 발생하는 취약점을 이용하며 이를 통해 문서 파일 내부의 악성코드가 실행되어 2차, 3차 피해를 유발한다. 국내에서는 이러한 문제로 인해 한글 에디터를 대상으로 하는 취약점 분석이 활발히 이루어지고 있으며 안티 바이러스 업체에서는 파일 포맷을 분석해 취약점을 유발할 수 있는 코드가 있거나 악성코드가 삽입되어 있는 경우 사전에 차단하는 등의 프로세스를 적용하고 있다. 

한글 파일 포맷은 구조가 복잡하기 때문에 분석이 어렵다. 하지만 이러한 한글 파일 포맷을 분석해 그 구조를 보여주는 다양한 뷰어가 있으니 이를 활용하는 것도 좋은 방법이 될 수 있다. 

[ 한글 파일 포맷 뷰어 ]
* 마이크로 소프트 : OffVis [다운로드]
* MiTeC : SSView [다운로드]
* 누리랩 : HwpScan2 [다운로드]



2. 악성코드 파일 정보


파일명 : 1.hwp_

파일크기 : 205,290 Bytes

특징 : 한글 파일 악성코드, BodyText

SHA-256 : AC772E949CBD46FA276A2A7ED28B431DDCC3CCADF7793C6D93264F97C946BB1A

취약한 버전 : 한글 2005 (세부버전 : 6.5.0.825)

malwares.com 정보 : https://goo.gl/ka2cSA


< Figure 1. 안티바이러스 진단 정보 (malwares.com) >


Figure 1을 보면 안티 바이러스에서는 대부분 BodyText 나 ParaText로 진단하고 있다. 일반적으로 안티 바이러스 진단명 중 HEUR(휴리스틱) , Gen (제너릭) 이나 Agent로 명명되지 않는 다수의 악성코드 진단명은 고유 진단명으로 악성코드의 특징을 반영한다. 그럼 안티 바이러스에서는 위의 악성 한글 파일을 왜 "BodyText" 나 "ParaText" 로 명명했을까?


3. CFBF 파일 포맷 


< Figure 2. 한글 파일 내부 구조 >


한글 파일은 기본적으로 CFBF 파일 포맷으로 작성되어 있으며 이 포맷을 따르는 파일간에 데이터(그림, 표등)를 연결하기 위해 OLE 연결 규약을 따른다. CFBF 파일 포맷은 디렉토리/파일 형태를 띄기 때문에 뷰어를 통해 확인하면 위의 그림과 같은 모습을 갖는다. 하지만 CFBF 파일 포맷에서 디렉토리/파일에 대응하는 별도의 명칭을 사용한다. 

- 디렉토리 = 스토리지 (Storage)

- 파일 = 스트림 (Stream)


기본적으로 스토리지는 일반적인 디렉토리처럼 그 자체는 별도의 데이터를 갖지 않는다. 따라서 스토리지가 포함하고 있는 스트림에 데이터가 저장되어 있다. 따라서 분석 대상은 데이터를 갖는 스트림이 된다. 


Compound File Binary Format (CFBF) : "Compound File" 또는 "Compound Document"로 불리우는 Compound 

                                                                File Binary Format은 다수의 파일을 저장하기 위한 파일 포맷

- Wikipedia : Compound File Binary Format 

Microsoft Open Specifications Support Team Blog : Exploring the Compound File Binary Format


Object Linking and Embedding (OLE) : 문서와 기타 객체간의 연결, 삽입등을 도와주는 연결 규약

- Wikipedia : Object Linking and Embedding


4. HWP 파일 분석

(1) HWP 파일 전체 구조


< Figure 3. 한글 파일 상세문서 >


한컴에서 제공하고 있는 한글 파일 상세 문서를 보면 Figure 3과 같이 한글 파일 포맷을 정의하고 있다. 이 중 안티 바이러스에서 진단명으로 사용했던 "BodyText"도 확인할 수 있다. 즉, 안티 바이러스에서 한글 파일 포맷내부에서 BodyText 부분을 진단해 악성으로 판단했던 것이다. 따라서 한글 파일 포맷 중 BodyText를 분석 대상으로 삼는다. 


그리고 한글 파일 포맷은 기본적으로 CFBF 파일 포맷 중 RootEntry 에서 데이터를 얻으며 포맷의 특성에 따라 레코드 구조 여부, 압축 여부를 결정한다. 


* 레코드 구조


< Figure 4. 레코드 구조 >


   - 한글 파일 포맷 중 문서 정보 (DocInfo), 본문 (BodyText, Section), 문서 이력 관리 (DocHistory, VersionLog) 는 레코

     드 구조로 되어 있다. 레코드 구조는 레코드 헤더와 데이터로 구성되어 있으며 레코드 헤더는 데이터의 크기에 따라 

     2가지 타입으로 나눌 수 있다. 

     기본적으로 타입 1의 형태를 띄지만 만약 헤더 다음의 데이터가 4095Bytes 이상인 경우 레코드 헤더 다음 4Bytes를 

     데이터의 크기로 인식하는 구조이다. 이는 헤더의 Size가 12Bits로 정의되어 있고 12Bits로 표현할 수 있는 데이터 크기

     보다 실제 데이터가 더 클 경우 헤더 다음 4Bytes에 별도로 크기를 정의했기 때문이다. 


* 압축 / 암호화

   - 한글 파일은 압축 및 암호화 기능을 제공하며 이는 한글 에디터에서 설정할 수 있다.

     설정된 값은 문서 정보 (DocInfo), 본문(BodyText, Section), 바이너리 데이터 (BinData, BinaryData), 문서 이력 관리 

     (DocHistory, VersionLog) 등에 적용된다. 


< Figure 5. 한글 에디터의 설정 위치 >


< Figure 6. 파일 인식 정보 내 압축/암호화 정보 >


     한글 에디터의 설정정보는 한글 파일 구조 중 파일 인식 정보(FileHeader)에 압축/암호화 여부가 저장되어 있다. 따라서 

     파일 인식정보 내에 저장된 압축/암호화 정보를 바탕으로 설정된 경우 모두 해제해야 스토리지/스트림의 구조를 파악할 

     수 있다. 압축의 경우 해제시 옵션(-15)을 부여해 zlib로 해제가 가능하지만 암호화의 경우 별도의 암호를 알고 있어야 

     가능하다. 


한컴 : Hwp 파일 상세 문서 보기 [다운로드]


(2) 본문(BodyText/Section) 구조


< Figure 7. 본문 구조 >


한글 문서의 본문은 스토리지인 BodyText와 스트림 Section[숫자]로 구성되어 있으며 문단, 표, 그리기, 텍스트 등의 정보를 저장하고 있다. 또한 압축/암호화가 적용가능한 영역이며 레코드로 구성되어 있다. 따라서 파일 인식 정보 내 압축 여부와 암호 설정 여부를 확인해야 한다. 샘플 파일의 경우 압축은 설정되어 있고 암호는 설정되지 않았다.

따라서 zlib로 압축을 해제한 후 레코드 구조에 맞춰 분석하면 본문 구조를 확인할 수 있다. 


< Figure 8. BodyText/Section0 >


BodyText/Section0을 확인해 보면 Figure 8과 같다. 압축 해제된 데이터를 레코드에 따라 분석해 데이터를 추출하고 추출된 데이터에 대해 악성여부를 판단하면 된다. Figure 8의 Section0은 특별히 악성으로 의심되는 부분은 확인되지 않았다.


< Figuire 9. BodyText/Section1 구조 분석>


Figure 9처럼 BodyText/Section0과 다르게 Section1은 16777250 Bytes의 문단 텍스트를 갖고 있다. 물론 큰 데이터가 존재할 수 있는 구조이지만 의심해 볼만 한다. 또한 문단 텍스트는 안티 바이러스에서 사용한 진단명 키워드이기도 하다.


* TagID 67 = 0x43 = HWPTAG_BEGIN + 51 = HWPTAG_PARA_TEXT


따라서 해당 데이터 영역을 확인해 보면 0xEB1EEB1E 나 0x63636363 등의 값이 반복되는 등 ShellCode로 의심스러운 부분이 보인다. 이 부분을 추출해 디스어셈블러로 확인하면 다음과 같은 코드를 확인할 수 있다. 


5. 바이너리 분석


< Figure 10. 디스어셈블러로 확인한 일부 코드 >


FIgure 10과 같이 디스어셈블러로 확인해 본 결과 WinExec( )를 호출하는 등의 의미있는 코드가 확인되었다. 이를 통해 본 악성 한글 파일은 한글 파일의 문단 텍스트(HWPTAG_PARA_TEXT)를 읽어들이는 과정에서 한글 에디터가 갖는 취약점을 이용해 위와 같은 코드를 실행하는 형태의 악성 파일로 최종 확인되었으며 이러한 이유로 안티 바이러스에서는 진단명에 BodyText 나 ParaText를 넣은 것이다. 


6. 악성코드 실행


< Figure 11. 악성코드 실행에 따른 네트워크 동작 >


취약점에 의해 ShellCode가 동작하면 Figure 11과 같이 외부 서버로 연결을 시도한다. 해당 악성코드는 과거에 발생했던 샘플임에 따라 현재 외부 서버와의 정상적인 통신은 이루어져지 않지만 ShellCode의 동작은 정상적으로 이루어지고 있다. 

* 서버 IP : 182.16.9.132



▶ 보고서 원본 PDF 다운로드: https://goo.gl/vq2MwU


* 본 보고서 및 관련 컨텐츠는 저작권의 보호를 받습니다. 재배포, 영리목적의 활용 관련 법률에 의거 처벌 받을 수 있습니다.


이 글을 공유하기

댓글(2)

  • 2016.09.14 00:27

    비밀댓글입니다

    • 2016.11.07 10:51 신고

      안녕하세요 세인트시큐리티입니다.
      소속과 신원을 밝혀주시면 해당 샘플에 대해서는 제공해드리겠습니다.

Designed by JB FACTORY