Python Scapy ARP

简介:

参考手册:https://fossies.org/dox/scapy-2.3.3/


当一台主机把以太网数据帧发送到位于同一个局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。

设备驱动程序从不检查IP数据包中的目的IP地址。

地址解析为这两种不同的地址形式提供映射:32bit的IP地址和数据链路曾使用的任何类型的地址。(FR环境)

ARP为IP地址到对应的硬件地址之间提供动态映射。我们之所以用动态这个词是因为这个过程是自动完成的,一般应用程序用户或系统管理员不必关心。


在ARP背后有有一个基本概念,那就是网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是TCP/IP有自己的地址:32bit的IP地址。知道主机的IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。

点对点链路不使用ARP。当设置这些链路时(一般在引导过程进行),必须告知内核链路每一端的IP地址。像以太网地址这样的硬件地址并不涉及。

只有多路访问链路才需要ARP这样的技术。

bd026c46612d8c05a571a8a2d1184d4d.png

1362a196e266c72a6642320c05a4c27c.png

3ebaa89c5e14ed66f7669aea729dc5ed.png


ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。


ARP请求包样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/python3.4
# -*- coding=utf-8 -*-
 
import  logging
logging.getLogger( "scapy.runtime" ).setLevel(logging.ERROR) #清除报错
from  scapy. all  import  *
 
#配置各种信息,以便调用
localmac  =  '00:0c:29:8d:5c:b6'
localip  =  '202.100.1.138'
destip  =  '202.100.1.139'
ifname  =  'eno33554944'
 
#######################源MAC为本地MAC####目的MAC为广播#########操作码为1(请求)#######################################################由于多个网卡所以需要指派iface###########
result_raw  =  srp(Ether(src = localmac, dst = 'FF:FF:FF:FF:FF:FF' ) / ARP(op = 1 , hwsrc = localmac, hwdst = '00:00:00:00:00:00' , psrc = localip, pdst = destip), iface  =  ifname, verbose  =  False )
 
'''
sr() function is for sending packets and receiving answers. The function #returns a couple of packet and answers, and the unanswered packets. 
sr1() is a variant that only return one packet that answered the packet (or #the packet set) sent. The packets must be layer 3 packets (IP, ARP, etc.). 
srp() do the same for layer 2 packets (Ethernet, 802.3, etc.).
send() function will send packets at layer 3. That is to say it will handle routing and layer 2 for you. 
sendp() function will work at layer 2.
'''
 
#print(result_raw)
#(<Results: TCP:0 UDP:0 ICMP:0 Other:1>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>) 一个元组,[0]收到响应的数据包,[1]未收到响应的数据包
#print(type(result_raw[0]))
#<class 'scapy.plist.SndRcvList'> #https://fossies.org/dox/scapy-2.3.1/classscapy_1_1plist_1_1SndRcvList.html
result_list  =  result_raw[ 0 ].res  #res: the list of packets,产生由收发数据包所组成的清单(list)
#print(result_list)
#[(<Ether  dst=FF:FF:FF:FF:FF:FF src=00:0c:29:8d:5c:b6 type=ARP |<ARP  op=who-has hwsrc=00:0c:29:8d:5c:b6 psrc=202.100.1.138 hwdst=00:00:00:00:00:00 pdst=202.100.1.139 |>>, <Ether  dst=00:0c:29:8d:5c:b6 src=00:0c:29:43:52:cf type=ARP |<ARP  hwtype=0x1 ptype=IPv4 hwlen=6 plen=4 op=is-at hwsrc=00:0c:29:43:52:cf psrc=202.100.1.139 hwdst=00:0c:29:8d:5c:b6 pdst=202.100.1.138 |<Padding load=‘\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00’ |>>>)]
#一个列表,每一个item为一个元组,元组内包括一次ARP请求与回应
 
#result_list[0][1][0],[0]表示第一组数据包(收发),[1],表示收包(0为发包),[0]表示以太网头部
#print(result_list[0][1][0].fields) 以太网头部字段
#{'dst': '00:0c:29:8d:5c:b6', 'type': 2054, 'src': '00:0c:29:43:52:cf'}
 
#result_list[0][1][0],[0]表示第一组数据包(收发),[1],表示收包(0为发包),[1]表示ARP头部
#print(result_list[0][1][1].fields) ARP头部字段
#{'pdst': '202.100.1.138', 'hwtype': 1, 'hwdst': '00:0c:29:8d:5c:b6', 'plen': 4, 'ptype': 2048, 'hwsrc': '00:0c:29:43:52:cf', 'op': 2, 'hwlen': 6, 'psrc': '202.100.1.139'}
 
print ( 'IP地址: '  +  result_list[ 0 ][ 1 ][ 1 ].fields[ 'psrc' +  ' MAC地址: '  +  result_list[ 0 ][ 1 ][ 1 ].fields[ 'hwsrc' ])

1ccf59da24da649641629ff436b7daae.png













本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1980254,如需转载请自行联系原作者
相关文章
|
7天前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
1月前
|
缓存 网络协议 Linux
Python渗透测试之ARP毒化和协议应用
Python渗透测试之ARP毒化和协议应用
|
4月前
|
网络协议 Python
Scapy一个强大的 Python 程序(一)
Scapy是Python的网络数据包操作工具,用于创建、分析和发送网络包。启动Scapy需以管理员权限运行`sudo scapy`。在交互式环境中,可构建自定义数据包,如设置IP包的`ttl`、`src`和`dst`。通过`/`叠加协议层,如IP和TCP。发送数据包示例:构造向`www.slashdot.org`的HTTP GET请求。Scapy还能用于嗅探、过滤和修改数据包,功能强大。
|
4月前
|
网络协议 安全 Python
Scapy一个强大的 Python 程序(二)
Scapy是Python的网络安全工具,可用于创建和修改网络包
|
6月前
|
存储 缓存 监控
使用 Scapy 库编写 ARP 拒绝服务脚本
使用 Scapy 库编写 ARP 拒绝服务脚本
|
6月前
|
存储 缓存 监控
使用 Scapy 库编写 ARP 拒绝服务攻击脚本
使用 Scapy 库编写 ARP 拒绝服务攻击脚本
|
6月前
|
缓存 监控 网络协议
使用 Scapy 库编写 ARP 缓存中毒脚本
使用 Scapy 库编写 ARP 缓存中毒脚本
|
6月前
|
网络协议 安全 Linux
Scapy:Python发包收包利器
Scapy:Python发包收包利器
325 0
|
网络协议 Python
Python 使用Scapy操作DNS流量
通常一个DNS数据包,客户端发送DNSQR请求包,服务器发送DNSRR响应包。一个DNSQR包含有查询的名称qname、查询的类型qtype、查询的类别qclass。一个DNSRR包含有资源记录名名称rrname、类型type、资源记录类别rtype、TTL等等。
385 0
|
网络协议 Python Windows
Python 实现ARP扫描与欺骗
ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定计算机或所有计算机无法正常连线。
459 0
Python 实现ARP扫描与欺骗