One Hundred Briefings. One Investigation Mindset.
When the first Friday Cyber Briefing was published, it was simply an investigation.
An interesting Microsoft Defender event. A useful KQL query. A small lesson from real-world security work.
But after one hundred briefings, something became obvious.
The investigations were never really about PowerShell, phishing, identity, ransomware, OAuth, process trees or alerts.
They were all teaching the same thing: how to think like an investigator.
Briefing #100
One hundred investigations. Hundreds of KQL queries. Thousands of Microsoft Defender events. The same lesson kept appearing: the evidence was already there.
The investigation mindset
One hundred briefings later
Start with recent activity
- 1
- 2
- 3
- 4
- 5
DeviceProcessEvents | where Timestamp > ago(24h) | project Timestamp, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine | order by Timestamp desc
Expand the timeline
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
let InvestigationDevice = "DEVICE-NAME-HERE";
let StartTime = ago(1d);
union isfuzzy=true
(
DeviceProcessEvents
| where Timestamp > StartTime
| where DeviceName =~ InvestigationDevice
| project Timestamp, DeviceName, EvidenceType="Process", ActionType, Detail=ProcessCommandLine
),
(
DeviceNetworkEvents
| where Timestamp > StartTime
| where DeviceName =~ InvestigationDevice
| project Timestamp, DeviceName, EvidenceType="Network", ActionType, Detail=strcat(RemoteUrl, " ", RemoteIP)
),
(
DeviceFileEvents
| where Timestamp > StartTime
| where DeviceName =~ InvestigationDevice
| project Timestamp, DeviceName, EvidenceType="File", ActionType, Detail=strcat(FolderPath, "\\", FileName)
)
| order by Timestamp asc
Follow the user
- 1
- 2
- 3
- 4
- 5
- 6
SigninLogs | where TimeGenerated > ago(7d) | project TimeGenerated, UserPrincipalName, AppDisplayName, IPAddress, Location, ConditionalAccessStatus, ResultType, ResultDescription | order by TimeGenerated desc
Follow the device
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
let DeviceToInvestigate = "DEVICE-NAME-HERE";
union isfuzzy=true
(
DeviceProcessEvents
| where Timestamp > ago(7d)
| where DeviceName =~ DeviceToInvestigate
| project Timestamp, DeviceName, EvidenceType="Process", Detail=ProcessCommandLine
),
(
DeviceNetworkEvents
| where Timestamp > ago(7d)
| where DeviceName =~ DeviceToInvestigate
| project Timestamp, DeviceName, EvidenceType="Network", Detail=strcat(RemoteUrl, " ", RemoteIP)
),
(
DeviceRegistryEvents
| where Timestamp > ago(7d)
| where DeviceName =~ DeviceToInvestigate
| project Timestamp, DeviceName, EvidenceType="Registry", Detail=strcat(RegistryKey, " ", RegistryValueData)
)
| order by Timestamp asc
Correlate everything
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
let InvestigationUser = "user@domain.com";
let StartTime = ago(7d);
union isfuzzy=true
(
SigninLogs
| where TimeGenerated > StartTime
| where UserPrincipalName =~ InvestigationUser
| project Timestamp=TimeGenerated, EvidenceType="Identity", Detail=strcat(AppDisplayName, " ", IPAddress, " ", Location)
),
(
EmailEvents
| where Timestamp > StartTime
| where RecipientEmailAddress =~ InvestigationUser
| project Timestamp, EvidenceType="Email", Detail=strcat(SenderFromAddress, " ", Subject)
),
(
DeviceProcessEvents
| where Timestamp > StartTime
| where AccountUpn =~ InvestigationUser
| project Timestamp, EvidenceType="Endpoint", Detail=ProcessCommandLine
),
(
CloudAppEvents
| where Timestamp > StartTime
| where AccountId has InvestigationUser or AccountDisplayName has InvestigationUser
| project Timestamp, EvidenceType="CloudApp", Detail=strcat(ActionType, " ", Application)
)
| order by Timestamp asc
Lessons from the first hundred
Continue the investigation
Agent Foskett’s takeaway
Yet every investigation came back to the same lesson.
The technology was never the hero.
The hero was the investigator willing to ask one more question.
