During SharePoint ToolShell Exploitation, threat actors modified Internet Information Services (IIS) components to load suspicious .NET assemblies for persistence.1
IIS Components T1505.004
- Tactic
- Persistence
- Platform
- Windows
- Version
- 1.1
- Created
- 03 June 2021
- Last modified
- 24 October 2025
- Contributor
- Wes Hurd
Adversaries may install malicious components that run on Internet Information Services (IIS) web servers to establish persistence. IIS provides several mechanisms to extend the functionality of the web servers. For example, Internet Server Application Programming Interface (ISAPI) extensions and filters can be installed to examine and/or modify incoming and outgoing IIS web requests. Extensions and filters are deployed as DLL files that export three functions: Get{Extension/Filter}Version, Http{Extension/Filter}Proc, and (optionally) Terminate{Extension/Filter}. IIS modules may also be installed to extend IIS web servers.[1][2][3][4]
IIS Components MITRE reference T1505.004
2 campaigns have been recorded using this technique. Listed newest first; dates are year-granularity and attribution is MITRE’s.
During Operation Dream Job, Lazarus Group targeted Windows servers running Internet Information Systems (IIS) to install C2 components.1
All 2 campaigns for this technique
3 software entries are documented implementing this technique. MITRE files each as a tool or as malware; newest first, then by how many groups carry them.
Is an IIS post-exploitation framework, consisting of 18 modules that provide several functionalities.1
Has been loaded onto Exchange servers and disguised as an ISAPI filter (owaauth.dll). The IIS w3wp.exe process then loads the malicious DLL.1
All 3 software entries for this technique
Offense vs defense T1505.004
Is defensive coverage keeping up with adversary use? Eight counts, each ranked against all 697 ATT&CK techniques. Attack sits left, defense right, so a shape leaning left means adversaries are better documented here than defenders are equipped. Hover any spoke for its percentile and the share of techniques that have more. The timeline below shows when each side arrived.
How it got here
Adversary activity (campaign spans) over cumulative rule output. Each source is plotted independently from zero, so neither line includes the other. Campaign dates are year-granularity.
IIS Components detection strategy DET0068
MITRE names one behaviour worth catching for this technique and breaks it into 1 analytic, one per platform. Each carries the log sources it needs and the fields you tune per environment.
Detection Strategy for T1505.004 - Malicious IIS Components
AN0184 · Windows
Adversary installs or modifies IIS components (ISAPI filters, extensions, or modules) using DLL files registered via configuration changes or administrative tools like AppCmd.exe. These components intercept or manipulate HTTP requests/responses for persistence or C2.
Log sources
The data this analytic draws on. You do not need every component — each one you already collect covers part of it. Each links to its ATT&CK record.
| Data component | Name | Channel |
|---|---|---|
| Module LoadDC0016 | WinEventLog:Sysmon | EventCode=7 |
| Process CreationDC0032 | WinEventLog:Sysmon | EventCode=1 |
| Application Log ContentDC0038 | WinEventLog:System | Changes to applicationhost.config or DLLs loaded by w3wp.exe |
| File CreationDC0039 | WinEventLog:Sysmon | EventCode=11 |
| File ModificationDC0061 | WinEventLog:Security | EventCode=4663, 4670, 4656 |
| Service ModificationDC0065 | WinEventLog:Microsoft-IIS-Configuration | Module or ISAPI filter registration events |
Tunable fields
MITRE calls these the analytic’s mutable elements: the thresholds and filters you set for your own environment.
| Field | What you tune |
|---|---|
| TimeWindow | Adjustable time frame for detecting chained events (e.g., config change + module load) |
| UserContext | Scope detection to specific users or roles allowed to modify IIS components |
| WatchedPaths | Specific directories such as %windir%\System32\inetsrv\ for DLL monitoring |
| DLLNameEntropyThreshold | Entropy or name patterns to flag suspicious DLLs registered as components |
| ParentProcessName | Restrict to DLLs loaded by w3wp.exe or invoked via AppCmd.exe |
Regularly check installed IIS components to verify the integrity of the web server and identify if unexpected changes have been made.
Ensure IIS DLLs and binaries are signed by the correct application developers.
Restrict unallowed ISAPI extensions and filters from running by specifying a list of ISAPI extensions and filters that can run on IIS.
Do not allow administrator accounts that have permissions to add IIS components to be used for day-to-day operations that may expose these permissions to potential adversaries and/or other unprivileged systems.
| # | Test | Platform | Executor | Elevation | Prereqs | Cleanup | Ref | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 01 | Install IIS Module using AppCmd.exe | windows | cmd | — | 1 | Yes | ||||||||||||||
The following Atomic will utilize AppCmd.exe to install a new IIS Module. IIS must be installed. This atomic utilizes a DLL on disk, but to test further suspiciousness, compile and load IIS-Raid. A successful execution will install a module into IIS using AppCmd.exe. Managing and installing Modules Reference IIS Modules Input arguments
Attack command %windir%\system32\inetsrv\appcmd.exe install module /name:#{module_name} /image:#{dll_path}
Cleanup command %windir%\system32\inetsrv\appcmd.exe uninstall module #{module_name}
Prerequisite IIS must be installed in order to add a module to IIS. Check $service = get-service w3svc -ErrorAction SilentlyContinue
if($service){ Write-Host "IIS installed on $env:computername" } else { Write-Host "IIS is not installed on $env:computername" }
Satisfy Install IIS to continue. GUID3c829773-a22a-45e6-9c60-813edd1006e7 | ||||||||||||||||||||
| 02 | Install IIS Module using PowerShell Cmdlet New-WebGlobalModule | windows | PowerShell | — | 1 | Yes | ||||||||||||||
The following Atomic will utilize PowerShell Cmdlet New-WebGlobalModule to install a new IIS Module. IIS must be installed. This atomic utilizes a DLL on disk, but to test further suspiciousness, compile and load IIS-Raid. A successful execution will install a module into IIS using New-WebGlobalModule. Managing IIS Modules with PowerShell IIS Modules Input arguments
Attack command New-WebGlobalModule -Name #{module_name} -Image #{dll_path}
Cleanup command Remove-WebGlobalModule -Name #{module_name}
Prerequisite IIS must be installed in order to add a module to IIS. Check $service = get-service w3svc -ErrorAction SilentlyContinue
if($service){ Write-Host "IIS installed on $env:computername" } else { Write-Host "IIS is not installed on $env:computername" }
Satisfy Install IIS to continue. GUID8b2f83dd-97b2-449c-9f3e-e51826e4a8ec | ||||||||||||||||||||
Tests from Atomic Red Team (MIT licence) · technique definition