绝对突破防火墙

适合读者:漏洞分析员、程序员、***爱好者

前置知识:端口复用技术,C语言基本语法

脚本小子:如何在溢出后获得安全的、隐蔽的Shell是你们一直都在讨论的问题,由于如今的防火墙和各类安全软件漫天飞,想不被它们发现还真是很难,幸亏有不少牛人们用本身的实力探
适合读者:漏洞分析员、程序员、***爱好者
前置知识:端口复用技术,C语言基本语法
脚本小子:如何在溢出后获得安全的、隐蔽的Shell是你们一直都在讨论的问题,由于如今的防火墙和各类安全软件漫天飞,想不被它们发现还真是很难,幸亏有不少牛人们用本身的实力探索出了一条这样的道路,让咱们这些人能顺着前辈的步伐一点点进步。本文给出了两种目前比较先进的端口复用技术,用在溢出后的端口绑定和Shell的获取,目前防火墙和各类安全工具对这样的技术仍是陌生的,能够预见又一波新的技术浪潮即将在网络这片海洋上咆哮!
绝对突破防火墙
/dangguai27
其实很早就想写点东西了,可总是以为本身对于事物的研究不深刻,写了会让人笑话。这一次坐卧不安,把最近关于溢出技术中端口利用的体会写出来,还但愿你们给予指点。
 
溢出后端口利用的缺陷
以 前学习网络课程的时候,只是了解了端口和应用层服务之间的对应关系。后来对安全方面逐渐有了兴趣,再经过学习些系统底层的东西,进一步了解端口和进程是怎 样映射的。再后来,接触了缓冲区溢出,步步深刻,同时也更多地涉及到了端口的使用……呵呵,以为我在说本身的成长史吧?
回 到正题,在溢出技术(这里暂时都指堆栈溢出)中,传统的端口利用方式大体有两种:一种是普通***所采用的,***成功之后,在对方机器上驻留一段服务程序, 而***者做为客户端,服务端经过一个端口打开链接资源,等待客户端链接。另外一种方式是反弹***所采用的,在本方机器打开一个端口,做为服务端,而对方机器 做为客户端,***成功后,客户端会主动链接服务端。
对于前一种方式,防火墙对进入本机的数据包进行相应的策略设置,就能轻易的截获掉***数据包,从而避免本机信息本***者获取。
后一种方式,通常的我的防火墙的默认策略设置忽略了对于本机向外界发送的数据包的检测,所以即使是安装了防火墙,也可以进行链接。但这种方式也并不是无懈可击,只要让防火墙对本机向外界的端口范围进行限制,这类***一样也能够被避免。例如,***成功之后,***者在本机开了777端口等待对方来链接,可是若是对方为了不反弹***的***,对防火墙对本机访问网络的端口作了限制,如图1所示:
1 天网我的防火墙对于本机外连的设置
当只容许访问本机访问外界的80如下端口时,咱们让对方链接咱们开放的777端口的但愿就会化为泡影。而且在反弹链接时对方防火墙会给出以下告警(如图2所示):
2 防火墙给出的访问非法端口的告警信息
 
尽管通常用户对于我的放火墙这样设置的状况很少,但一旦遇到,***就不会成功。
基于上述端口利用方式的缺陷,如今出现了另外一种新的利用方式,即Sanxcon20042004焦点峰会)中提到的复用当前链接的端口利用方式。这里的端口利用方式分为端口的重复绑定和从新绑定两类。本文中我不打算讨论ShellCode的具体编写,由于这方面的资料网上实在太多,我主要从实现方法这个角度来讨论。

突破防火墙限制一:复用当前端口

这种方式相对后面介绍的从新绑定端口而言要容易实现一些。在Winsock的实现中,对于服务器开放端口大可能是能够重复绑定的。
这里举一个例子,某机器上开放了WWW服务,端口为80。若是该主机存在IIS溢出漏洞,则***者发送***代码到该主机并使其溢出后,采起的利用方式是在ShellCode中重复绑定对方80端口,而且使用函数Setsockopt()对套接字的属性进行设置,这里将第3个参数设置为SO_REUSEADDR而非SO_EXCLUSIVEADDRUSE。缘由是这样的,SO_REUSEADDR表示若是80端口没有被独占的话,则能够重复绑定;而SO_EXCLUSIVEADDRUSE则表示只容许80端口绑定一次,可是对方www服务并无挂掉,仍然占用着80端口,咱们再次绑定确定失败。
绑定成功之后,对方机器上打开CMD输入netstat –an命令能够看到有两个IP绑定着80端口,如图3所示:
 
3 重复绑定80端口
这样绑定以后,若是外界链接该主机的80端口,则使用ShellCode中绑定的那个套接字。剩下的事情就只是利用该链接来为***者作哪一种服务而已了,能够绑定到Cmd,也能够上传、下载文件。在附带的代码中,我写了一个用高级语言实现的重复绑定80端口,而后传输上传并执行文件Sample.exeC/S示例。
因而可知,重复帮定端口的方式的特色是,溢出成功后,直接在原来的进程中重复绑定当前服务开放的端口。
这里也有一些问题,好比135139端口是不能重复绑定的,这是因为对应的服务可能设置了SO_EXCLUSIVEADDRUSE。此外,***者应该注意将咱们的功能和原来的服务区别开来。实现起来,只需先判断接收到的数据包是不是咱们想要的数据,若是是则按照咱们预约的方式处理。若是不是咱们想要的,则经过127.0.0.1传送给真正的应用,这也在附带的代码中有所实现。

突破防火墙限制二:从新绑定当前端口

这种方式与第一种有所不一样,实现起来也更为复杂。因为135139端口是不能重复绑定的,所以,要想从新利用当前端口,可行的方法就是先将当前进程结束,再绑定原端口。基本思路是这样,但问题是,怎样实如今系统进程中既要本身结束当前进程又要成功地从新绑定原端口呢?实现的方法以下:
1.溢出成功之后,在ShellCode中调用CreateProcess()为当前进程建立一个Suspend模式的子进程,这里第6个参数设置为CREATE_SUSPENDED
2.调用函数GetThreadContext()来得到子进程中主线程的上下文结构和寄存器信息。
3.调用VirtualAllocEx()在子进程里分配内存。
4.把ShellCode指令用WriteProcessMemory()来写入子进程刚才分配的空间。这里的ShellCode指令指ShellCode中在从新绑定端口之后将要用到的部分,它的功能能够是绑定Cmd,也能够是传输文件。
5.调用SetThreadContext()GetThreadContext()得到的EIP修改指向VirtualAllocEx()分配的内存地址,这样作的目的是让子进程的主线程结束后当即跳到咱们的ShellCode指令中执行。
6.接下来就是调用ResumeThread()恢复Suspend模式的进程并立刻调用TerminateProcess()结束当前进程。
这样就达到了从新绑定原端口,135139端口均不例外。然而还有一个问题是,子进程对应的执行程序是什么呢?答案很简单,固然是Cmd.exe,由于在Windows 2000之后的各系统版本中都存在Cmd.exe。并且更合适的是,Cmd有一个参数是 /c,表示“运行完指令后终止”,这样就刚好符合了要求其主线程很快结束的需求。实现起来,只须要将CreateProcess()2参数设置为如“cmd.exe /c dir”一类的形式就能够了。
至此,从新绑定端口的过程结束,***者能够远端链接,而后执行要要的功能。不管是绑定Cmd,仍是传输文件,都是经过原来进程开放的端口进行,防火墙是不会阻截。在附带的代码中也有对应的高级语言模拟从新绑定19800端口的示例,测试是只须要连续两次telnet  ip  19800便可。

后记

上面介绍了溢出技术中端口利用的各类方式,侧重点在实现方法上,也叙述了在实现过程当中须要注意的一些问题,但愿对感兴趣的朋友有所帮助。附带代码中的模拟过程都是基于高级语言的,通过屡次测试都是成功的。至于汇编实现以及转变为ShellCode的生成这里没有谈及,可是相信从方法上掌握了之后,实现起来也不会是很困难。端口重复绑定和从新绑定以及Socket查找的ShellCode编写在之后的讨论中进行。
(文中涉及的程序及源代码已收录到杂志配套光盘“杂志相关”栏目,按文章名查找便可)