如何从网络上的IP地址获取mac地址?

时间:2016-11-21 16:20:29

标签: python python-2.7 networking network-programming

我在下面创建了一个get_mac函数的问题,它接受一个I​​P地址并查找其mac地址,返回它或None。

实际的python函数是:

function getCommandLine() {
    switch (process.platform) {
        case 'darwin' : return 'open';
        case 'win32' : return 'start';
        case 'win64' : return 'start';
        default : return 'xdg-open';
    }
}

var exec = require('child_process').exec;
var filepath = '...';
//dir.fullPath will throw: The file /A/example.pdf does not exist.

var child = exec(getCommandLine() + ' ' + filepath, function (error, stdout, stderr) {
    if (error) {
        console.error(`exec error: ${error}`);
            return;
    }
});
child.on('close', function (e) {
    console.log('E: ', e);
});

我认为可能有更好的方法来做到这一点。这是从黑帽蟒蛇皮书中取出的,我正在利用导入:

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

我的整个文件文件我一直在工作。我正在努力创建一个非常精细的自定义工具。我正在通过ipconfig向我的伙伴运行它告诉我他的IP是192.168.0.20所以当运行时,我可以看到控制台输出这些信息。

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

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

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

这是正确的行动方案吗?我的好友给我发错了IP地址吗?我想我看到他在! Failed to find Target Mac

给我ipv4

我想我很好奇是否有更好的方式,然后ipconfig函数我最终打电话。

我正在使用的基本样本是BlackhatPython的第52页:通过Scapy进行ARP缓存中毒。

1 个答案:

答案 0 :(得分: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用法,其中“谁有?” part是虚拟的,“哦,顺便说一句,我的地址是......”是主要目标 - 这就是所谓的免费ARP,因为它经常在没有先前请求的情况下发送,实际上只是宣布发送者自己的IP / MAC协会。

(看起来你似乎并不打算询问ARP缓存中毒,但这实际上只是在说“哦,顺便说一句”条款。要么使用错误的MAC地址,要么使用完全虚假的地址。)

scapy srp函数适合这样做。可能是在python中实现它的最简单方法。