轩辕三官 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 之前的文章《渗透技巧——Pass the Hash with Remote Desktop(Restricted Admin mode)》介绍了在特定条件下(服务器需要启动受限管理模式,客户端需要支持受限管理模式)用远程桌面传递hash的方法。本文将介绍一种更通用的方法(通过NTLM哈希登录RDP),其分析原理、开源代码和记录细节。 0x01 简介 本文将介绍以下内容: 渗透测试的要求 验证口令或NTLM散列的实现方法 c实现代码 Python实现代码 C sharp实现代码 0x02 渗透测试中的需求 如果你是开发远程桌面服务的客户端,有很多选择,比如通过C#调用ActiveX组件AxMSTSCLib 详见:3359 www . code project . com/articles/43705/remote-desktop-using-c-net。 但是在渗透测试中,我们有以下两个要求: 1.验证口令或者hash 需要满足以下条件: 它可以在Windows和Linux系统上运行。 登录方式支持明文密码和NTLM哈希。 在命令行下使用 2.远程登录 它可以在Windows和Linux系统上运行。 登录方式支持明文密码和NTLM哈希。 0x03 验证口令或者hash的实现方法 为了支持NTLM散列登录,您需要了解一些协议和加密方法。 RDP协议参考:https://github . com/freerdp/freerdp/wiki/Reference-Documentation 1.使用Python实现(rdp_check.py) 地址:3359 github . com/SecureAuthCorp/IMPacket/blob/master/examples/RDP _ check . py 它可以在Windows和Linux系统上运行。 登录方式支持明文密码和NTLM哈希。 在命令行下使用 在脚本运行之前,需要安装Impacket。 安装方法:pip安装包 如果在Windows系统下使用,可以将Python脚本转换成exe。编译后的exe文件的下载地址是https://github.com/maaaaz/impacket-examples-windows. 使用示例:明文密码验证 RDP _ check . py/administrator:test 123 @ 192 . 168 . 1 . 1 使用示例:NTLM哈希认证 RDP _ check . py/administrator @ 192 . 168 . 1 . 1-hashes:C5 a 237 b 7 e 9d 8 e 708d 8436 b 6148 a 25 fa 1 注: hash的格式是lm hash:n hash。如果只有NTLM散列,则格式为n hash。请注意,它前面有一个空格字符。 2.使用C实现(FreeRDP) 地址:https://github.com/FreeRDP 它可以在Windows和Linux系统上运行。 登录方式支持明文密码。 在命令行下使用 为了支持NTLM哈希登录,你需要使用旧版本的FreeRDP。下载地址是https://labs.portcullis.co.uk/download/FreeRDP-pth.tar.gz. 如果只是为了验证密码或哈希,则需要修改代码来删除后续登录的功能。 关于FreeRDP的使用,请参考https://github.com/FreeRDP/FreeRDP/wiki/CommandLineInterface. 3.使用C sharp实现(SharpRDPCheck) 它可以在Windows系统上运行。 登录方式支持明文密码和NTLM哈希。 在命令行下使用 开发过程记录: 这里不能通过调用ActiveX组件AxMSTSCLib来实现,原因如下: ActiveX组件AxMSTSCLib无法通过NTLM哈希登录。 命令行支持不够友好。 因此,只能通过引用rdp_check.py来手动构造通信数据 搜了一下,找到一个可供参考的代码:https://github.com/RDPUploader/RDPUploader. RDPUploader包括三个子项目。编译成功后,它会生成两个dll和一个exe文件。它不支持命令行操作或NTLM哈希登录,但通信过程写得很清楚。 接下来,使用RDPUploader作为开发的模板。 下面是如何支持NTLM散列登录: 远程桌面协议在验证之前将明文密码转换为NTLM哈希。 首先,我们在RDPUploader中寻找将明文密码转换成NTLM散列的代码。具体内容如下: 私有静态字节[] nTOWFv1(字符串密码) { if(密码==空) { 抛出新异常(“密码参数是必需的”); } 返回MD4。ComputeHash(编码。Unicode.GetBytes(密码)); } 私有静态字节[] nTOWFv2(字符串域,字符串用户名,字符串密码) { hm act 64 hm act=new hm act 64(ntowfv 1(password)); hmact.update(编码。Unicode.GetBytes(用户名。ToUpper())); hmact.update(编码。Unicode.GetBytes(域)); 返回hm act . digest(); } 补充:NTLM hash的生成方法 将明文口令转换成十六进制的格式 转换成统一码格式,即在每个字节之后添加0x00 对统一码字符串作MD4加密,生成32位的十六进制数字串 这里以明文口令为例: 转换成十六进制的格式为74657374313233 转换成统一码格式为7400650073007400310032003300 对字符串7400650073007400310032003300作MD4加密,结果为c5a 237 b 7 e 9 D8 e 708d 8436 b 6148 a 25 fa 1 更多细节可参考之前的文章《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》 这里我们可以将nTOWFv1(密码)的结果输出,验证NTLM杂碎的生成方法是否准确,修改后的代码如下: 私有静态字节[] nTOWFv2(字符串域,字符串用户名,字符串密码) { byte[] a=nTOWFv1(密码); string text= for(int I=0;一。长度;我) { text=a[i].ToString(《X2》); } 控制台WriteLine(文本); HMACT64 hmact=新hm act 64(a); hmact.update(编码Unicode。GetBytes(用户名. ToUpper())); hmact.update(编码Unicode。GetBytes(域)); 返回hm act。digest(); } 输出的字符串为c5a 237 b 7 e 9 D8 e 708d 8436 b 6148 a 25 fa 1,验证成功 接下来,直接传入字符串c5a 237 b 7 e 9 D8 e 708d 8436 b 6148 a 25 fa 1进行验证 这里需要将十六进制格式的字符串转换为字节[],代码如下: public static byte[]将xStringToBytes(字符串hexString) { hexString=hexString .替换(' ',' '); if (hexString .长度% 2!=0) { 引发新的参数异常(" NTLM哈希的长度错误"); } byte[]返回字节=新字节[十六进制字符串.长度/2]; for(int I=0;我返回字节。长度;我) { returnBytes[i]=Convert .ToByte(十六进制字符串Substring(i * 2,2),16); } 返回返回字节 } 私有静态字节[] nTOWFv2(字符串域,字符串用户名,字符串密码) { string text=' C5 a 237 b 7 e 9 D8 e 708d 8436 b 6148 a 25 fa 1 '; byte[]byteArray=ConvertHexStringToBytes(text); hm act 64 hm act=新hm act 64(byteArray); hmact.update(编码Unicode。GetBytes(用户名. ToUpper())); hmact.update(编码Unicode。GetBytes(域)); 返回hm act。digest(); } 验证成功,最后将固定字符串修改为变量传递即可实现对NTLM杂碎登录的支持 完整代码已开源,地址如下:https://github。com/3g student/SharpRDPCheck/ 可通过可视化工作室进行编译,编译的目标框架推荐使用NET Framework 4.6,这是为了使用TLSv1.2 否则会使用TLSv1.0,在进行登录时会失败,提示如下: [!]身份验证错误(解密操作失败,请参见内部异常。) 内部异常:系统.组件模型。win32异常(0x 80004005):本地一秒钟 无法联系安全机构 参考资料:https://个文档。微软。com/en-us/dot net/API/system。网。安全。SSL流。authenticateasclient?redirectedfrom=MSDNview=net framework-4.8 编译成功后在安装100 .净框架四的Windows操作系统操作系统系统下都可以正常使用 0x04 防御思路 对于RDP的爆破攻击,可以选择提高用户口令的强度 对于爆破行为的检测,可以通过煤矿管理局查看其他用户通过RDP登录当前系统的日志: 微软视窗系统终端服务-远程连接管理器/操作' wevtutil QE/f:text ' Microsoft-Windows-终端服务-RemoteConnectionManager/Operational ' 每当听众RDP-Tcp收到一个连接请求,将产生EventID为261的日志 也就是说,只要收到了RDP的连接请求,无论连接是否成功,均会产生EventID为261的日志 通过Powershell查看其他用户通过RDP登录当前系统的日志: https://画廊。TechNet。微软。com/Remote-Desktop-Connection-3fe 225 CD 0x05 小结 本文介绍了针对远程桌面协议,验证口令或者NTLM杂碎的实现方法,开源代码SharpRDPCheck,分享程序实现NTLM杂碎登录的细节,最后介绍通过日志检测RDP爆破行为的方法。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子