基于ICMP的反弹式木马研究与实现

基于ICMP的反弹式木马研究与实现

ICMP木马技术最初是为了摆脱端口的束缚而出现,与TCP和UDP协议不同,ICMP并没有端口字段,因为ICMP报文是通过系统内核或进程直接进行。这样,木马的服务器端和木马的客户端的通信采用ICMP协议时,木马的服务器不用开方任何端口。一般意义上的ICMP木马,其实就类似与一个Ping的过程。
传统的木马都是利用一个TCP端口来监听控制端的连接,一旦控制端认证通过,攻击者便会对服务器进行非法控制,但这种方式的隐蔽性非常弱。因此有人提出了反弹窗口式木马,也就是服务器主动向被控制端发送连接请求。

一:ICMP通信的实现
1.1原始套接字的工作原理与规则:
原始套接字是一个特殊的套接字类型,他的创建方式跟TCP/UDP的创建方法几乎类似:
SOCKET socket=socket(AF_INET,SOCK_RAW,IPPRPTO_ICMP)//这说明创建的是一个基于ICMP协议的原始套接字。原始套接字能够访问传输层以下的数据,也就是说,你能够实现上至应用层的数据操作,下至链路层的数据操作。
sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))//用这个方式创建的原始套接字就能够直接读取链路层的数据。

(1):对于UDP/TCP产生的IP数据包,内核不将它传递给任何原始套接字,而只是将这些数据交给对应的UDP/TCP数据处理句柄(所以,如果你想要通过原始套接字来访问TCP/UDP或
者其它类型的数据,调用socket函数创建原始套接字第三个参数应该指定为htons(ETH_P_IP),
也就是通过直接访问数据链路层来实现.
(2):对于ICMP和EGP等使用IP数据包承载数据但又在传输层之下的协议类型的IP
数据包,内核不管是否已经有注册了的句柄来处理这些数据,都会将这些IP数据包复制一份传递给协议类型匹配的原始套接字
(3):对于不能识别协议类型的数据包,内核进行必要的校验,然后会查看是否有类型匹配的原始套接字负责处理这些数据,如果有的话,就会将这些IP数据包复制一份传递给匹配的原始套接字,否则,内核将会丢弃这个IP数据包并返回一个ICMP主机不可达的消息给源主机
(4)如果原始套接字bind绑定了一个地址,核心只将目的地址为本机IP地址的数包传递给原始套接字,如果某个原始套接字没有bind地址,核心就会把收到的所有IP数据包发给这个原始套接字
(5): 如果原始套接字调用了connect函数,则核心只将源地址为connect连接的IP地址的IP数据包传递给这个原始套接字
(6):如果原始套接字没有调用bind和connect函数,则核心会将所有协议匹配的IP数据包传递给这个原始套接字

1.2:利用原始套接字发送ICMP消息
由于操作系统的关系,创建一个原始套接字必须运行在管理员权限之下,因此,本程序全部运行在管理员模式。

WORD wVersion=MAKEWORD(2,2);
    WSADATA wsaData;
    WSAStartup(wVersion,&wsaData);
    if (LOBYTE(wsaData.wVersion)!=
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值