Gogs 远程命令执行漏洞分析

栏目: 编程工具 · 发布时间: 6年前

内容简介:先来看一下补丁代码:代码中通过 ContainsAny() 函数过滤了 ./ 字符,如果存在两个字符中的任意字符则ban掉当前请求,否则继续向下执行。

Gogs 远程命令执行漏洞分析

Author: c26 && 童话@0kee Team

0x00 前言

下午看到一个Gogs远程命令执行漏洞公告,其漏洞修复细节如下:

https://github.com/gogs/gogs/commit/a1098384c09bc0d569ec82d19c26415e00cc364b

Gogs 远程命令执行漏洞分析

https://github.com/go-macaron/session/commit/084f1e5c1071f585902a7552b483cee04bc00a14

Gogs 远程命令执行漏洞分析

基于以上commit记录,推出漏洞产生的原因为:

通过伪造session信息登录管理员账号,登录管理员账号后配合管理员权限才有的Git Hook功能实现RCE。

这里我们把以上利用方式分成两步来看,即

  1. 如何通过伪造session信息登录管理员账号
  2. 登录管理员账号后如何通过Git Hook实现RCE

0x01 如何通过伪造session信息登录管理员账号

先来看一下补丁代码:

Gogs 远程命令执行漏洞分析

代码中通过 ContainsAny() 函数过滤了 ./ 字符,如果存在两个字符中的任意字符则ban掉当前请求,否则继续向下执行。

这里我们通过目录遍历的方式进行读取指定目录内的session信息,然后进行身份校验操作。

Gogs 远程命令执行漏洞分析

通过Burp抓包,Cookie信息中有一个比较明显的字段i_like_gogits,在代码中全局搜索下方便定位漏洞触发点。

\gogs\conf\app.ini:264-284

Gogs 远程命令执行漏洞分析

这里Gogs的配置文件中指出了session的存储方式,即通过文件的方式存储,存储的目录在 data/sessions ,环境搭好后到这个目录里看一下,结合客户端的cookie信息,比如我

  • 6a493300000000eb ,其存储的目录格式为 6/a/6a493300000000eb 的格式。

相应的代码为:

Gogs 远程命令执行漏洞分析

Gogs 远程命令执行漏洞分析

查看一下该文件的内容,文件内容如下:

Gogs 远程命令执行漏洞分析

到这里可以知道其实cookie中i_like_gogits就是这个文件的名字,Gogs就是根据这些session文件实现用户身份认证。

我们把i_like_gogits字段设置为/etc/passwd看会发生什么:Gogs报了500错误。

Gogs 远程命令执行漏洞分析

指定一个不存在的文件再看一下返回结果:程序正常执行

Gogs 远程命令执行漏洞分析

Bingo!这里可以通过目录遍历的方式使Gogs加载任意文件的内容。

这一块,利用方式也就明了了,如果可以指定其加载管理员的session,我们就可以登录管理员的账号了。

翻一下session的生成代码,这里类似序列化、反序列的操作,其处理函数为:

\gogs\vendor\github.com\go-macaron\cache\utils.go:23-32

Gogs 远程命令执行漏洞分析

直接找个服务端生成的session通过DecodeGob()解码下,内容如下:

Gogs 远程命令执行漏洞分析

一共有三个变量uname、_old_uid、uid。经过测试发现,我们只要指定uid的值为管理员的uid然后通过EncodeGob()将其转码为既定的格式,存储于服务端,Gogs加载该文件即可登录管理员账号。

通过uid进行鉴权,这块的代码在

\gogs\pkg\auth\auth.go:84-150

Gogs 远程命令执行漏洞分析

通过EncodeGob()生成PoC:

Gogs 远程命令执行漏洞分析

为了验证我们的猜想,先把生成的session文件0kee放置于服务器的tmp目录下,发起请求,

Gogs可以加载该session信息,并且伪造管理员登陆:

Gogs 远程命令执行漏洞分析

关键问题解决了,为了利用这个漏洞,我们现在需要做的是找到一个上传点把我们构造好的session信息上传至服务器。

那Gogs作为一个Git服务器,找到一个上传点自然是不难了(代码总是要通过各种办法push到服务器上的嘛),先创建一个仓库,然后把我们构造好的session文件上传至仓库中,一番搜索找到了上传代码的存放位置:

Gogs 远程命令执行漏洞分析

全局搜索下代码,你会发现这块的逻辑是

\gogs\models\repo.go:594-596

Gogs 远程命令执行漏洞分析

在tmp/local-repo+仓库ID+文件名的形式,那有同学可能就要问了,这个仓库ID是从哪来的,爆破么?当然在仓库量不大的时候通过爆破也不是不行,但是却也不够优雅,看下前端代码,派生操作中即包含这个仓库ID。

Gogs 远程命令执行漏洞分析

到了这里,屡一下思路:

  1. 生成伪造的管理员session信息
  2. 通过向仓库中上传文件的方式将伪造的session文件上传至服务端
  3. 找到文件目录,通过cookie中的i_like_gogits字段指定该文件
  4. 成功伪造管理员登陆!

Gogs 远程命令执行漏洞分析

Gogs 远程命令执行漏洞分析

0x02 如何从管理员账号实现RCE?

熟悉Gogs的同学可能会知道,Gogs的代码仓库中有一个管理Git钩子的功能,通过在Git钩子中写入 shell 脚本,当指定的Git操作权限触发时,即可实现命令执行。

Gogs 远程命令执行漏洞分析

将这几个支持的钩子列表执行的shell脚本中添加代码

touch /tmp/0keeTeam!

将项目clone回本地,修改部分内容后再push回Gogs的仓库中,可以看到成功在Gogs服务器上实现命令执行。

Gogs 远程命令执行漏洞分析

0x03 总结

梳理一下完整的漏洞利用流程:

  1. 生成伪造的管理员session信息
  2. 通过向仓库中上传文件的方式将伪造的session文件上传至服务端
  3. 找到文件目录,通过cookie中的i_like_gogits字段指定该文件
  4. 成功伪造管理员登陆
  5. 创建仓库以及Git钩子执行的shell脚本

将仓库clone回本地修改代码后push回服务端,此时成功实现命令执行!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

联盟

联盟

里德•霍夫曼、本•卡斯诺查、克里斯•叶 / 路蒙佳 / 中信出版社 / 2015-2-5 / 39.00元

在充满变化的世界,联盟潜在的合伙人 将不确定的行业转变为可掌控的职业生涯 与世界紧密连接,开创精彩的事业与未来 终生效忠于一家公司已经成为历史,我们正在经历的自由雇佣制——将员工看作自由人——无法建立创新所需的高度信任与合作的关系。 互联网时代,企业如何用全新的人才策略定义员工的忠诚?未来职业成功的秘诀是什么? 《联盟》提供了一种使雇主与员工之间从商业交易转变为互惠关......一起来看看 《联盟》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器