0x00 前言
在渗透测试中,经常会接触Windows服务器的远程桌面服务,通过界面对服务器进行管理。而对于普通的Windows系统,在某些条件下也需要进行界面操作。
虽然我们可以通过编写程序来实现界面操作(捕获桌面信息,压缩传输,发送鼠标键盘消息等),但是如果能够使用远程桌面服务,岂不是更加方便高效
那么,对应非服务器版本的Windows系统,在使用远程桌面服务有哪些需要注意的问题呢,本文将会逐个分析介绍。
0x01 简介
本文将要介绍如下内容:
- 开启远程桌面的方法
- 使用mimikatz支持远程桌面多用户的原理
- 改进思路
- 测试工具rdpwrap
0x02 开启远程桌面的方法
1、查询系统是否允许3389远程连接
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
1表示关闭,0表示开启
查看远程连接的端口:
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
端口格式为16进制,如下图
0xd3d
转换为十进制为33389
2、本机开启3389远程连接的方法
方法1:通过cmd
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
方法2:通过reg文件
内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"fDenyTSConnections"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:00000d3d
导入注册表:
regedit /s a.reg
注:
如果修改连接端口,系统重启后才能生效
补充
如果系统未配置过远程桌面服务,第一次开启时还需要添加防火墙规则允许3389端口,如下图
修改防火墙配置,允许3389端口的命令如下:
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
3、远程连接方法
kali使用3389远程连接:
rdesktop 192.168.1.1:3389
Windows:
mstsc.exe
0x03 非服务器版本的Windows系统默认只允许一个账户登录
具体表现为:
远程登录时,使用与原系统相同的账户,原系统将被切换到登录界面
如下图
使用不同的账户,登录时提示其他用户已登录到此计算机,如下图
选择继续后,原系统桌面将弹框提示是否断开当前连接(30秒后默认选择同意,退回到登录界面)
如下图
0x04 非服务器版本的Windows系统支持多用户登录的方法
1、使用mimikatz
privilege::debug
ts::multirdp
执行如下图
开启多用户登录功能,最高支持到Win7
使用与原系统相同的账户,原系统还是会被切换到登录界面
使用与原系统不同的账户,登录成功,如下图
通过查看mimikatz的源码找到修改思路,代码位置如下:
https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/kuhl_m_ts.c
Windows在开启服务Remote Desktop Services时,会加载termsrv.dll,如下图
通过修改内存中的termsrv.dll实现开启多用户功能,具体操作如下:
Win7 x86:
查找:0x3B86200300000F84
替换为:0xC78620030000FFFFFF7F9090
Win7 x64:
查找:0x39873C0600000F84
替换为:0xC7873C060000FFFFFF7F9090
当然,该方法在系统重启后失效
更近一步,如果我们直接修改文件termsrv.dll,能否实现永久开启多用户登录的功能呢?
继续接下来的测试
2、修改termsrv.dll
推荐工具: CFF Explorer
测试系统: Win7 x64
打开c:\windows\system32
下的termsrv.dll
Hex Editor
查看十六进制数据39873C0600000F84
如下图
从0x0001738A
处开始,选中12字节,替换为C7873C060000FFFFFF7F9090
保存dll
注:
需要先停止远程桌面服务才能替换termsrv.dll
替换termsrv.dll后,重新开启服务TermService
尝试使用不同用户远程连接,成功,验证该思路正确
完整操作如下:
1.查看Remote Desktop Services服务状态
sc qc TermService
2.如果服务启动,需要先关闭
net stop TermService /y
3.删除原termsrv.dll
del c:\windows\system32\termsrv.dll
4.替换新termsrv.dll
5.启动服务
net start TermService
6.远程连接
成功实现多用户登录
补充1:
Win7 x86:
查找:0x3B86200300000F84
替换为:0xC78620030000FFFFFF7F9090
补充2
常见Windows系统的版本号:
系统 | 版本号 |
---|---|
Win7 | 6.1.7600 |
Win7sp1 | 6.1.7601 |
Win8 | 6.2.9200 |
Win8.1 | 6.3.9600 |
3、使用工具rdpwrap
工程地址:
https://github.com/stascorp/rdpwrap
工具地址:
https://github.com/stascorp/rdpwrap/releases
支持Win Vista - Win 10
不修改termsrv.dll,通过传入不同参数实现
安装:
RDPWInst.exe -i is
测试如下图
释放rdpwrap.dll和rdpwrap.ini至System32文件夹
rdpwrap.dll会被加载到同termsrv.dll相同的进程
此时,能够使用不同用户进行远程连接
卸载:
RDPWInst.exe -u
0x05 小结
本文介绍了三种支持远程桌面多用户登录的方法,适用于不同条件,对于替换termsrv.dll的方法,需要根据系统具体版本,使用不同的替换位置