2016-11-21 208 views
0

对于我在下面创建的get_mac函数有问题,它使用IP地址并找到它的MAC地址,并返回它或None。如何从网络上的IP地址获取MAC地址?

实际的Python函数是:

def get_mac(ip_addr): 
    "get_mac is used to obtain the mac address of the target ip." 
    print "Getting Mac for: %s" % ip_addr 
    responses, unanswered = srp(Ether(dst="de:ad:be:ef:ca:fe")/ARP(pdst=ip_addr),timeout=2,retry=10) 
    for s,r in responses: 
     return r[Ether].src 
    return None 

林认为有可能是一个更好的方式来做到这一点。这是从Black Hat Python书中提取出来的,我利用进口:

from scapy.all import * 
from scapy.base_classes import Gen, SetGen 
import scapy.plist as plist 
from scapy.utils import PcapReader 
from scapy.data import MTU, ETH_P_ARP 
import os 
import sys 
import threading 
import signal 

对于我的整个文件文件我一直在工作ith。我正在为创建一个非常精细的目的而创建一个定制工具。我正在通过ipconfig的方式对我的朋友运行它,告诉我他的IP是192.168.0.20,所以当运行它时,我可以看到控制台输出这些信息。

.... 
Begin emission: 
Finished to send 1 packets. 
Received 12 packets, got 0 answers, remaining 1 packets 
.... 

12次然后打印我告诉它,因为它没有返回。

! Failed to find Target Mac 

这是正确的行动路线?我的好友是否向我发送了错误的IP地址?我想我看到他给我的ipv4在ipconfig

我想我好奇,如果有更好的方法,然后srp()函数我结束了调用。

我正在同原样品是页BlackhatPython的52名为:通过Scapy的ARP缓存中毒。

回答

1

假设你只是想实现一个ARP请求,那么请求应该被发送到MAC广播地址(FF-FF-FF-FF-FF-FF)。您应该填写自己的NIC的MAC地址作为源地址,既可以在以太网报头中,也可以作为ARP发送者MAC地址填写。

ARP通常工作的方式是将广播消息发送到本地网络,实质上是说“嘿,大家,谁拥有IP地址N.N.N.N?告诉我<my MAC address>。”它通常包括发送者的IP地址,这实际上是说“噢,对了,我的IP地址是M.M.M.M。”

响应,然后通常是通过单播发送回这也就是为什么你需要在你自己的MAC填写为发件人地址请求者:让你得到响应。

还有其他用途ARP其中“谁了?”部分是虚拟的,并且“哦,顺便说一句,我的地址是......”是主要目标 - 这就是所谓的无偿ARP,因为它通常是在没有先前的请求的情况下发送的,本质上只是宣布发送方自己的IP/MAC协会。 (这看起来并不是说你想问ARP缓存中毒,但这基本上只是说“哦,顺便”一句,要么是MAC地址错误,要么是完全虚假的)

scapy srp功能很好。可能是在Python中实现它的最简单的方法。

+0

所以我想我的答案是,我想* *使用'FF-FF-FF-FF-FF-ff',而不是我的标准'去广告是-EF-CA-fe'?但是,我的目标是成功地做到缓存中毒。它看起来像srp似乎没有正确返回它,这使我困惑,为什么。 – Fallenreaper

+0

我没有使用以太网连接这个事实会有问题吗?我正在运行这个WiFi?我对此很好奇,因为当我查阅文档时,似乎有很多关于以太网连接的信息。 – Fallenreaper

+0

ARP中有4个MAC地址:Eth头中有2个,ARP“payload”中有2个。 Eth报头中的dst地址决定数据包的位置(并且src标识它来自哪里 - 可能可以说是那个)。 ARP中的那些是用于地址解析的那些(可能是你想用于中毒的)。但是如果Ether dst不正确,数据包将无法到达需要去的地方。如果你把Ether dst设置为'de-ad-be-ef-ca-fe',那么任何机器甚至都不会看它,因为它不会被发送给它们。它在wifi上的工作原理是一样的(至少在高层次上)。 –