
threatest v1.5.0
CLI e framework Go per test end-to-end di regole di rilevamento delle minacce. Detona tecniche di attacco e verifica gli alert in piattaforme di sicurezza come Datadog ed Elastic Security.
Threatest
Threatest è un CLI e un framework Go per testare end-to-end il rilevamento delle minacce.
Threatest ti permette di detonare una tecnica di attacco e verificare che sia stato generato l'avviso previsto nella tua piattaforma di sicurezza preferita.
Leggi l'articolo di annuncio sul blog: https://securitylabs.datadoghq.com/articles/threatest-end-to-end-testing-threat-detection/
Concetti
Detonatori
Un detonatore descrive come e dove viene eseguita una tecnica di attacco.
Detonatori supportati:
- Esecuzione locale di comandi
- Esecuzione di comandi SSH
- Stratus Red Team
- Detonatore AWS CLI
- Detonatore AWS (solo a livello programmatico, non funziona con la CLI)
Matcher di avvisi
Un matcher di avvisi è un'integrazione specifica della piattaforma in grado di verificare se è stato attivato un avviso previsto.
Matcher di avvisi supportati:
- Segnali di sicurezza Datadog
- Segnali di sicurezza Elastic
Correlazione tra detonazione e avviso
A ogni detonazione viene assegnato un UUID. Questo UUID viene riflesso nella detonazione e utilizzato per garantire che l'avviso corrispondente corrisponda esattamente a questa detonazione.
Il modo in cui questo viene fatto dipende dal detonatore; ad esempio, Stratus Red Team e l'AWS Detonator lo iniettano nello user-agent; il detonatore SSH utilizza un processo padre contenente l'UUID.
Utilizzo
Tramite CLI
Threatest include una CLI che puoi utilizzare per eseguire scenari di test descritti come YAML, seguendo uno schema specifico. Puoi configurare questo schema nel tuo editor per beneficiare del linting e del completamento automatico all'interno dell'IDE (vedi documentazione per VSCode utilizzando l'estensione YAML).
Installa la CLI scaricando una versione binaria o con Homebrew:
brew tap datadog/threatest https://github.com/datadog/threatest
brew install datadog/threatest/threatest
Esempio di utilizzo:
$ threatest lint scenarios.threatest.yaml
All 6 scenarios are syntaxically valid
# Local detonation
$ threatest run local-scenarios.threatest.yaml
# Remote detonation over SSH
$ threatest run scenarios.threatest.yaml --ssh-host test-box --ssh-username vagrant
# Alternatively, specify SSH parameters from environment variables
$ export THREATEST_SSH_HOST=test-box
$ export THREATEST_SSH_USERNAME=vagrant
$ threatest run scenarios.threatest.yaml
Esempi di file di definizione di scenari
- Detonazione tramite SSH
scenarios:
# Remote detonation over SSH
# Note: SSH configuration is provided using the --ssh-host, --ssh-username and --ssh-keyfile CLI arguments
- name: curl metadata service
detonate:
remoteDetonator:
commands: ["curl http://169.254.169.254 --connect-timeout 1"]
expectations:
- timeout: 1m
datadogSecuritySignal:
name: "Network utility accessed cloud metadata service"
severity: medium
- Detonazione con Stratus Red Team
scenarios:
# Stratus Red Team detonation
# Note: You must be authenticated to the relevant cloud provider before running it
# The example below is equivalent to manually running "stratus detonate aws.exfiltration.ec2-security-group-open-port-22-ingress"
- name: opening a security group to the Internet
detonate:
stratusRedTeamDetonator:
attackTechnique: aws.exfiltration.ec2-security-group-open-port-22-ingress
expectations:
- timeout: 15m
datadogSecuritySignal:
name: "Potential administrative port open to the world via AWS security group"
- Detonazione tramite comandi AWS CLI
scenarios:
# AWS CLI detonation
# Note: You must be authenticated to AWS before running it and have the AWS CLI installed
- name: opening a security group to the Internet
detonate:
awsCliDetonator:
script: |
set -e
# Setup
vpc=$(aws ec2 create-vpc --cidr-block 10.0.0.0/16 --query Vpc.VpcId --output text)
sg=$(aws ec2 create-security-group --group-name sample-sg --description "Test security group" --vpc-id $vpc --query GroupId --output text)
# Open security group
aws ec2 authorize-security-group-ingress --group-id $sg --protocol tcp --port 22 --cidr 0.0.0.0/0
# Cleanup
aws ec2 delete-security-group --group-id $sg
aws ec2 delete-vpc --vpc-id $vpc
expectations:
- timeout: 15m
datadogSecuritySignal:
name: "Potential administrative port open to the world via AWS security group"
Puoi esportare i risultati dei test in un file JSON:
$ threatest run scenarios.threatest.yaml --output test-results.json
$ cat test-results.json
[
{
"description": "change user password",
"isSuccess": true,
"errorMessage": "",
"durationSeconds": 22.046627348,
"timeDetonated": "2022-11-15T22:26:14.182844+01:00"
},
{
"description": "adding an SSH key",
"isSuccess": true,
"errorMessage": "",
"durationSeconds": 23.604699625,
"timeDetonated": "2022-11-15T22:26:14.182832+01:00"
},
{
"description": "change user password",
"isSuccess": false,
"errorMessage": "At least one scenario failed:\n\nchange user password returned: change user password: 1 assertions did not pass\n =\u003e Did not find Datadog security signal 'bar'\n",
"durationSeconds": 3.505294235,
"timeDetonated": "2022-11-15T22:26:36.229349+01:00"
}
]
Per impostazione predefinita, gli scenari vengono eseguiti con un parallelismo massimo di 5. Puoi aumentare questa impostazione usando l'argomento --parallelism.
Nota che quando si utilizzano detonatori SSH remoti, ogni scenario in esecuzione stabilisce una nuova connessione SSH.
Utilizzo programmatico di Threatest
Vedi esempi per un esempio completo di utilizzo programmatico.
Testare i segnali Datadog Cloud SIEM attivati da Stratus Red Team
threatest := Threatest()
threatest.Scenario("AWS console login").
WhenDetonating(StratusRedTeamTechnique("aws.initial-access.console-login-without-mfa")).
Expect(DatadogSecuritySignal("AWS Console login without MFA", WithSeverity("medium"))).
WithTimeout(15 * time.Minute)
assert.NoError(t, threatest.Run())
Testare i segnali Datadog Cloud Workload Security attivati dall'esecuzione di comandi su SSH
ssh, _ := NewSSHCommandExecutor("test-box", "", "")
threatest := Threatest()
threatest.Scenario("curl to metadata service").
WhenDetonating(NewCommandDetonator(ssh, "curl http://169.254.169.254 --connect-timeout 1")).
Expect(DatadogSecuritySignal("EC2 Instance Metadata Service Accessed via Network Utility"))
assert.NoError(t, threatest.Run())