TeamViewer 13.0.5058中的权限漏洞测试

0x00 前言


12月5日,TeamViewer发布新版本13.0.5640,修复了之前版本13.0.5058中的一个bug。

随后,gellin在github上传了该漏洞的POC,安全信息网站ThreatPost对这个情况作了报道。

但一眼看上去,该漏洞的描述和POC较难理解,于是,本文对其做了进一步测试,验证POC,得出结论

POC:

https://github.com/gellin/TeamViewer_Permissions_Hook_V1

ThreatPost报道:

https://threatpost.com/teamviewer-rushes-fix-for-permissions-bug/129096/

0x01 简介


本文将要介绍以下内容:

  • POC测试
  • 原理简要分析
  • 利用思路
  • 防御

0x02 POC测试


1、编译生成dll

POC通过c++开发,在使用VS2012对其编译时会出现如下bug:

error C2784: “std::_String_iterator<_Mystr> std::operator +(_String_iterator<_Mystr>::difference_type,std::_String_iterator<_Mystr>)”:未能从“std::string”为“std::_String_iterator<_Mystr>”推导 模板 参数

bug出现的位置:

https://github.com/gellin/TeamViewer_Permissions_Hook_V1/blob/master/TeamViewerHook_13_0_3711_88039/main.cpp#L25

Bug出现的原因是作者使用更高版本的Visual Studio编写,况且这段代码的功能是输出,所以可以忽略,修改后的代码如下:

console = new Console(std::string(BANNER), std::string("TeamViewer Permissions Hook v1"));

编译成功,生成TeamViewerHook_13_0_3711_88039.dll

2、测试环境搭建

主机1(Server):

操作系统:Win8 x86

安装TeamViewer 13.0.5058

作为被控制端,ID为543 847 147,密码为49s4eb

主机2(Client):

操作系统:Win8 x86

安装TeamViewer 13.0.5058

作为控制端,用于远程连接主机1

3、测试功能A: 主机1(Server)反控主机2(Client)

主机2(Client)填入ID和密码,成功远程连接主机1(Server)

如下图

Alt text

注:

TeamViewer支持的一个正常功能: 主机2(Client)选择通信-与伙伴切换角色控制,能够切换角色,允许主机1(Server)反过来控制主机2(Client),如下图

Alt text

POC的第一个功能: 实现主机1(Server)未经授权,反过来控制主机2(Client)

流程如下:

在主机1(Server)上,将TeamViewerHook_13_0_3711_88039.dll注入到TeamViewer的进程

这里可使用APC注入,代码可参考:

https://github.com/3gstudent/Inject-dll-by-APC/blob/master/test.cpp

dll注入前,主机1(Server)单击会话列表,如下图

Alt text

下面进行dll注入,按照提示输入NUMPAD 1,选择Host/Server,如下图

Alt text

再次单击主机1(Server)的会话列表,列表被修改,如下图

Alt text

选中切换角色,即可实现主机1(Server)反过来控制主机2(Client)

4、测试功能B: 主机2(Client)解锁鼠标键盘

同测试A,主机2(Client)填入ID和密码,成功远程连接主机1(Server)

主机1(Server)通过设置会话列表,禁止主机2(Client)的鼠标进行远程控制,如下图

Alt text

正常情况下,主机2(Client)无法使用鼠标对主机1(Server)进行远程控制

POC的第二个功能: 实现主机2(Server)未经授权,解锁鼠标,远程控制主机1(Server)

下面进行dll注入,按照提示输入NUMPAD 2,选择client,如下图

Alt text

成功解锁鼠标,远程控制主机1(Server),如下图

Alt text

0x03 原理简要分析


通过dll注入,搜索目标进程的内存,找到代表权限的指针地址,重新赋值,进行naked inline hook,实现权限的修改

修改后的内存结构如下图

Alt text

具体的实现方法可参照源代码

0x04 利用思路


1、功能A: 主机1(Server)反控主机2(Client)

如果主机1(Server)通过漏洞成功反控主机2(Client),默认情况下,主机2(Client)的桌面会显示成被控制的状态

但是,既然通过dll注入能够修改TeamViewer进程的内存数据,那么也能够通过修改内存数据控制主机2(Client)的桌面显示内容(例如黑屏、正常屏幕(不推荐)等)

公开的POC未实现控制主机2(Client)桌面显示内容的功能,考虑到这个漏洞的危害,本文不会介绍POC转为EXP的具体方法

2、功能B: 主机2(Client)解锁鼠标键盘

利用前提为主机2(Client)已经成功远程连接主机1(Server),当主机1(Server)选择禁用主机2(Client)的鼠标时,该功能才会发挥作用

0x05 防御思路


1、建议用户升级TeamViewer新版本13.0.5640

注:

截止本文编写,TeamViewer官网尚未发布该升级版本的具体内容,地址如下:

https://www.teamviewer.com/en/download/changelog/

2、不要随意连接未知的TeamViewer服务器

0x06 小结


本文对TeamViewer 13.0.5058中的权限漏洞POC进行测试,简要介绍原理和利用思路,给出防御建议


LEAVE A REPLY

Written on December 11, 2017