我尝试在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)
答案 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)