ICMP后门

前言

在上两篇文章中,详细讲解了ICMP协议,同时实现了一个具备完整功能的ping工具,完整的代码发布在https://github.com/qiyeboy/LuLunZi/blob/master/NetWork/ping.py中。本次讲的是嗅探,为什么要讲嗅探呢?和ICMP后门有什么关系呢?本篇的干货有点多。。。

第一节 ICMP后门结构

设计的ICMP后门采用的是典型的C/S结构,分为客户端和服务端,根据客户端和服务端的位置又分为正向连接和反向连接。对于TCP和UDP后门来说,正向和反向连接是有很大区别的,反向连接的目的之一就是为了规避正向连接时防火墙拦截端口绑定的问题。下面先讲一下正向连接和反向连接的概念。早期采用的是正向连接,现在更常见的是反向连接。

正向连接

正向连接时,server位于受控端,拥有公网ip,同时监听端口,等待连接。正向连接为什么逐渐被淘汰了呢?有几点原因,首先受控端的server程序需要绑定端口,容易被主机上的防火墙拦截发现,例如下图的情景。

接着是由于随着连接的控制端增多,受控端负载过大,易被发现,而且不适合大规模控制。最后是假如受控端是在内网中,正向连接就失去作用。

反向连接

反向连接就很好的规避了正向连接中的问题,受控端可以有公网ip,也可以没有,需要控制端拥有一个公网的主机即可,一般都是用VPS。

ICMP协议和TCP,UDP协议有很大的区别,ICMP没有端口的概念,就是说它不是通过端口来识别ICMP发送与接收进程的,也就没有端口绑定被拦截的问题,也避开了通过端口反查进程的检测手段。

正是ICMP协议没有端口的概念,也就无法直接建立两台主机上ICMP应用程序的通信,记住我说的是应用程序。大家肯定会疑问ping不就可以吗?其实ping本质上是位于系统内核。下面通过一张图来说明操作系统对icmp的处理。

假如用我写的ping.py程序,在受控端ping控制端,ICMP请求包通过网络传到控制端,在控制端的系统内核中,就直接生成ICMP响应返回给受控端的ping.py,根本不会由控制端的ping.py响应。也就是说ping.py本质上是ICMP协议的客户端,而不是服务端,服务端始终是主机的系统内核来完成了。

为难的地方也就出现了?服务端不受控制,那我们如何完成受控端应用程序和控制端应用程序的通信呢?其实不一定让两者直接通信,可以间接通信,只要受控端和控制端知道互相发送的内容不就可以了,这就是下一节的知识点。

第二节 “嗅探”黑科技

嗅探不知道大家熟不熟悉?大家肯定用过wireshark抓包吧,这就是嗅探的典型应用。虽然受控端发来的ping包,无法直接发给控制端的ping.py,但是控制端可以通过嗅探的方式抓取传输过来的ping包,获取里面的内容,然后主动发响应包给受控端,同理受控端也是如此。ICMP后门的通信结构就变成了下图所示的样子。

windows和linux平台嗅探ICMP的方式和编程内容差距有点大,linux相对简单。

windows平台嗅探ICMP

以嗅探ICMP数据包为例,代码如下,请详细看注释哈。

HOST="10.170.19.126"

# 创建原始套接字,然后绑定在公开接口上。在windows上使用ip协议

if os.name == "nt":

socket_protocol = socket.IPPROTO_IP

else:

socket_protocol = socket.IPPROTO_ICMP

rawSocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)

# 该选项可以让多个socket对象绑定到相同的地址和端口上

rawSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

我们调用bind方法,来绑定socket

rawSocket.bind((HOST, 0))

#通过setsockopt函数来设置数据保护IP头部,IP头部我们就可以接收到

rawSocket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# 在WIN平台上,需要设置IOCTL以启用混杂模式

if os.name == "nt":

rawSocket.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

在上述代码中,我们主要说的是bind,bind HOST其实绑定的是HOST所对应的网卡,一台电脑其实可以多个网卡的,包括虚拟的。在windows中,需要我们将网卡设置为混杂模式,这样就可以接受到所有经过本网卡的数据包。至于混杂模式的解释,百度百科中有。

经过上面的设置,raw socket就可以嗅探了,下面把嗅探的内容打印出来,代码如下:

while True:

pkt = rawSocket.recvfrom(2048)

print(pkt)

通过管理员权限运行这个程序,ping一下自己的ip,看到ICMP报文被抓住了。

Linux平台嗅探 ICMP

嗅探ICMP数据包,代码如下,请详细看注释哈。

#设置监听ICMP数据包

rawSocket = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)

#通过setsockopt函数来设置数据保护IP头部,IP头部我们就可以接收到

rawSocket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

while True:

pkt= rawSocket.recvfrom(2048)

print(pkt)

最后

如果觉得本文还可以,一定记得推荐哟。欢迎关注我的公众号。

回复【1】:领取 Python数据分析 教程大礼包

回复【2】:领取 Python Flask 全套教程

回复【3】:领取 机器学习 全套教程

python socket tcp远控_Python3实现ICMP远控后门(中)之“嗅探”黑科技相关推荐

  1. python socket tcp远控_Python3实现ICMP远控后门(上)

    这几天一直在研究远控木马的一些通信协议,比如TCP,UDP,ICMP,DNS,HTTP等等,对于TCP,UDP这两种就不讲解了,因为太常见了. 大家可能对采用ICMP,DNS的木马不是很熟悉,其实这两 ...

  2. python socket tcp客户端_python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  3. python socket tcp实战_python socket 实战

    server.py import socket,threading def tcplink(sock, addr): print('Accept new connection from %s:%s.. ...

  4. Python socket TCP

    样例1-基本使用 服务端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('l ...

  5. python socket tcp实战_Python socket.TCP_MAXSEG属性代码示例

    # 需要导入模块: import socket [as 别名] # 或者: from socket import TCP_MAXSEG [as 别名] def handle_tcp_state_tos ...

  6. python socket TCP协议断网重连

    最近做了个基于树莓派(Linux系统)的客户端.客户端需要把温湿度数据传到服务器上,每次传输约300个传感器的数据,大约3000个字节,我选用了Python的socket模块,完成这个项目时,最大的阻 ...

  7. python类为什么要初始化_python3类对象需要在init中初始化吗?

    我们都知道类需要借助类对象才能使用,类对象的作用是不可缺少的.那么,在我们使用类对象的时候需要注意哪些细节呢?比如,有的小伙伴想知道init中需要初始化吗?这个问题不知道大家都考虑了没有,小编已经查阅 ...

  8. Python3实现ICMP远控后门(下)之“Boss”出场

    ICMP后门 前言 第一篇:Python3实现ICMP远控后门(上) 第二篇:Python3实现ICMP远控后门(上)_补充篇 第三篇:Python3实现ICMP远控后门(中)之"嗅探&qu ...

  9. python黑科技:Python大佬用20行代码带你打造一个微信聊天机器人,真神了~

    如何用20行Python代码打造一个微信群聊助手? 1.安装python环境 2.安装python的itchat库 3.安装itchat库 4.Linux 5.申请图灵机器人API和key 6.编写p ...

最新文章

  1. 程序员求职之道(《程序员面试笔试宝典》)之面试官箴言?
  2. mongoDB 删除集合后,空间不释放
  3. poj 1390(消除方块(blocks))
  4. java笔试面试经典问题
  5. leetcode 87. 扰乱字符串(dp)
  6. 旋转成分矩阵结果分析_PCA(主成分分析) 和 SVD (奇异值分解)
  7. Sublime Text 3快捷键大全
  8. python界面开发webview_Python+Appium学习篇之WebView处理
  9. 机器学习中对不均衡数据的处理方法
  10. HighCharts:为plotLines基准线添加label标签不显示
  11. CentOS6.4 安装MongoDB
  12. python灰色预测模型步骤人口预测_人口预测模型灰色预测
  13. 稀疏编码的经典解法——ISTA算法的推导
  14. 基金暴跌年轻人为什么躲不过被割?
  15. 论文解读:Cycle ISP Real Image Restoration via Improved Data Synthesis
  16. HTPC改装19寸2U轻量级机架PC
  17. C语言键盘方向键的读入
  18. BTA | 陈建闽(阿德):Token的分散过程,一定要基于场景
  19. webpack+vue的项目模块分分合合
  20. 机器学习7 - 算法进阶2

热门文章

  1. oracle最佳环境,创建最适合的Oracle运行环境
  2. vue学习- 列表渲染v-for
  3. 在计算机系统中引入通道结构,第5-6章习题讲解.doc
  4. java里的关键字有什么用_java语言关键字有哪些?都有什么用处?
  5. 二进制转base64
  6. JAVA调用HTTP接口
  7. CaffeMFC:caffe.pb.h(2525): error C2059: syntax error : 'constant'
  8. OpenCV中的模板匹配/Filter2d
  9. 关于最近公司裁员和加班的思考
  10. 将多张图整合到一张大图中,再用css定位技术