无法通过scapy发送的sendp发送Wireshark中的DHCP offer数据包

时间:2014-02-19 08:28:00

标签: dhcp scapy

我尝试在scapy中实现DHCP服务器。我使用iface =“Local Area Connection 3”为udp sport 67和dport 68进行DHCP发现,然后使用sendp命令发送DHCP Offer。我无法在Wireshark中看到我的数据包,而且DHCP Clinet也没有收到,它会继续发送DHCP发现。

在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)

2 个答案:

答案 0 :(得分:2)

您是否尝试过简单地发送数据包并查看它是否可以启动?它有效吗?即使使用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"

答案 1 :(得分:1)

管理在Wireshark中查看数据包。我使用的是srp1(),而不是sendp()。

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