可通过powershell脚本探测局域网非法dhcp服务器:以管理员身份发送dhcpdiscover广播,监听dhcpoffer响应,排除已知合法ip后标记可疑服务器。
在 windows 中,可通过 powershell 脚本主动探测局域网内响应 dhcp 请求的设备,识别非授权(非法)dhcp 服务器。核心思路是:构造并发送 dhcp 发现(dhcpdiscover)广播包,监听来自不同 ip 的 dhcpoffer 响应,排除已知合法服务器后,其余即为可疑/非法 dhcp 服务。
准备前提:启用必要权限与模块
PowerShell 默认不提供原生 DHCP 协议栈,需借助 .NET Socket 手动构造 UDP 数据包。脚本需以管理员身份运行(因需绑定 67/68 端口、发送广播、绕过防火墙限制),且建议关闭本地 Windows 防火墙临时测试(或添加入站 UDP 68 规则)。
- 确保执行策略允许本地脚本:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 无需额外安装模块,纯 PowerShell + .NET Framework 4.5+ 即可运行(Windows 10/11 默认满足)
- 记录已知合法 DHCP 服务器 IP(如域控制器、专用 DHCP 设备),用于后续比对排除
构造并发送 DHCPDISCOVER 广播请求
脚本使用 UDP socket 向 255.255.255.255:67 发送标准 DHCPDISCOVER(DHCP 消息类型 1),源端口固定为 68,包含随机 xid 和客户端标识。关键点在于设置 socket 选项:$socket.SetSocketOption('IP', 'Broadcast', 1) 允许广播;$socket.EnableBroadcast = $true。
- 构造最小可行 DHCP 报文:OP=1(BOOTREQUEST)、HTYPE=1(Ethernet)、HLEN=6、XID=随机 4 字节
- 必须填充 chaddr(客户端 MAC 地址,从网卡获取)、flags=0x8000(广播响应标记)
- 不设 ciaddr/yiaddr/siaddr/giaddr,全部置零;option 53(DHCP Message Type)= 1(Discover)
监听并解析 DHCPOFFER 响应
在同一脚本中开启异步接收线程(或循环轮询),监听 0.0.0.0:68,超时建议设为 3–5 秒。收到 UDP 包后,按 DHCP 报文格式解析:检查 OP=2(BOOTREPLY)、确认 option 53=2(Offer)、提取 siaddr(DHCP Server IP)和 yiaddr(提议 IP)。
- 过滤掉源 IP 为本机或已知合法 DHCP 服务器的响应
- 同一 IP 多次响应只记录一次,避免重复告警
- 可进一步解析 option 54(Server Identifier),它应与 siaddr 一致——若不一致,属异常实现,需重点标记
输出结果与简单告警
脚本最终输出发现的非法 DHCP 服务器列表,含 IP、响应时间、是否匹配 option 54。支持导出 CSV 或触发 Windows 通知(通过 [System.Windows.Forms.MessageBox]::Show())。
- 示例输出:
⚠️ 发现非法 DHCP 服务器:192.168.1.233(未登记,siaddr=192.168.1.233, option54=192.168.1.233) - 可选增强:调用
Test-Connection -Count 1 -Quiet验证 IP 是否在线;用Get-NetIPAddress -AddressFamily IPv4自动获取本机子网,限定扫描范围 - 注意:该方法无法穿透 VLAN,仅限当前广播域;交换机启用了 DHCP Snooping 时可能拦截非法响应
不复杂但容易忽略细节,比如广播权限、端口复用冲突、MAC 地址字节序、option 解析偏移。实际部署前建议在测试网络小范围验证,避免误报干扰生产环境。











