【问题标题】:How do you get a mac address from an IP address on your network?如何从网络上的 IP 地址获取 mac 地址?
【发布时间】:2016-11-21 16:20:28
【问题描述】:

我在下面创建的 get_mac 函数有问题,它接受 IP 地址并找到它的 mac 地址,返回它或 None。

实际的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

对于我的整个文件文件,我一直在使用它。我正在为一个非常精细的目的创建一个自定义工具。我正在对我的伙伴运行它,通过 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地址吗?我想我在ipconfig看到他给了我ipv4

我想我很好奇是否有比我最终调用的 srp() 函数更好的方法。

我使用的基本示例是 BlackhatPython 的第 52 页,名为:ARP Cache Poisoning via Scapy。

【问题讨论】:

    标签: python python-2.7 networking network-programming


    【解决方案1】:

    假设您只是尝试实现一个 ARP 请求,那么该请求应该被发送到 MAC 广播地址 (FF-FF-FF-FF-FF-FF)。您应该在以太网标头和 ARP 发送者 MAC 地址中填写您自己的 NIC 的 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 中实现它的最简单方法。

    【讨论】:

    • 所以我想我的答案是我假设使用ff-ff-ff-ff-ff-ff而不是我的标准de-ad-be-ef-ca-fe?但是,是的,我的目标是成功进行缓存中毒。似乎 srp 似乎没有正确返回它,这让我很困惑为什么。
    • 我没有使用以太网连接这一事实是否存在问题?我将其作为 wifi 运行?我对此很好奇,因为当我查找文档时,似乎有很多关于以太网连接的信息。
    • 一个ARP中有4个mac地址:2个在Eth头中,2个在ARP“payload”中。 Eth 标头中的 dst 地址决定了数据包的去向(并且 src 标识了它的来源——可能与那个有关)。 ARP 本身中的那些是用于地址解析的那些(并且可能是您想要用于中毒的那些)。但是如果 Ether dst 不正确,数据包将无法到达它需要去的地方。如果您将 Ether dst 设置为de-ad-be-ef-ca-fe,则任何机器都不会查看它,因为它不会发送给它们。它在 wifi 上的工作原理相同(至少在高水平上)。
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2013-03-31
    • 2012-09-29
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多