
CLI وإطار عمل Go لاختبار شامل لقواعد كشف التهديدات. ينفذ تقنيات الهجوم ويتحقق من التنبيهات في منصات الأمان مثل Datadog و Elastic Security.
Threatest هي أداة CLI وإطار عمل بلغة Go لاختبار كشف التهديدات من البداية إلى النهاية.
تتيح لك Threatest تفجير أسلوب هجوم، والتحقق من أن التنبيه المتوقع تم إنشاؤه في منصة الأمان المفضلة لديك.
اقرأ منشور المدونة الإعلاني: https://securitylabs.datadoghq.com/articles/threatest-end-to-end-testing-threat-detection/
يصف المفجر كيف وأين يتم تنفيذ أسلوب الهجوم.
المفجرون المدعومون:
مطابقة التنبيهات هي تكامل خاص بالمنصة يمكنه التحقق مما إذا تم تشغيل التنبيه المتوقع.
مطابقات التنبيهات المدعومة:
يتم تعيين UUID لكل تفجير. ينعكس هذا UUID في التفجير ويُستخدم لضمان أن التنبيه المطابق يتوافق تمامًا مع هذا التفجير.
تعتمد طريقة القيام بذلك على المفجر؛ على سبيل المثال، يقوم Stratus Red Team ومفجر AWS بحقنه في user-agent؛ ويستخدم مفجر SSH عملية أصل تحتوي على UUID.
تأتي Threatest مع CLI يمكنك استخدامه لتشغيل سيناريوهات اختبار موصوفة بصيغة YAML، تتبع [مخططًا] محددًا (./schemas/threatest.schema.json). يمكنك تكوين هذا المخطط في محررك للاستفادة من التدقيق اللغوي والإكمال التلقائي داخل IDE (انظر توثيق VSCode باستخدام إضافة YAML).
قم بتثبيت CLI عن طريق تنزيل إصدار ثنائي أو باستخدام Homebrew:
brew tap datadog/threatest https://github.com/datadog/threatest
brew install datadog/threatest/threatest
مثال على الاستخدام:
$ threatest lint scenarios.threatest.yaml
جميع السيناريوهات الستة صحيحة نحوياً
# تفجير محلي
$ threatest run local-scenarios.threatest.yaml
# تفجير عن بُعد عبر SSH
$ threatest run scenarios.threatest.yaml --ssh-host test-box --ssh-username vagrant
# بدلاً من ذلك، تحديد معلمات SSH من متغيرات البيئة
$ export THREATEST_SSH_HOST=test-box
$ export THREATEST_SSH_USERNAME=vagrant
$ threatest run scenarios.threatest.yaml
ملفات تعريف سيناريو نموذجية
scenarios:
# تفجير عن بُعد عبر SSH
# ملاحظة: يتم توفير تكوين SSH باستخدام وسيطات CLI --ssh-host و --ssh-username و --ssh-keyfile
- 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
# ملاحظة: يجب أن تكون مصادقًا على موفر السحابة ذي الصلة قبل تشغيله
# المثال أدناه يعادل تشغيل "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
# ملاحظة: يجب أن تكون مصادقًا على AWS قبل تشغيله وأن يكون لديك AWS CLI مثبتًا
- name: opening a security group to the Internet
detonate:
awsCliDetonator:
script: |
set -e
# إعداد
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)
# فتح مجموعة الأمان
aws ec2 authorize-security-group-ingress --group-id $sg --protocol tcp --port 22 --cidr 0.0.0.0/0
# تنظيف
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"
يمكنك إخراج نتائج الاختبار إلى ملف 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"
}
]
افتراضيًا، يتم تشغيل السيناريوهات بحد أقصى للتوازي يبلغ 5. يمكنك زيادة هذا الإعداد باستخدام وسيطة --parallelism.
لاحظ أنه عند استخدام مفجرات SSH عن بُعد، يقوم كل سيناريو قيد التشغيل بإنشاء اتصال SSH جديد.
انظر الأمثلة للحصول على مثال كامل للاستخدام البرمجي.
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())