Python3实现ICMP远控后门(上)_补充篇

ICMP后门(上)补充篇

前言

在上一篇文章Python3实现ICMP远控后门(上)中,我简要讲解了ICMP协议,以及实现了一个简单的ping功能,在文章发表之后,后台很多朋友留言,说对校验和的计算不是很了解,实现的ping功能仅实现了发送,接收没有实现,一个完整ping如何实现等等。本来对于ICMP后门写三篇文章的,但是对大家的疑惑临时开辟了一个补充篇,对ICMP协议校验方式,以及实现一个完整功能的ping给大家进行详细的讲解。

第一节

ICMP协议校验和

对于校验和的计算,我对写校验和的代码进行了如下注释,注意看注释就会明白校验的整个流程(注释为红色)。

def checksum(packet):

"""

校验

"""

#packet为icmp头部和data的字节流,其中icmp校验和字段初始化为0

sum =0

#countTo:记录packet是有多少个16位,因为对每两个字节进行校验

countTo = (len(packet)//2)*2

count =0

while count <countTo:

#将每两个字节中的第二个字节作为高位,第一个字节作为低位组成16位的值

sum += ((packet[count+1] << 8) | packet[count])

count += 2

#packet并不一定都是偶数字节,可能是奇数,把最后一个字节加到sum中

if countTo<len(packet):

sum += packet[len(packet) - 1]

sum = sum & 0xffffffff

#sum中超过16位的高位加到低位

sum = (sum >> 16) + (sum & 0xffff)

sum = sum + (sum >> 16)

#对sum取反

answer = ~sum

#到这应该就结束了,但是字节序有问题,下面是将主机字节序转为网络字节序

#即高位转低位,低位转高位

answer = answer & 0xffff

answer = answer >> 8 | (answer << 8 & 0xff00)

return answer

第二节

ICMP报文的标识符与序列号

ICMP回送消息(Type = 8),被请求主机回送响应消息(Type = 0),基本格式如下:

回送消息[ECHO]

回送响应消息[ECHO REPLY]

  • Code = 0,
  • CheckSum为校验和,重点注意从ICMP的头部到data结束(即到整个数据包结束)
  • Identifier为标识符,由主机设定,一般设置为进程号,回送响应消息与回送消息中identifier保持一致
  • Sequence Number为序列号,由主机设定,一般设为由0递增的序列,回送响应消息与回送消息中Sequence Number保持一致
  • data为数据,由主机设定,回送响应消息与回送消息中data保持一致

第三节

ping实现

在上篇中,我们讲解了如何发送icmp请求,接下来我们实现如何接受响应,并计算响应时间,效果类似下图:

接收ping响应的代码如下:

ping的超时机制是通过select模型实现的。对于Identifier设置为进程号,如下图所示。

测试ping效果

注意使用管理员权限运行Python脚本,直接ping www.baidu.com

原文发布于微信公众号 - 七夜安全博客(qiye_safe)

原文发表时间:2018-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CRPER折腾记

React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)

上个版本 :React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏

1232
来自专栏游戏开发那些事

【Unity游戏开发】SDK接入与集成——小白入门篇

  通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成,对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,而熟悉SDK接入的同学又觉得不断地...

1332
来自专栏前端说吧

vue - 使用vue实现自定义多选与单选的答题功能

1032
来自专栏企鹅号快讯

HttpClient使用详解

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不...

2655
来自专栏何俊林

Android开发中,有哪些让你觉得相见恨晚的方法、类或接口?

前言:Android开发中,不是每一个api,我们都知道,一般情况,面对一个陌生的类,首先new出这个class,得到一到临时变量,然后class.xxx,看对...

1668
来自专栏IMWeb前端团队

webpack 项目 css/js主域重试

为了提高网站的访问速度,现在一般会将静态资源放在 CDN 下,而不是放在网站的域名之下。以腾讯课堂为例,其域名为 ke.qq.com,打开控制台,访问 ke....

20710
来自专栏闻道于事

Layui常用方法

layui中的input radio单选框监听选择触发事件: 根据给input绑定的 lay-filter 进行查找input,然后进入函数判断 ...

7489
来自专栏C语言C++游戏编程

抖音很火的告白编程程序,C语言一样也能做

最近抖音上火了一个由小伙伴自己制作的一个表白代码,很多小伙伴都在问这个表白代码是怎么写的?大家都知道是使用vbs实现的!虽说小编也承让VBS实现更简单,但是如果...

1632
来自专栏Pythonista

初识Django

框架,即framework,特制为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统。

901
来自专栏张戈的专栏

解决JS操作Cookies出现的乱码问题,修复WordPress评论乱码

为了解决博客纯静态之后无法记住用户信息的问题,我将这个功能改成 JS 操作 Cookie 的方式,将用户信息直接保存到用户本地 cookies 当中,从而脱离 ...

3327

扫码关注云+社区