python3黑帽编程_Python黑帽编程 3.2 ARP监控

Python黑帽编程 3.2 ARP监控

在第3.1节中,我们学习了ARP的基本原理,使用Python实现了我们自己的ARP欺骗工具。在上一节的基础上,我们来实现一个ARP监控程序,该程序存储局域网中所有的IP和MAC对应关系,如果有新加入的机器会动态添加到列表中,如果有机器的ARP记录发生了变化,会发出警告。

实现这个程序的关键,只有一点,就是监听网络中ARP数据包。Scapy中的sniff方法可以满足我们对ARP监听的需求。

3.2.1 sniff方法

sniff方法是用来嗅探数据的,我们首先使用help查看一下此方法的使用说明:

图2

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)

这段代码过滤icmp协议,host地址为66.35.250.151,捕获数据包个数为2个。

sniff(iface="wifi0", prn=lambda x: x.summary())

这段代码绑定网卡wifi0,对捕获的数据包使用summary进行数据汇总。

sniff(iface="eth1", prn=lambda x: x.show())

这段代码绑定网卡eth1,对数据包调用show方法,显示基本信息。

如何使用sniff方法过滤ARP请求呢?看下面的代码:

图3

#!/usr/bin/python

from scapy import sniff,ARP

def watchArp(pkg):

pass

sniff(prn=watchArp,filter="arp",iface="eth0",store=0);

这段代码先定义了一个空的watchArp方法,接收一个数据包对象,稍后我们会扩展该方法,用来提取数据包中的关键信息。接下来一行调用sniff方法,prn参数为watchArp方法,sniff会把捕获的数据包传递给该方法;filter我们指定了arp;iface是指定要监听的网卡为“eth0”;store设置为0,不存储数据包。

数据包捕获就这样完成了,是不是体会到scapy的便捷性了呢?下面我们对捕获的数据包进行处理。

3.2.2解析数据包

首先我们定义一个字典变量,用来存储ip和MAC的对应关系。

ip_mac = {}

然后,我们完善watchArp方法。

图4

首先对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。

玄魂工作室-精彩不断

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值