Contents

Defender for Endpoint Timeline Internals

After the publication of the timeline-downloader tool by Matthieu Gras it was time to test the solution to identify the value for DFIR and explore the internals of the timeline logs. After a quick initial , I already concluded that this tool changes the game for timeline based investigations, not only is the tool well designed for multihost timeline acquisition it also makes the raw telemetry of the timeline more accessible, resulting in much more insights for DFIR and Security Research folks. This blog will research the timeline events that benefit IR investigations. The investigation of the logs is done in two approaches:

  1. Exporting the results of the logs to Data Explorer for KQL based analysis.
  2. Commandline filtering of the logs.

πŸ“˜ Before reading this blog, make sure to check out the Defender Timeline Downloader: Extending Data Retention for Incident Response from Matthieu Gras. This blog covers the context and architecture of the tool.

πŸ”¨ The tool itself is available on GitHub and explains how to run the tool: https://github.com/matthieugras/timeline-downloader

⚠️ The data used in this investigation is not complete, there are more events that are not covered as they did not appear in my test environment.

Acquiring Defender for Endpoint Timeline Data

To evaluate the coverage and depth of Defender for Endpoint’s timeline telemetry, the timeline-downloader tool was executed targeting four hosts simultaneously. Workstation-03 is the most active host with around 600.000 exported events. In total 1310000 events had been exported in 16 minutes, which is a game changer compared to manual analysis (and the huge struggle) of the timeline. In total the output files of the four assets take up 3,4 GB of data. The acquisition was performed using the default configuration of five workers. Increasing the worker count or setting the timechunk parameter would further speed up the download and thus reduce the acquisition time.

/images/Defender-Timeline-Internals/Execution.png
Exporting timeline of multiple devices at once

bert-jan@DESKTOP-J0PG8P6:~/timeline-downloader$ ls -lh output/
total 3.4G
-rw-r--r-- 1 bert-jan bert-jan 1.6G Jan 22 19:36 Workstation-03_2694a7cc2225f3b66f7cf8b6388a78b1857fadca_timeline.jsonl
-rw-r--r-- 1 bert-jan bert-jan 354M Jan 22 19:25 dc-01.cyberguard.local_84fe39795cd8c40251afa9066d33451824189f82_timeline.jsonl
-rw-r--r-- 1 bert-jan bert-jan 275M Jan 22 19:24 sw-02.cyberguard.local_95c0eba6b7443d0966afbb9a2c5dfcca6b3d719c_timeline.jsonl
-rw-r--r-- 1 bert-jan bert-jan 1.3G Jan 22 19:37 workstation-01_d570c4018bf303ce65256dfa7cea8ecf0e802d18_timeline.jsonl

The exported JSONL files can be ingested into Azure Data Explorer (ADX) for KQL based analysis and storage. In the blog Incident Response Part 2: What about the other logs? it explains how you can ingest the data into Azure Data Explorer. In this research, all timeline events were ingested into a table named TimelineDownloader. Adjust the KQL examples in later sections if your table name differs.

πŸ’‘Tip - Microsoft offers a free 100GB Data Explorer cluster to play with. This is great for such side projects and to train your skills.

Reviewing the Timeline Dataset

Once the data is downloaded to your machine or uploaded to ADX, the investigation can kick off. To get an idea of what is included in the data, we first dump the schema of the created table. This displays a couple of interesting columns that require more in depth analysis:

  • IsCyberData
  • ActionType
  • SourceProvider
  • MitreInfo
  • CyberActionType

The full schema is returned below.

ColumnNameColumnOrdinalDataTypeColumnType
IsCyberData0System.SBytebool
ActionTime1System.DateTimedatetime
ActionTimeIsoString2System.DateTimedatetime
ActionType3System.Stringstring
Machine4System.Objectdynamic
Registry5System.Objectdynamic
InitiatingProcess6System. Objectdynamic
InitiatingProcessParent7System.Objectdynamic
InitiatingUser8System.Objectdynamic
LogonType9System.Stringstring
AppGuardContainerId10System.Stringstring
Tags11System.Objectdynamic
ReportId12System.Stringstring
MergedItemsReportIds13System.Objectdynamic
MergedItemsReportIdsToTimes14System.Objectdynamic
SourceProvider15System.Stringstring
Entities16System.Objectdynamic
MitreInfo17System.Objectdynamic
IsBoldEvent18System.SBytebool
TypedDetails19System.Objectdynamic
HiddenDetails20System.Objectdynamic
PreviousRegistry21System. Objectdynamic
Process22System.Objectdynamic
AdditionalFields23System.Objectdynamic
User24System.Objectdynamic
AlertIds25System.Objectdynamic
CyberActionType26System.Objectdynamic
Description27System.Stringstring
Icon28System.Stringstring
RelatedObservationName29System.Stringstring
File30System.Objectdynamic
RemoteEndpoint31System.Objectdynamic
LocalEndpoint32System.Objectdynamic

Commandline based analysis

Commandline based analysis:

cat output/workstation-01_d570c4018bf303ce65256dfa7cea8ecf0e802d18_timeline.jsonl | jq 'keys' | sort -u

Kusto based analysis:

TimelineDownloader
| getschema 

Columns of Interest

During the schema review, several columns stood out for understanding how Defender for Endpoint classifies and stores its timeline telemetry. This section discusses the purpose of each of these columns.

IsCyberData

The IsCyberData column has two values: true or false. All ‘regular’ events have the boolean value set to false, only the ActionType OneCyber has this value set to true. This split between ’normal’ and IsCyberData seems to be that ’normal’ data is made available in Advanced Hunting, as the ActionTypes in the set are known actions.

/images/Defender-Timeline-Internals/IsCyberData.png
IsCyberData events

Commandline based analysis

cat output/workstation-01_d570c4018bf303ce65256dfa7cea8ecf0e802d18_timeline.jsonl | jq -s -r 'group_by(.IsCyberData) |
          map([
            (.[0].IsCyberData | tostring),
            (map(.ActionType) | unique | join(";"))
          ] | @csv)[]'

Kusto based analysis:

TimelineDownloader
| summarize make_set(ActionType) by IsCyberData

Investigating the ActionType Column

The data in the json export has the familiar ActionType field which Defender For Endpoint uses to group events into EventTypes. When analysing the output of the ActionType column we can observe the following:

  • Most of the actions found in this field are already known to us, they streamed to one of the Device* tables that Defender For Endpoint logs in Advanced Hunting.
  • The timeline also contains Action Center events of activities that have been performed on the device. Examples of these activities are for example QuarantineFile, CollectInvestigationPackageResponse and LiveResponseCommand.
  • The majority of the events are in the OneCyber category, which is certainly not a dissapointment, this field is rich with content that we do not natively have in the Advanced Hunting logs, more on that later.

/images/Defender-Timeline-Internals/ActionType.png
ActionType distribution

Commandline based analysis

cat output/workstation-01_d570c4018bf303ce65256dfa7cea8ecf0e802d18_timeline.jsonl | jq -r '.ActionType' | sort | uniq -c

Kusto based analysis:

TimelineDownloader
| summarize count() by ActionType

SourceProvider

The SourceProvider column has three values, which seems to be the source product that streams the data to the timeline. In the exported dataset, three distinct values appear:

  • MDE - events originating from Microsoft Defender for Endpoint
  • MDI - based on the name suggests events attributed to Microsoft Defender for Identity
  • Empty values - alert related events

The interesting part is that MDI only seems to cover the OneCyber actions. As mentioned later in the blog, the MDI does include lots of OS based logs, which are not related to Defender For Identity. This makes me question if the MDI abbrivitation is refering to the MDI product of to a full name that we are not aware of (yet).

/images/Defender-Timeline-Internals/SourceProvider.png
SourceProvider events

MITRE Mapping and Coverage Analysis

The MitreInfo column lists the related MITRE ATT&CK tactics and techniques for the OneCyber events. This is purely speculation, based on the information we got from the previous step thing start to make sense (sort of). An event is IsCyberData when there is a MITRE ATT&CK technique mapped. In the dataset used there is no OneCyber event without mapping to any MITRE ATT&CK tactic of technique.

/images/Defender-Timeline-Internals/MitreInfo.png
MitreInfo events

The MitreInfo events can be converted into a MITRE layer to determine the coverage of the OneCyber events. The .json of the MITRE layer is available on GitHub. The layer is based on Windows techniques as that is the only OS used in the exported devices.

There is coverage available all over the board, with Discovery seemingly being the tactic that has the move coverage. With this export, the DFIR coverage becomes actionable to defenders and their response strategy.

OneCyber Coverage Layer

MITRE ATT&CK Coverage Visualization

CyberActionType

The last event on our list of columns of interest is the CyberActionType column. Again the OneCyber event is dividing the events. If the event is a OneCyber event there is data in the column. At first glance, this data looks promising as it seems to be seperated by different TypeName fields that seem similar to the ActionTypes but also contain different fields. As example the SuspiciousProcessDataExfiltration TypeName is not something that is logged in Advanced Hunting but sounds interesting from a DFIR perspective.

/images/Defender-Timeline-Internals/CyberActionType.png
CyberActionType events

Investigating the OneCyber events

The OneCyber events are not new, in the Microsoft Defender for Endpoint Internals 0x04 β€” Timeline telemetry, Olaf compares this field already with the exsisting events available in Advanced Hunting.

The OneCyber event data has a column named RelatedObservationName, the content of this column feels similar to the ActionType column, it has events such as NamedPipeCreation, ListeningSocketCreated, MismatchingOriginalNameWindowsBinary, AmsiContentDetails, AmsiContent, BeaconingActivity and WindowsLocalGroupMemberEnumeration. I have uploaded the export with unique matches between the TypeName and RelatedObservationName columns to GitHub, in total 279 combinations were made.

Commandline based analysis

cat output/workstation-01_d570c4018bf303ce65256dfa7cea8ecf0e802d18_timeline.jsonl | jq -s 'map(select(.ActionType == "OneCyber") |
       {
         TypeName: (.CyberActionType.TypeName // "" | tostring),
         RelatedObservationName: .RelatedObservationName,
         ActionType: .ActionType
       }) |
       unique |
       sort_by(.TypeName, .RelatedObservationName)'

Kusto based analysis:

TimelineDownloader
| where ActionType == "OneCyber"
| extend TypeName = tostring(CyberActionType.TypeName)
| distinct  TypeName, RelatedObservationName, ActionType
| sort by TypeName, RelatedObservationName 

Mapping Timeline Fields to Log Fields

Now that we understand the structure of the exported timeline logs, we can start correlating them with what appears in the Defender for Endpoint timeline in the portal. Several internal fields from the JSON export map directly to elements shown in the timeline interface, while others provide additional context that is not natively available in the portal without enabling developer mode. The MitreInfo maps to the additional information column of the timeline. If the timeline field has a MITRE mapping it is considered IsCyberData. The TypeName field translates to the Action type. The Description column in the JSON translates to the Event field in the gui.

/images/Defender-Timeline-Internals/Translation.png
Timeline translation to logs

DFIR Opportunities

With a solid understanding of how the timeline data is obtained, formatted and enriched we can shift focus. The reason we obtain the data is to answer the questions we have, we need to find out what happened on a host. Based on this data we want to know in what areas this data can add value to DFIR investigations. This section describes multiple areas in which these exports can add value to your investigations.

This section will discuss multiple TypeNames that can be of interest for incident response investigations. The bash script or Kusto query below can be used in all of these steps by changing the value of the TypeName in the filter. If additional parsing is needed an adjusted query is added for more context. The details of the action are saved in the TypedDetails column as JSON object.

It is important to mention that all these TypeNames are already available on the timeline, the logs did not provide new data. The main difference is that exporting all logs for 180 days provides a scalable way to analyze the actions and identify relevant actions based on alert or hunt for anomalies on the full timeline.

Commandline based analysis

cat output/workstation-01_d570c4018bf303ce65256dfa7cea8ecf0e802d18_timeline.jsonl | jq 'select(.ActionType == "OneCyber") |
    select(.CyberActionType.TypeName == "PsTokenDebugPrivilegeAdditionDropAndExec")'

Kusto based analysis:

TimelineDownloader
| where ActionType == "OneCyber"
| extend TypeName = tostring(CyberActionType.TypeName)
| where TypeName == "PsTokenDebugPrivilegeAdditionDropAndExec"

AMSI Content

First off are the AMSI related events. With the introduction of custom data collection in Microsoft Defender for Endpoint we have the opportunity to collect AMSI events from EDR onboarded devices. In the timeline export several AMSI related events are included:

  • AmsiScriptDetection
  • AmsiContentPattern
  • AmsiContentDetails
  • AmsiContent

These four events give details on what patterns, detections and content passed through AMSI. To review the details you would need to filter on any of the four AMSI events, for example the AmsiContent TypeName. The data describes what and who initiated the activity and the content of the executed commands. The Hello.exe executable was a SliverC2 beacon that executed the activities.

"TypedDetails": [
	{
		"key": "Content",
		"value": ".\\Hello.exe ping 8.8.8.8",
		"valueType": "String",
		"isHidden": false
	},
	{
		"key": "Content sha256",
		"value": "d303768785321558d04aac3249110fc33af31861628e2db410123bbe5d3ba933",
		"valueType": "CopyPastableString",
		"isHidden": false
	}
]
...
"TypedDetails": [
	{
		"key": "Content",
		"value": "schtasks /create /tn \"EDRTest\" /tr \"calc.exe\" /sc minute /mo 5",
		"valueType": "CopyPastableString",
		"isHidden": false
	},
	{
		"key": "Content sha256",
		"value": "5a2b66749d8900c1d4d1903efd683939fd7edaa061b9e98e2ee3ade2d58b13a0",
		"valueType": "CopyPastableString",
		"isHidden": false
	}
],

DelayedDropAndLoading

The events related to the TypeName DelayedDropAndLoading would require more research in what these events exactly are. Without context they may not seem too interesting, however the fact is that both the teamsviewer.exe and JetBrains.exe are being Sliver C2 beacons. Adding to this that these are the only events out of 1.3 million that have this specific TypeName it could yield forensic value.

/images/Defender-Timeline-Internals/DelayedDropAndLoading.png
DelayedDropAndLoading events

JavaScript & MSHTA

The timeline events contain more granular events related to script execution, as example JavaScript and MSHTA have their own category. In case a malicious MSHTA file is executed, these logs can provide details on what the contents of the malious file executed.

"TypedDetails": [
	{
		"key": "Script interpreter image file",
		"value": "mshta.exe",
		"valueType": "CyberEntity",
		"isHidden": false,
		"entityId": "b6cbda321330383c8e91df69a8ceae0b771af8ce",
		"entityType": "file"
	},
	{
		"key": "Script interpreter image file path",
		"value": "C:\\Windows\\System32\\mshta.exe",
		"valueType": "CopyPastableString",
		"isHidden": false
	},
	{
		"key": "Script interpreter pid",
		"value": "11272",
		"valueType": "String",
		"isHidden": false
	},
	{
		"key": "Script interpreter command line",
		"value": "\"mshta.exe\" javascript:eval('wscript.shell.Run(\\ calc.exe\\)')",
		"valueType": "CopyPastableString",
		"isHidden": false
	},
	{
		"key": "Script interpreter remote session initiator IP",
		"value": "192.168.178.144",
		"valueType": "CyberEntity",
		"isHidden": false,
		"entityId": "192.168.178.144",
		"entityType": "ip"
	},
	{
		"key": "Script interpreter remote session initiator device name",
		"value": "WORKSTATION-03",
		"valueType": "String",
		"isHidden": false
	}
],

RemoteAccessSoftware

The last event that I want to highlight is RemoteAccessSoftware, which is a common initial access vector (T1133). This event type highlights the presence or execution of remote access tools (RATs) on a device.

In the exported dataset, multiple events were detected for AnyDesk and TeamViewer, clearly identifying:

  • The binary filename
  • The installation or execution path
"TypedDetails": [
	{
		"key": "Remote access tool file",
		"value": "teamviewer.exe",
		"valueType": "CyberEntity",
		"isHidden": false,
		"entityId": "87bafe9379dc27234197946a535baa45322967e2",
		"entityType": "file"
	},
	{
		"key": "Remote access tool file path",
		"value": "C:\\Users\\RickAstley\\OneDrive - KQLQuery.com\\Pictures\\teamviewer.exe",
		"valueType": "CopyPastableString",
		"isHidden": false
	},
	{
		"key": "Remote access tool",
		"value": "TeamViewer",
		"valueType": "String",
		"isHidden": false
	}
],

There are way more events that provide valuable insights into what happend on the host of interest, these were just a couple of examples to show the granularity of the data. All this data is available in the GUI timeline, but requires setting the right timeframes to find it.

Timeline vs. Advanced Hunting

The last thing I wanted to do before concluding the research was to identify the difference between the data available in Advanced Hunting and the data that is present in the timeline. As responders we all know that there are differences, but there is limited clarity on when to use one of the two.

The comparison is based on three different inputs:

  • All ActionTypes from the Device* tables in Advanced Hunting
  • All ActionTypes from the timeline logs
  • All parsed TypeNames from the timeline logs

The ActionType can be any of the three sources; ActionType Advanced Hunting, ActionType Timeline or TypeName timeline event.

⚠️ The comparison made below is binary. In practice many of the actions are also logged in Advanced Hunting but with a different name or withing other aggregated events, however in most cases the data is not already split into categories for easy filtering.

ActionTypeTableNameAvailableInTimeLineAvailableInAdvancedHunting
Alertβœ…βŒ
AlternateDataStreamModificationβœ…βŒ
AmsiContentβœ…βŒ
AmsiContentDetailsβœ…βŒ
AmsiContentPatternβœ…βŒ
AmsiScriptContentDeviceCustomScriptEventsβŒβœ…
AmsiScriptDetectionDeviceEventsβœ…βœ…
AnomalousAsepByRegistryβœ…βŒ
AnomalousKeyboardHookβœ…βŒ
AnomalousSetWindowsHookExβœ…βŒ
AntivirusDetectionDeviceEventsβœ…βœ…
AntivirusDetectionActionTypeβœ…βŒ
AntivirusReportDeviceEventsβœ…βœ…
AntivirusScanCancelledDeviceEventsβœ…βœ…
AntivirusScanCompletedDeviceEventsβœ…βœ…
AppControlCodeIntegritySigningInformationDeviceEventsβœ…βœ…
AsepByRegistryβœ…βŒ
AsepByRegistryModificationβœ…βŒ
AsrDeviceEventsβœ…βœ…
AsrAbusedSystemToolAuditedDeviceEventsβœ…βœ…
AsrLsassCredentialTheftAuditedDeviceEventsβŒβœ…
AsrPersistenceThroughWmiAuditedDeviceEventsβŒβœ…
AsrPsexecWmiChildProcessAuditedDeviceEventsβŒβœ…
AuditPolicyModificationDeviceEventsβœ…βœ…
AutomatedCollectionByStagingβœ…βŒ
Base64EncodedCommandLineβœ…βŒ
BeaconingActivityβœ…βŒ
BitBltEventβœ…βŒ
BitsJobAddFilesβœ…βŒ
BitsJobCancelβœ…βŒ
BitsJobCreateβœ…βŒ
BitsJobsSuspiciousFileDownloadβœ…βŒ
BootRecordChangeβœ…βŒ
BrowserCreatedMalwareβœ…βŒ
BrowserLaunchedToOpenUrlDeviceEventsβœ…βœ…
ClipboardGetDataβœ…βŒ
ClrModuleLoadβœ…βŒ
ClrUnbackedModuleLoadedDeviceEventsβœ…βœ…
CmdExecutionβœ…βŒ
CollectInvestigationPackageResponseβœ…βŒ
ComClassRegistrationβœ…βŒ
CommonFileNameDropSignerMismatchβœ…βŒ
CommonToolRenamedβœ…βŒ
CompressedFileModifyβœ…βŒ
CompressedFileNetworkConnectionβœ…βŒ
ConnectionAcknowledgedDeviceNetworkEventsβœ…βœ…
ConnectionAttemptDeviceNetworkEventsβœ…βœ…
ConnectionFailedDeviceNetworkEventsβœ…βœ…
ConnectionFailedAggregatedReportDeviceNetworkEventsβœ…βœ…
ConnectionSuccessDeviceNetworkEventsβœ…βœ…
ConnectionSuccessAggregatedReportDeviceNetworkEventsβœ…βœ…
ContainedUserRemoteDesktopSessionDisconnectedDeviceEventsβœ…βœ…
ContainedUserRemoteDesktopSessionStoppedDeviceEventsβœ…βœ…
ControlFlowGuardViolationβœ…βŒ
CreateProcessAsUserβœ…βŒ
CreateProcessThroughWMIAPIβœ…βŒ
CreateRemoteThreadApiCallDeviceEventsβœ…βœ…
CreateWindowsDomainAccountβœ…βŒ
DataTransferSizeLimitsOverTCPβœ…βŒ
DcomRemoteComponentInvocationβœ…βŒ
DefenderObfuscationβœ…βŒ
DelayedDropAndLoadingβœ…βŒ
DelayedNdrZeekExfiltrationβœ…βŒ
DelayedTcpNetworkBytesTransferβœ…βŒ
DeviceShutdownβœ…βŒ
DirectoryServiceObjectCreatedβœ…βŒ
DirectoryServiceObjectModifiedβœ…βŒ
DlpFileInformationNetworkConnectionβœ…βŒ
DnsConnectionInspectedDeviceNetworkEventsβœ…βœ…
DnsQueryResponseDeviceEventsβœ…βœ…
DomainGroupSamrQueryβœ…βŒ
DomainSamrQueryβœ…βŒ
DpapiAccessedDeviceEventsβŒβœ…
DpapiCryptDataOperationβœ…βŒ
DriverLoadDeviceEventsβœ…βœ…
EnumerateDomainTrustsβœ…βŒ
EventLogWasClearedβœ…βŒ
ExecutionFromRegistryRunKeysβœ…βŒ
ExploitGuardChildProcessAuditedDeviceEventsβœ…βœ…
ExploitGuardNonMicrosoftSignedBlockedDeviceEventsβœ…βœ…
ExploitGuardWin32SystemCallBlockedDeviceEventsβœ…βœ…
ExploratoryCommandβœ…βŒ
ExploratoryCommandByCommandLineβœ…βŒ
ExploratoryLdapQueryβœ…βŒ
FileActionRemoteComponentInvocationβœ…βŒ
FileArchiveUtilityUsedβœ…βŒ
FileContentOverwriteβœ…βŒ
FileCouldBePackedβœ…βŒ
FileCreatedDeviceFileEventsβœ…βœ…
FileCreatedDeviceCustomFileEventsβœ…βœ…
FileCreatedAggregatedReportDeviceFileEventsβœ…βœ…
FileCreatedByRemoteMachineβœ…βŒ
FileDaclChangeβœ…βŒ
FileDeletedDeviceFileEventsβœ…βœ…
FileDeletionActivityWasObservedβœ…βŒ
FileDownloadedFromInternetβœ…βŒ
FileDroppedExecutedThenDeletedβœ…βŒ
FileDroppingAfterHighValueFileReadβœ…βŒ
FileHasDoubleExtensionβœ…βŒ
FileHasMotwInternetβœ…βŒ
FileModifiedDeviceFileEventsβœ…βœ…
FileModifiedAggregatedReportDeviceFileEventsβœ…βœ…
FileRenameAggregatedByExtensionβœ…βŒ
FileRenameAggregatedByProcessβœ…βŒ
FileRenamedDeviceFileEventsβœ…βœ…
FileRenamedAggregatedReportDeviceFileEventsβœ…βœ…
FileTimeStompβœ…βŒ
FileTypeAssociationSetβœ…βŒ
FilesExfiltrationOverNetworkβœ…βŒ
GetClipboardDataDeviceEventsβœ…βœ…
GetPublicIpInformationFromWebsiteβœ…βŒ
HiddenFileCreatedβœ…βŒ
HighValueFileNetworkConnectionβœ…βŒ
HighValueFileReadβœ…βŒ
HostsFileOpenβœ…βŒ
HttpConnectionInspectedDeviceNetworkEventsβœ…βœ…
HttpDataExfiltrationβœ…βŒ
IcaclsModifiedEntityPermissionβœ…βŒ
IcmpConnectionInspectedDeviceNetworkEventsβœ…βœ…
ImageFileModificationβœ…βŒ
ImageLoadedDeviceImageLoadEventsβœ…βœ…
InBoundHostVerticalPortScanβœ…βŒ
InboundConnectionAcceptedDeviceNetworkEventsβœ…βœ…
InboundRdpConnectionβœ…βŒ
IndicatorBlockingCommandβœ…βŒ
IngressFileTrasferβœ…βŒ
InjectionAndDotNetDllLoadingβœ…βŒ
InteractiveLogonβœ…βŒ
InteractiveRemoteComponentInvocationβœ…βŒ
InternalProxyβœ…βŒ
JavaScriptExecutionβœ…βŒ
KnownToolCreatedβœ…βŒ
KnownToolCreatedAndFirstSeenβœ…βŒ
KnownToolDeletedβœ…βŒ
KnownToolExecutedβœ…βŒ
LdapQueryβœ…βŒ
LdapSearchDeviceEventsβœ…βœ…
ListeningConnectionCreatedDeviceNetworkEventsβœ…βœ…
ListeningSocketCreatedβœ…βŒ
LiveResponseCommandβœ…βŒ
LocalProtocolTunnelingβœ…βŒ
LogonAttemptedDeviceLogonEventsβœ…βœ…
LogonFailedDeviceLogonEventsβœ…βœ…
LogonFailedAggregatedReportDeviceLogonEventsβœ…βœ…
LogonFailureBruteForceβœ…βŒ
LogonFailurePasswordGuessingβœ…βŒ
LogonSuccessDeviceLogonEventsβœ…βœ…
LogonUsingExplicitCredentialsβœ…βŒ
LolbinsDownloadedFileFromInternetβœ…βŒ
MaliciousFileUserExecutionβœ…βŒ
MaliciousPowerShellCommandRunβœ…βŒ
MappedExecutionFromRegistryRunKeysβœ…βŒ
MasqueradedScheduledTaskβœ…βŒ
MassFileModificationβœ…βŒ
MassFileModificationByInjectedProcessβœ…βŒ
MdiDnsQueryβœ…βŒ
MdiLdapQueryβœ…βŒ
MemoryRemoteProtectβœ…βŒ
MicrosoftAccountCloudTokenFunctionβœ…βŒ
MismatchedExecutedSuspiciousProcessDataExfiltrationβœ…βŒ
MismatchingOriginalNameWindowsBinaryβœ…βŒ
MismatchingOriginalNameWindowsBinaryExecutionβœ…βŒ
MismatchingOriginalNameWindowsDllβœ…βŒ
MsBuildExecutionβœ…βŒ
MshtaExecutionβœ…βŒ
MultipleFileDeletionActivityWasObservedβœ…βŒ
NamedPipeCreationβœ…βŒ
NamedPipeEventDeviceEventsβœ…βœ…
NdrKerberosSignatureβœ…βŒ
NdrZeekDnsβœ…βŒ
NdrZeekHttpβœ…βŒ
NdrZeekSshβœ…βŒ
NdrZeekSslβœ…βŒ
NetworkFilterConnectionInfoβœ…βŒ
NetworkFilterConnectionInfoProtocolNonStandardPortβœ…βŒ
NetworkFilterConnectionInfoTlsβœ…βŒ
NetworkFilterConnectionInfoWebProtocolβœ…βŒ
NetworkPortProtocolNonStandardβœ…βŒ
NetworkPortProtocolWebβœ…βŒ
NetworkRdpLogonβœ…βŒ
NetworkSignatureInspectedDeviceNetworkEventsβœ…βœ…
NetworkSignatureInspectedDeviceCustomNetworkEventsβœ…βœ…
NewServiceStartedβœ…βŒ
NonRecentShellLinkCreationβœ…βŒ
NtAllocateVirtualMemoryApiCallDeviceEventsβœ…βœ…
NtAllocateVirtualMemoryRemoteApiCallDeviceEventsβœ…βœ…
NtMapViewOfSectionRemoteApiCallDeviceEventsβœ…βœ…
NtProtectVirtualMemoryApiCallDeviceEventsβœ…βœ…
NtlmAuthenticationInspectedβœ…βŒ
ObjectManagerSymbolicLinkCreationβœ…βŒ
OneCyberβœ…βŒ
OpenHttpLinkβœ…βŒ
OpenKnownNamedPipeβœ…βŒ
OpenLnkFileβœ…βŒ
OpenProcessApiCallDeviceEventsβœ…βœ…
OtherAlertRelatedActivityDeviceEventsβœ…βœ…
OutboundConnectionFromLolbinToUncommonlyUsedPortβœ…βŒ
OutboundConnectionToCommonlyUsedPortβœ…βŒ
OutboundConnectionToDnsProtocolβœ…βŒ
OutboundConnectionToRdpProtocolβœ…βŒ
OutboundConnectionToUncommonlyUsedPortβœ…βŒ
OutboundConnectionToWebProtocolβœ…βŒ
OutboundMultipleChannelsCommunicationβœ…βŒ
OutboundOpenNetworkShareβœ…βŒ
PermissionGroupsDiscoveryCommandβœ…βŒ
PlugAndPlayDeviceConnectionβœ…βŒ
PnpDeviceAllowedDeviceEventsβœ…βœ…
PnpDeviceConnectedDeviceEventsβœ…βœ…
PossibleBypassUserAccessControlβœ…βŒ
PossibleMasqueradingScheduledTaskThroughTaskFileβœ…βŒ
PossibleMasqueradingScheduledTaskUsingCodeRunnerβœ…βŒ
PossibleTheftOfSensitiveWebBrowserInformationβœ…βŒ
PotentialIngressToolTransferβœ…βŒ
PowerShellCommandDeviceEventsβœ…βœ…
PowerShellImageLoadβœ…βŒ
PowershellExecutionβœ…βŒ
PowershellModuleLoadβœ…βŒ
PrefetchFileDeleteAggregationβœ…βŒ
ProcessCreatedDeviceProcessEventsβœ…βœ…
ProcessCreatedAggregatedReportDeviceProcessEventsβœ…βœ…
ProcessCreatedUsingWmiQueryDeviceEventsβœ…βœ…
ProcessCreationWithLogonβœ…βŒ
ProcessInjectionApiEventβœ…βŒ
ProcessLaunchingAfterWindowsDomainAccountLogonSuccessβœ…βŒ
ProcessPrimaryTokenModifiedDeviceEventsβœ…βœ…
ProcessRemoteCodeInjectedβœ…βŒ
ProcessTokenModificationβœ…βŒ
ProcessWithHiddenImageFileβœ…βŒ
PsTokenDebugPrivilegeAdditionDropAndExecβœ…βŒ
PythonExecutionβœ…βŒ
QuarantineFileβœ…βŒ
RansomwareBehaviorDetectedInTheFileSystemβœ…βŒ
RansomwareFileAggregationSimulationβœ…βŒ
RdpCoreTsconnectionsβœ…βŒ
ReadProcessMemoryApiCallDeviceEventsβŒβœ…
ReadSensitiveMemoryβœ…βŒ
RegSaveCredentialDumpingβœ…βŒ
RegWdavSettingsModificationβœ…βŒ
RegisterRawInputDeviceKeyboardβœ…βŒ
RegistryKeyCreatedDeviceRegistryEventsβœ…βœ…
RegistryKeyDeletedDeviceRegistryEventsβœ…βœ…
RegistryModificationβœ…βŒ
RegistryQueryValueβœ…βŒ
RegistryValueDeletedDeviceRegistryEventsβœ…βœ…
RegistryValueSetDeviceRegistryEventsβœ…βœ…
RemoteAccessSoftwareβœ…βŒ
RemoteCreateThreadβœ…βŒ
RemoteCreateThreadCrossProcessInjectionβœ…βŒ
RemoteCreateThreadProcessHollowingβœ…βŒ
RemoteCreateThreadSystemModuleβœ…βŒ
RemoteDesktopConnectionDeviceEventsβœ…βœ…
RemoteShareDiscoveryβœ…βŒ
ResourceAccessβœ…βŒ
SchTasksLaunchβœ…βŒ
ScheduledNdrZeekExfiltrationβœ…βŒ
ScheduledTaskCreatedDeviceEventsβœ…βœ…
ScheduledTaskDeletedDeviceEventsβœ…βœ…
ScheduledTaskRegisterAndRunLocalPathβœ…βŒ
ScheduledTaskRunLocalPathβœ…βŒ
ScheduledTaskTcpNetworkBytesTransferβœ…βŒ
ScheduledTaskUpdatedDeviceEventsβœ…βœ…
ScmConfigChangeBinaryPathNameβœ…βŒ
ScmSendControlβœ…βŒ
ScmSendControlStopβœ…βŒ
ScmServiceStartedβœ…βŒ
ScreenshotTakenDeviceEventsβœ…βœ…
SecurityGroupCreatedβœ…βŒ
SensitiveFileReadDeviceEventsβŒβœ…
ServiceCreationβœ…βŒ
ServiceDeleteFlagModificationβœ…βŒ
ServiceInstalledDeviceEventsβŒβœ…
ServiceStartupDelayChangeβœ…βŒ
SetWindowsHookExKeyboardβœ…βŒ
ShadowCopyDeletionβœ…βŒ
ShellLinkCreateFileβœ…βŒ
ShellLinkCreateFileEventDeviceEventsβœ…βœ…
ShimDatabaseRegistrationβœ…βŒ
SmartScreenUrlWarningDeviceEventsβœ…βœ…
SslConnectionInspectedDeviceNetworkEventsβœ…βœ…
StandardEncodingC2βœ…βŒ
SuspiciousAccessToLSASSServiceβœ…βŒ
SuspiciousBatchFilePowershellExecutionβœ…βŒ
SuspiciousPowerShellCommandRunβœ…βŒ
SuspiciousProcessDataExfiltrationβœ…βŒ
SuspiciousWindowsDefenderAntivirusExclusionListModificationβœ…βŒ
SystemInformationDiscoveryCommandβœ…βŒ
SystemInformationRegistryQueryβœ…βŒ
SystemNetworkConfigurationDiscoveryCommandβœ…βŒ
SystemNetworkConnectionsDiscoveryCommandβœ…βŒ
SystemRecoveryIsDisabledBySuspiciousProcess.βœ…βŒ
SystemShutdownRebootβœ…βŒ
TamperProtectionConfigChangeAttemptβœ…βŒ
TamperingAttemptβœ…βŒ
TcpIpv4PotentialExfiltrationβœ…βŒ
TracerouteInternetConnectionDiscoveryβœ…βŒ
TvmAxonTelemetryEventDeviceEventsβœ…βœ…
UncommonFileDropβœ…βŒ
UncommonRmmToolExecβœ…βŒ
UnsecuredCredsInFilesCmdLineβœ…βŒ
UnusualWallpaperChangeβœ…βŒ
UsbDriveMountedDeviceEventsβœ…βœ…
UserAccountAddedToLocalGroupβœ…βŒ
UserAccountModifiedβœ…βŒ
UserFileExecutionβœ…βŒ
VisualBasicExecutionβœ…βŒ
WallpaperChangeβœ…βŒ
WdavSecurityFeatureTurnOffByAccountβœ…βŒ
WebServiceCommandAndControlβœ…βŒ
WindowsBinarySimilarFileNameβœ…βŒ
WindowsDefenderAntivirusProtectionModificationsβœ…βŒ
WindowsFileAndDirPermissionModificationβœ…βŒ
WindowsLocalGroupMemberEnumerationβœ…βŒ
WindowsTamperProtectionβœ…βŒ
WindowsTamperProtectionNotificationβœ…βŒ
WindowsToolsOrCodeLoadersNameChangedβœ…βŒ
WindowsUserLocalGroupEnumerationβœ…βŒ
WmiBindEventFilterToConsumerDeviceEventsβœ…βœ…
WmiExecMethodβœ…βŒ
WmiQueryβœ…βŒ
WmiRemoteComponentInvocationβœ…βŒ
WriteToLsassProcessMemoryDeviceEventsβœ…βœ…

Kusto based analysis:

let TimeLineActions = datatable(TimeLineActionType:string ) ["RegistryValueSet","RegistryKeyCreated","RegistryKeyDeleted","ProcessCreated","OneCyber","FileRenamed","FileCreated","ConnectionAcknowledged","ConnectionSuccess","FileModified","ImageLoaded","ConnectionFailed","RegistryValueDeleted","TvmAxonTelemetryEvent","LogonSuccess","PnpDeviceAllowed","NtProtectVirtualMemoryApiCall","UsbDriveMounted","ShellLinkCreateFileEvent","ConnectionAttempt","AntivirusReport","WriteToLsassProcessMemory","ExploitGuardWin32SystemCallBlocked","ProcessCreatedUsingWmiQuery","NtMapViewOfSectionRemoteApiCall","ProcessPrimaryTokenModified","CreateRemoteThreadApiCall","AntivirusScanCompleted","NtAllocateVirtualMemoryRemoteApiCall","NtAllocateVirtualMemoryApiCall","IcmpConnectionInspected","PowerShellCommand","Alert","AntivirusScanCancelled","LiveResponseCommand","QuarantineFile","OtherAlertRelatedActivity","AntivirusDetection","CollectInvestigationPackageResponse","InboundConnectionAccepted","NetworkSignatureInspected","OpenProcessApiCall","LogonFailed","ScreenshotTaken","ExploitGuardNonMicrosoftSignedBlocked","AsrAbusedSystemToolAudited","UserAccountAddedToLocalGroup","TamperingAttempt","SecurityGroupCreated","DirectoryServiceObjectCreated","DirectoryServiceObjectModified","ExploitGuardChildProcessAudited","UserAccountModified","AntivirusDetectionActionType","ControlFlowGuardViolation"];
let TypeNames = datatable (TimeLineTypesOneCyber:string) ["NamedPipeEvent","ScheduledTaskUpdated","DnsConnectionInspected","NetworkSignatureInspected","FileDeleted","SslConnectionInspected","DpapiCryptDataOperation","ConnectionSuccess","IngressFileTrasfer","Asr","ProcessCreatedUsingWmiQuery","HttpConnectionInspected","ListeningConnectionCreated","MismatchingOriginalNameWindowsBinary","NetworkPortProtocolWeb","SuspiciousProcessDataExfiltration","DnsQueryResponse","PossibleTheftOfSensitiveWebBrowserInformation","ServiceStartupDelayChange","LogonAttempted","ServiceCreation","NewServiceStarted","ScheduledTaskCreated","WindowsUserLocalGroupEnumeration","PnpDeviceConnected","WmiBindEventFilterToConsumer","BrowserLaunchedToOpenUrl","SuspiciousAccessToLSASSService","PowershellExecution","WindowsFileAndDirPermissionModification","ScmConfigChangeBinaryPathName","ComClassRegistration","AmsiContentDetails","NetworkFilterConnectionInfoProtocolNonStandardPort","DriverLoad","ServiceDeleteFlagModification","SystemNetworkConfigurationDiscoveryCommand","RegisterRawInputDeviceKeyboard","ClrUnbackedModuleLoaded","ProcessCreated","ExecutionFromRegistryRunKeys","FileRenamed","FileRenameAggregatedByProcess","OpenHttpLink","InboundRdpConnection","InteractiveRemoteComponentInvocation","MismatchingOriginalNameWindowsDll","AsepByRegistry","FileTypeAssociationSet","ScheduledTaskRegisterAndRunLocalPath","ScheduledTaskDeleted","SchTasksLaunch","MasqueradedScheduledTask","RemoteCreateThreadCrossProcessInjection","FileModifiedAggregatedReport","FileCreatedAggregatedReport","FileRenamedAggregatedReport","FileDeletionActivityWasObserved","ConnectionFailedAggregatedReport","GetClipboardData","FileArchiveUtilityUsed","ConnectionFailed","DeviceShutdown","MappedExecutionFromRegistryRunKeys","SystemInformationDiscoveryCommand","RegistryQueryValue","ProcessCreatedAggregatedReport","RansomwareBehaviorDetectedInTheFileSystem","CommonFileNameDropSignerMismatch","NonRecentShellLinkCreation","ConnectionSuccessAggregatedReport","WindowsLocalGroupMemberEnumeration","NamedPipeCreation","OutboundConnectionToUncommonlyUsedPort","NetworkFilterConnectionInfo","ListeningSocketCreated","WmiQuery","PlugAndPlayDeviceConnection","LogonUsingExplicitCredentials","BitsJobCancel","NdrZeekHttp","NtlmAuthenticationInspected","AmsiContentPattern","NdrZeekDns","NdrZeekSsl","OpenLnkFile","UserFileExecution","OpenKnownNamedPipe","DlpFileInformationNetworkConnection","PotentialIngressToolTransfer","OutboundConnectionToWebProtocol","CreateProcessAsUser","HostsFileOpen","ProcessRemoteCodeInjected","RegistryModification","KnownToolExecuted","MismatchingOriginalNameWindowsBinaryExecution","KnownToolCreated","CommonToolRenamed","UncommonFileDrop","FileContentOverwrite","WindowsBinarySimilarFileName","FileDroppedExecutedThenDeleted","KnownToolDeleted","WindowsToolsOrCodeLoadersNameChanged","PossibleBypassUserAccessControl","CmdExecution","AmsiContent","FileHasDoubleExtension","ShellLinkCreateFile","SetWindowsHookExKeyboard","BitsJobAddFiles","BitsJobCreate","OutboundMultipleChannelsCommunication","SmartScreenUrlWarning","FileCouldBePacked","ExploratoryCommandByCommandLine","SuspiciousPowerShellCommandRun","SystemNetworkConnectionsDiscoveryCommand","FileDaclChange","ExploratoryCommand","IcaclsModifiedEntityPermission","MassFileModification","FileDroppingAfterHighValueFileRead","HighValueFileRead","MultipleFileDeletionActivityWasObserved","CompressedFileModify","CompressedFileNetworkConnection","AutomatedCollectionByStaging","HighValueFileNetworkConnection","RegSaveCredentialDumping","LolbinsDownloadedFileFromInternet","PythonExecution","FileHasMotwInternet","MemoryRemoteProtect","PrefetchFileDeleteAggregation","FileDownloadedFromInternet","OtherAlertRelatedActivity","AntivirusDetection","DefenderObfuscation","BrowserCreatedMalware","KnownToolCreatedAndFirstSeen","OutboundConnectionToRdpProtocol","SystemInformationRegistryQuery","ContainedUserRemoteDesktopSessionStopped","ContainedUserRemoteDesktopSessionDisconnected","ProcessCreationWithLogon","FileRenameAggregatedByExtension","ClrModuleLoad","OutboundConnectionToDnsProtocol","StandardEncodingC2","HttpDataExfiltration","NetworkFilterConnectionInfoWebProtocol","NetworkFilterConnectionInfoTls","WebServiceCommandAndControl","MassFileModificationByInjectedProcess","HiddenFileCreated","AlternateDataStreamModification","MismatchedExecutedSuspiciousProcessDataExfiltration","ShimDatabaseRegistration","ClipboardGetData","LdapSearch","VisualBasicExecution","AuditPolicyModification","InBoundHostVerticalPortScan","LocalProtocolTunneling","RemoteDesktopConnection","NdrKerberosSignature","LdapQuery","RdpCoreTsconnections","InteractiveLogon","DcomRemoteComponentInvocation","ResourceAccess","AppControlCodeIntegritySigningInformation","ProcessLaunchingAfterWindowsDomainAccountLogonSuccess","UnsecuredCredsInFilesCmdLine","FileTimeStomp","RegWdavSettingsModification","SystemShutdownReboot","NetworkRdpLogon","FileCreatedByRemoteMachine","EnumerateDomainTrusts","InternalProxy","OutboundConnectionToCommonlyUsedPort","AmsiScriptDetection","Base64EncodedCommandLine","DomainSamrQuery","AnomalousAsepByRegistry","MdiLdapQuery","DomainGroupSamrQuery","ExploratoryLdapQuery","ImageFileModification","TracerouteInternetConnectionDiscovery","ProcessInjectionApiEvent","RemoteCreateThread","BitsJobsSuspiciousFileDownload","PowershellModuleLoad","MshtaExecution","JavaScriptExecution","NetworkPortProtocolNonStandard","RemoteShareDiscovery","FileActionRemoteComponentInvocation","ReadSensitiveMemory","MicrosoftAccountCloudTokenFunction","AsepByRegistryModification","WmiExecMethod","MdiDnsQuery","OutboundOpenNetworkShare","UnusualWallpaperChange","WallpaperChange","WmiRemoteComponentInvocation","CreateProcessThroughWMIAPI","TamperProtectionConfigChangeAttempt","WindowsDefenderAntivirusProtectionModifications","OutboundConnectionFromLolbinToUncommonlyUsedPort","ScmSendControl","ScmServiceStarted","CreateWindowsDomainAccount","RansomwareFileAggregationSimulation","BitBltEvent","LogonFailurePasswordGuessing","LogonFailureBruteForce","LogonFailedAggregatedReport","PermissionGroupsDiscoveryCommand","GetPublicIpInformationFromWebsite","PsTokenDebugPrivilegeAdditionDropAndExec","ProcessTokenModification","WindowsTamperProtection","WindowsTamperProtectionNotification","WdavSecurityFeatureTurnOffByAccount","DelayedNdrZeekExfiltration","ScheduledNdrZeekExfiltration","FilesExfiltrationOverNetwork","DelayedTcpNetworkBytesTransfer","PowerShellImageLoad","AnomalousSetWindowsHookEx","SuspiciousWindowsDefenderAntivirusExclusionListModification","InjectionAndDotNetDllLoading","RemoteCreateThreadProcessHollowing","MaliciousFileUserExecution","UncommonRmmToolExec","AnomalousKeyboardHook","BeaconingActivity","NdrZeekSsh","DelayedDropAndLoading","RemoteAccessSoftware","ScheduledTaskRunLocalPath","PossibleMasqueradingScheduledTaskUsingCodeRunner","ProcessWithHiddenImageFile","PossibleMasqueradingScheduledTaskThroughTaskFile","ScheduledTaskTcpNetworkBytesTransfer","ObjectManagerSymbolicLinkCreation","MsBuildExecution","RemoteCreateThreadSystemModule","ScmSendControlStop","IndicatorBlockingCommand","EventLogWasCleared","PowerShellCommand","DataTransferSizeLimitsOverTCP","SuspiciousBatchFilePowershellExecution","MaliciousPowerShellCommandRun","ShadowCopyDeletion","TcpIpv4PotentialExfiltration","SystemRecoveryIsDisabledBySuspiciousProcess.","BootRecordChange"];
union Device*
| where TimeGenerated > ago(180d)
| distinct ActionType, TableName = Type
| join kind=fullouter TimeLineActions on $left.ActionType == $right.TimeLineActionType
| join kind=fullouter TypeNames on $left.ActionType == $right.TimeLineTypesOneCyber
| extend AvailableInTimeLine = iff(isnotempty(TimeLineActionType) or isnotempty(TimeLineTypesOneCyber), "βœ…", "❌"), AvailableInAdvancedHunting = iff(isnotempty(ActionType), "βœ…", "❌")
| extend ActionType = coalesce(ActionType, TimeLineActionType, TimeLineTypesOneCyber)
| where isnotempty(ActionType)
| project ActionType, TableName, AvailableInTimeLine, AvailableInAdvancedHunting
| sort by ActionType asc 

Conclusion

First off heads off to Matthieu Gras to deliver this tool to the community. This allows DFIR teams to be able to respond more efficient, and security researchers can get more insights into the workings and complete coverage of Defender For Endpoint.

The key takeaways after completing the research:

  • Timeline acquisition at scale is now possible.
  • DFIR teams can now archive timeline data for longer periods of time.
  • The timeline does not contain new events, they are searchable already. This issue here is that it does not scale as you would need to move the timeframe constantly to perform the search.
  • With the commandline tool jq analysis of the data can be done quickly, without needing to import the data elsewhere for analysis.
  • Be aware of the differences in goals of advanced hunting and the timeline, this results in different granularity of the logged actions between the two.

It would be good if Microsoft would support such funtionalities over an official API or allow expoerts to Data Lake going forward. This would return valuable logs for both detection and threat hunters and would bring value to incident response cases.

Appendix: JQ Basics

# Basic filter
jq 'select(.ActionType == "ProcessCreated")' logs.json

# With count
jq -s '[.[] | select(.ActionType == "ProcessCreated")] | length' logs.json

# Show specific fields
jq 'select(.ActionType == "ProcessCreated") | 
    {ActionTime, Machine: .Machine.Name, Process: .Process.ImageFile.FileName}' logs.json

# Filtering multiple fields OR
jq 'select(.ActionType == "ProcessCreated" or 
           .ActionType == "RegistryModified" or 
           .ActionType == "FileCreated")' logs.json

# Method 2: Using IN operator (cleaner)
jq 'select(.ActionType | IN("ProcessCreated", "RegistryModified", "FileCreated"))' logs.json

# Count by ActionType
jq -s 'map(select(.ActionType | IN("ProcessCreated", "RegistryModified"))) | 
       group_by(.ActionType) | 
       map({ActionType: .[0].ActionType, Count: length})' logs.json

# Filter by nested process name
jq 'select(.Process.ImageFile.FileName == "powershell.exe")' logs.json

# Filter by nested machine name
jq 'select(.Machine.Name == "workstation-03")' logs.json

# Filter by nested user (with null safety)
jq 'select((.Process.User.AccountName // "") == "system")' logs.json

# Multiple nested conditions
jq 'select(
      .Process.ImageFile.FileName == "powershell.exe" and
      .Process.User.AccountName != "system" and
      .Machine.Domain == "cyberguard.local"
    )' logs.json

# Regex match in nested field
jq 'select(.Process.ImageFile.FileName | test("powershell|cmd|wscript"; "i"))' logs.json

# Filter by nested numeric value
jq 'select(.Process.Id > 5000)' logs.json

# Check if nested field exists
jq 'select(.Process.ImageFile.Sha256 != null)' logs.json

Questions? Feel free to reach out to me on any of my socials.