编写和应用穿墙Shellcode(4)
善始善终----安全退出
在调用WindowsExec执行木马文件后,应该采用安全退出的方式,这里采用ExitProcess函数,当然也可以采用ExitThread函数。否则,可能会在目标机器管理员面前突然弹出Windows默认错误对话框,从而引起管理员的警惕。汇编代码如下:
end: push 0
call [ebp + 14h]
最后就是Shellcode的提取。汇编提取Shellcode是通过:获取调试内存数据 + UltraEdit32编辑 + 加引号程序步骤来实现的。将汇编程序进入调试状态,调试指针指向第一句汇编。
选择debug窗口的memory选项,将汇编对应的机器码复制下来,粘贴到UltraEdit中。
用UltraEdit32列模式去掉每行前面的地址等非机器码部分后,保存为input.txt,最后用加引号程序生成Shellcode。加引号程序的代码见附带的代码。
至此,Shellcode编写完成,通过测试达到了预期的功能。单纯的Shellcode测试方法很多,最近几期也有介绍,我这里不多罗嗦了。
实战----攻击代码的实现
Shellcode生成以后,就进入我们的实战阶段。我们的目的是成功利用CCProxy和RealServer这两个漏洞。这两个漏洞以前ISNO分析过,当时给出攻击代码功能是传统的监听空闲TCP端口。这里我们要将功能按照我们的要求进行改进,生成的Shellcode共3部分,编写攻击代码时直接将3部分连接在一个数组中就可以了。下面我谈谈这两个漏洞利用中值得注意的问题:
CCProxy溢出漏洞的利用改进
CCProxy是多功能代理服务软件,其http代理端口默认是808端口。很多版本的CCProxy都存在溢出漏洞,只是目前为止这些漏洞都还没有正式公布出来,这里针对6.0 版本。向该端口发送超长的GET请求时会发生溢出,通过覆盖函数返回地址可以执行任意指令。看起来和普通的漏洞利用差不多,只是溢出串的长度和攻击者机器自身IP(或外网网关IP)长度有关。假设该IP长度为11(如61.139.2.33),则计算一个填充量offset=15 – 11 = 3,当发送4045 + offset字节请求时溢出发生,Shellcode的跳转地址嘛,当然还是那个0x7ffa4512。
关于传输文件的大小是攻击代码中动态获取,连同目标端口808一起填入Shellcode相应位置。经过编码(XOR XX),加上解码的代码就可以完成攻击代码了。
RealServer溢出漏洞的利用改进
RealServer9.01及以下版本具有一个指针溢出漏洞,对应端口为554,通过大量的“../”(DAS指令)过渡恰好可以形成非常通用的攻击代码,而且不需要用jmp esp这样的跳转指令。漏洞的细节这里也不再罗嗦,因为2004年6期《黑防》中有漏洞的分析。我在改写攻击代码的过程中,发现代码老是被截断。弄了老半天,终于发现编码后的Shellcode中’\r’、’\n’、0、0xff这样一些字符全都不能有,否则Shellcode被截断。通过尝试,发现XOR 0x85正好符合编码要求。此外,我们惯用的解码代码中由于有向前跳转的指令,也少不了0xff,因此也必须修改。通过调试发现溢出发生时,EBP +37h指向的位置刚好是待解码部分的首地址,因此变通一下,将解码部分汇编代码改为:
MOV EDI,EBP
ADD EDI,37
XOR ECX,ECX
MOV DL,85
ADD CX,0334
decode :MOV BL,[EDI] //开始循环解码
XOR BL,DL
MOV [EDI],BL
INC EDI
LOOP decode
小结
通过本文,我和大家交流了一个综合功能Shellcode的打造过程,以及该Shellcode在具体漏洞中的应用和相关问题的解决过程,希望能给有兴趣的朋友一点启示。其中很多东西还是很基础的,说明我们只要把基础知识慢慢打牢固了,才能够解决更多的问题,水平才能逐步提高。此外,限于本人技术水平,本文中肯定有一些我没有考虑到或则是讲的不够清楚的地方,如果大家有一些更好意见,欢迎和我多多交流,以便共同提高