实现Windows系统(非服务器版)多用户登录远程桌面的方案

by LauCyun Jun 28,2018 16:30:23 54,207 views

在渗透测试中,经常会接触Windows服务器的远程桌面服务,通过界面对服务器进行管理。而对于普通的Windows系统,在某些条件下也需要进行界面操作。

虽然我们可以通过编写程序来实现界面操作(捕获桌面信息、压缩传输、发送鼠标键盘消息等),但是如果能够使用远程桌面服务,岂不是更加方便高效。本文将分析Windows系统(非服务器版)多用户登录远程桌面的解决方案。

本文中涉及Kali Linux的Metasploit操作靶机,都是基于攻击机利用MS17-010漏洞渗透进靶机。

0x00 实验环境

攻击机:

  • 系统:Kali Linux
  • IP地址:192.168.0.112
  • 工具:
    • Metasploit
    • nmap

靶机:

  • 系统:Windows 7 sp1 x64
  • IP地址:192.168.0.152

工具:

0x01 如何开启远程桌面服务

1 查询远程桌面服务开启状态

查询系统是否开启远程桌面服务,命令如下:

REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

执行结果如图1所示:


图1 远程桌面服务状态

如果fDenyTSConnections的值为0x1则表示关闭;0x0表示开启。

2 查询远程桌面服务端口号

查询远程桌面服务端口号,命令如下:

REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber

查询结果如图2所示:


图2 远程桌面服务端口号

端口格式为16进制,0xd3d转换为十进制是3389

3 开启远程桌面服务

如果远程桌面服务关闭的话,则需要开启,命令如下:

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

或者,通过导入reg文件(导入命令为regedit /s 1.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

执行结果如图3所示:


图3 开启远程桌面服务

如果系统未配置过远程桌面服务,第一次开启时还需要添加防火墙规则允许3389端口,如图4所示:


图4 启用远程桌面Windows防火墙例外

修改防火墙配置,允许3389端口的命令如下:

netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

4 远程桌面连接方法

  • Kali Linux:
    rdesktop 192.168.0.152:3389
    
  • Windows:
    mstsc.exe

0x02 Windows只允许单用户登录(非服务器版本)

远程登录时,如果使用与系统相同的登录账户(Administrator),系统将被切换到登录界面,如图5所示:


图5 系统将被切换到登录界面

如果使用不同的账户,登录时则提示其他用户已登录到此计算机,如6所示:


图6 登录提示

选择继续后,系统桌面将弹框提示是否断开当前连接(30秒后默认选择同意,退回到登录界面),如图7所示:


图7 系统连接确认界面

这种现象在渗透测试中肯定是很容易被电脑使用者发现,所以就要解决这个问题。

0x03 Windows 多用户登录的方法(非服务器版本)

为了解决Windows非服务器版系统多用户同时登录的问题,下面给出了3种方法:方法1和方法2都是修改termsrv.dll;方法3是通过注入rdpwrap.dlltermsrv.dll所在进程。

1  Mimikatz

Mimikatz是由C编写的开源小工具,功能非常强大。它支持从Windows系统内存中提取明文密码、哈希、PIN码和Kerberos凭证,以及pass-the-hash、pass-the-ticket、build Golden tickets等数种黑客技术。

Mimikatz分为x64和Win32两个版本,x64最高支持Windows 10 1083,Win32最高支持Windows 8.1。

直接通过运行命令即可安装补丁,命令如下:

privilege::debug
ts::multirdp

如图8所示就表示安装成功。


图8 安装Mimikatz补丁

使用不同的账户(hacker)即可登录成功,如图9所示:


图9 多用户登录成功

不足之处,该方法在系统重启后会失效。

2 修改termsrv.dll

上面,通过Mimikatz安装补丁的方法在系统重启后就失效,那有啥方法使其重启依然有效呢?

通过查看Mimikatz的源码,在modules/kuhl_m_ts.c中找到修改方法:

由于Windows在开启远程桌面服务服务时,会加载termsrv.dll,如下图10所示:


图10 加载的termsrv.dll

所以,通过修改termsrv.dll即可实现多用户登录,具体操作如下:

  • x64
    • Windows NT 6.0:
      查找:
      8B 81 38 06 00 00 39 81 3C 06 00 00 75
      替换为:
      C7 81 3C 06 00 00 FF FF FF 7F 90 90 EB
    • Windows NT 6.x:
      查找:
      39 87 3C 06 00 00 0F 84
      替换为:
      C7 87 3C 06 00 00 FF FF FF 7F 90 90 
    • Windows 8.1:
      查找:
      39 81 3C 06 00 00 0F 84
      替换为:
      C7 81 3C 06 00 00 FF FF FF 7F 90 90 
    • Windows 10 1803:
      查找:
      8B 99 3C 06 00 00 8B B9 38 06 00 00 3B DF 0F 84
      替换为:
      C7 81 3C 06 00 00 FF FF FF 7F 90 90 90 90 90 E9
  • x86

上面Windows NT对应的系统版本,请参考:https://en.wikipedia.org/wiki/Microsoft_Windows#Timeline_of_releases

接着,使用CFF Explorer打开C:\windows\system32\termsrv.dll,选择Hex Editor,然后查找39873C0600000F84,如图11所示:


图11 CFF Explorer查找39873C0600000F84

从图11得知,0x000173C6即为39873C0600000F84的起始位置。

0x000173C6处开始,选中12字节,替换为C7873C060000FFFFFF7F9090,替换后保存dll。如图12所示:


图12 修改termsrv.dll

接着,替换termsrv.dll(需要先停止远程桌面服务才能替换),替换termsrv.dll后,重新开启服务TermService。过程如下:

  • 查看远程桌面服务服务状态:
    sc qc TermService
    
  • 如果远程桌面服务服务启动,则需要先关闭:
    net stop TermService /y
    
  • 删除原termsrv.dll
    del c:\windows\system32\termsrv.dll
    
  • 替换新termsrv.dll
  • 启动服务
    net start TermService
    

Ok,通过修改termsrv.dll的方法,重启后也依然有效。

但是,这种方法比较麻烦,而且每个版本修改termsrv.dll的位置和内容都不一样。

3  RDPWrap

RDPWrap是恢复远程桌面服务被阉割的功能,  适用于Windows Vista 、7、8、8.1、10 。官方的介绍如下:

The goal of this project is to enable Remote Desktop Host support and concurrent RDP sessions on reduced functionality systems for home usage.

RDP Wrapper works as a layer between Service Control Manager and Terminal Services, so the original termsrv.dll file remains untouched. Also this method is very strong against Windows Update.

在kali中解压RDPWrap-v1.6.2.zip,其中解压后的文件有:

File name Description
RDPWInst.exe RDP Wrapper Library installer/uninstaller
RDPCheck.exe Local RDP Checker (you can check the RDP is working)
RDPConf.exe RDP Wrapper Configuration
install.bat Quick install batch file
uninstall.bat Quick uninstall batch file
update.bat Quick update batch file

将解压后的文件上传到靶机中,如图13所示:


图13 上传RDPWrap至靶机

接着,就是运行install.bat进行安装RDPWrap,如图14所示:


图14 安装RDPWrap

释放rdpwrap.dllrdpwrap.iniC:\Program Files\RDP Wrapper文件夹,rdpwrap.dll会被加载到同termsrv.dll相同的进程,如图15所示:


图15 rdpwrap.dll会被加载到termsrv.dll相同的进程

同样也可以在靶机中,运行RDPConfig.exe,看到Diagnostics后面都是绿色的,并且Listener state是Listening [fully supported],如图16所示:


图16 RDPWrap配置信息

此时,能够使用不同用户进行远程连接。

0x04 总结

本文介绍了三种支持远程桌面多用户登录的方法,适用于不同条件,对于替换termsrv.dll的方法,需要根据系统具体版本,使用不同的替换位置。最方便、最快捷的方法是安装RDPWrap。

0x05 参考

Tags