Image Image Image Image Image Image Image Image Image Image

NURILAB | February 22, 2019

Scroll to top

Top

PDF 취약점 분석 방법

PDF 취약점 분석 방법
최 원혁

Review Overview

분석 난이도
4.5
프로그래밍 요구
6
5.3

Rating

툴을 이용한 분석이라 난이도는 높지 않다. PDF 취약점 분석은 PDF 분석에서만 그치는 것이 아니라 자바스크립트등에 대한 이해가 필요하다.

개요

APT 공격에 있어 아래아한글 취약점 공격에 이어 가장 많은 취약점 공격이 PDF를 이용한 공격이다. PDF(Portable Document Format) 파일은 어도비 시스템즈에서 개발한 전자 문서 형식이다. 컴퓨터 환경에 관계없이 같은 표현을 하기 위한 목적으로 개발되었으며 장치 독립성 및 해상도 독립성을 가지고 있다. 다양한 문서 편집 프로그램들에는 PDF 파일로 변환하여 저장하는 기능이 존재하며, E-mail등으로 많이 문서 교환의 한 형태로 사용된다.

PDF는 사용자 입장에서는 사용이 편리한 반면, 악성코드를 분석하는 분석가의 입장에서는 비정규화된 파일 포맷을 가지기 때문에 처리하기가 까다롭다. 물론, PDF 파일은 헤더, 본문, 참조테이블등 큰 형태는 존재하나, 이 각각의 영역이 제대로 어떤 값들이 존재하는지 어떤 크기를 가지는지에 대한 정보가 부족하다.

여기에서는 PDFDot 프로그램을 통해 PDF를 분석하는 과정을 살펴보고자 한다.

 

분석 방법

PDF 파일은 다양한 오브젝트가 존재하며 이들의 참조로 구성이 되어 있다. 각각의 오브젝트들은 자신의 Type과 다양한 속성값 및 스트림을 포함하기도 한다. 대체로 악성코드들은 앞에서 언급한 오브젝트의 스트림으로 존재하는 경우가 대부분이다(물론 최악의 경우에는 스트림이 SWF 파일 포맷을 가지고, SWF 파일 내부의 ActionScript 형태로 가지는 경우도 있다).

분석을 위해 준비한 test.pdf 파일은 다음과 같다.

이제 PDFDot 프로그램을 통해서 test.pdf 파일의 오브젝트 구조를 살펴보도록 하겠다. 우선 PDFDot은 아래 링크에서 다운로드 받을 수 있다.

분석하고자 하는 PDF 파일을 PDFDot 프로그램의 인자값으로 넣어주는데 대체로 PDF의 루트(Root) 오브젝트는 1번 오브젝트이다. PDFDot 버전 0.20 이상 버전에서는 -r 옵션을 통해 루트(Root) 오브젝트를 확인할 수 있다.

C:\> pdfdot.exe test.pdf -r

pdf_root

 

이제 제일 먼저 분석해야 할 대상은 1번 오브젝트이다. 따라서 -o 옵션을 사용하여 1번 오브젝트를 지정하면 다음과 같은 화면이 나온다.

C:\> pdfdot.exe test.pdf -o1

obj1

 

PDF 파일을 분석하는데 있어서 가장 중요한 부분은 PDF 내부 참조 구조를 정확히 파악하는 것이 중요하다. 즉, 위 그림을 보면 오브젝트 1번은 2번과 4번 오브젝트를 참조하고 있다는 사실이다.

이제 -o 옵션의 숫자 값을 바꿔가면서 오브젝트의 참조 내용을 확인해보면 이를 간략히 표현하면 다음과 같은 형태가 될 것이다.

pdf_struct

 

위의 그림은 수작업으로 PDF 구조를 그려본 것이다. 이렇게 보면 한눈에 PDF 내부 구조를 쉽게 알 수 있다. 하지만, 매번 PDF를 분석할 때마다 이 구조를 수작업으로 한다는 것은 무리가 있다. 그래서 PDFDot 프로그램에는 이를 자동으로 그려주는 -g 옵션이다.

우선 -g 옵션을 사용하기 위해서는 그래프를 그리기 위한 별도의 외부 프로그램인 Graphviz가 필요하다. 따라서 아래의 사이트에서 윈도우용 설치 프로그램을 다운로드 받아 설치한 다음 -g 옵션을 사용할 수 있다.

Graphviz가 설치 되었다면 다음과 같이 명령어를 입력해본다.

C:\> pdfdot.exe test.pdf -g test_pdf.png

이 명령어가 정상적으로 실행되었다면 test_pdf.png 파일이 생성될 것이며, 파일을 열어보면 아래와 같은 PDF 내부 구조를 보여주게 된다.

test_pdf

PDFDot 프로그램을 사용하여 PDF 내부 구조를 출력해보면 빨간색의 오브젝트 박스와 검은색의 오브젝트 박스를 볼 수 있다. 이 중에서 빨간색 오브젝트 박스에 주목해야 한다. 바로 악성코드가 존재할 가능성이 있는 오브젝트들을 표현하고 있기 때문이다.

앞서 PDF 악성코드들은 대체로 오브젝트의 스트림 형식으로 저장되어 있다고 하였다. 지금 이 PDF 내부 구조를 보면 문제의 오브젝트들은 1번, 4번, 5번, 7번번 9번이다. 따라서 이들 오브젝트들을 다시 -o 옵션을 사용하여 살펴본다.

그중에서 오브젝트 5번을 살펴보자.

C:\> pdfdot.exe test.pdf -o5

obj5

 

위 그림에서 확인할 수 있듯이 오브젝트 5번에는 281 Byte의 스트림이 포함되어 있으며, 압축되어 있는 상태이다. 이 스트림을 추출해보자. 추출하기 위해서는 -d 옵션을 사용하면 된다.

C:\> pdfdot.exe test.pdf -o5 -d obj5.dmp

이렇게 스트림을 추출하면 압축된 상태로 추출되므로 압축을 해제해야 한다. 압축 여부를 확인하는 방법은 오브젝트의 내용중 /Filter로 표현이 되어 있다면 압축된 형태라고 보면 되겠다(물론 압축이 아닌 경우도 있다). 따라서 압축을 해제 하기 위해서 -f 옵션을 함께 지정하면 압축 해제된 스트림을 얻을 수 있다. 하지만, /Filter로 지정되어 있지 않다면 -f 옵션을 사용해서는 안된다.

자, 이제 -f 옵션까지 사용하여 스트림으로 추출된 obj5.dmp 파일을 열어보자.

C:\> pdfdot.exe test.pdf -o5 -d obj5.dmp -f

obj5_dmp

 

그림에서 보는 것처럼 자바스크립트가 오브젝트 5번의 스트림으로 저장되어 있었다. 같은 방법으로 오브젝트 7번과 9번도 스트림을 추출해본다.

C:\> pdfdot.exe test.pdf -o7 -d obj7.dmp -f

C:\> pdfdot.exe test.pdf -o9 -d obj9.dmp -f

obj79

자바스크립트는 아니지만 ASCII로 구성된 내용을 확인할 수 있다. 오브젝트 5번의 자바스크립트가 오브젝트 7번과 9번 스트림 내용을 다시 복호화 하는 과정을 거치게 된다.

사실 이후부터는 자바스크립트에 대한 내용이라 여기서 소개하는 PDF의 분석 내용에서 벗어나는 주제이므로 생략하기로 한다.

지금까지 간단하게 PDFDot을 이용하여 PDF의 내부 구조를 시각화 하고 그중 악성코드로 의심되는 오브젝트를 선별한 다음 스트림 추출을 통해 악성코드를 진행하는 것을 살펴보았다. 분석을 하다보면 이 보다 더 다양한 형태의 PDF를 보게 되겠지만, 거의 대체로가 이런 순서를 통해 PDF 악성코드를 분석하게 된다.


위 글에 대해 별도의 문의 사항이 있다면 hanul93@gmail.com으로 메일 보내주시기 바란다.