pythonarp-scan_python使用scapy模块实现ARP扫描的过程

本文详细介绍了如何使用Python的scapy库实现内网ARP扫描。通过构造ARP请求包并发送,然后接收响应,获取目标IP和源MAC地址,最终实现对整个网段的扫描。文中还给出了完整代码示例,包括单进程发送和多进程优化。
摘要由CSDN通过智能技术生成

前言

上篇文章主要写了利用scapy实现ping扫描,这篇文章主要是利用scapy模块实现内网ARP扫描

实现过程

上篇文章中介绍了通过scapy来伪造包,那么ARP包的伪造过程这里不再详述,说一工具的简单整体流程

1.首先,实现单个IP的ARP包的发送和接收

2.其次,实现多进程同时多个ARP包的发送和接收

整体的实现流程与上个脚本的实现较为相似

单进程ARP包

包的构造:

def scapy_arp_one(ip_address, queue=None):

Packet = Ether(dst='FF:FF:FF:FF:FF:FF') / ARP(op=1, hwdst='00:00:00:00:00:00:', pdst=ip_address)

请求包的发送:

arp = srp(Packet, timeout=0.2, verbose=False)

返回包的接收

try:

reply_list = arp[0].res

if queue is None:

return reply_list[0][1].getlayer(ARP).fields['hwsrc']

else:

queue.out((ip_address, reply_list[0][1].getlayer(ARP).fields['hwsrc']))

except:

return

这里采用队列的模式,主要是为了后面多进程同时发送做准备,涉及到ARP包的接受。这里我简单描述一下ARP包接受的情况,当我们发送ARP广播包的之后,我们就会接受到一个返回包。所以正确的情况就是,一个发送包一个接收包,一个发送包一个接收包,所以这里采用队列的方式,一个一个IP地址的接收,并使用列表进行存储,然后过滤ARP把内容,接收ARP中的硬件MAC地址

完整代码:

#!/usr/bin/env python3

# -*- coding:utf-8 -*-

# Author:Ameng, jlx-love.com

from scapy.all import *

import sys

def scapy_arp_one(ip_address, queue=None):

Packet = Ether(dst='FF:FF:FF:FF:FF:FF') / ARP(op=1, hwdst='00:00:00:00:00:00:', pdst=ip_address)

arp = srp(Packet, timeout=0.2, verbose=False)

try:

reply_list = arp[0].res

if queue is None:

return reply_list[0][1].getlayer(ARP).fields['hwsrc']

else:

queue.out((ip_address, reply_list[0][1].getlayer(ARP).fields['hwsrc']))

except:

return

if __name__ == '__main__':

scapy_arp_one(sys.argv[1])

进一步完善

那么既然我们已经了解了使用ARP进行基本的发包和收包,那么我们接下来就来编写一个能够扫描整个网段的ARP检测

理一下思路,首先,我们需要将ip地址编程一个网段中的所有ip,可以借助ipaddress模块实现,其次我们知道我们接收响应包是一对的,所以我们可以从一对一对的响应包中接收我们需要的目标IP和源MAC地址,其次就是优化代码,输出结果,这里我不再采用sys模块进行传参,而是采用一个新的模块optparse,具体使用方法可以百度百科

完整代码:

#!/usr/bin/env python3

# -*- coding:utf-8 -*-

# Author:Ameng, jlx-love.com

import time

from scapy.all import *

import ipaddress

import optparse

def scapy_arp_scan(network, ifname):

net = ipaddress.ip_network(network)

ip_addr = []

for ip in net:

ip = str(ip)

ip_addr.append(ip)

time.sleep(1)

Packet = Ether(dst='FF:FF:FF:FF:FF:FF')/ARP(op=1, hwdst='00:00:00:00:00:00', pdst=ip_addr)

arp = srp(Packet, iface = ifname, timeout = 1, verbose = False)

arp_list = arp[0].res

IP_MAC_LIST = []

for n in range(len(arp_list)):

IP = arp_list[n][1][1].fields['psrc']

MAC = arp_list[n][1][1].fields['hwsrc']

IP_MAC = [IP, MAC]

IP_MAC_LIST.append(IP_MAC)

return IP_MAC_LIST

if __name__ == '__main__':

t1 = time.time()

parser = optparse.OptionParser('用法:\n python3 scapy_arp_scan.py --network 扫描网段 --ifname 网卡名称')

parser.add_option('--network', dest = 'network', type = 'string', help = '扫描网段')

parser.add_option('--ifname', dest = 'ifname', type = 'string', help = '网卡名称')

(options, args) = parser.parse_args()

network = options.network

ifname = options.ifname

if network == None or ifname == None:

print(parser.usage)

else:

active_ip_mac = scapy_arp_scan(network, ifname)

print('存活的IP地址及对应MAC:')

for ip, mac in active_ip_mac:

print(ip, mac)

t2 = time.time()

print('所用时间为:{}'.format(int(t2 - t1)))

运行结果

e40b3a40689f984f33111242f77ce754.png

到此这篇关于python使用scapy模块实现ARP扫描的过程的文章就介绍到这了,更多相关python实现ARP扫描内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: python使用scapy模块实现ARP扫描的过程

本文地址: http://www.cppcns.com/jiaoben/python/374640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值