Python黑帽编程 3.2 ARP监控
Python黑帽编程 3.2 ARP监控
在第3.1节《ARP欺骗》中,我们学习了ARP的基本原理,使用Python实现了我们自己的ARP欺骗工具。在上一节的基础上,我们来实现一个ARP监控程序,该程序存储局域网中所有的IP和MAC对应关系,如果有新加入的机器会动态添加到列表中,如果有机器的ARP记录发生了变化,会发出警告。
实现这个程序的关键,只有一点,就是监听网络中ARP数据包。Scapy中的sniff方法可以满足我们对ARP监听的需求。
3.2.1 sniff方法
sniff方法是用来嗅探数据的,我们首先使用help查看一下此方法的使用说明:
图
sniff(count=0, store=1, offline=None, prn=None, lfilter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, *arg, **karg)
Sniff packets
sniff([count=0,] [prn=None,] [store=1,] [offline=None,] [lfilter=None,] + L2ListenSocket args) -> list of packets
count: number of packets to capture. 0 means infinity
store: wether to store sniffed packets or discard them
prn: function to apply to each packet. If something is returned,
it is displayed. Ex:
ex: prn = lambda x: x.summary()
lfilter: python function applied to each packet to determine
if further action may be done
ex: lfilter = lambda x: x.haslayer(Padding)
offline: pcap file to read packets from, instead of sniffing them
timeout: stop sniffing after a given time (default: None)
L2socket: use the provided L2socket
opened_socket: provide an object ready to use .recv() on
stop_filter: python function applied to each packet to determine
if we have to stop the capture after this packet
ex: stop_filter = lambda x: x.haslayer(TCP)
sniff()函数有一个重要的参数是filter,用来表示想要捕获数据包类型的过滤器,如只捕获ICMP数据包,则filter=”ICMP”;只捕获80端口的TCP数据包,则filter=”TCP and (port 80)”。其他几个重要的参数有:count表示需要不活的数据包的个数;prn表示每个数据包处理的函数,可以是lambda表达式,如prn=lambda x:x.summary();timeout表示数据包捕获的超时时间。
sniff(filter="icmp and host 66.35.250.151", count=2)
这段代码过滤个。
sniff(iface="wifi0", prn=lambda x: x.summary())
这段代码绑定网卡wifi0,对捕获的数据包使用summary进行数据汇总。
sniff(iface="eth1", prn=lambda x: x.show())
这段代码绑定网卡eth1,对数据包调用show方法,显示基本信息。
如何使用sniff方法过滤ARP请求呢?看下面的代码:
图
#!/usr/bin/python
from scapy import sniff,ARP
def watchArp(pkg):
pass
sniff(prn=watchArp,filter="arp",iface="eth0",store=0);
这段代码先定义了一个空的,不存储数据包。
数据包捕获就这样完成了,是不是体会到scapy的便捷性了呢?下面我们对捕获的数据包进行处理。
3.2.2 解析数据包
首先我们定义一个字典变量,用来存储ip和MAC的对应关系。
ip_mac = {}
然后,我们完善watchArp方法。
图
首先对ARP包做类型判断。
if pkt[ARP].op == 2:
print pkt[ARP].hwsrc + " " + pkt[ARP].psrc
如果是ARP响应包,打印MAC地址和ip地址。紧接着判断ip地址是否存储过。
if ip_mac.get(pkt[ARP].psrc) == None:
print "Found new device " + \
pkt[ARP].hwsrc + " " + \
pkt[ARP].psrc
ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc
如果没有在我们的字典中,我们判断它是新加入网络的主机,打印出它的MAC和IP地址。如果在我们的字典中,但是MAC值不一样,肯定是某台机器变更了MAC地址,这是异常情况:
elif ip_mac.get(pkt[ARP].psrc) and ip_mac[pkt[ARP].psrc] != pkt[ARP].hwsrc:
print pkt[ARP].hwsrc + \
" has got new ip " + \
pkt[ARP].psrc + \
" (old " + ip_mac[pkt[ARP].psrc] + ")"
ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc
打印出现异常情况的主机,同时更新我们的字典。
3.2.3 完整代码
将上面的代码拼装在一起,就是一个完整的例子了:
#!/usr/bin/python
from scapy.all import sniff,ARP
from signal import signal,SIGINT
import sys
ip_mac = {}
def watchArp(pkt):
if pkt[ARP].op == 2:
print pkt[ARP].hwsrc + " " + pkt[ARP].psrc
# Device is new. Remember it.
if ip_mac.get(pkt[ARP].psrc) == None:
print "Found new device " + \
pkt[ARP].hwsrc + " " + \
pkt[ARP].psrc
ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc
# Device is known but has a different IP
elif ip_mac.get(pkt[ARP].psrc) and ip_mac[pkt[ARP].psrc] != pkt[ARP].hwsrc:
print pkt[ARP].hwsrc + \
" has got new ip " + \
pkt[ARP].psrc + \
" (old " + ip_mac[pkt[ARP].psrc] + ")"
ip_mac[pkt[ARP].psrc] = pkt[ARP].hwsrc
sniff(prn=watchArp,filter="arp",iface="eth0",store=0);
下面我们运行看看效果:
图5
3.2.3 小结
本节结合sniff和我们上一节的基础知识,做一个ARP监控的小例子。大家要学会举一反三,结合上一节的ARP欺骗,和本节的监控,二者是否可以结合呢?欢迎在微信订阅号的本篇文章下留言讨论。
下一节,我们针对很多小型的路由交换设备存在的ARP缓存区溢出问题,一起来完善一个MAC洪水攻击的程序。
第3.3节《MAC洪水攻击》已经在微信订阅号抢先发布,心急的同学进入订阅号(二维码在下方),从菜单“专栏”—>”Python黑帽编程”进入即可。
查看完整系列教程,请关注我的微信订阅号(xuanhun521,下方二维码),回复“python”。问题讨论请加qq群:Hacking (1群):303242737 Hacking (2群):147098303。
玄魂工作室-精彩不断
Python黑帽编程 3.2 ARP监控的更多相关文章
- Python黑帽编程 3.1 ARP欺骗
Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...
- Python 黑帽编程大纲(变化中)
Python 黑帽编程大纲(预览版) 教程说明: 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and Defense with Pytho ...
- Python黑帽编程 3.4 跨越VLAN
Python黑帽编程 3.4 跨域VLAN VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理 ...
- PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析
Python黑帽编程1.5 使用Wireshark练习网络协议分析 1.5.0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...
- Python黑帽编程3.0 第三章 网络接口层攻击基础知识
3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...
- Python黑帽编程 3.3 MAC洪水攻击
Python灰帽编程 3.3 MAC洪水 传统的交换机(我只对我目前使用的交互机做过测试,按照常识只能这样表述)在数据转发过程中依靠对CAM表的查询来确定正确的转发接口,一旦在查询过程中无法找到相关目 ...
- Python黑帽编程 4.0 网络互连层攻击概述
Python黑帽编程 4.0 网络互连层攻击概述 是时候重新温习下下面这张图了. 图2 本章的内容核心包含上图中的网络层和传输层.TCP/IP是整个网络协议体系中的核心,因为从这里开始,数据传输从局域 ...
- Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)
Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上) 网络嗅探,是监听流经本机网卡数据包的一种技术,嗅探器就是利用这种技术进行数据捕获和分析的软件. 编写嗅探器,捕获数据是前置功能, ...
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获(下)
上一节(<4.1 SNIFFER(嗅探器)之数据捕获(上)>)中, 我们讲解了通过Raw Socket的方式来编写Sniffer的基本方法. 本节我们继续来编写Sniffer,只不过使用现 ...
随机推荐
- PHPExcel 大数据的导出
PHPExcel 是一个php语言读取导出数据.导入生成Excel的类库,使用起来非常方便,但有时会遇到以些问题,比如导出的数据超时,内存溢出等. 下面我们来说说这些问题和解决办法. PHPExcel ...
- 【Java EE 学习 57】【酒店会员管理系统之分页模板书写】
分页一直是一个比较麻烦的问题,特别是在我做的这个系统中更是有大量的分页,为了应对该问题,特地写了一个模板以方便代码重用,该模板包括后台分页的模板.前端显示的模板两部分. 一.分页分析 分页需要三种类型 ...
- MySQL开发规范
字段设计 (1)建议使用UNSIGNED存储非负数值. (2)建议使用INT UNSIGNED存储IPV4. (4)INT类型固定占用4字节存储,例如INT(4)仅代表显示字符宽度为4位,不代表存储长 ...
- 深信服务发布SSL站点
1.不能使用AD自带的HTTPS服务,需要新建一个服务,端口443 2.在“节点池”中添加内网HTTPS服务器的IP,端口443 3.在“策略”中新建一条策略,"服务"选新添加的端 ...
- The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties
出现这个错误提示可以用 DbFunctions.TruncateTime 将Linq中entity的DateTime转化一下再使用,如下所示: var anyCalls = _db.CallLogs. ...
- fragment嵌套问题
fragment嵌套里面不能用再用getActivity().getFragmentManager()要用getChildFragmentManager()
- MIT 6.828 JOS学习笔记11 Exercise 1.8
Exercise 1.8 我们丢弃了一小部分代码---即当我们在printf中指定输出"%o"格式的字符串,即八进制格式的代码.尝试去完成这部分程序. 解答: 在这个练 ...
- .NET平台常用的框架整理
基于.NET平台常用的框架整理 DotNet | 2016-03-31 17:13 (点击上方蓝字,可快速关注我们) 来源:天使不哭 链接:http://www.cnblogs.com/hgmyz/p ...
- 使用VisualVM检测
下载 https://visualvm.github.io/ 检测远程服务器 转自:http://blog.csdn.net/yangkangtq/article/details/52277794 授 ...
- tornado学习笔记18 _RequestDispatcher 请求分发器
根据Application的配置,主要负责将客户端的请求分发到具体的RequestHandler.这个类实现了HTTPMessageDelegate接口. 18.1 构造函数 定义: def __in ...