
DNS canarytokens के लिए एक सरल बाइनरी रैपर।
_ _
_ _ ___| | | _____ __
| | | |/ _ \ | |/ _ \ \ /\ / /
| |_| | __/ | | (_) \ V V /
\__, |\___|_|_|\___/ \_/\_/
|___/
- बस नीला जोड़ें
सरल बाइनरी संशोधन जो किसी बाइनरी के निष्पादित होने पर एक canarytoken ट्रिगर करेंगे।
हमलावरों के खिलाफ प्रोडक्शन सिस्टम बूबीट्रैप करने के लिए आदर्श।
वर्तमान में चार विधियाँ हैं:
अपना स्वयं का DNS कैनरी टोकन canarytokens पर पंजीकृत करें। आप दस्तावेज़ में इनके कार्य करने के तरीके के बारे में अधिक पढ़ सकते हैं।
यह कुछ इस प्रकार दिखेगा: pz21qtyfsidipvrsuzs9n2udi.canarytokens.com
इसे TOKEN पर्यावरण चर में रखें:
export TOKEN="c28y9l4dw0drj62un0cm4rwz6.canarytokens.com"
Dockerfiles में एक उदाहरण, कार्यशील टोकन मौजूद है, आप इसकी गतिविधि इतिहास यहाँ देख सकते हैं। हालाँकि, आपको वास्तव में अपना स्वयं का उपयोग करना चाहिए।
इनमें से प्रत्येक निर्माण विधि को लागू करने वाली Dockerfiles उपलब्ध हैं।
यदि आपके पास एक उपयुक्त डिफ़ॉल्ट बिल्ड वातावरण है (जैसे डेबियन आधारित सिस्टम पर build-essential या alpine आधारित सिस्टम पर build-base), तो आप libyellow या yellow को बहुत सरलता से संकलित कर सकते हैं। ldsoyellow अधिक जटिल है।
आप Dockerfiles में yellow के निर्माण और स्थापना का एक सरल एंड-टू-एंड उदाहरण देख सकते हैं।
gcc -o yellow yellow.c canary32.c
देखें Dockerfile.yellow
कोई निर्माण आवश्यक नहीं है।
सुनिश्चित करें कि आप alert_list सरणी में उन बाइनरी की सूची अपडेट करें जिन पर आप अलर्ट प्राप्त करना चाहते हैं।
gcc -shared -fPIC libyellow.c canary32.c -o libyellow.so
Alpine और Debian संस्करणों के लिए Dockerfile.libyellow या Dockerfile.libyellow.debian देखें।
कार्यशील उदाहरण के लिए Dockerfile.ldsoyellow देखें। आपको glibc स्रोतों की आवश्यकता होगी (मैं वास्तविक लिंकर के जितना संभव हो उतना करीब होने के लिए आधिकारिक पैकेज संस्करण का उपयोग करने की सलाह देता हूँ)।
apt-get source libc6
पैच rtld.c.patch लागू करें।
cd /glibc-*
patch < rtld.c.patch
glibc को सैनिटी जाँच अक्षम करके और सही libdir की ओर इंगित करते हुए कॉन्फ़िगर करें (64-बिट सिस्टम मानते हुए)।
mkdir glibcbuild && cd glibcbuild
/glibc-*/configure --disable-sanity-checks --libdir=$(dirname $(find / -name "libc.so.6"|grep 64))
सामान्य रूप से बनाएँ।
make
सभी वेरिएंट कैनरी टोकन URL निर्दिष्ट करने के लिए TOKEN पर्यावरण चर का उपयोग करते हैं। पर्यावरण चर का नाम बदला जा सकता है, या यदि आप चाहें तो इसे हार्डकोड भी किया जा सकता है। फिर से, इनमें से प्रत्येक के लिए Dockerfiles मौजूद हैं।
yellow विशिष्ट बाइनरी पर ट्रिगर करने के लिए है जिन्हें आप नाम बदलकर इसका उपनाम बनाते हैं, ठीक वैसे ही जैसे busybox का उपयोग किया जाता है। आपको बाइनरी का नाम बदलकर '.canary' एक्सटेंशन उपयोग करना होगा, फिर मूल बाइनरी नाम के लिए yellow की एक symlink (या प्रतिलिपि) बनानी होगी। उदाहरण के लिए:
cp yellow /usr/bin
mv /usr/bin/id /usr/bin/id.canary
ln -s /usr/bin/yellow /usr/bin/id
इसके बाद id का कोई भी निष्पादन आपके कैनरी टोकन को ट्रिगर करेगा।
देखें Dockerfile.yellow
संवेदनशील प्रक्रिया निष्पादन विधि उपरोक्त के समान तकनीक का उपयोग करती है, सिवाय इसके कि यह बाइनरी के बजाय एक शेल स्क्रिप्ट के साथ ट्रिगर होती है, और इसके साथ एक इंस्टॉलर आता है। spe_install.sh चलाएँ और इसे अपना DNS टोकन और उस बाइनरी का नाम दें जिस पर आप ट्रिगर करना चाहते हैं। बाइनरी का मौजूद होना आवश्यक नहीं है।
उदाहरण के लिए:
./spe_install.sh "c28y9l4dw0drj62un0cm4rwz6.canarytokens.com" /bin/id
इससे जब भी id चलाया जाएगा, एक अलर्ट बनेगा।
यह यहाँ वर्णित Windows टोकन विधि की एक प्रति है।
libyellow का उद्देश्य किसी भी बाइनरी पर ट्रिगर करना है जहाँ इसे LD_PRELOAD के माध्यम से इंजेक्ट किया गया है, लेकिन केवल उन पर अलर्ट करना है जिन्हें आप कोड में निर्दिष्ट करते हैं। यह प्रति सत्र LD_PRELOAD पर्यावरण चर को इसकी ओर इंगित करने के लिए सेट करके किया जा सकता है, या पूरे सिस्टम में इसे /etc/ld.so.preload फ़ाइल में जोड़कर किया जा सकता है। यदि लाइब्रेरी उस पर काम नहीं कर रही है तो बाद वाला आपके सिस्टम को तोड़ सकता है, इसलिए अनुशंसा की जाती है कि आप पहले LD_PRELOAD का उपयोग करके इसका परीक्षण करें।
ऊपर 'पूर्व-कार्य' के अंतर्गत बताए अनुसार अपना टोकन TOKEN पर्यावरण चर में रखना याद रखें।
LD_PRELOAD उदाहरण:
cp libyellow.so /usr/lib/
export LD_PRELOAD=/usr/lib/libyellow.so
फिर एक लक्षित बाइनरी चलाएँ, जाँच करें कि यह अपेक्षित रूप से व्यवहार करती है, और आपको एक कैनरी अलर्ट मिलेगा।
एक बार जब आप संतुष्ट हो जाएँ कि सब कुछ काम कर रहा है, तो आप इसे पूरे सिस्टम में इसके साथ जोड़ सकते हैं (यह मसल-आधारित सिस्टम जैसे alpine पर काम नहीं करेगा, जहाँ इसके बजाय LD_PRELOAD विधि उपयोग की जाती है):
cp libyellow.so /usr/lib
echo /usr/lib/libyellow.so >> /etc/ld.so.preload
Alpine और Debian संस्करणों के लिए Dockerfile.libyellow या Dockerfile.libyellow.debian देखें।
ldsoyellow विशिष्ट बाइनरी पर ट्रिगर करने के लिए है जहाँ बाइनरी को डिफ़ॉल्ट लिंकर के बजाय इसका उपयोग करने के लिए संशोधित किया जाता है। आप सिस्टम-व्यापी प्रभाव के लिए डिफ़ॉल्ट लिंकर को इसके साथ बदल सकते हैं, लेकिन यह संभवतः बहुत अधिक शोर पैदा करेगा।
Dockerfile.ldsoyellow उदाहरण में /bin/cat के लिए ऐसा करना शामिल है। पहले संशोधित (arm'ed) लिंकर को वैध लिंकर के बगल में कॉपी किया जाता है:
cp <arm'd linker> /lib64/ld-linux-x86-64.so.3
फिर बाइनरी को वैध लिंकर के बजाय इसका उपयोग करने के लिए संशोधित किया जाता है:
sed -i "s/\/lib64\/ld-linux-x86-64.so.2/\/lib64\/ld-linux-x86-64.so.3/" /bin/cat
देखें Dockerfile.ldsoyellow।
यदि आप Docker को Docker के अंदर चलाना चाहते हैं, मान लीजिए, एक बिल्ड वातावरण के लिए जहाँ आपका बिल्ड निर्देशों पर सीमित नियंत्रण था, और किसी के बाहर निकलने पर अलर्ट प्राप्त करना चाहते हैं, तो आप Dockerfile.dind-rootless में दिए गए उदाहरण जैसा कुछ कर सकते हैं। यह उदाहरण yellow का उपयोग करता है लेकिन किसी भी या सभी अन्य वेरिएंट का उपयोग कर सकता है।
यह होस्ट में उन बाइनरी को बूबीट्रैप करता है जो कंटेनर से सुलभ नहीं होनी चाहिए।