Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
dhcpoptinj — DHCP 选项注入器 | Kitploit
工具/GitHubGitHub/misje/dhcpoptinj
数据包嗅探与分析网络安全渗透测试红队
GitHubmisje/dhcpoptinj

dhcpoptinj

DHCP 选项注入器

查看仓库
4314617年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

DHCP 选项注入器

Build Status Total alerts

你是否曾想截获 DHCP 请求,并在发送者不知情的情况下悄悄塞入几个额外的 DHCP 选项?大概率没有。不过,如果真有此需要,dhcpoptinj 将(但愿能)帮到你。

为什么

篡改 DHCP 请求的原因可以有很多,尽管更可能的是你应该寻找一个更好的方法来解决你的问题。也许你无法访问 DHCP 服务器/客户端,却需要修改它们的 DHCP 选项;也许 DHCP 软件难以配置(或不支持你需要做的事情);也许你有一个非常复杂和/或特殊的设置;又或者你只是想尝试发送畸形或错误格式的选项?dhcoptinj 还是有一点点可能真的派上用场。

如何工作

dhcpoptinj 等待数据包到达 netfilter 队列。它会确保数据包确实是 BOOTP/DHCP 数据包,如果是,则继续注入选项。它会重新计算 IPv4 头部校验和,禁用 UDP 校验和(为了简化实现),然后将数据包交回给 netfilter。

你需要一个 iptables 规则来截获数据包并将其发送给 dhcpoptinj。假设你有两个桥接在一起的接口 eth0 和 eth1。假设你想截获所有来自 eth0 的 BOOTP 请求,并注入中继代理信息选项(82/0x52)。我们来编一个无聊的有效载荷:一个代理电路 ID 子选项,值为 "Fjas"。

在 iptables mangle 表中添加一条规则:sudo iptables -t mangle -A PREROUTING -m physdev --physdev-in eth0 -p udp --dport 67 -j NFQUEUE --queue-num 42。

然后运行 dhcpoptinj(让我们在前台运行,并开启额外调试输出):sudo dhcpoptinj -d -f -q 42 -o'52 01 04 46 6A 61 73'。请注意,dhcpoptinj 必须由具有 CAP_NET_ADMIN 能力的用户运行。你不需要、也不应该以 root 身份运行 dhcpoptinj。相反,你可以例如授予二进制文件 CAP_NET_ADMIN 能力(使用 setcap)并将执行权限限制为仅特定用户或组。这是一种用于以非 root 身份运行 Wireshark 的方法,你会找到多个指南来帮助你完成此操作。

现在向 eth0 接口发送一个 DHCP 数据包,并使用像 Wireshark 这样的工具观察它,当它到达桥接接口时已被修改。它应该会在选项列表的末尾有一个注入的选项。如果你用 Wireshark 捕获传入的 DHCP 数据包,它会显示为未修改,尽管实际上它已被篡改。

注意 -o 选项参数格式:它应该是一个十六进制字符串,以 DHCP 选项代码开头,后跟选项有效载荷。选项长度(通常跟在选项代码后面的那个字节)会自动计算,不得指定。十六进制字符串可以用非十六进制字符分隔以提高可读性。所有选项都必须有有效载荷,除了特殊的填充选项(代码 0)之外。

本示例中使用的无意义选项布局(首先是 DHCP 选项布局,然后是特定的中继代理信息选项子选项布局)如下:

代码长度数据
52(自动)01 04 46 6A 61 73 ("Fjas")
子选项长度数据
01446 6A 61 73 ("Fjas")

请注意,dhcpoptinj 不关心你在选项有效载荷中写入什么,也不检查你的选项代码是否存在。但它确实禁止你使用选项代码 255(终止结束选项)。dhcpoptinj 会自动将此选项作为最后一个选项插入。

截图

dhcpoptinj -f -d -q42 -r -o'0C 66 6A 61 73 65 68 6F 73 74' -o'52 01 04 46 6A 61 73' -o 320A141E28
3 DHCP option(s) to inject (with a total of 25 bytes): 12 (0x0C) (Hostname), 82 (0x52) (Relay Agent Information), 50 (0x32) (Address Request)
Existing options will be removed
Initialising netfilter queue
Initialising signal handler
Initialisation completed. Waiting for packets to mangle on queue 42
Received 416 bytes
Inspecting 328-byte DHCP packet from B6:40:FE:41:30:DC to 255.255.255.255:67
Mangling packet
Found option  53 (0x35) (DHCP message type)        DHCPREQUEST (copying)
Found option  54 (0x36) (DHCP Server Id)           with   4-byte payload 0A 14 1E 01 (copying)
Found option  50 (0x32) (Address Request)          with   4-byte payload 0A 14 1E 28 (removing)
Found option  12 (0x0C) (Hostname)                 with  12-byte payload 33 31 36 64 65 39 31 34 64 61 62 34 (removing)
Found option  55 (0x37) (Parameter List)           with  13-byte payload 01 1C 02 03 0F 06 77 0C 2C 2F 1A 79 2A (copying)
Found END option (removing)
Injecting option  12 (0x0C) (Hostname)                 with   9-byte payload 66 6A 61 73 65 68 6F 73 74
Injecting option  82 (0x52) (Relay Agent Information)  with   6-byte payload 01 04 46 6A 61 73
Injecting option  50 (0x32) (Address Request)          with   4-byte payload 0A 14 1E 28
Inserting END option
Padding with 10 byte(s) to meet minimal BOOTP payload size
Sending mangled packet

安装

Packaging status

dhcpoptinj 在 Debian/Ubuntu 中可用。deb 软件包在 salsa 上进行版本控制。建议通过 deb 软件包安装 dhcpoptinj,而不是以下手动安装过程,因为它还包括 man 手册页、bash 补全规则、示例文件等。

先决条件

你需要 cmake 和 libnetfilter_queue(以及一个支持 C99 的 C 编译器)。希望你在使用 Debian 类系统,在这种情况下,你可以运行以下命令来安装它们:sudo apt-get install cmake libnetfilter-queue-dev。

构建

  1. 下载或克隆源代码:git clone git://github.com/misje/dhcpoptinj
  2. 进入目录:cd dhcpoptinj
  3. 创建构建目录并进入(可选,但建议):mkdir build && cd build
  4. 运行 cmake:cmake ..(或者 cmake -DCMAKE_BUILD_TYPE=Debug .. 如果你想要调试构建)
  5. 运行 make:make -j4
  6. 安装(可选,但将 dhcpoptinj 放在 PATH 中会有好处):sudo make install

卸载

  1. 从你的构建目录运行 sudo make uninstall

构建目录及其所有内容可以安全删除。如果你没有使用构建目录,可以通过运行 git clean -dfx 清除所有 cmake 垃圾。但请注意,这会删除项目目录中所有不受版本控制的内容。

配置文件

dhcptopinj 将尝试解析 /etc/dhcpoptinj.conf 或通过 -c/--conf-file 传递的文件。配置文件的语法为:

  • key=value,其中 key 是长选项名称,或者
  • key 如果该选项不带参数

空格是可选的。从字符 # 开始的内容被视为注释。DHCP 选项逐个列出,格式为 option=01:02:03。选项十六进制字符串周围的引号是可选的,字节可以用任意数量的非十六进制字符分隔。

配置文件不接受选项 version、help 和 conf-file。

示例:

# 在前台运行:
foreground
# 启用调试输出:
debug
# 覆盖主机名为 "fjasehost":
option = '0C 66 6A 61 73 65 68 6F 73 74'
# 发送代理 ID "Fjas":
option = "52:01:04:46:6A:61:73"
# 覆盖地址请求,请求 10.20.30.40:
option=320A141E28
# 使用队列 12:
queue = 12

remove-existing-opt # 在插入前移除现有选项

帮助

这份读我文件应该能让你入门。也请查阅 man 手册页(在 deb 软件包中)和帮助输出(dhcpoptinj -h),它们应该涵盖了该工具提供的所有功能。

如有错误或建议,请提交 issue。

限制

dhcpoptinj 很简单,希望它保持这样。尽管如此,以下是缺少的功能,希望有一天能添加:

  1. 移除选项,而不是必须替换它们
  2. 在篡改之前,根据 DHCP 消息类型(代码 53)过滤传入的数据包

故障排除

  1. Failed to bind queue handler to AF_INET: Operation not permitted

    很可能你没有 CAP_NET_ADMIN 能力,或者有另一个进程(也许是另一个 dhcpoptinj 实例?)绑定到了相同的 netfilter 队列号。

已知问题

  1. 非正常退出时的内存泄漏。

    这不被视为泄漏。但是,正常退出(捕获 SIGTERM、SIGINT 或 SIGHUP)时不应有内存泄漏。

有用信息

在创建与 dhcpoptinj 一起使用的 iptables 规则时,以下选项可能很有用:

  • --queue-bypass

    不要丢弃数据包,而是让它们通过,如果 dhcpoptinj 没有运行(或没有监听正确的队列号)。

贡献

如果你有任何建议,请提交 issue,我会回复你。欢迎贡献,拉取请求非常感激。

如果你发现 dhcpoptinj 有用,我很想听听你用它做什么。更新 wiki 页面 并描述你的用法。

许可证

我选择使用 GPL 用于该项目。如果这不适合你,请联系我,我们可以商定不同的许可证。

下载工具