从Todesk多个漏洞浅谈远程连接程序溯源反制
在企业和单位网络资产运维中,维护人员往往为了方便在服务器中安装向日葵、Teamviewer、Todesk等远程控制程序,这些程序能够让运维人员随时随地接入服务器,非常方便,同时也有不少运维人员认为这些远程控制程序要比windows自带的Rdp协议更加安全可靠,而在攻防实战当中,攻击者一旦获取服务器权限,这些远程控制程序内存储记录的设备识别码和连接密码往往能够被攻击者轻易获取,就拿Todesk举例,在老版本中,攻击者可通过Todesk安装目录下的config.ini搭配解密程序获取当前服务器运行的Todesk远程识别码和连接密码,同时攻击者还可以通过config.ini文件替换的方式,来更改当前Todesk的连接密码从而实现远程桌面登入,同时有些大佬还可以通过内存hook的方式来捕获Todesk运行内存中的明文密码信息。
方案一图示:
方案二图示:
方案三图示:
通过上述几个技术组合拳打法,攻击者可轻易获取Todesk远程桌面的连接权限,从而对企业单位生产环境进行横向移动,敏感信息获取等操作。那么作为防守人员,我们是否能够通过Todesk来溯源到连接方信息呢?答案是可以。
众所周知,在Todesk较新版本中,但用户想要作为主控端向被控端发起连接,必须注册登录自己的Todesk账号,否则程序无法发起远程连接。
也就是说,新版Todesk用户要想发起连接,必须登录自己或他人的账号,而Todesk的账号注册采用手机验证方式,如果作为被控方的我们能够获取连接方的账号认证手机,就可以通过该信息进一步去进行溯源操作,如何使用手机号进行深入溯源不在本章节讨论范畴。
思路清晰之后,下一步就需要验证Todesk连接发起方是否会向被控方发送自身的账号信息了,经常使用Todesk的大佬们都知道,在我们连接到被控方后,被控方屏幕右下角会显示当前连接方的昵称、设备代码、连接客户端版本、头像等信息。
那么我们不妨设想一下Todesk的连接机制。
Todesk连接机制(瞎猜版)
但是光知道这些信息是不够的,因为被控方的昵称和头像都能自定义,唯一存在利用空间的就是这个设备代码,但是由于我们不知道连接方的连接密码,我们同样无法对被控方发起成功的连接申请,到此为止,从软件呈现出来的内容看,作为防守方的我们确实没有特别好的方法去识别当前连接人的个人身份。
做过渗透测试的大佬们应该都知道,有时系统显示的内容和实际从接口处接受到的内容并不完全一致,由于一些原因,接口往往会传递一些仅被后端记录的信息,相信有很多大佬在测试一个个人信息查询点时接口会回显当前用户的密码情况,秉着这个思路,尝试通过windows网络抓包程序来进行捕获,看看传输到被控端的信息中是否包含连接方的实名认证信息。
通过流量程序捕获,发现控制端和被控端的连接大多加密,要么是二进制数据流,握手部分也采用了TLS加密处理,要想通过抓包获取根证书替换解密又很麻烦,看来通过流量监控方式确实是行不通的,但是在抓包过程中,发现了一个很有趣的现象,当主控端发起连接请求后,如果是首次连接,被控端会请求一个HTTP链接,通过访问这个链接发现这是连接方的用户头像信息,看来控制端在连接时确实会向被控端发送一个包含个人信息的数据包。
既然无法通过流量方面来检查,看起来目前的道路只有逆向了,但是鉴于Todesk的程序体量,逆向起来绝不是一个小活,那么是否存在一种投机取巧的办法呢?有的。
在一筹莫展之际,笔者发现了这么一处功能
点击之后,发现了Todesk竟然支持网页端远控,那么这样一来一切都好做了,通过Burp的tls证书,我们可以捕获到Todesk网页连接过程中的全部流量,通过对网页握手部分流量的分析,极大的减轻了流量分析的工作量,说干就干。
通过反复抓包测试,最终在一条websocket数据包中找到了我们想要的内容,在该包发送完成后,控制端和被控端开始正式建立画面流式传输,这个包中包含了连接方的用户名、手机号、mac地址、客户端版本和连接到被控方的识别码、密码等信息,如果该消息确认是发送至被控端的,那么就说明被控端一定掌握了当前连接方的手机号码信息,只是没有显示出来而已,那么如何证明这条消息是发送到被控方的呢?我们将数据包中代表“用户名”和“版本号”的字段进行修改,观察在被控方右下角显示的内容是否是我们改掉的内容,如果是,那么说明这个包大概率是无修改情况下直接发送到被控方的。
成功了!经过修改之后被控方所显示的用户名、版本号信息已经变成了我们修改之后的信息,进一步说明了这个数据包被毫无修改地被接收并渲染,接下来只需要在被控方中找到传输这条数据的信息即可。
刚才我们测试中发现Todesk的所有连接流量都采用了加密处理,我们很难对这些信息进行解密,同时直接逆向又过于麻烦,那么在被控端中我们还有什么办法去找到我们想要的信息呢?答案是有的。
我们可以使用CheatEngine来对当前系统运行的程序进行内存捕获,只需要在内存视图中添加查询,指向我们要查找的手机号码,就能获取当前连接中手机号码存储的位置,进一步通过内存结构处理,编写对应的监控脚本,从而实现实时监听连接方的手机号码信息。
在内存视图中成功查到了连接方的手机号码信息,接下来就可以针对该处内存结构编写对应脚本来进行循环监测了。
利用该脚本,任何向该台电脑发起成功连接的信息,都能捕获其连接账号的手机号信息,再也不怕攻击队连接我们的Todesk了!
聪明的小伙伴可能发现了问题,在我们前面网页端连接时修改手机号码不就可以了吗,我们来实验一下
确实,当修改手机号码之后,我们收到的用户信息也会改变,这也是规避这种溯源反制的一种方法,现在我们既有了矛,也有了盾。
在实际应用场景中,防守方人员可以将散布虚假泄露情报,引导攻击者使用Todesk连接蜜罐服务器,从而捕获攻击者的个人手机号码,非常好用。
|