
CLI- und Go-Framework für End-to-End-Tests von Bedrohungserkennungsregeln. Detoniert Angriffstechniken und überprüft Alarme in Sicherheitsplattformen wie Datadog und Elastic Security.
Threatest ist ein CLI und Go-Framework für End-to-End-Tests der Bedrohungserkennung.
Threatest ermöglicht es Ihnen, eine Angriffstechnik zu detonieren und zu überprüfen, ob der erwartete Alarm in Ihrer bevorzugten Sicherheitsplattform generiert wurde.
Lesen Sie den Ankündigungs-Blogbeitrag: https://securitylabs.datadoghq.com/articles/threatest-end-to-end-testing-threat-detection/
Ein Detonator beschreibt, wie und wo eine Angriffstechnik ausgeführt wird.
Unterstützte Detonatoren:
Ein Alarm-Matcher ist eine plattformspezifische Integration, die prüfen kann, ob ein erwarteter Alarm ausgelöst wurde.
Unterstützte Alarm-Matcher:
Jeder Detonation wird eine UUID zugewiesen. Diese UUID wird in der Detonation reflektiert und dient dazu, sicherzustellen, dass der gefundene Alarm genau dieser Detonation entspricht.
Die genaue Umsetzung hängt vom Detonator ab; beispielsweise injiziert Stratus Red Team und der AWS-Detonator die UUID in den User-Agent; der SSH-Detonator verwendet einen übergeordneten Prozess, der die UUID enthält.
Threatest wird mit einer CLI ausgeliefert, mit der Sie Testszenarien ausführen können, die als YAML beschrieben sind und einem bestimmten Schema folgen. Sie können dieses Schema in Ihrem Editor konfigurieren, um von IDE-interner Linting und Autovervollständigung zu profitieren (siehe Dokumentation für VSCode mit der YAML-Erweiterung).
Installieren Sie die CLI, indem Sie ein Binary-Release herunterladen oder mit Homebrew:
brew tap datadog/threatest https://github.com/datadog/threatest
brew install datadog/threatest/threatest
Beispielverwendung:
$ 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
Beispiel-Szenariodefinitionsdateien
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"
Sie können die Testergebnisse in eine JSON-Datei ausgeben:
$ 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"
}
]
Standardmäßig werden Szenarien mit einer maximalen Parallelität von 5 ausgeführt. Sie können diese Einstellung mit dem Argument --parallelism erhöhen.
Beachten Sie, dass bei Verwendung von entfernten SSH-Detonatoren jedes laufende Szenario eine neue SSH-Verbindung aufbaut.
Vollständige programmatische Nutzungsbeispiele finden Sie unter examples.
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())