Как TeamViewer хранит пароли
TeamViewer — популярная программа для удалённого доступа к рабочему столу. Поэтому довольно интересно посмотреть, как она хранит пароли. Если вкратце, пароли хранятся в реестре Windows в зашифрованном виде. Для шифрования используется алгоритм AES-128-CBC и секретный ключ 0602000000a400005253413100040000.
Такой метод сохранения паролей и связанное с ним повышение привилегий официально зарегистрированы 7 февраля 2020 года как уязвимость CVE-2019–18988 (применима ко всем версиям TeamViewer до 14.7.1965 включительно).
Начинающий специалист по безопасности, который обнародовал эту уязвимость, наткнулся на неё случайно. Он рассказывает, что работал у клиента и во время резервного копирования заметил ключи реестра TeamViewer, которые назывались OptionsPasswordAES
и SecurityPasswordAES
.
Впоследствии ему стало интересно, что это за ключи и как вообще TeamViewer хранит пароли. Он импортировал их на свежую систему на виртуальной машине и запустил сканер BulletPassView, который собирает пароли в системе. Сканер выдал пароль TeamViewer открытым текстом.
Сканер BulletPassView
Затем с помощью программы Cheat Engine (для взлома игр под Windows) специалист провёл поиск этого пароля в оперативной памяти — и нашёл его опять же открытым текстом. Позже выяснилось, что данная уязвимость уже зафиксирована два года назад как CVE-2018–14333.
Потом пришло время проверить, откуда в памяти у клиента TeamViewer берётся ключ: с сервера или с локального хоста. Оказалось, что сетевой трафик отсутствует, но пароль в памяти всё равно есть. Реверс-инжиниринг бинарника TeamViewer с помощью IDA Pro, API Monitor, procdump и Frida занял несколько недель, но ничего не дал, хотя парень по ходу дела освоил несколько новых инструментов, так что процесс нельзя назвать бесполезным.
В ходе поиска информации оказалось, что немало людей уже задавалось вопросом, как найти в ресурсах AES-ключи для игр Unity. Оказалось, что это совсем несложный процесс, для которого достаточно использовать дебаггер. Спустя шесть часов он нашёл фрагмент кода TeamViewer, отвечающий за AES-шифрование:
=================================================
"ServerPasswordAES"=hex:88,44,d7,0a,b2,96,2a,3d,63,16,3c,ff,e4,15,04,fb
=================================================
Takes 8844d70ab2962a3d63163cffe41504fb into xmm0
Takes 5B659253E5E873D26723B7D5EAC06E3B into xmm1
pxor xmm0, xmm1
movdqa xmmword ptr ds:[eax],xmm0
[eax] = D3214559577E59EF04358B2A0ED56AC0
movdqa xmm1,xmmword ptr ds:[esi] | [esi] = 25C8C8BD4298BB32A57EECBDBD045BBB
movdqa xmm0,xmmword ptr ds:[eax] | [eax] = D3214559577E59EF04358B2A0ED56AC0
aesdec xmm0,xmm1 | One round of an AES decryption, using Equivalent Inverse Cipher, 128-bit data (state) from xmm1 with 128-bit round key from xmm2/m128; store the result in xmm1.
movdqa xmmword ptr ds:[eax],xmm0 | [eax] = 6F AA 98 76 DE 11 7D 8D 7E B6 EE 61 2D 3D 15 52
movdqa xmm1,xmmword ptr ds:[esi+10] | [esi+10]=[008FDE10]=79 DC 78 A6 67 50 73 8F E7 E6 57 8F 18 7A B7 06
add esi,20 |
dec ecx | ecx = 3
aesdec xmm0,xmm1 | do the actual decryption
movdqa xmmword ptr ds:[eax],xmm0 | [eax]=[008FDC90]=E3 58 26 46 A7 37 12 40 85 1C C0 43 7D 1F 1E 30
Three more rounds of aesdec then
aesdeclast xmm0, xmm1 .| Last round of AES decryption, using Equivalent Inverse Cipher, 128-bit data (state) from xmm2 with a 128-bit round key from xmm3/m128; store the result in xmm1.
008FDC90 01 00 01 00 67 24 4F 43 6E 67 62 F2 5E A8 D7 04 ....g$OCngbò^¨×.
Этот код берёт из реестра несколько байт ServerPasswordAES
и расшифровывает их с помощью ключа, полученного путём XOR’а прописанных значений esi
и eax
. В результате получается ключ 0602000000a400005253413100040000
, а значение IV равняется 0100010067244F436E6762F25EA8D704
.
В версии TeamViewer 14 новый скриптовый движок позволяет повысить привилегии до NT AUTHORITY\SYSTEM
, прочитав пароль TeamViewer в реестре с правами юзера.
Ну и ещё можно расшифровать некоторые чужие пароли, погуглив [SecurityPasswordAES], [OptionsPasswordAES], [SecurityPasswordExported] или [PermanentPassword] с параметром поиска [filetype: reg].
TeamViewer закрыла эту уязвимость в последних версиях. Как теперь программа шифрует пароли, ещё не разобрались.