
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 è 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/
Un detonatore descrive come e dove viene eseguita una tecnica di attacco.
Detonatori supportati:
Un matcher di avvisi è un'integrazione specifica della piattaforma in grado di verificare se è stato attivato un avviso previsto.
Matcher di avvisi supportati:
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.
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
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
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"
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.
Vedi esempi per un esempio completo di utilizzo programmatico.
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())
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())