Python3实现ICMP远控后门(中)之“嗅探”黑科技


ICMP后门

前言

 

第一篇:Python3实现ICMP远控后门(上)

第二篇:Python3实现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】:领取 机器学习 全套教程 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Python 的 Scapy 库实现网络嗅探,并检测 SYN Flood 攻击。具体实现步骤如下: 1. 导入 Scapy 库 ```python from scapy.all import * ``` 2. 监听网络数据包,并过滤出 TCP 协议的数据包 ```python def packet_callback(packet): if packet.haslayer(TCP): # 在这里添加检测 SYN Flood 攻击的代码 pass sniff(prn=packet_callback, filter="tcp") ``` 3. 检测 SYN Flood 攻击 SYN Flood 攻击是指攻击者向目标主机发送大量的 SYN 报文,目的是占用目标主机的资源。因此,我们可以通过统计某个 IP 地址发送的 SYN 报文数量,来判断是否有 SYN Flood 攻击。 具体实现步骤如下: - 初始化一个字典,用于存储每个 IP 地址发送的 SYN 报文数量: ```python syn_packets = {} ``` - 每当收到一个 SYN 报文时,判断该报文是否为 SYN 报文,并统计该报文所属 IP 地址的 SYN 报文数量: ```python if packet[TCP].flags == "S": src_ip = packet[IP].src if src_ip not in syn_packets: syn_packets[src_ip] = 0 syn_packets[src_ip] += 1 ``` - 每隔一段时间(比如 10 秒),遍历字典的所有 IP 地址,判断是否有 SYN Flood 攻击: ```python for src_ip, count in syn_packets.items(): if count > SYN_THRESHOLD: print(f"{src_ip} 发送了 {count} 个 SYN 报文,可能存在 SYN Flood 攻击!") ``` 完整代码如下: ```python from scapy.all import * import time # 设置 SYN Flood 阈值 SYN_THRESHOLD = 100 # 初始化一个字典,用于存储每个 IP 地址发送的 SYN 报文数量 syn_packets = {} # 处理每个数据包的回调函数 def packet_callback(packet): if packet.haslayer(TCP): # 判断是否为 SYN 报文 if packet[TCP].flags == "S": src_ip = packet[IP].src # 统计该 IP 地址发送的 SYN 报文数量 if src_ip not in syn_packets: syn_packets[src_ip] = 0 syn_packets[src_ip] += 1 # 每隔一段时间检测是否存在 SYN Flood 攻击 if int(time.time()) % 10 == 0: for src_ip, count in syn_packets.items(): if count > SYN_THRESHOLD: print(f"{src_ip} 发送了 {count} 个 SYN 报文,可能存在 SYN Flood 攻击!") # 监听网络数据包 sniff(prn=packet_callback, filter="tcp") ``` 当检测到 SYN Flood 攻击时,程序将会输出相应的警告信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值