## 如何在metasploit對JavaScript進行混淆
隱藏是在開發過程中考慮的一個重要特點.如果你的exploit永遠被抓住.那么這和你的exploit多棒或者多么有技術挑戰是不重要的.在真正的滲透測試中,它很可能不是很有用。
特別是瀏覽器漏洞,主要依靠JavaScript來觸發漏洞,因此許多基于防病毒或基于特征的入侵檢測/防御系統將掃描JavaScript并將特定行標記為惡意代碼.以下代碼曾被多個防病毒軟件供應商視為MS12-063,即使這些代碼不一定有害或惡意,我們將在整個wiki上使用它作為示例:
~~~
var arrr = new Array();
arrr[0] = windows.document.createElement("img");
arrr[0]["src"] = "a";
~~~
為了避免被標記,我們可以嘗試一些常見的躲避技巧.例如,您可以手動修改代碼,使其不能被任何簽名識別.或者,如果防病毒軟件依靠緩存的網頁來掃描漏洞,則可能導致瀏覽器不緩存你的漏洞網頁,以避免漏洞檢查。或者在這種情況下,你可以混淆你的代碼,這是這篇文章的重點。
在Metasploit中,有三種常見的方法來混淆你的JavaScript。第一個是簡單地使用rand_text_alpha方法(在Rex)隨機化你的變量。第二個是使用ObfuscateJS類。第三個選項是JSObfu類。
### rand_text_alpha 技巧
使用rand_text_alpha 是最基本的逃避技巧.但也是最沒有效的。如果這是你的選擇,你應該隨機化任何可以隨機化,而不會破壞代碼。
通過使用上面的MS12-063,你將學會如何使用rand_text_alpha
~~~
# Randomizes the array variable
# Max size = 6, Min = 3
var_array = rand_text_alpha(rand(6) + 3)
# Randomizes the src value
val_src = rand_text_alpha(1)
js = %Q|
var #{var_array} = new Array();
#{var_array}[0] = windows.document.createElement("img");
#{var_array}[0]["src"] = "#{val_src}";
|
~~~
### ObfuscateJS 類
ObfuscateJS類就像rand_text_alpha,但更好。它允許您替換符號名稱,如變量,方法,類和名稱空間。它也可以通過隨機使用fromCharCode或unescape來混淆字符串.最后,它可以去掉JavaScript注釋,這是非常方便的,因為漏洞經常難以理解和閱讀,所以您需要注釋來記住為什么要以特定的方式編寫某些內容,但是您不想在滲透中顯示或泄露這些注釋
為了使用ObfuscateJS,我們再次使用MS12-063的例子來演示。如果你覺得自己不用編寫模塊就可以自己完成這個步驟,你可以做的就是繼續運行msfconsole,然后切換到irb,如下所示:
~~~
$ ./msfconsole -q
msf > irb
[*] Starting IRB shell...
>>
~~~
你準備好后.你使用ObfuscateJS做的第一件事是你需要用你想混淆的JavaScript來初始化它,所以在這種情況下,就像下面這樣開始:
~~~
js = %Q|
var arrr = new Array();
arrr[0] = windows.document.createElement("img");
arrr[0]["src"] = "a";
|
obfu = ::Rex::Exploitation::ObfuscateJS.new(js)
~~~
obfu應該是一個返回的Rex::Exploitation::ObfuscateJS對象.它允許你做很多事情,你可以真正的調用方法,或者查看源代碼,看看有什么方法可用(附加的API文檔)。但是為了演示目的,我們將展示最常用的一個:obfuscate方法。
要實際混淆,您需要調用該obfuscate方法.這個方法接受一個符號參數,它允許你手動指定要混淆的符號名(變量,方法,類等等),它應該像下面這樣
~~~
{
'Variables' => [ 'var1', ... ],
'Methods' => [ 'method1', ... ],
'Namespaces' => [ 'n', ... ],
'Classes' => [ { 'Namespace' => 'n', 'Class' => 'y'}, ... ]
}
~~~
所以,如果我想混淆變量arrr,我想混淆src字符串,這是怎么做
~~~
>> obfu.obfuscate('Symbols' => {'Variables'=>['arrr']}, 'Strings' => true)
=> "\nvar QqLFS = new Array();\nQqLFS[0] = windows.document.createElement(unescape(String.fromCharCode( 37, 54, 071, 045, 0x36, 0144, 37, 066, 067 )));\nQqLFS[0][String.fromCharCode( 115, 0x72, 0143 )] = unescape(String.fromCharCode( 045, 0x36, 0x31 ));\n"
~~~
在某些情況下,您實際上可能想知道符號名稱的混淆版本。一種情況是從元素的事件處理程序調用JavaScript函數,例如
~~~
<html>
<head>
<script>
function test() {
alert("hello, world!");
}
</script>
</head>
<body onload="test();">
</body>
</html>
~~~
混淆的版本如下所示
~~~
js = %Q|
function test() {
alert("hello, world!");
}
|
obfu = ::Rex::Exploitation::ObfuscateJS.new(js)
obfu.obfuscate('Symbols' => {'Methods'=>['test']}, 'Strings' => true)
html = %Q|
<html>
<head>
<script>
#{js}
</script>
</head>
<body onload="#{obfu.sym('test')}();">
</body>
</html>
|
puts html
~~~
### JSObfu類
JSObfu類曾經是ObfuscateJS的堂兄弟,但自2014年9月以來已經完全重寫,并被封裝成一個gem。混淆更為復雜,您實際上可以用它混淆多次。您也不再需要手動指定要更改的符號名稱,它是知道的。
#### 嘗試jsobfu
讓我們再回到irb來展示使用JSObfu是多么容易
~~~
$ ./msfconsole -q
msf > irb
[*] Starting IRB shell...
>>
~~~
這個時候我們嘗試`hello world`的例子
~~~
>> js = ::Rex::Exploitation::JSObfu.new %Q|alert('hello, world!');|
=> alert('hello, world!');
>> js.obfuscate
=> nil
~~~
它的輸出是這樣的
~~~
window[(function () { var _d="t",y="ler",N="a"; return N+y+_d })()]((function () { var f='d!',B='orl',Q2='h',m='ello, w'; return Q2+m+B+f })());
~~~
像ObfuscateJS一樣,如果你需要得到一個符號名稱的隨機版本,你仍然可以這樣做。我們將用下面的例子來演示
~~~
>> js = ::Rex::Exploitation::JSObfu.new %Q|function test() { alert("hello"); }|
=> function test() {
alert("hello");
}
>> js.obfuscate
~~~
如果我們想知道方法名test的隨機版本
~~~
>> puts js.sym("test")
~~~
很好,快速確認一下
~~~
>> puts js
function _(){window[(function () { var N="t",r="r",i="ale"; return i+r+N })()](String.fromCharCode(0150,0x65,0154,0x6c,0x6f));}
~~~
我看起來很好,最后,讓我們嘗試混淆幾次,看看結果如何:
~~~
>> js = ::Rex::Exploitation::JSObfu.new %Q|alert('hello, world!');|
=> alert('hello, world!');
>> js.obfuscate(:iterations=>3)
=> window[String[((function(){var s=(function () { var r="e"; return r })(),Q=(function () { var I="d",dG="o"; return dG+I })(),c=String.fromCharCode(0x66,114),w=(function () { var i="C",v="r",f="omCh",j="a"; return f+j+v+i })();return c+w+Q+s;})())](('Urx'.length*((0x1*(01*(1*020+5)+1)+3)*'u'.length+('SGgdrAJ'.length-7))+(('Iac'.length*'XLR'.length+2)*'qm'.length+0)),(('l'.length*((function () { var vZ='k'; return vZ })()[((function () { var E="h",t="t",O="leng"; return O+t+E })())]*(0x12*1+0)+'xE'.length)+'h'.length)*(function () { var Z='uA',J='tR',D='x'; return D+J+Z })()[((function () { var m="th",o="g",U="l",Y="en"; return U+Y+o+m })())]+'lLc'.length),('mQ'.length*(02*023+2)+('Tt'.length*'OEzGiMVf'.length+5)),(String.fromCharCode(0x48,0131)[((function () { var i="gth",r="len"; return r+i })())]*('E'.length*0x21+19)+(0x1*'XlhgGJ'.length+4)),(String.fromCharCode(0x69)[((function () { var L="th",Q="n",$="l",I="g",x="e"; return $+x+Q+I+L })())]*('QC'.length*0x2b+3)+(01*26+1)))]((function(){var C=String[((function () { var w="rCode",j="mCha",A="fr",B="o"; return A+B+j+w })())]((6*0x10+15),('riHey'.length*('NHnex'.length*0x4+2)+4),(01*95+13),(1*('Z'.length*(0x1*(01*(0x3*6+5)+1)+18)+12)+46),(0x1*(01*013+6)+16)),JQ=String[((function () { var NO="ode",T="rC",HT="fromCha"; return HT+T+NO })())](('J'.length*0x54+17),(0x2*051+26),('TFJAGR'.length*('ymYaSJtR'.length*'gv'.length+0)+12),(01*0155+2),(0xe*'FBc'.length+2),(0x1*22+10),(3*(01*043+1)+11)),g=(function(){var N=(function () { var s='h'; return s })();return N;})();return g+JQ+C;})());
~~~
### 使用jsbofu進行模塊開發
當你正在編寫一個模塊時,你不應該像上面的例子那樣直接調用Rex。相反,你應該使用JSObfu mixin中的#js_obfuscate方法。當你在你的模塊中使用JavaScript時,一定要這樣寫:
~~~
# This returns a Rex::Exploitation::JSObfu object
js = js_obfuscate(your_code)
~~~
- Home
- 開始使用
- 安裝metasploit開發環境
- 使用metasploit
- 使用git
- 報告一個bug
- 貢獻代碼
- 貢獻給metasploit
- 創建一個loginscans Metasploit模塊
- 接受模塊和增強功能的指導
- 常見的Metasploit模塊代碼錯誤
- 樣式提示
- metasploit提交者
- metasploit開發
- 為什么是ruby
- 樣式提示
- 如何開始寫一個exploit
- 如何開始寫一個輔助模塊
- 如何開始寫一個post模塊
- 如何開始寫一個Meterpreter腳本
- 載入外部模塊
- exploit rank
- Metasploit模塊引用標識符
- 怎么在你的exploit中確認window補丁程序級別
- 如何使用filedropper清理文件
- 如何棄用metasploit模塊
- 如何在模塊開發中報告或儲存數據
- 在metasploit如何使用日志
- 如何在metasploit對JavaScript進行混淆
- 如何解析一個http響應
- 如何使用HTTPClient發送HTTP請求
- 如何使用命令階段
- 如何使用數據儲存選項
- 如何在window后期開發中使用railgun
- 如何在exploit中使用powershell
- 如何使用PhpEXE來利用任意文件上傳漏洞
- 如何使用FILEFORMAT mixin創建一個文件格式exploit
- 如何使用BrowserExploitServer編寫一個瀏覽器exploit
- 如何使用HttpServer編寫瀏覽器exploit
- 如何編寫一個check()方法
- 如何使用Seh mixin來利用異常處理程序
- 如何在Windows上使用WbemExec進行寫入權限攻擊
- 如何使用httpserver和httpclient編寫一個模塊
- payloads如何工作
- 如何免殺
- 如何正確使用metasploit模塊