POC详情: a7c023533a461bbc5a54c5c25a607eeeb82308c0

来源
关联漏洞
标题: Zabbix SQL注入漏洞 (CVE-2024-42327)
描述:Zabbix是Zabbix公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和应用监控等。 Zabbix 6.0.0至6.0.31版本、6.4.0至6.4.16版本和7.0.0版本存在SQL注入漏洞,该漏洞源于CUser类的addRelatedObjects函数中存在SQL注入漏洞,允许攻击者操纵数据库查询。
描述
writeup cve-2024-42327
介绍
#  writeup CVE-2024-42327 zabbix vulnerability

alvo: 10.129.231.176

Informacoes: Sei que meu alvo eh um servidor zabbix. Recebi uma conta de user padrão para logar no zabbix: user matthew passwd 96qzn0h2e1k3. Essa conta está com usuário padrão, sem grupos ou privilégios adicionais.

Como de costume, iniciamos com a enumeracao, vamos fazer um port scan usando o nmap.

![image](https://github.com/user-attachments/assets/dc909107-b0ad-4321-b805-d403c2cce732)

A saída do nmap nos mostra que a porta padrão ssh e o apache2 também na porta padrão. Também temos portas 10051 e 10050 rodando algum serviço do zabbix. 

Vamos acessar o zabbix colocando o ip na url do navegador e na porta http padrão, porta 80.

![image](https://github.com/user-attachments/assets/c4ae4eb6-1ba1-4357-aeac-c8a529c6a25d)

Essa é a tela de login do zabbix, vou logar com o user que recebi

![image](https://github.com/user-attachments/assets/223d9ce4-f8d9-4f4a-b849-bd318310cda6)

![image](https://github.com/user-attachments/assets/d11a914d-9d2a-4701-8d53-ffb4f782f219)


No rodapé, encontrei a versão do zabbix:

![image](https://github.com/user-attachments/assets/4453287d-7550-4231-bb5a-e6602d678b44)

Usando o pai dos burros, pesquisei se já tinha algum cve dessa versão do zabbix

![image](https://github.com/user-attachments/assets/a07f5d79-9138-47b2-b48c-4ac01e6f310d)

Após um bom tempo de pesquisa, vi que essa versão é vulnerável ao CVE-2024-42327 que fala sobre uma exploração de injeção de SQL para obter dados do banco de dados e escalar privilégios e ao CVE-2024-36467 que fala que permite alterar o papel de usuário para superusuário abusando de controles de acesso ausentes.

https://nvd.nist.gov/vuln/detail/CVE-2024-36467

https://nvd.nist.gov/vuln/detail/CVE-2024-42327


Na documentação do zabbix tem ensinano como fazer solicitações HTTP para chamar a API.

![image](https://github.com/user-attachments/assets/e61b0542-2533-4e3c-a5be-0b821bd4f960)

https://www.zabbix.com/documentation/current/en/manual/api


Mandei a requisição chamando o appiinfo.version que ele nos ensina na documentação

![image](https://github.com/user-attachments/assets/b1aca2f9-430d-4b13-b4d7-9924721617fa)

o que nos retornou o seguinte:

{"jsonrpc":"2.0","result":"7.0.0","id":1}

Para o próximo teste mudei alguns parâmtros nessa resquest para mandar novamente

![image](https://github.com/user-attachments/assets/f544c40a-609b-4a09-9f2c-5fcb12836868)

Em method, alterei de appinfo.version para user.login e adicionei os parâmetros username e password. Isso também vi na documentação do zabbix.

![image](https://github.com/user-attachments/assets/2060c6e0-546b-43c9-9d3e-9728e312eb79)

Nos retornou um token:

{"jsonrpc":"2.0","result":"9566174b00c9c3ca552abc1a52d670ba","id":1}

Depois de mais um tempo pesquisando, decidi ir no repositório do zabbix no github

https://github.com/zabbix/zabbix

Pesquisei sobre CUser e encontrei um arquivo CUser.php

![image](https://github.com/user-attachments/assets/b94168dd-f5c1-4ac4-95b4-60c13cedb8b9)

Encontramos a função user.update:

```
public function update(array $users) {
$this->validateUpdate($users, $db_users);
self::updateForce($users, $db_users);
return ['userids' => array_column($users, 'userid')];
}
```

Não encontrei nenhuma verificação de autorização então decidi mudar minha função para uma função de superusuário, voltei lá na requisição e fiz os ajustes no payload

![image](https://github.com/user-attachments/assets/79181a2b-ac18-484c-a399-c7bfc59926f0)

Me retornou um erro com uma mensagem de invalid params.

Dando mais uma longa analisada no código encontramos essa função

```
/**
* Additional check to exclude an opportunity to deactivate himself.
*
* @param array $users
* @param array $users[]['usrgrps'] (optional)
*
From this snippet, we understand that we cannot change our roles because our role is checked
from extracting our data from the API token, and verifying against the database if we are that user.
But following the code we see that usrgrps has no validation at all, and therefore can be abused
to add ourselves into multiple groups at once. As long as the group is not disabled and the group
allows GUI access we can abuse this to change our current role with the following command:
User ID 3 is matthew , User group 7 is the Zabbix administrators group and user group 13 is the
Internal group which both hold unrestrictive privileges. The response indicates that the change
was successful:
* @throws APIException
*/
private function checkHimself(array $users) {
foreach ($users as $user) {
if (bccomp($user['userid'], self::$userData['userid']) == 0) {
if (array_key_exists('roleid', $user) && $user['roleid'] !=
self::$userData['roleid']) {
self::exception(ZBX_API_ERROR_PARAMETERS, _('User cannot change
own role.'));
}
if (array_key_exists('usrgrps', $user)) {
$db_usrgrps = DB::select('usrgrp', [
'output' => ['gui_access', 'users_status'],
'usrgrpids' => zbx_objectValues($user['usrgrps'], 'usrgrpid')
]);
foreach ($db_usrgrps as $db_usrgrp) {
if ($db_usrgrp['gui_access'] == GROUP_GUI_ACCESS_DISABLED
|| $db_usrgrp['users_status'] ==
GROUP_STATUS_DISABLED) {
self::exception(ZBX_API_ERROR_PARAMETERS,
_('User cannot add himself to a disabled group or a
group with disabled GUI access.')
);
}
}
}
break;
}
}
}
```

De acordo com esse snippet, não podemos alterar nossas funções pq nossa função é verificada ao extrair nossos dados do token da API e verificar no banco de dados se somos esse usuário. Mas analisando o código, vemos que usrgrps não tem validação alguma e por conta dessa falta de validação, pode ser abusado para nos adicionar em vários grupos de uma vez. Não tem nenhuma verificação para impedir que um usuário adicione a si mesmo a grupos que não deveria ter acesso.

vamos tentar escalar privilégios pela falta dessa validação, editei o payload e mandei a request novamente

![image](https://github.com/user-attachments/assets/a1f5b0fe-cec5-4cd4-9f79-15eca18ca266)

userid 3 refere-se ao id do user matthew
usrgrps contém uma lista de IDS de grupo: 13 que é um grupo internet e 7 é o grupo zabbix administators. a nossa resposta do servidor confirma o sucesso da operação:

```
{"jsonrpc":"2.0","result":{"userids":["3"]},"id":1}
```







文件快照

[4.0K] /data/pocs/a7c023533a461bbc5a54c5c25a607eeeb82308c0 └── [6.2K] README.md 0 directories, 1 file
神龙机器人已为您缓存
备注
    1. 建议优先通过来源进行访问。
    2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
    3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。