folder restructure for hunting queries, exploration queries, and built-in alerts aka detections. (#12)

This commit is contained in:
timbMSFT 2019-01-24 10:30:15 +00:00 коммит произвёл GitHub
Родитель d104b28411
Коммит 38faeb1656
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
30 изменённых файлов: 557 добавлений и 438 удалений

Просмотреть файл

@ -1,5 +1,21 @@
// Finding base64 encoded PE files header seen in the command line parameters
// Tags: #Initial Access, #Execution, #Defense Evasion
// Name: Base64 encoded Windows executables in process commandlines
// Description: finds instances of base64 encoded PE files header seen in process command line parameter.
// Severity: Medium
// QueryFrequency: 24
// QueryPeriod: 24
// AlertTriggerOperator: gt
// AlertTriggerThreshold: 0
// Data source: SecurityEvent
// Techniques: #Initial Access, #Execution, #Defense Evasion
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688
@ -11,4 +27,5 @@ InitiatingProcessFileName=ParentProcessName,InitiatingProcessCommandLine="",Init
processEvents};
ProcessCreationEvents
| where ProcessCommandLine contains "TVqQAAMAAAAEAAA"
| where TimeGenerated >= ago(24h)
| top 1000 by TimeGenerated

Просмотреть файл

@ -0,0 +1,40 @@
// Name: Process executed from binary hidden in Base64 encoded file.
// Description: Encoding malicious software is a technique to obfuscate files from detection.
// The first ProcessCommandLine component is looking for Python decoding base64
// The second ProcesssCommandLine component is looking for the Bash/sh commandline base64 decoding tool
// The third one is looking for Ruby decoding base64
// Severity: Medium
// QueryFrequency: 24
// QueryPeriod: 24
// AlertTriggerOperator: gt
// AlertTriggerThreshold: 0
// Data source: SecurityEvent
// Techniques: #Initial Access, #Execution, #Defense Evasion
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688
| project TimeGenerated, ComputerName=Computer,AccountName=SubjectUserName,AccountDomain=SubjectDomainName,
FileName=tostring(split(NewProcessName, '\\')[-1], // convert SecurityEvents raw schema to get FileName & CommandLine
ProcessCommandLine = CommandLine,
FolderPath = "",
InitiatingProcessFileName=ParentProcessName,InitiatingProcessCommandLine="",InitiatingProcessParentFileName="";
processEvents ;
};
ProcessCreationEvents
| where TimeGenerated > ago(1d)
| where ProcessCommandLine contains ".decode('base64')"
or ProcessCommandLine contains "base64 --decode"
or ProcessCommandLine contains ".decode64("
| project TimeGenerated , ComputerName , FileName , ProcessCommandLine , InitiatingProcessCommandLine
| top 100 by EventTime

Просмотреть файл

@ -1,6 +1,22 @@
// Finding attackers hiding malware in the recycle bin.
// Name: Malware in the recycle bin.
//
// Description: finding attackers hiding malware in the recycle bin.
// Read more here: https://azure.microsoft.com/en-us/blog/how-azure-security-center-helps-reveal-a-cyberattack/
// Tags: #Execution, #Defense Evasion
//
// Severity: Medium
//
// QueryFrequency: 24
//
// QueryPeriod: 24
//
// AlertTriggerOperator: gt
//
// AlertTriggerThreshold: 0
//
// Data source: SecurityEvent
//
// Techniques: #Execution, #Defense Evasion
//
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688

Просмотреть файл

@ -0,0 +1,7 @@
// If we also wanted to see what alerts fired on these machines we could extend the above query and join them with the SecurityAlerts table from Azure Security Center.
// Azure Security Center must be enabled for this query to be valid
| join (SecurityAlert
| extend ExtProps=parsejson(ExtendedProperties)
| extend Computer=toupper(tostring(ExtProps["Compromised Host"]))
)
on Computer

Просмотреть файл

@ -0,0 +1,14 @@
// Name: Summary of users creating new user accounts
//
// Description: creating new user accounts is a privileged activity that may be abused by attackers to provide persistent access.
// Reviewing which user accounts have been created, and by whom, can help detect attacker attempts to provide themselves with backdoor access to data.
//
// Data source: OfficeActivity
//
// Techniques: #Persistence
//
OfficeActivity
| where Operation == "Add user."
| project addedBy=UserId, newUser=OfficeObjectId
| summarize newUserCount=dcount(newUser) by addedBy
| render barchart

Просмотреть файл

@ -1,10 +1,15 @@
// Name: Accounts and User Agents associated with multiple IPs.
// Name: Accounts and User Agents associated with multiple IPs in Office Azure Active Directory authentications.
//
// Description: summary of users/user agents associated with authentications from multiple IPs within a short timeframe.
// This query computes and joins two tables to highlight IPs associated with multiple authentications:
// 1- UserAgents seen in authentications from multiple IPs within short timeframe
// 2- User Ids seen authenticated from multiple IPs
// The time window join looks for instances of a small elpased time between logons.
// Tags: #InitialAccess
//
// Data source: OfficeActivity
//
// Techniques: #InitialAccess
//
let timeRange=ago(7d);
let officeAuthentications =
OfficeActivity

Просмотреть файл

@ -0,0 +1,23 @@
// Name: sharepoint downloads from previously unseen IP address.
//
// Description: Shows volume of documents uploaded to or downloaded from Sharepoint by new IP addresses.
// In stable environments such connections by new IPs may be unauthorized, especially if associated with spikes in volume which could be associated with large-scale document exfiltration.
//
// Data source: OfficeActivity
//
// Techniques: #Exfiltration
//
let historicalActivity=
OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated between(ago(30d)..ago(7d))
| summarize historicalCount=count() by ClientIP;
let recentActivity = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated > ago(1d)
| summarize recentCount=count() by ClientIP;
recentActivity | join kind= leftanti (
historicalActivity
) on ClientIP;

Просмотреть файл

@ -0,0 +1,25 @@
// Name: sharepoint downloads from devices associated with previously unseen user agents.
//
// Description: tracking via user agent is one way to differentiate between types of connecting device.
// In homogeneous enterprise environments the user agent associated with an attacker device may stand out as unusual.
// In stable environments such connections by new IPs may be unauthorized, especially if associated with spikes in volume
// which could be associated with large-scale document exfiltration.
//
// Data source: OfficeActivity
//
// Techniques: #Exfiltration
//
let historicalActivity=
OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated between(ago(30d)..ago(7d))
| summarize historicalCount=count() by UserAgent;
let recentActivity = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated > ago(1d)
| summarize recentCount=count() by UserAgent;
recentActivity | join kind= leftouter (
historicalActivity
) on UserAgent;

Просмотреть файл

@ -0,0 +1,22 @@
// Name: New user agents associated with a clientIP for sharepoint file uploads/downloads
//
// Description: New user agents associated with a clientIP for sharepoint file uploads/downloads.
//
// Data source: OfficeActivity
//
// Techniques: #Exfiltration
//
let historicalUA=
OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated between(ago(30d)..ago(7d))
| summarize by ClientIP, UserAgent;
let recentUA = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated > ago(1d)
| summarize by ClientIP, UserAgent;
recentUA | join kind=leftanti (
historicalUA
) on ClientIP, UserAgent;

Просмотреть файл

@ -1,5 +1,11 @@
// cscript script daily summary breakdown
// Tags: #Execution
// Name: cscript script daily summary breakdown
//
// Description: breakdown of scripts running in the environment
//
// Data source: SecurityEvent
//
// Techniques: #Execution
//
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688

Просмотреть файл

@ -1,5 +1,11 @@
// The query finds attempts to list users or groups using Net commands
// Tags: #Initial Access #Execution #Persistence #Lateral Movement #Discovery
// Name: Enumeration of users and groups
// Description: finds attempts to list users or groups using the built-in Windows 'net' tool
// Data source: SecurityEvent
// Techniques: #Discovery
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688

Просмотреть файл

@ -0,0 +1,21 @@
// Name: masquerading files.
// Description: Malware writers often use windows system process names for their malicious process names to make them blend
// in with other legitimate commands that the Windows system executes.
// An analyst can create a simple query looking for a process named svchost.exe.
// It is recommended to filter out well-known security identifiers (SIDs) that are used to launch the legitimate svchost.exe process.
// The query also filters out the legitimate locations from which svchost.exe is launched.
//
// Data source: SecurityEvent
//
// Techniques: #Execution, #Defense Evasion
//
SecurityEvent
| where ProcessName contains "svchost.exe"
| where SubjectUserSid != "S-1-5-18"
| where SubjectUserSid != "S-1-5-19"
| where SubjectUserSid != "S-1-5-20"
| where NewProcessName !contains ":\\Windows\\System32"
| where NewProcessName !contains ":\\Windows\\Syswow64"

Просмотреть файл

@ -1,11 +1,16 @@
// Name: Summary of users created using uncommon & undocumented commandline switches
// Description: Summarizes users of uncommon & undocumented commandline switches to create persistance
//
// Description: Summarizes uses of uncommon & undocumented commandline switches to create persistence
// User accounts may be created to achieve persistence on a machine.
// Read more here: https://attack.mitre.org/wiki/Technique/T1136
// Query for users being created using "net user" command
// "net user" commands are noisy, so needs to be joined with another signal -
// e.g. in this example we look (e.g. /ad instead of /add)
// Tags: #InitialAccess #Execution #LateralMovement #Persistance #DefenseEvasion
// e.g. in this example we look for some undocumented variations (e.g. /ad instead of /add)
//
// Data source: SecurityEvent
//
// Techniques: #Persistence
//
SecurityEvent
| where EventID==4688
| project TimeGenerated, ComputerName=Computer,AccountName=SubjectUserName,

Просмотреть файл

@ -1,5 +1,11 @@
// Finds PowerShell execution events that could involve a download.
// Tags: #Initial Access, #Execution, #Persistence
// Name: powershell downloads
//
// Description: Finds PowerShell execution events that could involve a download
//
// Data source: SecurityEvent
//
// Techniques: #Initial Access, #Execution, #Persistence
//
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688

Просмотреть файл

@ -1,9 +1,15 @@
// Identify and decode new encoded powershell scripts this week versus previous fortnight - generic
// Tags: #Initial Access, #Execution, #Persistence
// Name: new powershell scripts encoded on the commandline
//
// Description: Identify and decode new encoded powershell scripts this week versus previous fortnight
//
// Data source: SecurityEvent
//
// Techniques: #Initial Access, #Execution, #Persistence
//
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688
| project TimeGenerated, ComputerName=Computer,AccountName=SubjectUserName, AccountDomain=SubjectDomainName,
| project TimeGenerated, ComputerName=Computer,AccountName=SubjectUserName,AccountDomain=SubjectDomainName,
FileName=tostring(split(NewProcessName, '\\')[-1]),
ProcessCommandLine = CommandLine,
InitiatingProcessFileName=ParentProcessName,InitiatingProcessCommandLine="",InitiatingProcessParentFileName="";

Просмотреть файл

@ -1,15 +1,23 @@
// Name: uncommon processes - bottom 5%
//
// Description: Identify and decode new encoded powershell scripts this week versus previous fortnight
//
// Description:
// Shows the rarest processes seen running for the first time. (Performs best over longer time ranges - eg 3+ days rather than 24 hours!)
// These new processes could be benign new programs installed on hosts;
// However, especially in normally stable environments, these new processes could provide an indication of an unauthorized/malicious binary that has been installed and run.
// Reviewing the wider context of the logon sessions in which these binaries ran can provide a good starting point for identifying possible attacks.
// Uncommon processes/files - bottom 5%
// Tags: #Initial Access, #Execution, #Persistence, #Privilege Escalation, #Credential Access, #Discovery, #Lateral Movement, #Collection, #Exfiltration, #Command and Control
//
// Data source: SecurityEvent
//
// Techniques: #Initial Access, #Execution, #Persistence, #Privilege Escalation, #Credential Access, #Discovery, #Lateral Movement, #Collection, #Exfiltration, #Command and Control
//
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688
// filter out common randomly named files related to MSI installers and browsers
| where not(NewProcessName matches regex @"Temp\\[0-9]{1}\\TRA[0-9A-Fa-f]{3}.tmp")
| where not(NewProcessName matches regex @"Temp\\[0-9]{1}\\TRA[0-9A-Fa-f]{4}.tmp")
| where not(NewProcessName matches regex @"Temp\\[0-9]{1}\\TRA[0-9A-Fa-f]{3}\.tmp")
| where not(NewProcessName matches regex @"Temp\\[0-9]{1}\\TRA[0-9A-Fa-f]{4}\.tmp")
| where not(NewProcessName matches regex @"Installer\\MSI[0-9A-Fa-f]{3}\.tmp")
| where not(NewProcessName matches regex @"Installer\\MSI[0-9A-Fa-f]{4}\.tmp")
| project TimeGenerated,

Просмотреть файл

@ -1,7 +1,12 @@
// Name: Anomalous Azure AD apps based on authentication location
// Name: Anomalous Azure Active Directory apps based on authentication location
//
// Description: This query over Azure AD sign-in activity highlights Azure AD apps with
// an unusually high ratio of distinct geolocations versus total number of authentications
// Tags: #InitialAccess
//
// Data source: SigninLogs
//
// Techniques: #InitialAccess
//
let timeRange=ago(14d);
let azureSignIns =
SigninLogs

Просмотреть файл

@ -1,8 +1,12 @@
// Name: azure AD signins from new locations.
// Description: New AzureAD signin locations today versus historical Azure AD signin data
// In the case of password spraying or brute force attacks
// one might see authentication attempts for many accounts from a new location.
// Tags: #InitialAccess
// Name: Azure Active Directory signins from new locations.
//
// Description: New Azure Active Directory signin locations today versus historical Azure Active Directory signin data
// In the case of password spraying or brute force attacks one might see authentication attempts for many accounts from a new location.
//
// Data source: SigninLogs
//
// Techniques: #InitialAccess
//
SigninLogs
| where TimeGenerated >= ago(1d)
| summarize perIdentityAuthCount=count() by Identity, locationString= strcat(tostring(LocationDetails["countryOrRegion"]), "/", tostring(LocationDetails["state"]), "/", tostring(LocationDetails["city"]), ";" , tostring(LocationDetails["geoCoordinates"]))

Просмотреть файл

@ -1,7 +1,12 @@
// Name: Signin burst from multiple locations
// Description: This query over Azure AD sign-in activity highlights accounts associated
// with multiple authentications from different geographical locations in a short space of time
// Tags: #InitialAccess
// Name: Azure Active Directory sign-in burst from multiple locations
//
// Description: This query over Azure Active Directory sign-in activity highlights accounts associated
// with multiple authentications from different geographical locations in a short space of time.
//
// Data source: SigninLogs
//
// Techniques: #InitialAccess
//
let timeRange=ago(10d);
let signIns = SigninLogs
| where TimeGenerated >= timeRange

Просмотреть файл

@ -1,24 +0,0 @@
// Process executed from binary hidden in Base64 encoded file. Encoding malicious software is a technique to obfuscate files from detection.
// The first ProcessCommandLine component is looking for Python decoding base64
// The second ProcesssCommandLine component is looking for the Bash/sh commandline base64 decoding tool
// The third one is looking for Ruby decoding base64
// Tags: #Initial Access, #Execution, #Defense Evasion
let ProcessCreationEvents=() {
let processEvents=SecurityEvent
| where EventID==4688
| project EventTime=TimeGenerated, ComputerName=Computer,AccountName=SubjectUserName, AccountDomain=SubjectDomainName,
FileName=reverse(substring(reverse(NewProcessName), 0, indexof(reverse(NewProcessName), "\\"))), // convert SecurityEvents raw schema to get FileName & CommandLine
ProcessCommandLine = CommandLine,
FolderPath = "",
InitiatingProcessFileName=ParentProcessName,InitiatingProcessCommandLine="",InitiatingProcessParentFileName="";
processEvents ;
};
ProcessCreationEvents
| where EventTime > ago(14d)
| where ProcessCommandLine contains ".decode('base64')"
or ProcessCommandLine contains "base64 --decode"
or ProcessCommandLine contains ".decode64("
| project EventTime , ComputerName , FileName , ProcessCommandLine , InitiatingProcessCommandLine
| top 100 by EventTime

Просмотреть файл

@ -1,30 +0,0 @@
// Malware writers often use windows system process names for their malicious process names to make them blend in with other legitimate commands that the Windows system executes.
// an analyst can create a simple query looking for a process named Svchost.exe.
// It is recommended to filter out well-known security identifiers (SIDs) that are used to launch the legitimate svchost.exe process.
// The query also filters out the legitimate locations from which svchost.exe is launched.
// Tags: #Execution, #Defense Evasion
SecurityEvent
| where TimeGenerated >= ago(2d)
| where ProcessName contains "svchost.exe"
| where SubjectUserSid != "S-1-5-18"
| where SubjectUserSid != "S-1-5-19"
| where SubjectUserSid != "S-1-5-20"
| where NewProcessName !contains "C:\\Windows\\System32"
| where NewProcessName !contains "C:\\Windows\\Syswow64"
// If we also wanted to see what alerts fired on these machines we could extend the above query and join them with the SecurityAlerts table from Azure Security Center.
// Azure Security Center must be enabled for this query to be valid
// Tags: #Execution
SecurityEvent
| where EventID == 4624
| where AccountType == "User"
| where TimeGenerated >= ago(1d)
| extend Computer = toupper(Computer)
| summarize IndividualAccounts = dcount(Account) by Computer
| where IndividualAccounts > 4
| join (SecurityAlert
| extend ExtProps=parsejson(ExtendedProperties)
| extend Computer=toupper(tostring(ExtProps["Compromised Host"]))
)
on Computer

Просмотреть файл

@ -1,59 +0,0 @@
//Shows volume of documents uploaded to or downloaded from Sharepoint by new IP addresses.
//In stable environments such connections by new IPs may be unauthorized, especially if associated with spikes in volume which could be associated with large-scale document exfiltration.
// Tags: #Exfiltration
let historicalActivity=
OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated between(ago(30d)..ago(7d))
| summarize historicalCount=count() by ClientIP;
let recentActivity = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated > ago(1d)
| summarize recentCount=count() by ClientIP;
recentActivity | join kind= leftanti (
historicalActivity
) on ClientIP;
//Shows volume of documents uploaded to or downloaded from Sharepoint by user agent.
//Tracking via user agent is one way to differentiate between types of connecting device.
//In homogeneous enterprise environments the user agent associated with an attacker device may stand out as unusual.
//In stable environments such connections by new IPs may be unauthorized, especially if associated with spikes in volume which could be associated with large-scale document exfiltration.
// Sharepoint - files downloaded/uploaded by new user agent
// Tags: #Exfiltration
let historicalActivity=
OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated between(ago(30d)..ago(7d))
| summarize historicalCount=count() by UserAgent;
let recentActivity = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated > ago(1d)
| summarize recentCount=count() by UserAgent;
recentActivity | join kind= leftouter (
historicalActivity
) on UserAgent;
// Sharepoint -New user agents associated with a clientIP for sharepoint file uploads/downloads
// Tags: #Exfiltration
let historicalUA=
OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated between(ago(30d)..ago(7d))
// DEMO | where TimeGenerated between(datetime(2018-05-25)..datetime(2018-05-29 21:00)) // fake history
| summarize by ClientIP, UserAgent;
let recentUA = OfficeActivity
| where RecordType == "SharePointFileOperation"
| where Operation in ("FileDownloaded", "FileUploaded")
| where TimeGenerated > ago(1d)
// DEMO | where TimeGenerated between (datetime(2018-05-29 21:30)..datetime(2018-05-29 21:45))
| summarize by ClientIP, UserAgent;
recentUA | join kind=leftanti (
historicalUA
) on ClientIP, UserAgent;

Просмотреть файл

@ -1,9 +0,0 @@
// Name: Summary of users creating new user accounts
// Description: new user accounts may be an attacker providing themselves with backdoor access for some later date.
// an account creating further accounts for the first time may be an indication of compromise
// Tags: #Persistance
OfficeActivity
| where Operation == "Add user."
| project addedBy=UserId, newUser=OfficeObjectId
| summarize newUserCount=dcount(newUser) by addedBy
| render barchart