这些天闲来无事把以前写的东东整理了下,突然发现一个有趣的玩意,是帮Leading Yu写的***学实验,我貌似写了个ICMP的小***,这里就贴出来大家娱乐娱乐了~~
1. 什么是ICMP协议
ICMP
是
“Internet Control Message Protocol”
(
Internet
控制消息协议)的缩写。它是
TCP/IP
协议族的一个子协议,用于在
IP
主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP协议在网络上有很多用处,比如ICMP扫描,拒绝服务(DOS)***,隧道***,以及我们最常用到的PING程序。而我们就是利用ICMP协议来为我们传送(TCP/UDP)数据。大家知道一般的防火墙都是过滤了来自外部主机的回送请求(echo Request)报文,但为了是自己能够探测外部主机的当前状态,防火墙都不会过滤掉回送应答(echo Reply)数据报,而且ICMP报文可以在广域网上传送,这样我们就可以利用它来突破网关的种种限制。
2. 为什么选择ICMP协议设计***
ICMP
协议对于网络安全具有极其重要的意义。
ICMP
协议本身的特点决定了它非常容易被用于***网络上的路由器和主机。比如,可以利用操作系统规定的
ICMP
数据包最大尺寸不超过
64KB
这一规定,向主机发起
“Ping of Death”
(死亡之
Ping
)***。
“Ping of Death”
***的原理是:如果
ICMP
数据包的尺寸超过
64KB
上限时,主机就会出现内存分配错误,导致
TCP/IP
堆栈崩溃,致使主机死机。此外,向目标主机长时间、连续、大量地发送
ICMP
数据包,也会最终使系统瘫痪。大量的
ICMP
数据包会形成
“ICMP
风暴
”
,使得目标主机耗费大量的
CPU
资源处理,疲于奔命。
3. ICMP协议***设计方案
***的设计需要两个程序,一个是作为***服务端,一个是***客户端,一个不权威的划分将历史上的***分为5代,结果图如下:
传统EXE***是最简单和常见的***形式,不过这种***由于广泛应用,所有各大杀毒软件都会把它kill掉,不过,后来有***发展出ICMP***或反弹端口***来逃过查杀,我这次设计的***就是基于ICMP报文的***,效果非常不错。
传统DLL/VxD***是一类不会自己运行的***,它是通过系统进程来加载的,所以一般的任务管理器是看不出来有没有莫名的EXE程序在运行的,不过这类***一般当执行时需要开启一个系统端口,而对于1024以上的端口一般的杀毒软件是一直在监控的,所以这类***当执行***任务时会轻而易举的被杀毒软件发现,我也就没有采取这类***设计。
替换挂钩式DLL***是一类非常高级的***,它还是DLL***,不过这种DLL***会将系统中的正常DLL文件改个名字,然后自己改为这个正常DLL文件的名字,当系统需要调用正常DLL文件中的接口时,这个***DLL就会对系统DLL文件提供的函数进行挂钩,任务就交给正常的DLL执行,当接收到***客户端传过来的任务时就执行***任务。这种***的出现曾经盛极一时,不过后来微软公司非常重视这个***问题,在win2000内核之后的windows版本后系统自动以数码认证方式来查看各系统DLL文件是不是原来的文件,如果不是就从系统的备份处将原始DLL文件复制过来,而且考虑到备份可能被破坏,windows系统将会存在多份备份,在如此严格的保护下,这种***就失去了生存的空间。
注入式DLL***,这种技术才是***界的神技,利用注入技术将DLL***寄生到某个系统文件中,当该系统文件运行时***也一并运行,如此不仅在任务管理器之类的工具中看不到任何异常,而且使用端口监测的软件也看不出任务问题,不过在WinXP SP2、WinVista和后续的windows版本中加入了数据执行保护(DEP)的功能后,这类***会被杀毒软件查看内存时被kill,所以后来也没有什么作为。
最新的***永远是存在那些最优秀的程序员脑中的***,随着程序员技能的提高,各种系统平台的开源、虚拟化、网络化,只要你肯去学习,就一定能编写出世界上独一无二的***,杀毒软件当然也检查不到,因为系统是人写的,人写的就一定会有漏洞,没有哪个系统是没有漏洞的,如果没有漏洞,我们也不需要天天去更新系统补丁了。
客户端编写:
我编写的ICMP***原始工作流程如下:
对于实现这个服务端我就遇到很大的困难,比如,如何从如大海般的报文中接收正确的客户端的ICMP报文,后来我想到了ICMP报文头中有个序列号可以自己设置,于是我便把这个序列号设置为5678,当服务端程序只有收到序列号为5678的ICMP报文时才移交给服务线程去执行。接下来我就需要考虑ICMP报文的网络传递路径问题了,我上网查了很多资料,这期间微软公司的MSDN网站帮助我很大,在MSDN中有这样一段对ICMP报文的描述:
“什么是ICMP呢?ICMP全称是Internet Control Message Protocol(互联网控制报文协议)它是IP协议的附属协议,用来传递差错报文以及其他需要注意的消息报文,这个协议常常为TCP或UDP协议服务,但是也可以单独使用,例如著名的工具Ping,就是通过发送接收ICMP_ECHO和ICMP_ECHOREPLY报文来进行网络诊断的。实际上,ICMP***的出现正是得到了Ping程序的启发,由于ICMP报文是由系统内核或进程直接处理而不是通过端口,这就给***一个摆脱端口的绝好机会,***将自己伪装成一个Ping的进程,系统就会将ICMP_ECHOREPLY(Ping的回包)的监听、处理权交给***进程,一旦事先约定好的ICMP_ECHOREPLY包出现(可以判断包大小、ICMP_SEQ等特征),***就会接受、分析并从报文中解码出命令和数据。 ICMP_ECHOREPLY包还有对于防火墙和网关的穿透能力。对于防火墙来说,ICMP报文是被列为危险的一类:从Ping of Death到ICMP风暴到ICMP碎片***,构造ICMP报文一向是***主机的最好方法之一,因此一般的防火墙都会对ICMP报文进行过滤;但是ICMP_ECHOREPLY报文却往往不会在过滤策略中出现,这是因为一旦不允许ICMP_ECHOREPLY报文通过就意味着主机没有办法对外进行Ping的操作,这样对于用户是极其不友好的。如果设置正确,ICMP_ECHOREPLY报文也能穿过网关,进入局域网。”
看来前辈对ICMP报文***研究的已经很透彻了,不然MSDN上也不会有这样一段描述,不过即使这样,也不妨碍我设计我的***,因为只要***技术会随着时间更新就永远走在安全之前。
我又查了一些传统的网络连接图,我把它简单的绘制如下:
这里面有几项必须要说明,比如Winsock技术,在计算机网络课程设计中我已经学会如何使用了,所以在***的设计中不是拦路虎了,其他的连接过程我确实还是一片空白,这个时候图书馆就发挥了无比巨大的作用,我在图书馆里借到了微软公司出版社2000年出版的《Windows网络编程技术》这本书,刚好这本书里有Ping命令的大致实现过程,其中也谈到了ICMP的设计,我根据自己的理解绘制如下图:
然后我又从MSDN网站上学习了winsock中关于ICMP协议的相关知识,于是就设计出了一个简单的服务端模型,我又加上了sock建立的过程函数和ICMP报文构造的过程,现在我的服务端基本完成了,下面就需要设计它能执行的***命令了。
“pslist”和“pskill”命令设计:
我首先想到必须完成的功能就是能够关闭系统中的进程,因为作为一个好的***必须具备这样的能力,否则那还那算的上是控制了系统呢。所以我从图书馆借了同样是微软出版社2000年出版的《Windows核心编程》(貌似微软那年出版了这么一整套介绍windowsAPI的书),在学习了系统对象之后,我了解了可以通过CreateToolhelp32Snapshot()函数得到系统的进程表,然后我了解了可以用TerminateProcess()接口关闭进程,不过我在实验中一直没能执行成功,没办法只得再上MSDN去查,一查才知道要执行这个接口必须具备系统管理员的权限,而我的线程没有这个权限,无法在操作系统课上老师讲的核心态执行代码,于是我又在图书馆借了本人民邮电出版社2002年出版的《Windows系统编程》,里面有谈到可以用LookupPrivilegeValue()函数提高权限,于是我又写了个提高权限的函数,这样我的第一个功能就能够成功执行了,首先由客户端发送“pslist”命令过去,服务端返回系统进程表,我又从那本书中知道每个进程都有一个进程的PID号,当执行结束进程函数时只需要传递这个PID号就能找到对应的进程,然后我设计服务端接收到客户端发送“pskill 进程PID”号就可以结束该进程,这样我的第一个命令就算是完成了。
Windows系统命令设计:
然后我想到的是需要实现能够执行windows系统自带的系统功能命令,比如cd、dir等命令,我以前设计过这样的程序,我知道这只需要创建一个匿名管道用于取得cmd的命令输出就可以了,这个实现可以使用CreatePipe()函数,然后为每一条命令创建一个执行进程就可以了,由于是执行系统自带的程序,所以杀毒软件不会认为是***,可以放心大胆的执行,使用CreateProcess()函数创建进程就可以了。
下载功能设计:
本来功能设计到此为止了的,不过当我和另一个同学沟通时他问我设计了下载功能没,他说看到的网上***都是先搞个***到目标电脑中,然后通过这个***下载很多病毒文件到目标电脑中去执行,我想也是啊,于是我就又想设计一个下载功能,即从客户端电脑中下载程序到服务端所在电脑中,然后可以直接调用系统cmd.exe程序执行这个下载的程序,下载是基于http协议的,关于这个协议使用的是最多的,但对于编程实现方面我了解的确实不多,我查了书后也只发现有URLDownloadToFile()这么个从目标URL下载文件的接口,于是我就先写在了程序里,虽然在实验中有时能下载成功有时却下载失败,但我不知道问题在哪,想来这http协议的水很深,不是我一时半会能搞明白的,于是我也就只写了个模型在服务端里,是否能成功下载还是个未知数,这个功能就留作加强提高吧。
客户端设计:
当完成服务端设计后才发现原来客户端比起服务端来简单的多了,最重要的就是设计能把输入的字符串发送到服务端去,这里就需要知道对方机器的IP地址,我试过很多办法也没办法把对方的IP地址正确的发送过来,虽然能够在服务端程序中加入代码得到对方的IP地址发送到客户端,不过在客户端解析时总会出错,后来我才在MSDN中的网络教程中发现我遇到的可能是IP地址发送的大端小端问题,即发送出去的IP地址按小端编码,接收方得到的IP地址是反序的二进制代码,所以自然会出错,我本来想重新写这个功能的,不过由于时间的关系就没添加这个过程了,因为我觉得这个和实现***的功能没有太大的关系,于是我就假设已经得到了服务端主机的IP地址,在做测试时在客户端我会直接输入服务端的IP地址就行了,毕竟只是一个测试程序嘛,总不能做的真的在网上传开了。然后我又添加了一些帮助程序的代码,显示如何使用这个***程序。一个客户端模型就完成了。至此我的***设计也基本告一段落了。
测试结果:
我的测试环境是客户端机器使用WinXP SP3系统,把系统防火墙关闭,并将其他的防火墙禁掉的ICMP报文功能打开:
然后使用Vmware虚拟机软件装载了一个win7系统,关闭掉了win7系统的防火墙,将服务端程序拷贝到win7系统中,在cmd窗口中执行该程序,我设计的服务端不会自动运行,需要手动安装,在安装过程中会出现我编写的调试代码,我开启的系统服务会随着系统的启动而一起启动,而且服务端程序也会当作系统程序开机加载,在任务管理器中可以查看到。这些都是为了方便调试,隐藏进程就当作提高吧。
把icmpsrv.exe程序拷贝到win7系统下执行如下:
可以在win7的系统服务中看到我创建的服务:
在任务管理器中也可以查看到创建的系统程序:
任务管理器中的系统服务项也能查看到该服务:
在客户端执行客户端程序如下:
pslist命令测试:
与win7中任务管理器显示的系统进程一模一样:
pskill命令测试:
win7中开启了QQ程序如图:
在上述进程表中找到QQ进程和它对应的PID号,客户端输入“pskill 3756”:
Win7系统中QQ立刻被结束掉了:
显示如下信息,当发送的ICMP报文头中序列号不是5678时会提示“Other ICMP Packets!”:
执行系统自带程序功能,这里拿ipconfig举例:
至此,这个***的设计就算告一段落了,我在后面附上我写的源码。有不轨理由的童鞋可以参考参考,出现任何后果我概不负责哦~~还有,一般来说你编译我写的代码时杀毒软件是会报毒的,如果不报的话,我还是劝你赶快把杀毒软件换了吧~~
如何防止ICMP协议***
虽然ICMP***可以实现很大的***功能,不过要避免它也很简单,只需要配置防火墙屏蔽一切ICMP报文就可以了,这也是ICMP***的局限性。
如何提高***的能力
那是否因为防止ICMP***很简单,这个***就完全没有用武之地呢?当然不是了,我想过了,这个***还有很强的扩展性,比如可以对ICMP报文进行加密,让防火墙无法过滤,还可以让服务端关闭防火墙,或者设置信任程序等等手段绕开防火墙。还有我上面提到过的获取服务端机器IP地址的功能,也可以设计为让服务端程序主动想客户端要命令,这样就更加强大和主动,而且这些实现也不是那么困难的事,如果你有兴趣,可以和我探讨一下,我们共同想着***的终极奥义迈进哦~~