NOTICE



 최근 비트코인과 관련해서 취약점을 이용한 악성 한글 문서 파일이 다수 발견되고 있습니다.


 저도 어떤 파일인지 궁금해서 지난 주말에 분석을 해봤습니다.

 그 내용을 정리해서 올려볼까 합니다.


 “[hwp] 비트코인을 겨냥한 한글 취약점 파일 분석_첫 번째” 입니다.


 분석에 사용한 샘플에 대한 정보는 malwares.com에서도 확인하실 수 있습니다.


- PostScript를 이용한 한글 악성코드: http://story.malwares.com/108



 한글 파일을 분석하기 위해서는 간략하게나마 HWP 파일 Format을 알아야 하기에 언급하고 넘어가겠습니다.

 먼저 Object가 무엇인지 알아야 합니다. Object는 쉽게 얘기해서 하나의 데이터 집합체입니다.


 우리가 문서를 작성하다가 사진을 넣고 싶으면 사진 파일을 문서 공간에 끌어다 넣죠? 이는 사진 파일 데이터를 문서에 포함시키는 것 입니다. 이때 문서에 포함된 사진 데이터는 하나의 Object가 됩니다. 엄밀히 Object에는 Linked Object와 Embeded Object가 존재하지만 자세한 설명은 생략합니다. (블로그에 간략한 설명이 있어서 링크만 남깁니다. http://securityfactory.tistory.com/357)


 이제 간단하게 샘플 파일을 만들어보겠습니다. 한글 프로세스를 열어서 텍스트를 입력하고 사진도 넣었습니다.



 그리고 "TEST.hwp"라는 이름으로 저장합니다. "C:\TEST" 경로로 이동해보니 파일이 잘 만들어졌네요.



 .hwp 파일은 ZIP archive technologies를 기반으로 하고 있기 때문에 7-Zip을 사용하면 압축을 해제할 수 있습니다. 압축 해제 후, 스토리지 안으로 들어가보면 HWP 파일 Format에 맞게 잘 구성되어 있는 데이터들이 확인됩니다.



HWP 파일의 전체적인 Format은 아래 그림을 참조하시면 됩니다.


HWP 파일의 전체적인 구조 (출처: 한글과 컴퓨터 공식 페이지)


 여기서 BinData 스토리지에는 우리가 앞에서 첨부했던 그림 파일 데이터가 저장되어 있습니다.



 Hxd.exe로 Object 데이터를 확인해 봅시다. 원본 그림 파일 데이터와 비교해서 살펴보겠습니다.


원본 그림파일 데이터


BIN0001.png 파일 데이터


 원본 파일 데이터와 많이 다르네요. .png 파일이 가지는 시그니처도 없고, 실행시켰을 때 그림이 출력되지도 않습니다.



 이는 한글 프로세스가 문서를 저장할 때, Object 데이터를 압축해서 저장시키기 때문입니다. HWP 파일 포멧 전체 구조를 보면 바이너리 데이터의 압축/암호화 항목이 체크되어 있습니다.


 그럼 .hwp 문서에 포함된 Object 데이터는 어떻게 추출해야 할까요? 간단한 방법이 있습니다. 먼저 그림 Object를 선택한 후, 그림 탭에서 바꾸기/저장 버튼을 누르고그림 파일 형식으로 저장하면 됩니다.



 그렇게 하고 나면 원본 파일과 동일한 그림 파일 데이터를 추출할 수 있습니다.



 "국내 가상화폐의 유형별 현황 및 향후 전망.hwp" 파일(이하, “전망.hwp")을 살펴봅시다. "전망.hwp" 파일의 BinData 스토리지에는 BIN0012.ps Object가 존재합니다. 그리고 BIN0012.ps Object에는 악성 PostScript 코드가 작성되어 있습니다. 



 "전망.hwp" 파일을 실행하면 한글 프로세스가 BinData 스토리지에 존재하는 그림 Data를 읽어서 출력해주는 것처럼, BIN0012.ps 코드를 읽어서 실행시킵니다. 그 결과 악성 행위가 발생하게 되는 겁니다. 그럼 이제 우리는 BIN0012.ps 코드를 추출해서 어떤 동작을 하도록 작성되어 있는지 분석하면 됩니다.


 문서를 열어보죠. 14 페이지나 되는 문서 안에서 BIN0012.ps Object를 찾기란 쉽지 않아 보입니다.



 그런데 자세히 살펴보면 실제로는 총 15 페이지이고 첫 페이지가 사용자가 식별하기 힘들만큼 작게 축소되어 있는 것을 찾을 수 있습니다.



 공격자는 첫 페이지에 BIN0012.ps Object를 첨부하고 사용자가 식별하기 힘들만큼 작게 축소시켜놨습니다. “파일 → 편집 용지”에 들어가서 “[용지 종류: A4(국배판)] / [적용범위: 문서전체]”로 설정하면 숨겨진 첫 페이지에 첨부되어 있는 BIN0012.ps Object를 찾을 수 있습니다.



 마우스로 드래그해서 문서에 가져다 놓으면 BIN0012.ps Object가 확연히 드러납니다.



 이것을 파일로 저장하고 Notepad++로 열어보면 악성 스크립트 코드를 확인할 수 있습니다.



BIN0012.ps 코드


BIN0012.ps 코드 요약


 이 코드는 어디서 실행될까요? 취약점이라는 것은 정상 모듈이 정상적이지 않은 동작을 하게 만드는 코드입니다. 당연히 한글 프로세스도 BIN0012.ps 코드를 읽고 출력하는 과정에서 이상동작을 하게 될 것입니다. 바로 요놈입니다.



 그런데 한가지 주의할게 있습니다. 앞선 그림에서 보이는 PostScript는 페이로드 입니다. 다시 말해서 핵심 악성 데이터가 아니라, gsdll32.dll이 오동작하게 하고 핵심 악성 데이터가 실행되도록 만들어주는 징검다리라고 보시면 됩니다. BIN0012.ps 코드를 조금 더 내려보면 뭔지 모를 데이터 쓰레기가 보이는데 이것이 핵심 악성 데이터입니다.



 악성 PostScript가 어떤 동작을 하고 핵심 악성 데이터를 어떻게 실행시키는지에 대해서는 다음시간에 알아보도록 하겠습니다.


 이상으로 “[hwp] 비트코인을 겨냥한 한글 취약점 파일 분석_첫 번째” 포스팅을 마치겠습니다.