Detection rules › YARA-L
YARA-L rules: 1t
| Rule | Severity |
|---|---|
| Google Workspace Multiple Files Downloaded From Google Drive | high |
| MITRE ATT&CK T1033 Recon Successful Logon Enumeration Powershell CISA Report | info |
| Recon Suspicious Commands CISA Report | low |
Google Workspace Multiple Files Downloaded From Google Drive
#Identifies when a user downloads multiple files from Google Drive, which may indicate data exfiltration.
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Exfiltration |
Telemetry Coverage
| Platform | Record / event type |
|---|---|
| Google Workspace | download: Download |
Rules Detecting the Same Action
These rules filter on the same operation.
Rule Body
// Copyright 2023 Google LLC. Licensed under Apache-2.0.
rule google_workspace_multiple_files_downloaded_from_google_drive {
meta:
author = "Google Cloud Security"
description = "Identifies when a user downloads multiple files from Google Drive, which may indicate data exfiltration."
rule_id = "mr_72855af9-fba4-4424-b879-4de733374e8b"
rule_name = "Google Workspace Multiple Files Downloaded From Google Drive"
mitre_attack_tactic = "Exfiltration"
mitre_attack_technique = "Exfiltration Over Web Service"
mitre_attack_url = "https://attack.mitre.org/techniques/T1567/"
mitre_attack_version = "v13.1"
type = "Alert"
data_source = "Workspace Activity"
severity = "High"
priority = "High"
events:
// Document downloaded from Google Drive
$download.metadata.vendor_name = "Google Workspace"
$download.metadata.product_name = "drive"
$download.metadata.product_event_type = "download"
$download.principal.user.userid = $user_id
match:
$user_id over 1h
outcome:
$risk_score = max(75)
$mitre_attack_tactic = "Exfiltration"
$mitre_attack_technique = "Exfiltration Over Web Service"
$mitre_attack_technique_id = "T1567"
$event_count = count_distinct($download.metadata.id)
$product_event_type = array_distinct($download.metadata.product_event_type)
$userid = array_distinct($download.principal.user.userid)
$doc_type = array_distinct($download.src.resource.attribute.labels["doc_type"])
$owner = array_distinct($download.target.resource.attribute.labels["owner"])
$doc_name = array_distinct($download.target.resource.name)
$doc_id = array_distinct($download.target.resource.product_object_id)
$count_docs = count_distinct($download.target.resource.product_object_id)
condition:
// Customize the value of $count_docs to set the alerting threshold for your environment
$download and $count_docs > 10
}
YARA-L Rule Structure
Condition
Fires when at least one $download event in the 1h window and $count_docs > 10.
Events
$download
metadata.product_event_type = "download"
Match and Correlation
Outcome
Outcome variables add context to a detection. When the rule generates an alert, $risk_score is displayed with it.
| Field | Expression |
|---|---|
risk_score | max(75) |
event_count | count_distinct($download.metadata.id) |
product_event_type | array_distinct($download.metadata.product_event_type) |
userid | array_distinct($download.principal.user.userid) |
doc_type | array_distinct($download.src.resource.attribute.labels["doc_type"]) |
owner | array_distinct($download.target.resource.attribute.labels["owner"]) |
doc_name | array_distinct($download.target.resource.name) |
doc_id | array_distinct($download.target.resource.product_object_id) |
count_docs | count_distinct($download.target.resource.product_object_id) |
MITRE ATT&CK T1033 Recon Successful Logon Enumeration Powershell CISA Report
#Detects the use of powershell to enumerate successful logins on a specific host
MITRE ATT&CK Coverage
| Tactic | Techniques |
|---|---|
| Discovery |
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
// Copyright 2023 Google LLC. Licensed under Apache-2.0.
rule recon_successful_logon_enumeration_powershell_T1033_cisa_report {
meta:
author = "Google Cloud Security"
description = "Detects the use of powershell to enumerate successful logins on a specific host"
rule_id = "mr_db589a2e-0a06-46b5-8479-f8e120ec0405"
rule_name = "MITRE ATT&CK T1033 Recon Successful Logon Enumeration Powershell CISA Report"
type = "hunt"
platform = "Windows"
data_source = "microsoft sysmon"
tactic = "TA0007"
mitre_attack_technique = "T1033"
reference = "https://media.defense.gov/2023/May/24/2003229517/-1/-1/0/CSA_Living_off_the_Land.PDF"
severity = "Info"
priority = "Info"
events:
(
$process.metadata.event_type = "PROCESS_LAUNCH" and
// cisa report referenced cmd /c and other wmic switches like /user and /password, these have been excluded to focus on the commands being issued since
// focused on event code 4624 but could be modified to look for other event codes if needed
re.regex($process.target.process.command_line, `(|cmd.*/c).*Get-EventLog.*security.*-instanceid.*4624`) nocase
)
or
(
$process.metadata.event_type = "STATUS_UPDATE" and
re.regex($process.security_result.description, `Get-EventLog.*security.*-instanceid.*4624`) nocase
)
$process.principal.hostname = $hostname
match:
$hostname over 15m
outcome:
$risk_score = 15
$event_count = count_distinct($process.metadata.id)
$security_result_description = array_distinct($process.security_result.description)
// added to populate alert graph with additional context
// Commented out principal.hostname because it is already represented in graph as match variable. If match changes, can uncomment to add to results
//$principal_hostname = array_distinct($process.principal.hostname)
$principal_process_pid = array_distinct($process.principal.process.pid)
$principal_process_command_line = array_distinct($process.principal.process.command_line)
$principal_process_file_sha256 = array_distinct($process.principal.process.file.sha256)
$principal_process_file_full_path = array_distinct($process.principal.process.file.full_path)
$principal_process_product_specific_process_id = array_distinct($process.principal.process.product_specific_process_id)
$principal_process_parent_process_product_specific_process_id = array_distinct($process.principal.process.parent_process.product_specific_process_id)
$target_process_pid = array_distinct($process.target.process.pid)
$target_process_command_line = array_distinct($process.target.process.command_line)
$target_process_file_sha256 = array_distinct($process.target.process.file.sha256)
$target_process_file_full_path = array_distinct($process.target.process.file.full_path)
$target_process_product_specific_process_id = array_distinct($process.target.process.product_specific_process_id)
$principal_user_userid = array_distinct($process.principal.user.userid)
condition:
$process
}
YARA-L Rule Structure
Condition
Fires when at least one $process event in the 15m window.
Events
$process
target.process.command_line matches "(|cmd.*/c).*Get-EventLog.*security.*-instanceid.*4624"security_result.description matches "Get-EventLog.*security.*-instanceid.*4624"
Match and Correlation
Outcome
Outcome variables add context to a detection. When the rule generates an alert, $risk_score is displayed with it.
| Field | Expression |
|---|---|
risk_score | 15 |
event_count | count_distinct($process.metadata.id) |
security_result_description | array_distinct($process.security_result.description) |
principal_process_pid | array_distinct($process.principal.process.pid) |
principal_process_command_line | array_distinct($process.principal.process.command_line) |
principal_process_file_sha256 | array_distinct($process.principal.process.file.sha256) |
principal_process_file_full_path | array_distinct($process.principal.process.file.full_path) |
principal_process_product_specific_process_id | array_distinct($process.principal.process.product_specific_process_id) |
principal_process_parent_process_product_specific_process_id | array_distinct($process.principal.process.parent_process.product_specific_process_id) |
target_process_pid | array_distinct($process.target.process.pid) |
target_process_command_line | array_distinct($process.target.process.command_line) |
target_process_file_sha256 | array_distinct($process.target.process.file.sha256) |
target_process_file_full_path | array_distinct($process.target.process.file.full_path) |
target_process_product_specific_process_id | array_distinct($process.target.process.product_specific_process_id) |
principal_user_userid | array_distinct($process.principal.user.userid) |
Recon Suspicious Commands CISA Report
#Detects suspicious commands as identified in CISA Living off the Land pdf. Alone they may be normal but in concert, they may be worth looking into
References
Telemetry Coverage
| Provider | Record / event type |
|---|---|
| Sysmon | Event ID 1: Process creation |
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule Body
// Copyright 2023 Google LLC. Licensed under Apache-2.0.
rule recon_suspicious_commands_cisa_report {
meta:
author = "Google Cloud Security"
description = "Detects suspicious commands as identified in CISA Living off the Land pdf. Alone they may be normal but in concert, they may be worth looking into"
rule_id = "mr_66edb4f7-a7e2-4ce6-a247-d09319b7eeea"
rule_name = "Recon Suspicious Commands CISA Report"
type = "hunt"
platform = "Windows"
data_source = "microsoft sysmon, microsoft windows events"
reference = "https://media.defense.gov/2023/May/24/2003229517/-1/-1/0/CSA_Living_off_the_Land.PDF"
severity = "Low"
priority = "Low"
events:
$process.metadata.event_type = "PROCESS_LAUNCH"
$process.principal.hostname = $hostname
$process.target.process.command_line = $command_line
// cisa report referenced cmd /c in their report throughout, can filter this in/out for tuning as needed
// other wmic switches like /user and /password, these have been excluded to focus on the commands being issued since local access does not require these
(
re.regex($process.target.process.command_line, `(|cmd.*/c).*7z.*a.*-p.*c:\\windows\\temp\\.*.7z`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*c:\\Windows\\system32\\pcwrun.exe.*c:\\Users\\Administrator\\Desktop\\Win.exe`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c|cmdbak.*/c).*ping.*-n.*1.*127\.0\.0\.1.*c:\\Windows\\temp\\(putty|tmp).log`) nocase or
// The following line could be swapped for the previous line for a looser match. It was observed during testing that a c2 running powershell logged putty.log as a file creation but not in the command line process event
//re.regex($process.target.process.command_line, `(|cmd.*/c).*ping.*-n.*1.*127\.0\.0\.1`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*dir.*127\.0\.0\.1\\c\$.*/od`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*ping.*-a.*-n.*1`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*wmic.*process.*call.*create.*net.*stop.*C:\\Windows\\Temp\\tmp.log"`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*\\ADMIN\$\\__.*2>&1`) nocase or
//The following line could be swapped for the previous line for a looser match, but potentially noisier
//re.regex($process.target.process.command_line, `(|cmd.*/c).*\\ADMIN\$\\__`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*net.*use.*127\.0\.0\.1\\ipc\$.*/y.*/d`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*powershell.*start-process.*-filepath.*c:\\windows\\temp\\.*.bat.*-windowstyle.*Hidden`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*rar\.exe.*a.*c:\\Windows\\temp\\.*D:\\.*`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*wmic.*cmd.*/c.*whoami`) nocase or
re.regex($process.target.process.command_line, `(|cmd.*/c).*xcopy.*c:\\windows\\temp\\hp.*d:\\`) nocase
)
match:
$hostname over 15m
outcome:
$risk_score = 35
$event_count = count_distinct($process.metadata.id)
$unique_command_line_threshold = 5
// added to populate alert graph with additional context
// Commented out principal.hostname because it is already represented in graph as match variable. If match changes, can uncomment to add to results
//$principal_hostname = array_distinct($process.principal.hostname)
$principal_process_pid = array_distinct($process.principal.process.pid)
$principal_process_command_line = array_distinct($process.principal.process.command_line)
$principal_process_file_sha256 = array_distinct($process.principal.process.file.sha256)
$principal_process_file_full_path = array_distinct($process.principal.process.file.full_path)
$principal_process_product_specific_process_id = array_distinct($process.principal.process.product_specific_process_id)
$principal_process_parent_process_product_specific_process_id = array_distinct($process.principal.process.parent_process.product_specific_process_id)
$target_process_pid = array_distinct($process.target.process.pid)
$target_process_command_line = array_distinct($process.target.process.command_line)
$target_process_file_sha256 = array_distinct($process.target.process.file.sha256)
$target_process_file_full_path = array_distinct($process.target.process.file.full_path)
$target_process_product_specific_process_id = array_distinct($process.target.process.product_specific_process_id)
$principal_user_userid = array_distinct($process.principal.user.userid)
condition:
// modify the condition value for command line to throttle how many of these unique commands can be seen until the rule is triggered
$process and #command_line > 5
}
YARA-L Rule Structure
Condition
Fires when at least one $process event in the 15m window and $command_line occurs more than 5 times in the 15m window.
Events
$process
target.process.command_line matches "(|cmd.*/c).*7z.*a.*-p.*c:\\windows\\temp\\.*.7z"target.process.command_line matches "(|cmd.*/c).*c:\\Windows\\system32\\pcwrun.exe.*c:\\Users\\Administrator\\Desktop\\Win.exe"target.process.command_line matches "(|cmd.*/c|cmdbak.*/c).*ping.*-n.*1.*127\.0\.0\.1.*c:\\Windows\\temp\\(putty|tmp).log"target.process.command_line matches "(|cmd.*/c).*dir.*127\.0\.0\.1\\c\$.*/od"target.process.command_line matches "(|cmd.*/c).*ping.*-a.*-n.*1"target.process.command_line matches "(|cmd.*/c).*wmic.*process.*call.*create.*net.*stop.*C:\\Windows\\Temp\\tmp.log""target.process.command_line matches "(|cmd.*/c).*\\ADMIN\$\\__.*2>&1"target.process.command_line matches "(|cmd.*/c).*net.*use.*127\.0\.0\.1\\ipc\$.*/y.*/d"target.process.command_line matches "(|cmd.*/c).*powershell.*start-process.*-filepath.*c:\\windows\\temp\\.*.bat.*-windowstyle.*Hidden"target.process.command_line matches "(|cmd.*/c).*rar\.exe.*a.*c:\\Windows\\temp\\.*D:\\.*"target.process.command_line matches "(|cmd.*/c).*wmic.*cmd.*/c.*whoami"target.process.command_line matches "(|cmd.*/c).*xcopy.*c:\\windows\\temp\\hp.*d:\\"
Match and Correlation
Outcome
Outcome variables add context to a detection. When the rule generates an alert, $risk_score is displayed with it.
| Field | Expression |
|---|---|
risk_score | 35 |
event_count | count_distinct($process.metadata.id) |
unique_command_line_threshold | 5 |
principal_process_pid | array_distinct($process.principal.process.pid) |
principal_process_command_line | array_distinct($process.principal.process.command_line) |
principal_process_file_sha256 | array_distinct($process.principal.process.file.sha256) |
principal_process_file_full_path | array_distinct($process.principal.process.file.full_path) |
principal_process_product_specific_process_id | array_distinct($process.principal.process.product_specific_process_id) |
principal_process_parent_process_product_specific_process_id | array_distinct($process.principal.process.parent_process.product_specific_process_id) |
target_process_pid | array_distinct($process.target.process.pid) |
target_process_command_line | array_distinct($process.target.process.command_line) |
target_process_file_sha256 | array_distinct($process.target.process.file.sha256) |
target_process_file_full_path | array_distinct($process.target.process.file.full_path) |
target_process_product_specific_process_id | array_distinct($process.target.process.product_specific_process_id) |
principal_user_userid | array_distinct($process.principal.user.userid) |