
इस रिपॉजिटरी में अगस्त 2020 में Tiandy के IPC/NVR फर्मवेयर पर किए गए मेरे शोध के परिणाम शामिल हैं। मुझे दो कमज़ोरियाँ मिलीं जिनका उपयोग दूरस्थ रूप से व्यवस्थापक पासवर्ड पुनर्प्राप्त करने और डिवाइस तक रूट एक्सेस प्राप्त करने के लिए किया जा सकता है।
इस रिपॉज़िटरी में Tiandy के IPC/NVR फ़र्मवेयर (ये डिवाइस OMNY के रूप में भी बेचे जाते हैं) पर मेरे अगस्त 2020 के शोध के परिणाम हैं। यह "शोध" संपूर्ण नहीं था, लेकिन मुझे व्यवस्थापक पासवर्ड दूरस्थ रूप से पुनर्प्राप्त करने, टेलनेट सक्षम करने और रूट पासवर्ड बदलने के कई तरीके मिले।
यह कहना मुश्किल है कि वास्तव में कौन से संस्करण प्रभावित हैं, क्योंकि हम केवल हाल के संस्करण ही डाउनलोड कर सकते हैं। ये सभी डाउनलोड करने योग्य संस्करण प्रभावित हैं:
DVRS_V9.12.7.20200422
DVRS_V11.7.4.20200721
NVSS_V13.6.1.20200723
NVSS_V22.1.0.20200722
विभिन्न डिवाइसों के लिए अलग-अलग ब्रांच ही नहीं हैं, बल्कि कुछ घटकों का संस्करणीकरण और उन्नयन अलग से होता है, जैसे वेब API, जहाँ मुझे एक प्रमाणीकरण बाइपास मिला जो फ़र्मवेयर संस्करण संख्या की परवाह किए बिना केवल मध्य 2019 के बाद जारी संस्करणों पर काम करता है। यदि आपको प्रभावित संस्करणों के बारे में अधिक जानकारी हो, तो मैं आपकी मदद की सराहना करूँगा।
मैं यहाँ पूर्ण प्रकटीकरण कर रहा हूँ, लेकिन यह उचित है। विक्रेता का पैच (संभावना नहीं क्योंकि वे अनुत्तरदायी हैं) समस्या को गायब नहीं करेगा, खासकर जब ऑनलाइन किसी भी डिवाइस में नवीनतम फ़र्मवेयर नहीं है (बिल्कुल भी नहीं)। वास्तविक कमजोरी यह है कि वे डिवाइस इंटरनेट के संपर्क में हैं। और यह कुछ ऐसा है जिसे अंतिम उपयोगकर्ताओं को ठीक करना है, न कि Tiandy को।
बोनस के रूप में, मैं फ़र्मवेयर अनपैकर और RTSP/RTMP के माध्यम से स्ट्रीम तक पहुँचने के तरीके के बारे में कुछ जानकारी भी शामिल कर रहा हूँ (मैनुअल में उसे खोजने के लिए शुभकामनाएँ)।
सबसे पहले मैं स्क्रिप्ट प्रस्तुत करता हूँ:
फिर मैं संक्षेप में समझाने की कोशिश करता हूँ कि ये स्क्रिप्ट क्या करती हैं और क्यों। मैं कोड दोहराता नहीं हूँ, लेकिन इतना संदर्भ समझाने की कोशिश करता हूँ कि आप कोड समझ सकें:
अंत में, यह अपेक्षाकृत तकनीकी हो जाता है:
आपको PyCrypto के साथ Python 3 की आवश्यकता होगी।
पहले, recover.py आज़माएँ। इसके लिए पोर्ट 3001 सुलभ होना चाहिए:
python3 recover.py [HOST]
यदि सब कुछ ठीक रहा, तो व्यवस्थापक क्रेडेंशियल प्रिंट हो जाने चाहिए।
यदि वह पोर्ट सुलभ नहीं है, तो वेब वाला काम कर सकता है। इसके लिए URL चाहिए:
python3 cgi_recover.py http://123.45.67.89
python3 cgi_recover.py https://123.45.67.89
यदि उपरोक्त में से कोई भी काम नहीं करता है, तो जाँचें कि टेलनेट सक्षम है या नहीं। यदि यह सक्षम है, तो आप सीधे डिवाइस पर रूट प्राप्त कर सकते हैं, बस इस हैश को क्रैक करें:
support:$1$$AErA9BQgLjrxTJB1748k71:501:501:Linux User,,,:/home/support:/bin/sh
(यदि आप वास्तव में इसे क्रैक कर लें तो PR खोलना सुनिश्चित करें :D)
पुराने V7 NVR फ़र्मवेयर में, आप सीधे कमांड चला सकते हैं:
python3 ftpupdate.py [host] [adminpass] '[cmd]'
लेकिन यह कोई आउटपुट नहीं देता। इसे आसान बनाने के लिए, मैंने यह शॉर्टहैंड शामिल किया है:
python3 ftpupdate.py [host] [adminpass] adduser [username] [password]
यह uid 0 वाला एक और उपयोगकर्ता जोड़ देगा।
पहले, टेलनेट सक्षम करें:
python3 telnet.py [host] [adminpw]
या हाल के डिवाइसों के लिए:
python3 cgi_recover.py [host] telnet
फिर आप /etc/passwd को अधिलेखित कर सकते हैं (मुझे लगता है आप जानते हैं कि यह कैसे काम करता है)। पहले filetransport.py आज़माएँ (NVR के लिए):
python3 filetransport.py [host] [adminpass] put /etc/passwd <[source_file]
यह कोई प्रतिक्रिया नहीं देता, आपको लॉगिन करके इसे जाँचना होगा...
जिन IPC मॉडलों पर filetransport.py काम नहीं करता, वहाँ upgrade_rw.py आज़माएँ:
python3 upgrade_rw.py [url] [adminpass] /etc/passwd <[source_file]
(यह भी कोई प्रतिक्रिया नहीं देता)
अंत में, और भी नए डिवाइसों के लिए, यह वेब API के माध्यम से भी किया जा सकता है:
python3 cgi_recover.py [url] write /etc/passwd <[source_file]
यदि उपरोक्त में से कोई भी काम नहीं आया (जाँचें कि आप लॉगिन कर पाते हैं या नहीं), तो उन सभी तरीकों को दोबारा आज़माएँ लेकिन इसके बजाय /config/etc/passwd को अधिलेखित करें। कुछ फ़र्मवेयर संस्करणों में, /etc/passwd उसका एक सिमलिंक है। अंत में, आप /tdfs/etc/passwd को अधिलेखित करने का भी प्रयास कर सकते हैं, लेकिन उसके बाद डिवाइस को रीबूट करने की आवश्यकता हो सकती है, इसलिए रीबूट करने के लिए उपयोग करें:
python3 reboot.py [host] [adminpass]
पुराना V7 (IPC और NVR) फ़र्मवेयर प्रभावित नहीं दिखता है, लेकिन यदि आपके पास व्यवस्थापक पासवर्ड है, तो NVR के लिए एक प्रमाणित RCE (ftpupdate.py) है, और IPC के लिए, upgrade-rw.py स्क्रिप्ट का उपयोग /etc/passwd को अधिलेखित करने के लिए किया जा सकता है।
NVR फ़र्मवेयर के बाद के संस्करणों (V9 और V11) में एक डिफ़ॉल्ट खाता होता है, जो "निष्क्रिय" विशेषाधिकार वृद्धि के साथ मिलकर व्यवस्थापक पासवर्ड पुनर्प्राप्त करना संभव बनाता है। फिर हम filetransport.py का उपयोग करके /etc/passwd को अधिलेखित कर सकते हैं।
जबकि डिफ़ॉल्ट खाता IPC फ़र्मवेयर में मौजूद नहीं है, एक और पुनर्प्राप्ति विधि सामने आती है - PSW विधि। यह एक पासवर्ड पुनर्प्राप्ति तंत्र है जिसमें बिल्कुल भी सुरक्षा नहीं है। यह V9 के बाद से सभी डाउनलोड करने योग्य फ़र्मवेयर संस्करणों में मौजूद है। जबकि filetransport.py केवल NVR पर काम करता है, upgrade_rw.py उन्नयन तंत्र का उपयोग करके IPC पर वही उद्देश्य पूरा करता है, इसलिए हम फिर भी रूट एक्सेस प्राप्त कर सकते हैं।
2019 फ़र्मवेयर एक और हमला वेक्टर पेश करता है - वेब API का उपयोग करके एक प्रमाणीकरण बाइपास। बिना प्रमाणीकरण के कॉन्फ़िगरेशन फ़ाइल निर्यात करके, हम पासवर्ड पुनर्प्राप्त कर सकते हैं और मनमानी फ़ाइलों को अधिलेखित करने के लिए एक उन्नयन पैकेज तैयार कर सकते हैं।
कमजोरियों की बात करें तो, उनमें से 4 हैं:
ध्यान दें कि मैंने "क्लाउड" सुविधाओं की जाँच नहीं की, जैसे कि क्या डिवाइसों की गणना करना संभव है और इस प्रकार इंटरनेट के संपर्क में न आने वाले डिवाइसों से कनेक्ट होना (जैसा कि Xiongmai डिवाइसों के साथ होता है)।
पुराने संस्करणों में, टेलनेट डिफ़ॉल्ट रूप से सक्षम होता है और यही हमें /etc/passwd फ़ाइल में मिल सकता है:
support:$1$$AErA9BQgLjrxTJB1748k71:501:501:Linux User,,,:/home/support:/bin/sh
(रूट पासवर्ड गतिशील रूप से अपडेट होता है, और मैंने यह हैश भी क्रैक नहीं किया है, इसलिए पुल रिक्वेस्ट का स्वागत है :D)
support उपयोगकर्ता (वास्तव में सभी फ़र्मवेयर संस्करणों में मौजूद) अविशेषाधिकार प्राप्त लग सकता है, लेकिन निश्चित रूप से, इस उपयोगकर्ता के पास Admin पासवर्ड पढ़ने और /etc/init.d में विश्व-लेखनीय init स्क्रिप्ट को अधिलेखित करने या नई बनाने के लिए पर्याप्त विशेषाधिकार हैं :)
अवधारणात्मक रूप से, यह विधि वास्तव में सरल है। हम बस एक लॉगिन पैकेट भेजते हैं और प्रतिक्रिया पढ़ते हैं। बस इतना ही, क्योंकि "लॉगिन सफल" प्रतिक्रिया में हमारे विशेषाधिकारों की परवाह किए बिना सभी उपयोगकर्ताओं के क्रेडेंशियल होते हैं। हालाँकि V7 में भी ऐसा ही था, व्यावहारिक रूप से यह विधि तभी उपयोगी बनी जब NVR फ़र्मवेयर में डिफ़ॉल्ट खाता पेश किया गया। अपरिवर्तनीय "Default" के पास कोई दूरस्थ विशेषाधिकार नहीं है, इसलिए आप इसके साथ कुछ नहीं कर सकते। खैर, शायद व्यवस्थापक पासवर्ड पढ़ने के अलावा...
हालाँकि यह तुच्छ लगता है, इसे लागू करना उतना तुच्छ नहीं था। संचार के लिए एक कस्टम प्रोटोकॉल उपयोग किया जाता है, और पासवर्ड DES का उपयोग करके एन्क्रिप्ट किए जाते हैं लेकिन बिट्स उल्टे होते हैं (सबसे कठिन हिस्सा यह पता लगाना था), सर्वर द्वारा प्रेषित कुंजी के साथ। चूँकि कोई कुंजी व्युत्पत्ति नहीं है, एक छिपकर सुनने वाला आसानी से सब कुछ डिक्रिप्ट कर सकता है। फिर भी, किसी को यह पता लगाना होगा कि बिट्स उल्टे हैं, या पूरी चीज़ को शुरू से दोबारा लागू करना होगा...