跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

渗透技能——用远程桌面协议传递哈希


轩辕三官

推荐的帖子

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爆破行为的方法。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...