PanwIndicatorCreateQueries
The script accepts indicators as input and creates an indicator query in the relevant Palo Alto Networks products.
- Type
- python
- Pack
- PANWComprehensiveInvestigation
Source
"""
The script accepts indicators and creates relevant queries in Panw products
"""
from CommonServerPython import *
def generate_ip_queries(ips: list):
ips = [ip for ip in ips if is_ip_valid(ip)]
if not ips:
return {}
queries = {}
# Cortex traps IP
ip_fields = [f"endPointHeader.agentIp='{ip}'" for ip in ips]
query_cortex_traps_ip = " OR ".join(ip_fields)
queries["CortexTrapsIP"] = (
f"SELECT * from tms.threat where " # guardrails-disable-line
f"{query_cortex_traps_ip}"
)
# Cortex Analytics IP
ip_fields = [f"endPointHeader.agentIp='{ip}'" for ip in ips]
query_cortex_analytics_ip = " OR ".join(ip_fields)
queries["CortexAnalyticsIP"] = (
f"SELECT * from tms.analytics where " # guardrails-disable-line
f"{query_cortex_analytics_ip}"
)
# Cortex Traffic IP
ip_fields = [f"src='{ip}' OR dst='{ip}'" for ip in ips]
query_cortex_traffic_ip = " OR ".join(ip_fields)
queries["CortexTrafficIP"] = (
f"SELECT * from panw.traffic where " # guardrails-disable-line
f"{query_cortex_traffic_ip}"
)
# Cortex Threat IP
ip_fields = [f"src='{ip}' OR dst='{ip}'" for ip in ips]
query_cortex_threat_ip = " OR ".join(ip_fields)
queries["CortexThreatIP"] = (
f"SELECT * from panw.threat where " # guardrails-disable-line
f"{query_cortex_threat_ip}"
)
# Autofocus Sessions IP
children = [{"field": "alias.ip_address", "operator": "contains", "value": ip} for ip in ips]
query_autofocus_sessions_ip = {"operator": "any", "children": children}
queries["AutofocusSessionsIP"] = json.dumps(query_autofocus_sessions_ip)
# Panorama IP
ip_fields = [f"( addr.src in {ip} ) or ( addr.dst in {ip} )" for ip in ips]
query_panorama_ip = " or ".join(ip_fields)
queries["PanoramaIP"] = query_panorama_ip
return queries
def generate_hash_queries(hashes: list):
if not hashes:
return {}
queries = {}
# Cortex traps Hash
hash_fields = [f"messageData.files.sha256='{hash}'" for hash in hashes]
query_cortex_traps_hash = " OR ".join(hash_fields)
queries["CortexTrapsHash"] = (
f"SELECT * from tms.threat where " # guardrails-disable-line
f"{query_cortex_traps_hash}"
)
# Cortex Analytics Hash
hash_fields = [f"messageData.sha256='{hash}'" for hash in hashes]
query_cortex_analytics_hash = " OR ".join(hash_fields)
queries["CortexAnalyticsHash"] = (
f"SELECT * from tms.analytics where " # guardrails-disable-line
f"{query_cortex_analytics_hash}"
)
# Cortex Threat Hash
hash_fields = [f"filedigest='{hash}'" for hash in hashes]
query_cortex_threat_hash = " OR ".join(hash_fields)
queries["CortexThreatHash"] = (
f"SELECT * from panw.threat where " # guardrails-disable-line
f"{query_cortex_threat_hash}"
)
# Autofocus Hash
children = [{"field": "alias.hash_lookup", "operator": "contains", "value": hash} for hash in hashes]
query_autofocus_sessions_hash = {"operator": "any", "children": children}
queries["AutofocusSessionsHash"] = json.dumps(query_autofocus_sessions_hash)
# Panorama IP
hash_fields = [f"( filedigest eq {hash} )" for hash in hashes]
query_panorama_hash = " or ".join(hash_fields)
queries["PanoramaHash"] = query_panorama_hash
return queries
def generate_domain_queries(domains: list):
if not domains:
return {}
queries = {}
# Cortex Threat Domain
domain_fields = [f"misc LIKE '{domain}'" for domain in domains]
query_cortex_threat_domain = " OR ".join(domain_fields)
queries["CortexThreatDomain"] = (
f"SELECT * from panw.threat where " # guardrails-disable-line
f"{query_cortex_threat_domain}"
)
# Autofocus Domain
children = [{"field": "alias.domain", "operator": "contains", "value": domain} for domain in domains]
query_autofocus_sessions_domain = {"operator": "any", "children": children}
queries["AutofocusSessionsDomain"] = json.dumps(query_autofocus_sessions_domain)
# Panorama Domain
domain_fields = [f"( url contains {domain} )" for domain in domains]
query_panorama_domain = " or ".join(domain_fields)
queries["PanoramaDomain"] = query_panorama_domain
return queries
def main() -> None:
try:
args = demisto.args()
ips = argToList(args.get("ip"))
hashes = argToList(args.get("hash"))
domains = argToList(args.get("domain"))
ip_queries = generate_ip_queries(ips)
hash_queries = generate_hash_queries(hashes)
domain_queries = generate_domain_queries(domains)
human_readable = "".join(
[
tableToMarkdown("IP Queries", ip_queries),
tableToMarkdown("Hashes Queries", hash_queries),
tableToMarkdown("Domains Queries", domain_queries),
]
)
outputs = {
"Query.IP": ip_queries,
"Query.Hash": hash_queries,
"Query.Domain": domain_queries,
}
return_outputs(human_readable, outputs)
except Exception as err:
return_error(f"Unexpected error: {err}.\ntraceback: {traceback.format_exc()}")
if __name__ in ("builtins", "__builtin__"):
main()
README
The script accepts indicators as input and creates an indicator query in the relevant Palo Alto Networks products.
Script Data
| Name | Description |
|---|---|
| Script Type | python3 |
| Tags | Panw |
| Cortex XSOAR Version | 5.0.0 |
Inputs
| Argument Name | Description |
|---|---|
| ip | A commma-separated list of IP addresses for which to create the query. |
| hash | A commma-separated list of file hashes for which to create the query. |
| domain | A commma-separated list of domains for which to create the query. |
Outputs
| Path | Description | Type |
|---|---|---|
| Query.IP.CortexTrapsIP | The query for the specified IP address indicators. This query is relevant for the Cortex Traps table “tms.threat”, which is the agent IP. | String |
| Query.IP.CortexAnalyticsIP | The query for the specified IP address indicators. This query is relevant for the Cortex Analytics table “tms.analytics”, which is the agent IP. | String |
| Query.IP.CortexTrafficIP | The query for the specified IP address indicators. This query is relevant for the Cortex Traffic table “panw.traffic”, and includes both source and destination. | String |
| Query.IP.CortexThreatIP | The query for the specified IP address indicators. This query is relevant for the Cortex Threat table “panw.threat”, and includes both source and destination. | String |
| Query.IP.AutofocusSessionsIP | The query (in JSON format) for the specified IP address indicators. This query is relevant for AutoFocus, includes both source and destination. | String |
| Query.IP.PanoramaIP | The query (in Panorama syntax) for the specified IP address indicators. This query is relevant for Panorama, and is valid for all log types. | String |
| Query.Hash.CortexTrapsHash | The query for the specified file hash indicators. This query is relevant for the Cortex Traps table “tms.threat”, which contains only SHA256 hashes. | String |
| Query.Hash.CortexAnalyticsHash | The query for the specified file hash indicators. This query is relevant for the Cortex Analytics table “tms.analytics”, which contains only SHA256 hashes. | String |
| Query.Hash.CortexThreatHash | The query for the specified file hash indicators. This query is relevant for the Cortex Threat table “panw.threat”, which contains only SHA256 hashes. | String |
| Query.Hash.AutofocusSessionsHash | The query (in JSON format) for the specified file hash indicators. This query is relevant for AutoFocus, and supports the following file hashes: MD5, SHA1, and SHA256. | String |
| Query.Hash.PanoramaHash | The query (in Panorama syntax) for the specified file hash indicators. This query is relevant for the WildFire log in Panorama, and only supports SHA256 hashes. | String |
| Query.Domain.CortexThreatDomain | The query for the domain indicators. This query is relevant for the Cortex Threat table “panw.threat”. | String |
| Query.Domain.AutofocusSessionsDomain | The query (in JSON format) for the domain indicators. This query is relevant for AutoFocus. | String |
| Query.Domain.PanoramaDomain | The query (in Panorama syntax) for the domain indicators. This query is relevant for Panorama. | String |