ID: 0xFF-0294-ADCS_Certificate_Requested_via_Web_Interface
OS: WindowsServer
FP Rate: Medium
Tactic | Technique | Subtechnique | Technique Name |
---|---|---|---|
TA0006 - Credential Access | T1556 | Modify Authentication Process |
Log Provider | Event ID | Event Name | ATT&CK Data Source | ATT&CK Data Component |
---|---|---|---|---|
AzureMonitor(IIS) | W3CIISLog | Application Log | Application Log Content |
This query uses IIS logs to identify certificates requested via the web interface. In the first step, ADCS servers are listed by looking for an ADCS specific Uri Stem in the IIS logs events. A hard-coded ADCS server list can also be provided as environment variable instead (adcs_server_list). In a second step, requests to these servers done via the web interface are identified by looking for POST to a '/certsrv/certfnsh.asp' Uri.
User
This query looks for ADCS certificates being requested via the web interface. This technique can be used by an attacker to modify authentication processes, in order to evade detection or elevate privileges.
This action is not malicious on its own, but should be quite rare. This event must be correlated with other events.
This rule will create noise if the web interface is a common way to request certificates in a given environment.
Investigate whether the affected user requested the certificate for a valid business purpose.
None expected.
Language: Kusto
Platform: Sentinel
Query:
let timeframe = 2*1h;
let RuleId = "0294";
let DedupFields = dynamic(["TimeGenerated"]);
// List ADCS servers.
let ADCSsrv = dynamic(["ADCS01.test.lab", "ADCS02.test.lab"]);
// Cert request via web interface.
W3CIISLog
| where ingestion_time() >= ago(timeframe)
| where Computer in~ (ADCSsrv)
| where not(csMethod in~ ("GET","HEAD"))
| where csUriStem =~ "/certsrv/certfnsh.asp"
// Begin environment-specific filter.
// End environment-specific filter.
// Begin de-duplication logic.
| extend DedupFieldValues=pack_all()
| mv-apply e=DedupFields to typeof(string) on (
extend DedupValue=DedupFieldValues[tostring(e)]
| order by e // Sorting is required to ensure make_list is deterministic.
| summarize DedupValues=make_list(DedupValue)
)
| extend DedupEntity=strcat_array(DedupValues, "|")
| project-away DedupFieldValues, DedupValues
| join kind=leftanti (
SecurityAlert
| where AlertName has RuleId and ProviderName has "ASI"
| where TimeGenerated >= ago(timeframe)
| extend DedupEntity = tostring(parse_json(tostring(parse_json(ExtendedProperties)["Custom Details"])).DedupEntity[0])
| project DedupEntity
) on DedupEntity
// End de-duplication logic.
Version | Date | Impact | Notes |
---|---|---|---|
1.1 | 2022-07-06 | minor | Modified query to use ingestion_time() instead of TimeGenerated. |
1.0 | 2022-06-08 | major | Initial version. |