如何使用 Bash 伪造 DHCP 发现数据包?

How can I forge a DHCP Discovery packet using Bash?

我想使用命令行通过网络 (LAN) 发送一个经典的 DHCP Discover 包,以便触发来自任何 DHCP 服务器的响应 监听,所以我可以用类似的东西捕获它(假设我的 IP 地址是 192.168.0.30 ):

tcpdump -i eth0 host 192.168.0.30 -n -s 0 -vvv -w listening.pcap

我认为这是一种检测网络上恶意 DHCP 服务器的简单方法。

我如何使用Bash做到这一点?

更多数据:

替换解决方案-为了方便。

扫描网络寻找 DHCP 服务器不是更容易吗?

# nmap -sU -p 67 --script=dhcp-discover 192.168.43.0/24 |awk -v RS= '/dhcp-discover/'

结果:

Starting Nmap 7.40 ( https://nmap.org ) at 2020-05-29 18:38 UTC
Nmap scan report for 192.168.43.1
Host is up (0.0052s latency).
PORT   STATE SERVICE
67/udp open  dhcps
| dhcp-discover: 
|   DHCP Message Type: DHCPACK
|   Server Identifier: 192.168.43.1
|   IP Address Lease Time: 47m22s
|   Subnet Mask: 255.255.255.0
|   Broadcast Address: 192.168.43.255
|   Router: 192.168.43.1
|   Domain Name Server: 192.168.43.1
|_  Vendor Specific Information: ANDROID_METERED
MAC Address: xx:xx:xx:xx:xx:xx (Chiun Mai Communication Systems)

也许使用 "dhcp snooping"(第 2 层 OSI 模型)在交换机 上保护自己更明智,它包括拒绝任何不是来自受信任接口的 DHCP 数据包。

“黑客”解决方案

提出的问题提出了三个问题:

  1. 使用Bash回显
  2. 发送 UDP DHCPDISCOVER 包
  3. 生成 DHCPDISCOVER 包

要使 DHCPDISCOVER 数据包不失真地到达 DHCP 服务器,它必须作为二进制数据发送。不幸的是,Bash 接收到一些二进制序列作为控制命令。 这排除了 echo Bash.

的使用

只要输入来自文件(绕过bash),cat 命令就不会导致此问题。包裹发货如下:

cat blobfile | nc -w1 -u -b 255.255.255.255 67

包已正确发送,服务器 DHCP returns 包 DHCP 提供。来自 tcpdump 的日志片段:

DHCP-Message Option 53, length 1: Discover

和服务器回答:

DHCP-Message Option 53, length 1: Offer

从哪里获取运输详细信息是另一回事。 我通过使用 ncat 以这种方式拦截 DHCPDISCOVER 运输来获得它们:

ncat -l -p 67 --udp >blobfile

有了这样的块就足以发送DHCPDISCOVER数据包,从而解决基本任务

准确地说,您必须编写 DHCPDISCOVER 包生成器,不幸的是 RFC 2132 和其他具有相当复杂的结构和记录格式 - 请参阅我的“完整解决方案”。

完整解决方案

解决方法与'hacker'类似,不同的是UDP Discover包会在shell中手动生成。

该代码只是为了将网卡的给定MAC替换为空格的形式而不是冒号并赋值给一个变量(输入Bash):

# manualy:
MAC=ab:ab:ab:ab:ab:ab; MAC=`printf "$(echo $MAC | sed 's/:/ /g')%.0s"`
# or automaticaly: 
MAC=`printf "$(echo $(ifconfig -a |awk -v RS= '/eth0/' |awk '/ether/ {print()}') | sed 's/:/ /g')%.0s"`
# or simply type (spaces instead of colons!):
MAC="a6 a6 a6 a6 a6 a6"

使用 xxd 生成一个包含准备发送的 DHCPDISCOVER 包的文件。我使用所有 DHCP 服务器 实际上并未检查校验和的事实。这避免了校验和计算及其记录的严重复杂化。唯一需要更改的元素是网卡的MAC。
该网站非常有帮助:DHCP (in Russian)

echo -e $(echo -n -e "01 01 06 00 62 48 94 CA 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 $MAC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 FF") |xxd -r -p >blobfile

要使 DHCPDISCOVER 数据包不失真地到达 DHCP 服务器,它必须作为二进制数据发送。不幸的是,Bash 收到一些二进制序列作为控制命令。

HEX码00到1F是控制字符的范围,因系统而异。其中许多将由 BASH 解释,例如1F、0d 等 添加到此的是控制序列,例如082008 或 610860。

MAC地址理论上是16777216,它们通常包含标识制造商和硬件的部分。 生产者越来越多,计算机也越来越多,也有分配虚构或生成随机MAC地址的做法。因此,使用控制字符的机会是相当大的。

这排除了 echo Bash* 的使用。我们将使用 cat.

cat blobfile | nc -w1 -u -b 255.255.255.255 67

Wireshark 结果的片段:

Client MAC address: ab:ab:ab:ab:ab:ab (ab:ab:ab:ab:ab:ab)
Option: (53) DHCP Message Type (Discover)

解决方案归结为仅使用 catxxdnetcat[=54= 的 2 行代码] 假设在 shell.

中手动输入 MAC 地址

我没有找到一种方法让 Bash 在不破坏二进制数据的情况下不受二进制数据的影响。这就是为什么我建议将它从包发送阶段排除 用 C 语言编写生成器可能有意义,这将摆脱对文件和 cat 程序的重定向并将所有内容打包到 1 行中。但是,这不是问题的主题。

编辑:

Bash 问题的解决方案是安装计划 9 中的 rc shell。它非常小 (96kB),速度很快,最重要的是, 不将二进制字符解释为控制。我检查了可通过 apt 获得的标准版本 rc 1.7.4-1 Debian Linux。现在只需按照下面的说明发送正确的 DHCP 发现数据包,而不使用 cat 和存根文件,仅 shell 和 xxd 和 nc.

MAC='08 20 08 1f 0d ff'
echo -n -e "01 01 06 00 62 48 94 CA 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 $MAC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 FF" |xxd -r -p | nc -w1 -u -b 255.255.255.255 67