资源描述:
《编写和应用穿墙shellcode》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、编写和应用穿墙Shellcode~教育资源库 Shellcode要求是:满足攻击机器位于NAT的内网中的情况,溢出后能突破防火墙限制、突破操作系统版本限制、能自动接收并执行文件、最后安全退出。这实际上是要编写一个综合性的Shellcode,结合这两个漏洞的具体情况,经过两整天的编写和调试最终成功,完整的Shellcode汇编代码和攻击程序参见文章附带的源码。这里我主要想和大家交流实现的思路和过程。 第一部分:打造综合功能的Shellcode 制定最佳的防火墙突破思路及文件传送方式 我们的目标是攻击个人主机,这里的防火墙也专指个人防火墙(PFe法)、要
2、么就是目标服务进程中代码在调用recv函数时开辟的缓冲区大小很难确定(字符串匹配法)或则是该服务进程根本就没使用recv函数来接收数据(hookrecv法)。根据Shellcode设计要求,该方法不应该成为首选。 方法二、端口复用,也就是溢出成功后在目标服务进程中重复绑定其开放的TCP端口。这种方法应该能满足我们的设计要求,但它存在一个限制:假如服务进程中绑定端口时通过setsockopt函数设置了SO_EXCLUSIVEADDRUSE选项的话,重复绑定该端口是不会成功的。那么究竟怎么检测服务进程是否设置了SO_EXCLUSIVEADDRUSE呢?比如检测
3、CCProxy进程(对应808端口),在本地运行该进程,另外编写一程序,绑定808端口,并且设置: setsockopt(fd,SOL_SOCKET,SO_REUSEADDR, (char*)val,sizeof(val)) 如果bind函数返回0,则说明未设置SO_EXCLUSIVEADDRUSE,反之设置。 通过实验,CCProxy和RealServer服务进程中绑定端口时都没有设置SO_EXCLUSIVEADDRUSE,看来采用端口复用的方法是可行的!不急,把其它两种方法看了再说,说不定有更好的方法呢。 方法三、重新绑定服务进程开放端口。这种
4、方法适合在第二种方法不起作用,即服务进程设置了SO_EXCLUSIVEADDRUSE时采用。它需要在重新绑定端口之前退出进程、移植文件、创建进程、向新进程注入Shellcode等工作。因此,这种方法是最通用的一种,也是实现起来最复杂的一种。 方法四、代码注入可信任进程。这种方法要求攻击者本机监听一常用端口(如80端口),Shellcode执行时创建可信任的进程(如InterExplore),然后再将通信部分的Shellcode通过CreateRemoteThread注入到该进程中去让其执行以完成指定的功能。假如防火墙对外出的端口做了严格的限制,这种方法可能
5、会失败,实现起来和第三中方法的复杂程度相近,但总的来讲成功率还是很高的。 比较完四种溢出成功后突破防火墙方法各自的优劣,毫无疑问,我选择第二种方法---端口复用。 接下来就是文件的传输方式。这里以目标系统为服务端,攻击者为客户端,客户端向服务器端上传文件。 取消系统版本的限制----Shellcode中API函数地址的动态获取 这部分不是什么新鲜的东西,在很多资料中都有描述,但它却是很基本、很重要的。编写Shellcode的过程中,很用到多个API函数来完成各种功能。但是不同的oveax,[eax+0x0c] movesi,[eax+0x1c]
6、lodsd movebx,[eax+0x08]//ebx=Kernel32.dll基址 moveax,[ebx+0x3c]//eax=PEheaderoffset moveax,[ebx+eax+0x78] addeax,ebx//eax=输出表目录指针 mov[ebp+20h],eax//保存输出表目录指针 movecx,[eax+0x18]//函数名数目 moveax,[eax+0x20] addeax,ebx//eax=函数名指针数组指针 movDovDovdovdovdovovbyteptr[ebp+0xe],0 movesi,e
7、bp pushesi pushecx//保存外层循环次数 moveax,[eax]//得出指针偏移 addeax,ebx//eax某个函数名地址 movedi,eax move1234下一页友情提醒:,特别!cx,14//GetProcAddress的长度 repcmpsb jneFindNext//如果当前函数名不是指定的函数名则查找下一个 addesp,4 moveax,[ebp+20h] moveax,[eax+0x24] addeax,ebx//获得序号转换表地址,以便取得正确的函数地址序号 movedi,D push2/
8、/AF_I call[ebp+44h]//sock