--[ 5 - 密码
在SMB协议中,如果你想进行一次在服务器上的请求认证,你的密码可以以原码或加密后的形式发
送到服务器端。如果服务器支持加密属性,客户端必须发送一个应答信号。在negprot应答数据报中,
器端。服务器将会核查密码的有效性,并由此允许或拒绝客户端的访问。
你必须知道一个SMB密码(未加密)的最大长度是14位。密钥的长度一般为8位,加密过后的口令长
度为24位。在ANSI密码中,密码中的所有位都转换成大写的形式然后再加密。
密码是以DEC编码方式进行加密的。
--[ 6 - 几种SMB数据报的描述
这一部分,我将会对SMB协议中涉及到的大多数重要的数据报类型进行分析。我知道这或许很烦,
不过这是了解SMB的工作机制和进行攻击的基础。我将会解释什么是数据报中最重要的类型。每种命
令都对应两种数据报类型,请求数据报和应答数据报。
----[ 6.1 - SMB数据报的常规特征
通常情况下,SMB运行于TCP/IP协议组之上。那么我们就假设SMB运行在TCP层之上。在TCP层上面,
你常常会发现NETBIOS(NBT)头部。在NBT上面,有SMB基础报文头部。在SMB基础报文头部之上,就是
另一种依赖于特定请求命令的头部。
----------------------
│ TCP Header │
----------------------
│ NETBIOS Header │
----------------------
│ SMB Base Header │
----------------------
│ SMB Command Header │
----------------------
│ DATA │
----------------------
“SMB Base header”包含了几种信息,像接收缓冲区的长度,允许的最大连接数目……它也包
含了一个鉴别请求命令的数字。
“SMB Command header”包含了所有的请求命令的参数(像磋商协议版本命令……)。
“DATA”容纳了请求命令的数据。
我们把“SMB packet”看成:NETBIOS Header + SMB Base Header + SMB Command Header
+ DATA。
注意:我将使用这个定义:
typedef unsigned char UCHAR; // 8 unsigned bits
typedef unsigned short USHORT; // 16 unsigned bits
typedef unsigned long ULONG; // 32 unsigned bits
而STRING被定义为以空字符结束的ASCII字符串。
----[ 6.2 - NETBIOS与SMB
NETBIOS(NETwork Basic Input and Output System)在微软的网络系统中被广泛使用。它是
一个软件接口和命名系统。每台主机都有一个长度为15个字符的NETBIOS名字,且第十六个字符用来
标志主机的类型(域名服务器,工作站……)。
第十六个字符的选择:
0x00 基础电脑,工作站。
0x20 资源共享服务器。
这还有一些其他的值可选,不过我们对这两个最感兴趣。第一个(0x00)鉴定一台工作站,第二个
(0x20)鉴定服务器。
在一个SMB数据报中,NETBIOS头部对应NETBIOS会话头部。
定义如下:
UCHAR Type; // Type of the packet
UCHAR Flags; // Flags
USHORT Length; // Count of data bytes (netbios header not included)
“Flags”域的值总是被置为0。
“Type”域有几种可能的选择:
0x81 对应一个NETBIOS会话请求。这个代码在客户端发送它的NETBIOS名字到服务器是使用。
0x82 对应一个NETBIOS会话应答。这个代码在服务器向客户端批准NETBIOS会话时使用。
0x00 对应一个会话消息。这个代码总是在SMB会话中被使用。
“Length”域包含了数据字节的长度(NETBIOS头部没有被包含在内)。数据包含在NETBIOS头部
以上的所有部分(它可能是 SMB Base Header + SMB Command Header + DATA 或 NETBIOS名字)。
NETBIOS名字与编码。
NETBIOS编码名字的长度为32字节。
NETBIOS名字总是以大写的形式存在的。
编码一个NETBIOS名字非常的简单。例如我的计算机的NETBIOS名字是“BILL”,它是一个工作
站,所以它的第十六个字符为“0x00”。
首先,如果一个NETBIOS名字比15字节短,就会在右边补填上空格。
“BILL “
十六进制为: 0x42 0x49 0x4c 0x4c 0x20 0x20 ......0x00
每个字节都分裂为4位一组:
0x4 0x2 0x4 0x9 0x4 0xc 0x4 0xc 0x2 0x0 .......
而且每个4位都要添加ASCII码‘A’的值(0x41)。
0x4 + 0x41 = 0x45 -> ASCII value = E
0x2 + 0x41 = 0x43 -> ASCII value = C
……
最后NETBIOS名字被编码为32字节长。
注意:
SMB可以直接运行于TCP之上而无须NBT(在Windows 2k和XP上它们使用455端口)。此时,
NETBIOS名字没有被限制在15字符以内。
----[ 6.3 - SMB的基础报文头部
这个头部在所有的SMB数据报中都会使用,以下是它的定义:
UCHAR Protocol[4]; // Contains 0xFF,'SMB'
UCHAR Command; // Command code
union {
struct {
UCHAR ErrorClass; // Error class
UCHAR Reserved; // Reserved for future use
USHORT Error; // Error code
} DosError;
ULONG Status; // 32-bit error code
} Status;
UCHAR Flags; // Flags
USHORT Flags2; // More flags
union {
USHORT Pad[6]; // Ensure section is 12 bytes long
struct {
USHORT PidHigh; // High part of PID
ULONG Unused; // Not used
ULONG Unused2;
} Extra;
};
USHORT Tid; // Tree identifier
USHORT Pid; // Caller's process id
USHORT Uid; // Unauthenticated user id
USHORT Mid; // multiplex id
UCHAR WordCount; // Count of parameter words
USHORT ParameterWords[ WordCount ]; // The parameter words
USHORT ByteCount; // Count of bytes
UCHAR Buffer[ ByteCount ]; // The bytes
“Protocol”域包含协议(SMB)的名字,前面放了一个0xFF。
“Command”域包含请求命令的数据。例如0x72就是“磋商协议”命令。
“Tid”域在客户端成功和一台SMB服务器上的资源建立连接后被使用的。TID数字用来鉴别资源。
“Pid”域在客户端成功在服务器上创建一个进程是使用。PID数字用来鉴别进程。
“Uid”域在一个用户被成功通过验证后被使用。UID数字用来鉴别用户。
“Mid”域在客户端拥有几个请求(进程,线程,文件访问……)是和PID同时使用。
“Flags”域也很重要,如果第15位置1,则使用UNICODE编码。
----[ 6.4 - 重要SMB命令的描述
SMB 磋商协议(negprot)
磋商协议在SMB会话建立连接的第一步时使用。
在SMB基础报文头部中的“Command”域被填充为:0x72。
下面是negprot请求与应答数据报的定义:
Request header
UCHAR WordCount; //Count of parameter words = 0
USHORT ByteCount; //Count of data bytes
struct {
UCHAR BufferFormat; //0x02 -- Dialect
UCHAR DialectName[]; //ASCII null-terminated string
} Dialects[];
这个数据报包括客户端向服务器发送的它所支持SMB协议的所有版本信息。
有三件事要说,在这个报文中:
“WordCount”域总是被置为零;
“ByteCount”域等于结构“Dialects”的长度;
“BufferFormat”域总是等于0x02。
“DialectName”包含SMB协议支持的几种版本信息。
应答数据报头部:
UCHAR WordCount; Count of parameter words = 17
USHORT DialectIndex; Index of selected dialect
UCHAR SecurityMode; Security mode:
bit 0: 0 = share, 1 = user
bit 1: 1 = encrypt passwords
USHORT MaxMpxCount; Max pending multiplexed requests
USHORT MaxNumberVcs; Max VCs between client and server
ULONG MaxBufferSize; Max transmit buffer size
ULONG MaxRawSize; Maximum raw buffer size
ULONG SessionKey; Unique token identifying this session
ULONG Capabilities; Server capabilities
ULONG SystemTimeLow; System (UTC) time of the server (low).
ULONG SystemTimeHigh; System (UTC) time of the server (high).
USHORT ServerTimeZone; Time zone of server (min from UTC)
UCHAR EncryptionKeyLength; Length of encryption key.
USHORT ByteCount; Count of data bytes
UCHAR EncryptionKey[]; The challenge encryption key
UCHAR OemDomainName[]; The name of the domain (in OEM chars)
这个数据报由服务器发出,它包含SMB协议支持的版本列表,服务器的SMB域名,如果需要还要
包含密钥。
重要的:
第一个感兴趣的域是“SecurityMode”位。如果第0位被选中,那么我们就选择了用户安全模式;
如果没有,则拥有共享安全模式。如果第1位被选中,密码就使用DEC加密算法进行编码。
“SessionKey”域被用来鉴别会话。一个会话有单一的一个会话钥匙。
“Capabilities”域表明服务器是否支持UNICODE字符串,或NT LM 0.12特别的命令……
数据被放在报文头部的结束处。通过一个negprot应答,这些数据与“EncryptionKey”和
“OemDomainName”相对应。
“OemDomainName”域的长度等于(Bytecount - EncryptoinKeyLength)。
“OemDomainName”字符串包含服务器的SMB域名。
SesssetupX(Session setup and X)
SesssetupX数据报被用来处理用户鉴别,或在你访问资源时提供一个密码。
SesssetupX的命令代码是:0x73。
请求数据报头部:
UCHAR WordCount; Count of parameter words = 13
UCHAR AndXCommand; Secondary (X) command; 0xFF = none
UCHAR AndXReserved; Reserved (must be 0)
USHORT AndXOffset; Offset to next command WordCount
USHORT MaxBufferSize; Client's maximum buffer size
USHORT MaxMpxCount; Actual maximum multiplexed pending requests
USHORT VcNumber; 0=first (only),nonzero=additional VC number
ULONG SessionKey; Session key (valid iff VcNumber != 0)
USHORT CaseInsensitivePasswordLength; Account password size, ANSI
USHORT CaseSensitivePasswordLength; Account password size, Unicode
ULONG Reserved; must be 0
ULONG Capabilities; Client capabilities
USHORT ByteCount; Count of data bytes; min = 0
UCHAR CaseInsensitivePassword[]; Account Password, ANSI
UCHAR CaseSensitivePassword[]; Account Password, Unicode
STRING AccountName[]; Account Name, Unicode
STRING PrimaryDomain[]; Client's primary domain, Unicode
STRING NativeOS[]; Client's native operating system, Unicode
STRING NativeLanMan[]; Client's native LAN Manager type, Unicode
这个报文提供很多关于客户端系统的信息。
收藏地址:http://www.qqread.com/net-saft/f707113081.html相关专题
- DoS 拒绝服务攻击专题 (1215篇文章)
- 脚本攻击和防范 (2353篇文章)
- DDoS攻击防御与分析 (1480篇文章)
- ARP攻击防范与解决方案 (1702篇文章)
- 端口·木马·安全·扫描应用知识 (980次浏览)
- FTP服务器-架设-配置-漏洞-管理-安全精通篇 (386次浏览)
- FTP服务器架设--安全篇 (189次浏览)
- Win2000安全设置手册 (84次浏览)
- Apache服务器的安全性及实现 (59次浏览)
- 全方位堵住Windows 2003的安全隐患 (51次浏览)
- 让我们认识病毒命名规则 (25次浏览)
- U盘病毒原理 (17次浏览)
- Windows系统用户摆脱黑客攻击的方法 (16次浏览)
- 反垃圾邮件技术:九个方法告别垃圾邮件 (16次浏览)



