
प्राधिकृत लैब में ZendTo अनप्रमाणित ClamAV RCE और रूट विशेषाधिकार उन्नयन को पुनरुत्पादित करता है, जिसमें पिन किया गया Docker लक्ष्य, fail-closed सत्यापन, nonce-बद्ध आउटपुट और सफाई शामिल है।
यह निर्देशिका बिना-खाते ZendTo-से-ClamAV कोड-निष्पादन श्रृंखला और इसकी अलग डिफ़ॉल्ट-प्रोफ़ाइल Smarty/root-cron निरंतरता के लिए एक स्वतंत्र, अधिकृत-प्रयोगशाला पुनरुत्पादन बंडल है। इसमें शामिल हैं:
प्रारंभिक PoC, मानक clamav सेवा खाते के रूप में कॉलर-चयनित कमांड निष्पादित करता है। वैकल्पिक वेरिएंट उस बिना-खाते पैर जमाने (foothold) को root के रूप में कॉलर-चयनित कमांड तक आगे बढ़ाता है। दोनों डिफ़ॉल्ट रूप से id चलाते हैं, शाब्दिक /root/flag पथ को अस्वीकार करते हैं, और HTTPS पर nonce-बद्ध आउटपुट लौटाते हैं।
कमजोर समूह, निर्देशिका, Smarty और root-cron संबंध ZendTo Debian पैकेज/इंस्टॉलर डिफ़ॉल्ट हैं। फिर भी root तक पहुँच पर्यावरण-शर्तयुक्त है: यह सटीक सकारात्मक फिक्स्चर ext4-समर्थित /var/zendto वॉल्यूम, कार्यशील PHP CLI FFI/POSIX/exec और एक अप्रतिबंधित (unconfined) clamd प्रक्रिया का उपयोग करता है। AppArmor/SELinux लागू करना या असंगत फ़ाइलसिस्टम सिमेंटिक्स किसी अन्य अन्यथा मानक स्थापना पर निरंतरता को रोक सकते हैं।
इसका उपयोग केवल शामिल डिस्पोज़ेबल फिक्स्चर या किसी अन्य सिस्टम पर करें जिसे आप स्पष्ट रूप से परीक्षण करने हेतु अधिकृत हैं।
आधिकारिक सटीक लक्ष्य निम्न पथ पर एक स्थानीय, जानबूझकर अनावृत्ति-रहित (unversioned) आर्टिफैक्ट है:
image/zendto-installer-systemd-debian12.tar.zst
Git Docker इमेज अभिलेखागार (archives) को अनदेखा करता है। सटीक प्रतिगमन (regression) से पहले, उस पथ पर एक अधिकृत स्थानीय प्रति रखें; scripts/setup.sh को उसका दर्ज SHA-256 और इमेज ID चाहिए। source-recipe/README.md दस्तावेज़ित करता है कि इंस्टॉलर-व्युत्पन्न इमेज कैसे बनाई और कैप्चर की गई। लाइव पैकेज रिपॉज़िटरी से एक नया बिल्ड टोपोलॉजी परीक्षण के लिए उपयोगी है, लेकिन इसे पिन किए गए लक्ष्य के बाइट-समान होने का अनुमान नहीं लगाया जाता।
सेटअप और कंटेनर एंट्रीपॉइंट निम्नलिखित प्रोफ़ाइल से किसी भी बेमेल को अस्वीकार करते हैं:
पूर्ण मान PROFILE.json में हैं।
यह केवल ClamAV पैकेज संस्करण को पिन करने से अधिक मज़बूत है। एलोकेटर निर्माण glibc, CVD-संचालित पार्सर ट्रैफ़िक, वर्कर सेटिंग्स और सटीक लक्ष्य लाइब्रेरी पर भी निर्भर करता है। कैप्चर की गई इमेज में FreshClam अक्षम है, और यदि daily.cvd विचलित हो गया है या daily.cld प्रकट हुआ है तो स्टार्टअप विफल हो जाता है।
मूल वर्कस्पेस में वर्तमान में लंबे समय से चल रहा शोध कंटेनर साफ़ फिक्स्चर नहीं है: बाद के परीक्षण ने इसके बाहरी-प्रेषक फ़ॉर्म को अक्षम कर दिया और इसका दैनिक डेटाबेस अद्यतन कर दिया। वे परिवर्तन जानबूझकर यहाँ बाहर रखे गए हैं। यह बंडल उस साफ़ आधार रेखा (baseline) का उपयोग करता है जिसके विरुद्ध मूल (native) निष्पादन प्रदर्शित किया गया था।
/sys/fs/cgroupzstd, venv के साथ Python 3, एक C कंपाइलर, file और GNU readelfलक्ष्य होस्ट कर्नेल और ASLR कार्यान्वयन साझा करता है। इसलिए कर्नेल-निर्भर मैपिंग व्यवहार एक पोर्टेबिलिटी चर बना रहता है।
एक समय में केवल एक systemd फिक्स्चर को होस्ट cgroup नेमस्पेस साझा करना चाहिए। मूल शोध मशीन पर, पुराने फिक्स्चर को हटाए बिना रोकें:
docker stop zendto-installer-systemd-native
इसे बाद में docker start zendto-installer-systemd-native से पुनर्स्थापित किया जा सकता है।
इस निर्देशिका से:
./scripts/verify-bundle.sh
./scripts/setup.sh
सेटअप स्क्रिप्ट:
.venv बनाती है;/var/zendto वॉल्यूम बनाती है और systemd प्रारंभ करती है; औरclamav के रूप में किया गया एक डिस्पोज़ेबल renameat2(RENAME_EXCHANGE) ऑपरेशन शामिल है।डिफ़ॉल्ट एंडपॉइंट केवल-लूपबैक हैं:
http://127.0.0.1:18084/
https://127.0.0.1:18447/
प्रमाणपत्र स्व-हस्ताक्षरित है। PoC जानबूझकर प्रत्येक HTTP अनुरोध के लिए verify=False का उपयोग करता है। सेटअप से पहले अलग लूपबैक पोर्ट चुने जा सकते हैं:
export ZENDTO_HTTP_PORT=19084
export ZENDTO_HTTPS_PORT=19447
./scripts/setup.sh
बाद के Compose/हेल्पर कमांड के लिए समान पर्यावरण चर का उपयोग करें।
किसी भी समय लक्ष्य की जाँच करें:
./scripts/verify-target.sh
docker compose ps
साफ़ इंस्टॉलर आधार रेखा में है:
allowExternalUploads = TRUE
confirmExternalEmails = TRUE
captcha = google
इसके CAPTCHA और मेल मान इंस्टॉलर प्लेसहोल्डर हैं, इसलिए अछूता आर्काइव वास्तव में सार्वजनिक सत्यापन ईमेल वितरित नहीं कर सकता। मूल प्रतिगमन परीक्षण ने केवल उस पूर्ण एप्लिकेशन चरण को समकक्ष बाहरी-प्रेषक AuthData पंक्ति के साथ दर्शाया। लक्ष्य कोड, पैकेज, स्कैनर, अनुमतियाँ और एक्सप्लॉइट पथ को पैच नहीं किया गया।
वह एक प्रयोगशाला पंक्ति और mode-0600 टोकन फ़ाइल बनाएँ:
./scripts/mint-lab-auth.py [email protected]
टोकन मान दबा दिया जाता है और इसमें संग्रहीत होता है:
.lab/upload-auth-token.txt
यह स्थानीय सहायक यह दावा नहीं है कि बाहरी-अपलोड-अक्षम तैनाती का दूरस्थ रूप से शोषण किया जा सकता है। यदि सार्वजनिक बाहरी-प्रेषक फ़ॉर्म अक्षम है, तो PoC टोकन फ़ाइल प्रदान किए जाने पर भी ClamAV से पहले सही ढंग से रुक जाता है।
सामान्य रूप से कॉन्फ़िगर की गई अधिकृत तैनाती पर, --external-auth-token-file को हटाएँ: सत्यापन पृष्ठ को मैन्युअल रूप से खोलें, CAPTCHA हल करें, हमलावर-नियंत्रित मेलबॉक्स पर लक्ष्य-जनित संदेश प्राप्त करें, और छिपे संकेत पर उसका URL/टोकन चिपकाएँ।
यह मोड कोई CAPTCHA, ईमेल, क्षमता (capability), अपलोड, लॉगिन POST या स्कैनर सामग्री नहीं भेजता। --skip-clamd-tcp-probe वैकल्पिक केवल-पठनीय मूल TCP/3310 जाँच को भी दबा देता है:
mkdir -p -m 700 work
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--enumerate-only \
--skip-clamd-tcp-probe \
--fingerprint-json work/fingerprint.json
गणना फिर भी सामान्य वेब एक्सेस लॉग उत्पन्न करती है और सामान्य एप्लिकेशन कैश आरंभ कर सकती है। इसका Debian/Ubuntu Apache-लेआउट परिणाम मूल पैकेज, Build ID, libc, CVD, socket नीति या MAC स्थिति की पुष्टि नहीं करता। स्थानीय Docker सत्यापन स्क्रिप्ट इस फिक्स्चर के लिए वह साक्ष्य प्रदान करती है।
यह प्रयोगशाला बियरर और प्राप्तकर्ता नीति को मान्य करता है लेकिन कोई फ़ाइल या स्कैनर सामग्री प्रस्तुत नहीं करता:
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--probe-only \
--no-open-browser
[email protected]. उस जानबूझकर असामान्य test. आंतरिक-डोमेन मान से मेल खाता है जो इस इंस्टॉलर फिक्स्चर के निर्माण के समय दर्ज किया गया था। एक कस्टम वास्तविक तैनाती के लिए वास्तविक अधिकृत प्राप्तकर्ता की आवश्यकता हो सकती है।
चेतावनी: यह एक सौम्य स्कैनर जाँच नहीं है। पहले प्रयास से पहले, दूरस्थ मोड EICAR भेजता है, PESpin विभेदक (discriminator) के साथ जानबूझकर clamd को क्रैश करता है, socket-ट्रिगरित पुनर्प्राप्ति सिद्ध करता है, और अतिरिक्त क्रैश/पुनर्प्राप्ति चक्रों के साथ दो टर्मिनल कोड-पेज प्रोब चलाता है। अस्वीकृत मैपिंग जानबूझकर clamd को मार देती हैं।
एक नई कार्य निर्देशिका और एक हानिरहित कमांड का उपयोग करें:
run_dir="work/run-$(date +%Y%m%d-%H%M%S)"
mkdir -m 700 "$run_dir"
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--oracle-conditioned-attempts 72 \
--command 'id; uname -a' \
--workdir "$run_dir" \
--keep-workdir
पसंदीदा शर्तयुक्त मार्ग एक भ्रष्टाचार वाहक (corruption carrier) प्रस्तुत करने से पहले उपयोगी nibble-8 मैपिंग का परीक्षण करता है। वर्तमान तीन-लेआउट समुच्चय (aggregate) एक बाद का जीवनचक्र सुधार है; इसके ऐतिहासिक एक-लेआउट oracle और समान-प्रक्रिया RCE चरण docs/ में अलग से दस्तावेज़ित हैं।
अंधा (blind) निश्चित-nibble-6 फ़ॉलबैक स्पष्ट रूप से उपलब्ध है:
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--restart-resample-attempts 72 \
--command 'id; uname -a' \
--workdir work/blind-run \
--keep-workdir
एक स्वतंत्र समान nibble मॉडल के अंतर्गत, 47 नए मैपिंग लगभग 95% और 72 लगभग 99% हैं। वे ज्यामितीय मैपिंग संभावनाएँ हैं, एंड-टू-एंड विश्वसनीयता गारंटी नहीं। प्रत्येक अस्वीकृत मैपिंग में स्कैन समय को छोड़कर कम से कम 12-सेकंड की पुनर्प्राप्ति देरी और अनिवार्य 40-सेकंड की वर्कर-सेवानिवृत्ति अवधि लगती है। 72-प्रयास वाला रन एक घंटे से अधिक ले सकता है।
परिणाम कॉलबैक या वेबशेल से नहीं पढ़ा जाता। DSO एक अलग 30-मिनट का केवल-आउटपुट AuthData बियरर बनाता है, clamav के रूप में /bin/sh -c निष्पादित करता है, और एक अनाम ZendTo पृष्ठ के माध्यम से सीमित stdout/stderr लौटाता है। सफलता के लिए एक फ्रेम किया गया परिणाम चाहिए जिसमें निम्नलिखित सभी सुसंगत हों:
zendto_unauth_clamav_rce_result=1लापता, डुप्लिकेट, छोटा (truncated) या बेमेल प्रमाण एक विफल रन है।
इसे केवल तभी चलाएँ जब ./scripts/verify-target.sh [target] और [privesc-target] दोनों की सफलता रिपोर्ट करे। रैपर पहले वही बिना-खाते ClamAV चरण करता है, उसका सटीक सीमित आर्मिंग प्रमाण चाहता है, फिर अपरिवर्तित मानक root cron उपभोक्ता की प्रतीक्षा करता है:
.venv/bin/python poc/zendto_clamav_to_root_smarty_privesc.py chain-unauth \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--oracle-conditioned-attempts 72 \
--root-command 'id; uname -a' \
--keep-workdir
टोकन-फ़ाइल विकल्प केवल फिक्स्चर का पूर्ण-ईमेल विकल्प है। अधिकृत सार्वजनिक वर्कफ़्लो पर, इसे हटाएँ और CAPTCHA/ईमेल संकेत को मैन्युअल रूप से पूरा करें। chain-unauth द्वारा कोई ZendTo उपयोगकर्ता नाम या पासवर्ड उपयोग नहीं किया जाता।
root चरण जानबूझकर अलग है भले ही रैपर इसका हैंडऑफ़ स्वचालित करता है। यह:
savechunk.php के माध्यम से एक nonce-बद्ध PHP आर्मर अपलोड करता है;clamav के रूप में एक क्लोन की गई Smarty कंपाइल निर्देशिका का परमाणु रूप से आदान-प्रदान (exchange) करता है;verify=False के साथ /zendto-root-result-<nonce>.json डाउनलोड करता है, जिसके लिए euid=0, सटीक कमांड हैश, पुनर्स्थापना मार्कर और समापन nonce आवश्यक हैं।Cron अंतिम पोल को लगभग एक घंटे तक प्रतीक्षा करवा सकता है; डिफ़ॉल्ट टाइमआउट 3900 सेकंड है। root कमांड 1024 बाइट्स और 30 सेकंड तक सीमित है, जिसमें stdout और stderr प्रत्येक अधिकतम 1 MiB हैं। इसका nonce-संबोधित JSON इस डिस्पोज़ेबल प्रयोगशाला में जानबूझकर वेब-पठनीय है, इसलिए केवल हानिरहित परीक्षण आउटपुट का उपयोग करें।
मैन्युअल ऑर्केस्ट्रेशन के लिए, emit बिना-खाते PoC के --command में पास करने के लिए सटीक कमांड प्रिंट करता है; आर्मिंग प्रमाण के बाद, मुद्रित रन ID और सटीक root कमांड के SHA-256 के साथ poll का उपयोग करें। निर्माण और ऑडिट प्रतिलेख के लिए docs/SMARTY_ROOT_BRIDGE.md देखें।
इस वेरिएंट के किसी पूर्वापेक्षा के लापता होने पर सुरक्षित रूप से रुकने की उम्मीद है। आर्म्स को ओवरलैप न करें या अस्पष्ट रन को दोबारा न आज़माएँ: विफल चरण एक आने वाली PHP फ़ाइल, छिपा क्लोन, लॉक या स्वैप किया गया कैश छोड़ सकते हैं। प्रत्येक root परीक्षण के लिए एक नए फिक्स्चर का उपयोग करें:
./scripts/reset-lab.sh --yes-delete-lab-volume
./scripts/mint-lab-auth.py [email protected]
प्रति clamd प्रक्रिया एक सफल भ्रष्टाचार समर्थित है। दूसरा आह्वान तभी उचित है जब एक नए रन का विनाशकारी रीसायकल प्रोब अपेक्षित स्कैनर-विफलता प्रतिक्रिया लौटाए और EICAR सक्रिय socket के माध्यम से पुनर्प्राप्ति सिद्ध करे। रन ID, चरणबद्ध चंक नाम, परिणाम बियरर या क्लाइंट कार्य निर्देशिका का पुनः उपयोग न करें।
किसी भी रीडायरेक्ट, नेटवर्क टाइमआउट, अस्पष्ट बॉडी/स्थिति, अप्रत्याशित साफ़ प्रतिक्रिया या विफल EICAR पुनर्प्राप्ति पर तुरंत रुकें। किसी अनिश्चित डेमन को पिछला भ्रष्टाचार अनुरोध कभी भी मैन्युअल रूप से पुनः प्रस्तुत न करें।
पैकेज की गई सेवा में Restart=no है। पुनरावृत्ति अभी भी सक्रिय clamav-daemon.socket से आती है, स्वचालित सेवा पुनर्स्टार्ट नीति से नहीं। यदि socket अक्षम या प्रारंभ-सीमित है, तो जानबूझकर क्रैश स्कैनर को अनुपलब्ध छोड़ सकते हैं।
अपेक्षित लक्ष्य अवशेष में एक्सेस/त्रुटि लॉग, clamd क्रैश रिकॉर्ड या कोर, साफ़ oracle गार्ड से सीमित अनाथ दावा (orphan claim) फ़ाइलें, एक केवल-अपेंड /var/zendto/incoming/Bridge<nonce>.1 DSO और अल्पकालिक AuthData पंक्तियाँ शामिल हैं। मानक सफाई सामान्य अनाथ दावों को केवल एक दिन से अधिक के बाद पुराना करती है।
root वेरिएंट अतिरिक्त रूप से एक nonce PHP आर्मर, छिपा क्लोन और लॉक, root-स्वामित्व वाला सार्वजनिक JSON परिणाम और निजी /run stdout/stderr छोड़ता है। एक सफल रैपर root कमांड निष्पादित करने से पहले वास्तविक templates_c पुनर्स्थापित करता है, लेकिन ये साक्ष्य फ़ाइलें तब तक बनी रहती हैं जब तक कंटेनर और वॉल्यूम रीसेट नहीं होते।
परीक्षण के बाद प्रयोगशाला अपलोड बियरर रद्द करें:
./scripts/revoke-lab-auth.py
लक्ष्य को उसके साक्ष्य वॉल्यूम को संरक्षित करते हुए रोकें:
docker compose down
साफ़ नए फिक्स्चर के लिए, स्पष्ट रूप से केवल इस प्रोजेक्ट का नामित वॉल्यूम हटाएँ और इसे पिन की गई इमेज से पुनः प्रारंभ करें:
./scripts/reset-lab.sh --yes-delete-lab-volume
यदि साक्ष्य के रूप में आवश्यक हों तो रीसेट करने से पहले कार्य निर्देशिका और फ़िंगरप्रिंट JSON का संग्रह (archive) करें।
docker-compose.yml exact systemd/socket target topology
PROFILE.json exact package/hash/CVD profile
image/*.tar.zst local ignored target artifact
poc/ no-account driver and support modules
third_party/ minimized builder/source/binary closure
scripts/setup.sh image/client/Compose setup
scripts/verify-bundle.sh delivery-manifest verification
scripts/verify-target.sh fail-closed target verification
scripts/verify-privesc-target.sh root-variant semantic preflight
scripts/mint-lab-auth.py local completed-email substitute
scripts/revoke-lab-auth.py remove that lab bearer
scripts/reset-lab.sh explicit clean-volume reset
source-recipe/ installer provenance, not exact rebuild
docs/ technical regression/audit notes
source-recipe/install.ZendTo.tgz और इसकी रनबुक उत्पत्ति और स्रोत निर्माण के लिए शामिल हैं। किसी नए लाइव-रिपॉज़िटरी बिल्ड को सटीक न मानें: इंस्टॉलर सभी पैकेज या ClamAV डेटाबेस को पिन नहीं करता। सटीक प्रतिगमन के लिए अनदेखा किए गए स्थानीय इमेज आर्काइव को PROFILE.json से मेल खाना आवश्यक है।
MANIFEST.sha256 स्वयं को छोड़कर प्रत्येक वितरित फ़ाइल को कवर करता है। Docker इमेज आर्काइव, होस्ट-कंपाइल third_party/installer-runtime/clamav-pespin/pespin_summit हेल्पर, और उत्पन्न .venv, .lab, work और __pycache__ ट्री अनदेखा किए जाते हैं। सेटअप हेल्पर को उसके मैनिफ़ेस्टेड C स्रोत से पुनर्निर्मित करता है और स्थानीय इमेज को अलग से सत्यापित करता है।
पैकेजिंग-समय की स्थिर (static), दूरस्थ प्रीफ़्लाइट, संभाव्य पुनर्नमूनाकरण (resampling) और इंस्ट्रूमेंटेड एंड-टू-एंड जाँचें docs/BUNDLE_VALIDATION.md में दर्ज हैं। रिकॉर्ड दूरस्थ अवलोकनों को उस एक सत्यापन रन से अलग करता है जिसे स्पष्ट रूप से स्थानीय रूप से देखा गया मॉड्यूल आधार प्रदान किया गया था।
| घटक | सटीक परीक्षण मान |
|---|
| Docker image ID | sha256:de6d2f06ca04943362a9bdec5026e808448953728f31bd926343a4ed2ca2ef7c |
| ZendTo | 6.15-8 |
| ClamAV/libclamav पैकेज | 1.4.3+dfsg-1~deb12u2 |
| libclamav | libclamav.so.12.0.3, SHA-256 55e3cd94…027c |
| libclamav Build ID | e6427ab62146ee3001fe463d12e797e9d25bf81a |
| glibc | 2.36-9+deb12u14, SHA-256 6b4a4535…421 |
| मुख्य डेटाबेस | v63, SHA-256 0b2182d2…365 |
| दैनिक डेटाबेस | v28082, SHA-256 cddbcccf…906 |
| बाइटकोड डेटाबेस | v339, SHA-256 6d4aa01f…ffb |
| clamd | MaxThreads 12, IdleTimeout 30, Restart=no |
| जीवनचक्र | सक्षम clamav-daemon.socket, systemd PID 1 |
| वेब रनटाइम | Apache 2.4.68, PHP 8.2.32 |
| MAC स्थिति | अप्रतिबंधित विशेषाधिकार प्राप्त Docker फिक्स्चर |
| root सेतु | www-data में मानक clamav; /var/zendto root:www-data 0775 |
| root उपभोक्ता | मानक root सफाई cron, मिनट 25 पर प्रति घंटा |
| Smarty कैश | नियतात्मक Smarty 4.5.4 संकलित zendto.conf |
| एक्सचेंज फ़ाइलसिस्टम | ext4-समर्थित नामित /var/zendto वॉल्यूम |