Python--Arp主机发现
概述:
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理APR。NDP用于在IPv6中代替地址解析协议。
ARP的工作原理
ARP协议属于数据链路层的协议,主要负责根据网络层地址(IP)来获取数据链路层地址(MAC)。以太网协议规定,同一局域网的一台主机要和另外一台主机进行直接通信,必须知道目标主机的MAC地址。而TCP/IP中,网络层只关注目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接收到的网络层IP协议提供的数据中只包含目的主机的IP地址。于是需要ARP协议来完成IP地址到MAC地址的转换。
第一步:向目标发送一个ARP Request
第二步:如果目标主机处于活跃状态,它一定会回应一个ARP Reply
第三步:如果目标主机处于非活跃状态,那么它不会给出任何回应
=========================================================================================
import os
import re
import optparse
from scapy.all import *
from scapy.layers.l2 import Ether, ARP
def HostAddress(iface):
ipData = os.popen('ifconfig /all' + iface)
dataLine = ipData.readlines()
if re.search('\w\w-\w\w-\w\w-\w\w-\w\w-\w\w', str(dataLine)):
MAC = re.search('\w\w-\w\w-\w\w-\w\w-\w\w-\w\w', str(dataLine)).group(0)
if re.search(r'((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)', str(dataLine)):
IP = re.search(r'((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)', str(dataLine)).group(0)
addressInfo = (IP, MAC)
return addressInfo
def ArpScan(iface='eth0'):
mac = HostAddress(iface)[1]
ip = HostAddress(iface)[0]
ipSplit = ip.split('.')
ipList = []
for i in range(1, 255):
ipItem = ipSplit[0] + '.' + ipSplit[1] + '.' + ipSplit[2] + '.' + str(i)
ipList.append(ipItem)
mac = ":".join(mac.split('-'))
print(mac)
result = srp(
Ether(src=mac, dst="FF:FF:FF:FF:FF:FF") / ARP(op=1, hwsrc=mac, hwdst='00:00:00:00:00:00', pdst=ipList),
timeout=2, verbose=False)
resultAns = result[0].res
liveHost = []
number = len(resultAns)
print("=====================")
print(" ARP 探测结果 ")
print("本机IP地址:" + ip)
print("本机MAC地址:" + mac)
print("=====================")
for x in range(number):
IP = resultAns[x][1][1].fields['psrc']
MAC = resultAns[x][1][1].fields["hwsrc"]
liveHost.append([IP, MAC])
print("IP:" + IP + "\n\n" + "MAC:" + MAC)
print("=====================")
resulFile = open("result", 'w')
for i in range(len(liveHost)):
resulFile.write(liveHost[i][0] + "\n")
resulFile.close()
if __name__ == "__main__":
parser = optparse.OptionParser('usage: python %prog -i interfaces \n\n'
'Example: python %prog -i eth0\n')
parser.add_option('-i', '--iface', dest='iface', default='', type='string', help='interface name')
(options, args) = parser.parse_args()
ArpScan(options.iface)