• Python3实现ICMP远控后门(上)


     这几天一直在研究远控木马的一些通信协议,比如TCP,UDP,ICMP,DNS,HTTP等等,对于TCP,UDP这两种就不讲解了,因为太常见了。

     

    大家可能对采用ICMP,DNS的木马不是很熟悉,其实这两种协议在木马通信上很流行,特点是比较隐蔽,不容易被封锁。HTTP协议主要是用在以大型网站作为C&C服务器的场景,例如之前就有使用twitter作为 C&C服务器。

     

    本次就以ICMP协议进行分析,并使用Python开发出一个ICMP远控后门,在写这篇文章的之前,我感觉大家对ICMP协议肯定不会很了解,因此将ICMP后门的实现分成几篇进行讲解,循序渐进。本篇就讲解一下ICMP协议的内容,并使用Python实现一个简单的ping。

    第一节 ICMP协议是什么鬼?

     不知道大家有没有ping过百度,用来测试自己的网络是不是畅通,如下图所示。

    ping命令使用的就是ICMP协议,在ping百度的过程中,咱们使用wireshark抓一下包,这样比较直观。如下图所示,ICMP协议是典型的一问一答模式,本机向百度服务器发送ICMP请求包,如果请求包成功到达目的地,百度服务器则回应ICMP响应包。

     

    第二节 ICMP协议及报文格式

    ICMP(Internet Control Message Protocol)是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。ICMP报文以IP协议为基础,其报文格式如下:

     

    如上图所示,ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节。对于ICMP首部细分为8位类型+8位代码+16位校验和+16位标识符+16位序列号,其中类型的取值如下,我们比较关注的是请求(取值为8)和应答(取值为0)。

    第三节 ping实现

    在上面我们简单讲解了ICMP的报文格式,接下来我们使用Python3根据报文格式简单实现一下ping功能,主要用到了raw socket技术,即原始套接字,使用struct pack方法打包ICMP报文。代码实现如下所示:

    原始套接字的初始化,使用如下代码:

        socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.getprotobyname('icmp'))

    里面比较复杂的是计算校验和,计算方法如下:

    1. ICMP首部和数据整个内容看成16比特整数序列(按网络字节顺序),

    2. 对每个整数分别计算其二进制反码,然后相加

    3. 再对结果计算一次二进制反码而求得

    测试ping效果 

    注意使用管理员权限运行Python脚本,直接ping 百度的地址 220.181.112.244

    同时打开wireshark抓包。

    最后 完整代码

    ping的完整代码,请关注公众号,查看 原文。记得推荐哟。

  • 相关阅读:
    Leetcode979 : Distribute Coins in Binary Tree 二叉树均匀分配硬币问题
    Leetcode547: Friend Circles 朋友圈问题
    线程安全的生产者消费者四种实现方法
    Leetcode823 : 因子二叉树问题
    Leetcode7 : Reverse Integer 整数反转问题
    Leetcode3 : 最长不含重复字符子串问题
    Leetcode6 : ZigZag 转换问题
    leetcode8 : 实现atoi函数将字符串转化为整数问题
    seo域名选择
    利用 Python django 框架 输入汉字,数字,字符,等。。转成二维码!
  • 原文地址:https://www.cnblogs.com/qiyeboy/p/9017921.html
Copyright © 2020-2023  润新知