【问题标题】:Can`t see DHCP offer packet in Wireshark sent with sendp from scapy在 Wireshark 中看不到 DHCP 提供的数据包,用 scapy 的 sendp 发送
【发布时间】:2014-03-19 10:48:02
【问题描述】:

我尝试在 scapy 中实现一个 DHCP 服务器。我用 iface="Local Area Connection 3" 嗅探 udp sport 67 和 dport 68 的 DHCP 发现,然后使用 sendp 命令发送 DHCP Offer。我在 Wireshark 中看不到我的数据包,DHCP Clinet 也没有收到,它继续发送 DHCP Discovers。

在 wireshark 上,我只看到来自客户端的 DHCP 发现。

代码如下:

def sniff_DHCP_discovers():
    sniff(filter='port 67 or port 68', prn=startThread, iface="Local Area Connection 3")

def startThread(pkt):
    thread = threading.Thread(target=process_DHCP_discover, args=(pkt,))
    thread.deamon = True
    thread.start()

def process_DHCP_discover(pkt):
    print 'Process ', ls(pkt)

    if DHCP in pkt:
        if pkt[DHCP].options[0][1]==1:
            print '\tDetected DHCP Discover from client: ', pkt[Ether].src          
            #Create DHCP Offer
            Ethernet = Ether(src="00:50:B6:0E:FE:36", dst=pkt[Ether].src)
            IPo = IP(src="192.168.0.100", dst="255.255.255.255")
            UDPo = UDP(sport=67, dport=68)
            BOOTPo = BOOTP(op=2, yiaddr="192.168.0.1", siaddr="192.168.0.100", giaddr='0.0.0.0', xid=pkt[BOOTP].xid)
            DHCPo = DHCP(options=[('message-type', 'offer'),('subnet_mask',IPv4_ConfigParam.SUBNET_MASK),('server_id', "192.168.0.100"), ('lease_time', 1800),('end')])
            pkt_Offer = Ethernet/IPo/UDPo/BOOTPo/DHCPo
            sendp(pkt_Offer, iface="Local Area Connection 3")
            print 'DHCP Offer sent: ', ls(pkt_Offer)

【问题讨论】:

  • 找到了一些东西,但在 Wireshark 中仍然看不到我的数据包。将本地连接 3 替换为 eth2,因为来自 scapy 的 ifaces 命令将本地连接 3 检测为 eth2。重复还是没有解决问题

标签: dhcp scapy


【解决方案1】:

您是否尝试过简单地发送数据包并查看它是否可以开始?它在工作吗?即使iface="Local Area Connection 3"?

不管怎样,做你想做的事,你应该使用AnsweringMachine。 Scapy 已经自带了一个实现,BOOTP_am,你可能想看看代码;你可以直接用Scapy函数bootpd().

首先,您可以使用不带参数的bootpd();您可以在之后使用的选项(当/如果有效)是(使用它们的默认值,取自https://bitbucket.org/secdev/scapy/src/1d36e8fd9df8dfddbb5e9b3819910ace5e21e233/scapy/layers/dhcp.py?at=default#cl-300):

pool=Net("192.168.1.128/25")
network="192.168.1.0/24",gw="192.168.1.1"
domain="localnet"

【讨论】:

  • 如果我在没有指定 iface 的情况下发送数据包,仍然无法在 Wireshark 中看到数据包。我会试试 AnsweringMachine。你能给我一个在我的代码上使用 bootpd() 的例子吗?谢谢
【解决方案2】:

设法在 Wireshark 中查看数据包。我改用 srp1(),而不是 sendp()。

现在发现另一个问题。当我想模拟 DHCP 服务器并发送 DHCP 报价时,如果我发送 BOOTP.op = 2 的报价,则不会发送数据包。我在wireshark 上看不到它,而且我的DHCP 客户端没有发出任何请求。如果我发送 BOOTP.op = 1 的 DHCP Offer,我会在 Wireshark 上看到数据包,但这是不正确的(op=1 是 BOOTREQUEST,op=2 是 BOOTREPLY)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多