एक AD लैब के विरुद्ध स्वचालित adversary emulation (Caldera) Sigma डिटेक्शन कवरेज को मान्य करने और परिणामों को MITRE ATT&CK पर मैप करने के लिए।
detection-as-code-repo में बनाए गए Sigma डिटेक्शन नियमों का स्वचालित purple-team सत्यापन, जिसमें MITRE Caldera का उपयोग करके मौजूदा डोमेन लैब के विरुद्ध एक श्रृंखलाबद्ध Active Directory क्रेडेंशियल-एक्सेस अटैक पाथ निष्पादित किया गया, और कवरेज को विज़ुअलाइज़ करने के लिए एक ATT&CK Navigator हीटमैप का उपयोग किया गया।
इस प्रोजेक्ट के लिए Atomic Red Team के बजाय Caldera को चुना गया क्योंकि यह एक पूर्ण C2 फ्रेमवर्क प्रदान करता है, जिसमें एजेंट, एडवर्सरी प्रोफाइल, और श्रृंखलाबद्ध बहु-चरणीय ऑपरेशन शामिल हैं, बजाय एकल, पृथक तकनीक निष्पादन के। यह इस प्रोजेक्ट के लक्ष्य से अधिक निकटता से मेल खाता है: केवल यह नहीं कि "क्या इस एक तकनीक का पता चला," बल्कि यह कि "क्या एक यथार्थवादी, क्रमबद्ध अटैक चेन हमारे वर्तमान डिटेक्शन स्टैक से बच पाती है, शुरू से अंत तक।"
Purple-Team-Automation/
├── abilities/ Custom Caldera ability YAMLs
├── adversary-profiles/ The chained adversary profile used in the operation
├── validation/ Kibana evidence per technique + the LLMNR known-gap writeup
├── attack-navigator-heatmap.json ATT&CK Navigator layer, load at mitre-attack.github.io/attack-navigator
├── purple-team-automation-report.md Full write-up: scope, methodology, results, gap analysis
└── README.md This file
मैंने मौजूदा AD डोमेन लैब के समान लैब नेटवर्क पर एक अलग Ubuntu VM (caldera-server, 192.168.18.205) पर Docker Compose के माध्यम से एक समर्पित Caldera सर्वर तैनात किया, इसे ELK/SIEM स्टैक से अलग रखते हुए। Caldera v5.0.0 बॉक्स से बाहर 2000 स्टॉक abilities और 29 स्टॉक adversaries के साथ आया।
निर्माण के दौरान मैंने जिन समस्याओं की जड़ पकड़ी:
plugins/magma/dist/assets/) पर क्रैश-लूप में चला गया। मैंने इसका पता docker-compose.yml में एक पूर्ण-डायरेक्टरी Docker वॉल्यूम माउंट तक लगाया जो इमेज के कंपाइल किए गए फ्रंटएंड को अनकंपाइल किए गए होस्ट सोर्स से ओवरराइट कर रहा था। पूर्ण-डायरेक्टरी माउंट को हटाकर इसे ठीक किया।npm/nodejs को अनइंस्टॉल कर देता है।localhost:8888 इसके API बेस के रूप में हार्डकोडेड था, जो Vue बिल्ड समय पर plugins/magma/.env (VITE_CALDERA_URL) के माध्यम से बेक किया गया था, जो conf/local.yml की रनटाइम app.frontend.api_base_url सेटिंग द्वारा नियंत्रित नहीं होता। मैंने .env को VM के वास्तविक IP पर संपादित करके और रीबिल्ड करके इसे ठीक किया।lvextend -l +100%FREE + resize2fs, साथ ही docker system prune -a --volumes के माध्यम से बिल्ड-कैश लेयर को पुनःप्राप्त करके इसे ठीक किया।Stockpile केवल LSASS/Mimikatz-आधारित क्रेडेंशियल डंपिंग (T1003.001) के लिए एक नेटिव ability भेजता है। इस प्रोजेक्ट के लिए मुझे जिन चार तकनीकों की आवश्यकता थी, Kerberoasting, AS-REP Roasting, Password Spraying, और DCSync, सभी के लिए कस्टम abilities की आवश्यकता थी जिन्हें मैंने Impacket (GetUserSPNs.py, GetNPUsers.py, secretsdump.py) और Kerbrute के आसपास बनाया, क्योंकि Stockpile की मौजूदा Kerberoasting abilities (Rubeus, WinPwn) केवल Windows/.NET हैं और इस लैब के Linux-आधारित Sandcat एजेंट के साथ असंगत हैं।
इन्हें लिखते समय मुझे दो निर्माण समस्याओं का सामना करना पड़ा:
plugins.stockpile.app.parsers.katz) का उपयोग करती है जिसमें source/edge/target फ़ील्ड होते हैं, न कि एक सामान्य regex pattern पार्सर जैसा कि मैंने मूल रूप से मान लिया था। इसके कारण लोड पर एक चुपचाप TypeError('ParserConfig.__init__()') हुआ। चूंकि कच्चे Impacket आउटपुट के लिए कोई अंतर्निहित पार्सर मौजूद नहीं है, मैंने सभी चार abilities से parsers: ब्लॉक को पूरी तरह हटा दिया। परिणाम कच्चे आउटपुट/हैश फ़ाइलों के रूप में कैप्चर किए जाते हैं और Kibana के विरुद्ध मैन्युअल रूप से सत्यापित किए जाते हैं (देखें /validation)।nano पेस्ट चुपचाप विफल हो गया। मैंने कंटेनर को पुनः आरंभ करने से पहले cat/wc -l के साथ प्रत्येक फ़ाइल की जाँच करके इसे पकड़ा।मैंने Kali VM (192.168.18.70) पर एक Sandcat एजेंट (Linux, समूह red) तैनात किया, OPSEC मास्करेडिंग के लिए प्रोसेस नाम splunkd का उपयोग करते हुए, और पुष्टि की कि यह जीवित और विश्वसनीय रूप से आया, proc/sh executor के साथ root के रूप में चल रहा है।
मैंने AD Credential Access Chain एडवर्सरी प्रोफाइल बनाया ताकि चार कस्टम abilities को उस क्रम में श्रृंखलाबद्ध किया जा सके जिस क्रम में एक अवसरवादी आंतरिक हमलावर आमतौर पर उन्हें आज़माएगा:
→ Password Spray (Kerbrute)
→ Kerberoasting (GetUserSPNs.py)
→ AS-REP Roasting (GetNPUsers.py)
→ DCSync (secretsdump.py)
LLMNR/NBT-NS poisoning (T1557.001) को जानबूझकर Caldera प्रोफाइल से बाहर रखा गया था। क्यों, और यह अभी भी एक known-gap नेगेटिव कंट्रोल के रूप में कैसे शामिल है, इसके लिए देखें validation/llmnr-known-gap.md।
सभी चार निष्पादित तकनीकों को detection-as-code-repo के Sigma नियमों के विरुद्ध पता लगाया गया, Kibana में सीधे क्रॉस-चेक किया गया। LLMNR/NBT-NS poisoning एक खुला, प्रलेखित अंतराल बना हुआ है।
| तकनीक | स्थिति |
|---|---|
| T1110.003 – Password Spraying | 🟢 पता चला |
| T1558.003 – Kerberoasting | 🟢 पता चला |
| T1558.004 – AS-REP Roasting | 🟢 पता चला |
| T1003.006 – DCSync | 🟢 पता चला |
| T1557.001 – LLMNR/NBT-NS Poisoning | 🔴 अंतराल |
पूर्ण विवरण: validation/detection-results.md
पूर्ण राइट-अप: purple-team-automation-report.md
इंटरैक्टिव हीटमैप: attack-navigator-heatmap.json