schizophrenic files

86
2014/06/02 Zürich, Switzerland Schizophrenic files Ange Albertini Gynvael Coldwind Schizophrenic files Area41

Upload: ange-albertini

Post on 15-Jan-2015

227 views

Category:

Technology


4 download

DESCRIPTION

Ange Albertini, Gynvael Coldwind 2014/06/02 Area41 Zürich, Switzerland

TRANSCRIPT

Page 1: Schizophrenic files

2014/06/02Zürich, Switzerland

Schizophrenicfiles

Ange AlbertiniGynvael Coldwind

Schizophrenic filesArea41

Page 2: Schizophrenic files

Gynvael ColdwindSecurity researcher, GoogleDragon Sector captainlikes hamburgershttp://gynvael.coldwind.pl/

All opinions expressed during this presentation are mine and mine alone. They are not opinions of my lawyer, barber and especially not my employer.

Page 3: Schizophrenic files

Ange AlbertiniReverse engineering&Visual Documentationshttp://corkami.com

Page 4: Schizophrenic files

1 file + 2 tools⇒ 2 different documents

No active detection in the file.

Page 5: Schizophrenic files

abusing parsers for

● fun

● bypassing security○ same-origin policy○ evade detection○ exfiltration○ signing

■ Android Master Key

Page 6: Schizophrenic files

ZIP archives

Page 7: Schizophrenic files

excerpt from Gynvael's talk:"Dziesięć tysięcy pułapek: ZIP, RAR, etc."

(http://gynvael.coldwind.pl/?id=523)

Page 8: Schizophrenic files

ZIPtrick 1

a glitch in the matrix

Page 9: Schizophrenic files

file names in ZIP

a couple of files with the same name?

update: for an awesome example see:

Android: One Root to Own Them All Jeff Forristal / Bluebox

(https://media.blackhat.com/us-13/US-13-Forristal-Android-One-Root-to-Own-Them-All-Slides.pdf)

Page 10: Schizophrenic files

ZIPtrick 2

abstract kitty

Page 11: Schizophrenic files

Let's start with simple stuff -the ZIP format

A ZIP file begins with letters PK.

Page 12: Schizophrenic files

Let's start with simple stuff -the ZIP format

A ZIP file begins with letters PK.

WRONG

Page 13: Schizophrenic files

ZIP - second attempt :)

.zip file

last 65557 bytes of the filethe "header" is

"somewhere" here

PK\5\6...

Page 14: Schizophrenic files

ZIP - "somewhere" ?!4.3.16 End of central directory record:

end of central dir signature 4 bytes (0x06054b50) number of this disk 2 bytes number of the disk with the start of the central directory 2 bytes total number of entries in the central directory on this disk 2 bytes total number of entries in the central directory 2 bytes size of the central directory 4 bytes offset of start of central directory with respect to the starting disk number 4 bytes .ZIP file comment length 2 bytes .ZIP file comment (variable size)

you begin ZIP parsing

from this; it MUST be

at the end of the file

$0000-$FFFF0-65535

22 b

ajty

Total: from 22 to 65557 bytes(aka: PK\5\6 magic will be somewhere between EOF-65557 and EOF-22)

Page 15: Schizophrenic files

ZIP - looking for the "header"?

"From the START"Begin at EOF-65557,

and move forward.

"From the END"(ZIPs usually don't have comments)

Begin at EOF-22,and move backward.

PK\5\6...

"somewhere"

PK\5\6...

"somewhere"

Page 16: Schizophrenic files

The show will continue in a

moment.

LarchSomething completely different

Page 17: Schizophrenic files

ZIP Format - LFH 4.3.7 Local file header:

local file header signature 4 bytes (0x04034b50) version needed to extract 2 bytes general purpose bit flag 2 bytes compression method 2 bytes last mod file time 2 bytes last mod file date 2 bytes crc-32 4 bytes compressed size 4 bytes uncompressed size 4 bytes file name length 2 bytes extra field length 2 bytes

file name (variable size) extra field (variable size) file data (variable size)

rand

om s

tuff

PK\3\4... LFH + data

Each file/directory in a ZIP has LFH + data.

Page 18: Schizophrenic files

ZIP Format - CDH [central directory header n]

central file header signature 4 bytes (0x02014b50) version made by 2 bytes version needed to extract 2 bytes general purpose bit flag 2 bytes compression method 2 bytes last mod file time 2 bytes last mod file date 2 bytes crc-32 4 bytes compressed size 4 bytes uncompressed size 4 bytes file name length 2 bytes extra field length 2 bytes file comment length 2 bytes disk number start 2 bytes internal file attributes 2 bytes external file attributes 4 bytes relative offset of local header 4 bytes

file name (variable size) extra field (variable size) file comment (variable size)

sim

ilar s

tuff

to L

FH

PK\2\1... CDH

Each file/directory has a CDH entry in the Central Directory

thanks to the redundancy you can recover LFH

using CDH, or CDH using LFH

Page 19: Schizophrenic files

ZIP - a complete file

PK\3\4... LFH + data PK\5\6...EOCDPK\2\1... CDH

Files (header+data) List of files(and pointers)

Page 20: Schizophrenic files

ZIP - a complete file (continued)

PK\3\4... LFH + data PK\5\6...EOCDPK\2\1... CDH

PK\3\4... LFH + data PK\5\6...EOCDPK\2\1... CDH

If the list of the files has pointers to files...... the ZIP structure can be more relaxed.

Page 21: Schizophrenic files

ZIP - a complete file (continued)

PK\5\6...EOCDPK\2\1... CDH PK\3\4... LFH + data

file comment (variable size)

You can even do an "inception"(some parsers may allow EOCD(CHD(LFH)))

Page 22: Schizophrenic files

And now back to our show!

(we were looking for the EOCD)

LarchSomething completely different

Page 23: Schizophrenic files

ZIP - looking for the "header"?

"stream"Let's ignore EOCD!

(it's sometimes faster)(99.9% of ZIPs out there can be parsed this way)

PK\3\4... LFH + data PK\3\4... LFH + data PK\3\4... LFH + data

(single "files" in an archive)

PK\5\6...

(who cares...)

Page 24: Schizophrenic files

ZIP - looking for the "header"?

"aggressive stream"We ignore the "garbage"!

(forensics)

PK\3\4... LFH + data PK\3\4... LFH + data PK\3\4... LFH + data

(single "files" in an archive)

PK\5\6...

(who cares...)

Page 25: Schizophrenic files

Let's test the parsers!abstract.zip

Page 26: Schizophrenic files

EOCD

LFH+data

CDH

EOCD

LFH+data

CDH

LFH+data

LFH+data

syntax breaker

yellow is a comment

of the green

archive

stream

aggressivestream

start-first

end-first

abstract.zip

Page 27: Schizophrenic files

abstract.zip

from zipfile import ZipFileZipFile("abstract.zip", "r").printdir()

Page 28: Schizophrenic files

abstract.zip<?php$za = new ZipArchive();$za->open('abstract.zip');for ($i=0; $i<$za->numFiles;$i++) { echo "index: $i\n"; print_r($za->statIndex($i));}echo "numFile:" . $za->numFiles . "\n";

Page 29: Schizophrenic files

abstract.zipimport java.io.FileInputStream;import java.io.InputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;

public class zip { public static void main(String args[]) throws java.io.IOException, java.io.FileNotFoundException { InputStream f = new FileInputStream("abstract.zip"); ZipInputStream z = new ZipInputStream(f);

ZipEntry e; while((e = z.getNextEntry()) != null) { System.out.println(e.getName()); } }}

Page 30: Schizophrenic files

abstract.zip

Page 31: Schizophrenic files

EOCD

CDH

EOCD

readme_StartFirst.txtCDH

readme_AggressiveStream.txt

readme_Stream.txt

syntax breaker

abstract.zip

readme_EndFirst.txt

Total Commander 8.01UnZip 6.00 (Debian)Midnight CommanderWindows 7 ExplorerALZipKGB Archiver7-zipb1.orgPython zipfileJSZipC# DotNetZipperl Archive::ZipJeffrey's Exif Viewer WOBZIPGNOME File RollerWinRAROSX UnZipzip.vim v25Emacs Zip-Archive modeAda Zip-Ada v45Go archive/zipPharo smalltalk 2.0 ZipArchiveUbuntu lessJava ZipFile

Page 32: Schizophrenic files

EOCD

CDH

EOCD

readme_StartFirst.txtCDH

readme_AggressiveStream.txt

readme_Stream.txt

syntax breaker

abstract.zip

readme_EndFirst.txt

PHP ZipArchivePHP zip_open ...PHP zip:// wrappertcl + tclvfs + tclunzip

Page 33: Schizophrenic files

EOCD

CDH

EOCD

readme_StartFirst.txtCDH

readme_AggressiveStream.txt

readme_Stream.txt

syntax breaker

abstract.zip

readme_EndFirst.txt

Ruby rubyzip2Java ZipArchiveInputStreamjava.util.zip.ZipInputStream

Page 34: Schizophrenic files

EOCD

CDH

EOCD

readme_StartFirst.txtCDH

readme_AggressiveStream.txt

readme_Stream.txt

syntax breaker

abstract.zip

readme_EndFirst.txt

binwalk (found all)

Page 35: Schizophrenic files

EOCD

CDH

EOCD

readme_StartFirst.txtCDH

readme_AggressiveStream.txt

readme_Stream.txt

syntax breaker

abstract.zip - result summary

readme_EndFirst.txt

Thanks!● Mulander● Felix Groebert● Salvation● j00ru

Page 36: Schizophrenic files

abstract.zip - who cares?

● verify files via End-First

● unpack via Stream

Oops.

Page 37: Schizophrenic files

abstract.zip - AV

EICAR test results (using VT):● most End-First● some Aggressive● Stream-only:

○ VBA32○ NANO-Antivirus○ Norman○ F-Prot○ Agnitum○ Commtouch

https://docs.google.com/spreadsheet/ccc?key=0Apy5AGVPzpIOdDRPTFNJQXpqNkdjUzl4SE80c1kwdkE&usp=sharing

Page 38: Schizophrenic files

Portable Document File

Page 40: Schizophrenic files
Page 41: Schizophrenic files
Page 42: Schizophrenic files

% trailer <</Root …>>

trailer <</Root …>>

<</Root …>>

Page 43: Schizophrenic files
Page 44: Schizophrenic files

sometimes,it’s in the specs

obscurity via over-specification?

Page 45: Schizophrenic files

notice anything unusual?

Page 46: Schizophrenic files

WYSIWYG

Page 47: Schizophrenic files

“Optional Content Configuration”● principles

○ define layered content via various /Forms○ enable/disable layers on viewing/printing

● no warning when printing

● “you can see the preview!”○ bypass preview by keeping page 1 unchanged○ just do a minor change in the file

PDF Layers 1/2

Page 48: Schizophrenic files

● it’s Adobe only○ what’s displayed varies with readers○ could be hidden via previous schizophrenic trick

● it was in the specs all along○ very rarely used○ can be abused

PDF Layers 2/2

Page 49: Schizophrenic files

BMPTrick 1

(originally published in Gynvael's "Format BMP okiem hakera" article in 2008)

Page 50: Schizophrenic files

FILE HEADER

INFO HEADER

PIXEL DATA

offset 0

offset N

bfOffBits

bfOffBitsSpecifies the offset, in bytes, from the BITMAPFILEHEADER structure to the bitmap bits

(MSDN)

Page 51: Schizophrenic files

FILE HEADER

INFO HEADER

PIXEL DATA(secondary)

offset 0

offset N

bfOffBits

bfOffBitsSpecifies the offset, in bytes, from the BITMAPFILEHEADER structure to the bitmap bits

(MSDN)

PIXEL DATA

● Some image viewers ignore bfOffBits and look for data immediately after the headers.

Page 52: Schizophrenic files

Different images, depending on which pixel data is used.

PIXEL DATA(secondary)

PIXEL DATA

Page 53: Schizophrenic files

BMPTrick 2

Something I've learnt about because it spoiled my steg100 task for a CTF (thankfully during testing).

Page 54: Schizophrenic files

BMP compression & palette

Run-Length Encoding (each box is 1 byte):

Length>0

Palette Index (color)

Length0

End of Line0

Length0

End of Bitmap1

Length0

Move Cursor2 X offset Y offset

Length0

RAW Length>2

Palette Index (color)

Palette Index (color)

...

Page 55: Schizophrenic files

BMP compression & palette

Question: If the opcodes below allow jump over pixels and set no data, how will the pixels look like?

Hint: Please take a look at the presentation title :)

Length0

End of Line0

Length0

End of Bitmap1

Length0

Move Cursor2 X offset Y offset

Page 56: Schizophrenic files

Option 1The missing data will be filled with background color.

(index 0 in the palette)

Page 57: Schizophrenic files

Option 2The missing data will be black.

Page 58: Schizophrenic files

Option 3The missing data will be transparent.(pink represents transparency)

Page 59: Schizophrenic files

PNG

Page 60: Schizophrenic files

a data schizophren

image data combining● 2 images● via 2 palettes

cute PoC by @reversity

“There shall not be more than one PLTE chunk”

Page 61: Schizophrenic files

different images depending on which PLTE chunk is used

Page 62: Schizophrenic files

Portable Executable

Page 63: Schizophrenic files

W8VistaXP

Relocations types

Type 4HIGH_ADJ -- -- ✓Type 9

MIPS_JMPADDR16IA64_IMM64

MACHINE_SPEC_932 bit 64 bit ✗

Page 64: Schizophrenic files

Relocations on relocations

Type 4HIGH_ADJ -- -- ✓Type 9

MIPS_JMPADDR16IA64_IMM64

MACHINE_SPEC_932 bit 64 bit ✗

Type 10DIR64 ✓ ✓ ✓

as seen in

PoC||GTFO

Page 65: Schizophrenic files

Relocation-based PE Schizophren

Page 66: Schizophrenic files

Julian Bangert, Sergey Bratus -- ELF Eccentricitieshttps://www.youtube.com/watch?v=4LU6N6THh2U

Page 67: Schizophrenic files

GIFSomething Gynvael stumbled on in 2008,

but never made a PoC... until now.(with great input from Ange)

Page 68: Schizophrenic files

GIF

GIF can be made of many small images.If "frame speed" is defined, these are frames instead(and the first frame is treated as background).

x

x

x y

yy

Page 69: Schizophrenic files

GIF

Certain parsers (e.g. browsers) treat "images" as "frames" regardless of "frame speed" not being defined.

Frame 1 Frame 2 Frame 3

Page 70: Schizophrenic files

GIF

Certain parsers (e.g. browsers) treat "images" as "frames" regardless of "frame speed" not being defined.

Frame 1 Frame 2 Frame 3

Page 71: Schizophrenic files

GIF

Schizophrenic PoC:

Frame 1 Frames 2-100011x1 px

Frame 10002

Page 72: Schizophrenic files

These apps try to force animation.

These apps render the GIF by the specs.

Page 73: Schizophrenic files

GIMP says "frames", but allows one to see all the frames, which is nice.

Page 74: Schizophrenic files

same-tool schizophrenia1 file + 1 tool = 2 behaviors

Page 75: Schizophrenic files

it was too simple

● WinRar: different behavior when viewing or extracting○ opening/failing○ opening/’nothing’

● Adobe: viewing ⇔printing○ well, it’s a feature

Page 76: Schizophrenic files

Failures / Ideas / WIP

Page 77: Schizophrenic files

Screen ⇔ Printer schizophrenvia color profiles?

Page 78: Schizophrenic files

Failures / Ideas / WIP

● screen ⇔ printer○ embedded color profiles?

● JPG○ IrfanView vs the world

● Video○ FLV: video fails but still plays sound ?

Page 79: Schizophrenic files

PNG

Various ancillary chunks (rendering level)● partially supported:

○ gamma○ transparency (for palettes)

● never supported?○ significant bits○ chromacities

● always supported?○ physical size

Page 80: Schizophrenic files

Conclusion

Page 81: Schizophrenic files

Conclusion

● such a mess○ specs are messy○ parsers don’t even respect them

● no CVE/blaming for parsing errors?○ no security bug if no crash or exploit :(

PoCs and slides: http://goo.gl/Sfjfo4

Page 82: Schizophrenic files

ACK

@reversity @travisgoodspeed @sergeybratusqkumba @internot @pdfkungfoo

@j00ru ise ds vx

Page 83: Schizophrenic files

questions?

Ange AlbertiniGynvael Coldwind

thank you

It's time to kick ass and chew bubble gum... and I'm all outta gum.

@angealbertini@gynvael

Page 84: Schizophrenic files

Flash (SWF) vs Prezi

vs

Bonus Round(not a fully schizophrenic problem in popular

parsers, that's why it's here)

Page 85: Schizophrenic files

Prezi SWF sanitizer

Prezi allows embedding SWF files.But it first sanitizes them.It uses one of two built-in SWF parsers.

There was a problem in one of them:● It allowed huge chunk sizes.● It just "jumped" (seeked) over these chunk...● ...which resulted in an integer overflow...● ...and this lead to schizophrenia.● As the sanitizer saw a good SWF...● ...Adobe Flash got its evil twin brother.

Page 86: Schizophrenic files

Prezi SWF sanitizer"good" SWF sent to sanitizer

and its evil twin brotherkudos to the sanitizer!

Fixed in Q1 2014. For details see: "Integer overflow into XSS and other fun stuff - a case study of a bug bounty"http://gynvael.coldwind.pl/?id=533