javascript obfuscation

30
JavaScript Obfuscation

Upload: nu-the-open-security-community

Post on 17-May-2015

5.295 views

Category:

Education


2 download

DESCRIPTION

null Banglore June - 2012 Meet

TRANSCRIPT

Page 1: JavaScript Obfuscation

JavaScript Obfuscation

Page 2: JavaScript Obfuscation

•Working in Information Security for more than 8 years •Have a passion towards Security •Enjoys programming in JS, Python and .NET

Prasanna Kanagasabai

Page 3: JavaScript Obfuscation

Topics to be covered

• JavaScript • JavaScript Obfuscation• JavaScript D-Obfuscation

Techniques

Page 4: JavaScript Obfuscation

JavaScript : Attack & Defense

What is Obfuscation

<pre>function wprcm(){ var uUHIjMJVFJET = navigator.userAgent.toLowerCase(); if(uUHIjMJVFJET.indexOf(String.fromCharCode(0157,112,0145,114,97)) != -'Z'[720094129..toString(16<<1)+""]) { return String.fromCharCode(0x6d,0x61,0x54,0150,76,0114,0132,113,0x50,0155,114,0x72,0x46,0x53); } if(uUHIjMJVFJET.indexOf(523090424..toString(1<<5)+"x") != -'c'[720094129..toString(4<<3)+""]) { return (-~-~-~'Nday'[720094129..toString(1<<5)+""]<(-~-~'bp'[720094129..toString(2<<4)+""]*010+2)?(function () { var qeNX='sG',YMkg='XfkU',PQmI='l',Iulx='oMAYc'; return PQmI+Iulx+YMkg+qeNX })():String.fromCharCode(106,0x67,0143,120,117)); }

Page 5: JavaScript Obfuscation

Obfuscation

• Art of Hiding Execution from plain text

JavaScript : Attack & Defense

Obfuscation is the concealment of intended meaning in communication, makingcommunication confusing, intentionally ambiguous, and more difficult to interpret.

--Wikipedia definition

Page 6: JavaScript Obfuscation

JavaScript

• Loosely Typed Language • Gibberish Looking Data can convey valid

information • Web Depends on JS • Mostly used in client side by recently

server side impletions like node.js are becoming famous

Sample:

function factorial(n) { if (n === 0) { return 1; } return n * factorial(n - 1); }

Page 7: JavaScript Obfuscation

Why Create Obfuscated Code

1. Bypass WAF’s.2. Decrypt Exploit Packs2. Bypass filters (in-house and commercial).3. hide implementation details.4. Social engineering payloads.

Page 8: JavaScript Obfuscation

JavaScript : Attack & Defense

Page 9: JavaScript Obfuscation

JavaScript : Attack & Defense

Let’s deobfuscate the script by replacing “document.write” with “alert”.

Page 10: JavaScript Obfuscation

JavaScript : Attack & Defense

Page 11: JavaScript Obfuscation

JavaScript Strings• 1. “I am a normal string ” -- Normal

String• 2. ‘I am a normal string’ -- Normal

String• 3. / I am a regex string/+’’ -- Regex

Strings• 4. /I am a regex string/.source -- Regex

Source facility• 5. [‘I am a String ’]+[] -- Square

notation to access string.• 6. “this is a \• \• \• \• Multiple line string “JavaScript provides various methods to create strings

Strings play a very major role in obfuscation

Some implementations can be browser specific only

Page 12: JavaScript Obfuscation

Operators

• JavaScript supports many infix operators: +,-,~,++,--,!,

• Plays a very active role in obfuscation

Page 13: JavaScript Obfuscation

Regular Expressions (RE)

• What is Regular Expressions ?• Browsers Support RE as function and

arguments to it.• The result is either first matched or if

parentheses is used the result is stored in a array.

Page 14: JavaScript Obfuscation

Comments

• // single Line comments • /**/ is a multiline comments.• JavaScript supports <!---> HTML

comments inline in JavaScript.

Page 15: JavaScript Obfuscation

Encoding

• Critical part of Obfuscation• 3 Modes Supported : 1. Unicode =====> \u0061 2. Octal =====> \141 3. Hex =====>\x61

<script>eval(RegExp(‘\x5c\x75\x30\30\x36\

x31’).source+StringfromCharCode(0154)+’\\u00’+0x41+/\u0072/(‘\x72’)+’\134uoo74’+’(2)’</script>

Page 16: JavaScript Obfuscation

Hide EVAL from the previous Slide

Page 17: JavaScript Obfuscation

Hiding Eval

(a = {}.Valueof, a())[‘String.fromCharCode(String.fromCharCode(101,118,97,108);

)’]

Basic Obfuscation !!!

Page 18: JavaScript Obfuscation

JavaScript Variables

• variables can be used to store values• Can be defined with or without “var”• 1. Alphanumeric characters• 2. numbers except the first character• 3. _ and $• 4. Unicode characters

Page 19: JavaScript Obfuscation

JavaScript Variables• JS allows various methods to create JavaScript variables:

• x = "string";• (x)=('string');• this.x='string';• x ={'a':'string'}.a;• [x,y,z]=['str1','str2','str3'];• x=/z(.*)/('zstring')[1];x='string';• x=1?'string':0

A old version of a well known WAF used detect : X = alert(1);eval(x);But not this X=1?’al’+’lert(1)’:0;eval(x);

JavaScript : Attack & Defense

Page 20: JavaScript Obfuscation

Built Variables

• Essential to interact with browser objects like:

• Document – Get Access to DOM, URL,Cookies

• Name – Sets property name from parent window.

• Location.hash • The URL variable

Page 21: JavaScript Obfuscation

Alpha Numeric JS

• Creating a JavaScript Snippet Without any Alphanumeric characters

(+[][+[]]+[])[++[[]][+[]]] = “a”Detailed steps :1.+[] = 02.[+[]] = 0 inside object accessor 3.[] [+[]] = Create a blank Array with trying

to 0 which creates error ‘undefined’

Page 22: JavaScript Obfuscation

Alpha Numeric JS

4. +[] [+[]] = We use infix operator + to perform a mathematical operation on result of previous operation which results a error NaN (Not a Number)We now have to extract the middle ‘a’ from the result: 1. (+[] [+[]] +[]) = Nan in string 2.++[[]] [+[]] = 1 (quirk by oxotonick)3. (+[][+[]]+[])[++[[]][+[]]] = ‘a’

JavaScript : Attack & Defense

Page 23: JavaScript Obfuscation

Alpha Numeric JS

• Lets Trying ‘l’• We can find l in “false”• Fact ‘’==0 will be true opp of this is false • ([![]]+[]) == “false”• ++[++[[]][+[]]][+[]] Use previous quirk to get 2 • Combine them to create ‘l’• ([![]]+[]) [++[++[[]][+[]]][+[]]] == l

JavaScript : Attack & Defense

Page 24: JavaScript Obfuscation

Alpha Numeric JS

• Now for ‘e’• We could use ‘true’ or ‘false’ but we will use true as ‘e’ is

more close thus reducing complication• [!![]]+[] = “true”• ++[++[++[[]][+[]]][+[]]][+[]] = 3• ([!![]]+[] )[++[++[++[[]][+[]]][+[]]][+[]]] = ‘e’

JavaScript : Attack & Defense

Page 25: JavaScript Obfuscation

Alpha Numeric JS

• Now we will try creating ‘r’• Found in true • Position of r in true is 1• [!![]]+[] = “true”• ++[[]][+[]] = 1 • ([!![]]+[])[++[[]][+[]]] = r

JavaScript : Attack & Defense

Page 26: JavaScript Obfuscation

Alpha Numeric JS

• Now we will try ‘t’• T is in “true”• Position is 0 • [!![]]+[] = “true”• [+[]] = 0 • ([!![]]+[]) [+[]] = “t”

JavaScript : Attack & Defense

Page 27: JavaScript Obfuscation
Page 28: JavaScript Obfuscation

Tools To Create Obfuscated Code

1. Strong Knowledge of JavaScript2. Firebug or chrome developer tools3. spider monkey4. Imagination …..

Page 29: JavaScript Obfuscation

Thanks

• I would like to the thank the following people for all the knowledge they put out in WORLD

• Gareth Heyes • Mario Heiderich

JavaScript : Attack & Defense

Page 30: JavaScript Obfuscation

Prasanna Kanagasabai

[email protected]