SMB攻击的一些资料.docx
《SMB攻击的一些资料.docx》由会员分享,可在线阅读,更多相关《SMB攻击的一些资料.docx(30页珍藏版)》请在冰点文库上搜索。
![SMB攻击的一些资料.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/0b850b0b-58b6-4a3d-b621-6415f611e03d/0b850b0b-58b6-4a3d-b621-6415f611e03d1.gif)
SMB攻击的一些资料
SMB攻击的一些资料
--[目录
1-介绍
2-什么是SMB/CIFS?
3-会话的建立
客户端如何与服务器建立一个SMB会话?
4-SMB的安全等级
5-密码
6-几种SMB数据报的描述
6.1-SMB数据报的常规特征
6.2-NETBIOS与SMB
6.3-SMB的基础报文头部
6.4-重要SMB命令的描述
6.5-我们如何才能将本应该加密的SMB密码清楚的还原?
6.6-Maninthemiddle攻击
6.7-注意Windows2k/XP里基于TCP的SMB操作
7-事物处理子协议与RAP命令
7.1-事物处理子协议
7.2-RAP命令
8-使用RAP命令列出服务器上所有可得的共享列表
8.1-Tconx数据报
8.2-RAP命令“NetshareEnum”的解释
9-结论
10-参考
11-感谢
--[1-介绍
本文,我将向大家解释什么是CIFS和SMB,它们如何工作和这些协议里一些共同的不安全隐患。
本文将会成为学习微软网络知识的一个有用资源。
SMB协议是一个在LAN中非常通用的协议了。
我为
大家提供了一个关于如何操作SMB例子的源代码。
你将会学习到在所有SMB密码都是加密的情况下,如何使用ARP毒药来获得清晰的SMB密码(不需要
粗鲁与暴力)。
你将会理解SMB与NETBIOS之间的关系。
你同样会学到什么是微软远程管理协议(RAP),
以及如何使用它来扫描远程SMB服务器上的共享资源。
本文提供的程序和资料都只有一个教育性的目的。
你将用它来做的任何事情与我无关。
--[2-什么是SMB/CIFS?
依照微软的意思,CIFS是为客户系统在网络上向服务器请求文件和打印服务的开放跨平台的运行
机制。
它是建立在广泛应用于个人电脑和工作站等操作系统的标准服务器消息块(SMB)协议。
实际上,SMB是一个通过网络在共享文件,设备,命名管道和邮槽之间操作数据的协议。
CIFS是
SMB的一个公共版本。
SMB客户端的可用系统:
forMicrosoft:
Windows95,Windowsforworkgroups3.x,WindowsNT,2000andXP
forLinux:
SmblientfromSamba,SmbfsforLinux
SMB服务器:
Samba
MicrosoftWindowsforWorkgroups3.x
MicrosoftWindows95
MicrosoftWindowsNT
ThePATHWORKSfamilyofserversfromDigital
LANManagerforOS/2,SCO,etc
VisionFSfromSCO
TotalNETAdvancedServerfromSyntax
AdvancedServerforUNIXfromAT&T(NCR?
)
LANServerforOS/2fromIBM.
--[3会话的建立
注意:
SMB协议已经被发展成为可以运行于DOS操作系统,因此字节顺序将会和网络顺序相反。
SMB可以运行在TCP/IP,NetBEUI,DECnet和IPX/SPX协议之上。
如果SMB执行于TCP/IP,DECnet
或则是NetBEUI之上,那么NETBIOS名字必须被使用。
我将会在第六章向大家介绍什么是NETBIOS。
但是现在,你必须知道NETBIOS名字用来在网络上鉴
别一台计算机。
SMB技术的发展开始于八十年代,出现过很多版本的SMB协议。
但是最通用的(在Windows98,
WindowsNT,Windows2000andXP)是NTLM0.12版本。
本文是基于NTLM0.12版本之上的。
你必须知道一个SMB域名是用来鉴别一个SMB服务器上的一组资源的(用户,打印机,文件……)。
那么一个客户端是如何与一个服务器建立SMB会话的呢?
让我们假设一个这样的环境:
一个客户端希望访问一台服务器上的特定资源。
1-开始于客户端向服务器请求一个NETBIOS会话。
客户端发送它的已编码的NETBIOS名字到SMB
服务器(它们在139端口监听连接请求)。
服务器接收到NETBIOS名字后回复一个NETBIOS会话数据报给
有效的会话连接。
客户端在建立了连接之后才能进入访问。
2-客户端发送一个SMBnegprot请求数据报(negprot是磋商协议“negotiateprotocol”的
简写)。
客户端列出了它所支持的所有SMB协议版本。
3-通过磋商之后,客户端进程向服务器发起一个用户或共享的认证。
(下一章中我们将会看到
共享认证和用户认证之间的不同)。
这个过程是通过发送SesssetupX(SesssetupX是会话建立和X“SessionsetupandX”的简称)
请求数据报实现的。
客户端发送一对登录名/密码或一个简单密码到服务器,然后服务器通过发送一个
SesssetupX应答数据报来允许或拒绝本次连接。
4-好了,在客户端完成了磋商和认证之后,它会发送一个TconX数据报并列出它想访问的特定
网络资源的名称,之后服务器会发送一个TconX应答数据报以表示此次连接是否接受或拒绝。
netbiossessionrequest
(netbiosname)
[client]--------------------------->[server]
1)
netbiossessiongranted
[client]<--------------------------[server]
SMBnegprotrequest
[client]--------------------------->[server]
2)
SMBnegprotreply
[client]<--------------------------[server]
SMBsesssetupXrequest
[client]--------------------------->[server]
3)
SMBsesssetupXreply
[client]<--------------------------[server]
SMBTconXrequest
[client]--------------------------->[server]
4)
SMBTconXreply
[client]<--------------------------[server]
关于每个数据报的详细描述在第六章里有详细的讲解。
--[4-SMB的安全等级
在SMB中有两种安全模式:
第一种是“共享”级的安全模式。
这种安全模式需要一个访问网络上共享资源的密码。
用户通过
这个正确的密码来访问网络资源(IPC,磁盘,打印机)。
他可以是网络上任何一个知道共享资源服务
器名字的用户。
第二种是“用户”级的安全模式。
这是在第一种模式上的增强版。
它坚持使用一对登录名/密码来
访问共享资源。
所以如果一个用户想访问这种类型的共享资源,就必须同时提供登录名和密码。
这种
模式对了解用户如何使用共享资源是很有帮助的。
--[5-密码
在SMB协议中,如果你想进行一次在服务器上的请求认证,你的密码可以以原码或加密后的形式发
送到服务器端。
如果服务器支持加密属性,客户端必须发送一个应答信号。
在negprot应答数据报中,
服务器会给客户端发送一个密钥。
然后,客户端将密码加密并通过SesssetupX请求数据报发送到服务
器端。
服务器将会核查密码的有效性,并由此允许或拒绝客户端的访问。
你必须知道一个SMB密码(未加密)的最大长度是14位。
密钥的长度一般为8位,加密过后的口令长
度为24位。
在ANSI密码中,密码中的所有位都转换成大写的形式然后再加密。
密码是以DEC编码方式进行加密的。
--[6-几种SMB数据报的描述
这一部分,我将会对SMB协议中涉及到的大多数重要的数据报类型进行分析。
我知道这或许很烦,
不过这是了解SMB的工作机制和进行攻击的基础。
我将会解释什么是数据报中最重要的类型。
每种命
令都对应两种数据报类型,请求数据报和应答数据报。
----[6.1-SMB数据报的常规特征
通常情况下,SMB运行于TCP/IP协议组之上。
那么我们就假设SMB运行在TCP层之上。
在TCP层上面,
你常常会发现NETBIOS(NBT)头部。
在NBT上面,有SMB基础报文头部。
在SMB基础报文头部之上,就是
另一种依赖于特定请求命令的头部。
----------------------
│TCPHeader│
----------------------
│NETBIOSHeader│
----------------------
│SMBBaseHeader│
----------------------
│SMBCommandHeader│
----------------------
│DATA│
----------------------
“SMBBaseheader”包含了几种信息,像接收缓冲区的长度,允许的最大连接数目……它也包
含了一个鉴别请求命令的数字。
“SMBCommandheader”包含了所有的请求命令的参数(像磋商协议版本命令……)。
“DATA”容纳了请求命令的数据。
我们把“SMBpacket”看成:
NETBIOSHeader+SMBBaseHeader+SMBCommandHeader
+DATA。
注意:
我将使用这个定义:
typedefunsignedcharUCHAR;//8unsignedbits
typedefunsignedshortUSHORT;//16unsignedbits
typedefunsignedlongULONG;//32unsignedbits
而STRING被定义为以空字符结束的ASCII字符串。
----[6.2-NETBIOS与SMB
NETBIOS(NETworkBasicInputandOutputSystem)在微软的网络系统中被广泛使用。
它是
一个软件接口和命名系统。
每台主机都有一个长度为15个字符的NETBIOS名字,且第十六个字符用来
标志主机的类型(域名服务器,工作站……)。
第十六个字符的选择:
0x00基础电脑,工作站。
0x20资源共享服务器。
这还有一些其他的值可选,不过我们对这两个最感兴趣。
第一个(0x00)鉴定一台工作站,第二个
(0x20)鉴定服务器。
在一个SMB数据报中,NETBIOS头部对应NETBIOS会话头部。
定义如下:
UCHARType;//Typeofthepacket
UCHARFlags;//Flags
USHORTLength;//Countofdatabytes(netbiosheadernotincluded)
“Flags”域的值总是被置为0。
“Type”域有几种可能的选择:
0x81对应一个NETBIOS会话请求。
这个代码在客户端发送它的NETBIOS名字到服务器是使用。
0x82对应一个NETBIOS会话应答。
这个代码在服务器向客户端批准NETBIOS会话时使用。
0x00对应一个会话消息。
这个代码总是在SMB会话中被使用。
“Length”域包含了数据字节的长度(NETBIOS头部没有被包含在内)。
数据包含在NETBIOS头部
以上的所有部分(它可能是SMBBaseHeader+SMBCommandHeader+DATA或NETBIOS名字)。
NETBIOS名字与编码。
NETBIOS编码名字的长度为32字节。
NETBIOS名字总是以大写的形式存在的。
编码一个NETBIOS名字非常的简单。
例如我的计算机的NETBIOS名字是“BILL”,它是一个工作
站,所以它的第十六个字符为“0x00”。
首先,如果一个NETBIOS名字比15字节短,就会在右边补填上空格。
“BILL“
十六进制为:
0x420x490x4c0x4c0x200x20......0x00
每个字节都分裂为4位一组:
0x40x20x40x90x40xc0x40xc0x20x0.......
而且每个4位都要添加ASCII码‘A’的值(0x41)。
0x4+0x41=0x45->ASCIIvalue=E
0x2+0x41=0x43->ASCIIvalue=C
……
最后NETBIOS名字被编码为32字节长。
注意:
SMB可以直接运行于TCP之上而无须NBT(在Windows2k和XP上它们使用455端口)。
此时,
NETBIOS名字没有被限制在15字符以内。
----[6.3-SMB的基础报文头部
这个头部在所有的SMB数据报中都会使用,以下是它的定义:
UCHARProtocol[4];//Contains0xFF,'SMB'
UCHARCommand;//Commandcode
union{
struct{
UCHARErrorClass;//Errorclass
UCHARReserved;//Reservedforfutureuse
USHORTError;//Errorcode
}DosError;
ULONGStatus;//32-biterrorcode
}Status;
UCHARFlags;//Flags
USHORTFlags2;//Moreflags
union{
USHORTPad[6];//Ensuresectionis12byteslong
struct{
USHORTPidHigh;//HighpartofPID
ULONGUnused;//Notused
ULONGUnused2;
}Extra;
};
USHORTTid;//Treeidentifier
USHORTPid;//Caller'sprocessid
USHORTUid;//Unauthenticateduserid
USHORTMid;//multiplexid
UCHARWordCount;//Countofparameterwords
USHORTParameterWords[WordCount];//Theparameterwords
USHORTByteCount;//Countofbytes
UCHARBuffer[ByteCount];//Thebytes
“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请求与应答数据报的定义:
Requestheader
UCHARWordCount;//Countofparameterwords=0
USHORTByteCount;//Countofdatabytes
struct{
UCHARBufferFormat;//0x02--Dialect
UCHARDialectName[];//ASCIInull-terminatedstring
}Dialects[];
这个数据报包括客户端向服务器发送的它所支持SMB协议的所有版本信息。
有三件事要说,在这个报文中:
“WordCount”域总是被置为零;
“ByteCount”域等于结构“Dialects”的长度;
“BufferFormat”域总是等于0x02。
“DialectName”包含SMB协议支持的几种版本信息。
应答数据报头部:
UCHARWordCount;Countofparameterwords=17
USHORTDialectIndex;Indexofselecteddialect
UCHARSecurityMode;Securitymode:
bit0:
0=share,1=user
bit1:
1=encryptpasswords
USHORTMaxMpxCount;Maxpendingmultiplexedrequests
USHORTMaxNumberVcs;MaxVCsbetweenclientandserver
ULONGMaxBufferSize;Maxtransmitbuffersize
ULONGMaxRawSize;Maximumrawbuffersize
ULONGSessionKey;Uniquetokenidentifyingthissession
ULONGCapabilities;Servercapabilities
ULONGSystemTimeLow;System(UTC)timeoftheserver(low).
ULONGSystemTimeHigh;System(UTC)timeoftheserver(high).
USHORTServerTimeZone;Timezoneofserver(minfromUTC)
UCHAREncryptionKeyLength;Lengthofencryptionkey.
USHORTByteCount;Countofdatabytes
UCHAREncryptionKey[];Thechallengeencryptionkey
UCHAROemDomainName[];Thenameofthedomain(inOEMchars)
这个数据报由服务器发出,它包含SMB协议支持的版本列表,服务器的SMB域名,如果需要还要
包含密钥。
重要的:
第一个感兴趣的域是“SecurityMode”位。
如果第0位被选中,那么我们就选择了用户安全模式;
如果没有,则拥有共享安全模式。
如果第1位被选中,密码就使用DEC加密算法进行编码。
“SessionKey”域被用来鉴别会话。
一个会话有单一的一个会话钥匙。
“Capabilities”域表明服务器是否支持UNICODE字符串,或NTLM0.12特别的命令……
数据被放在报文头部的结束处。
通过一个negprot应答,这些数据与“EncryptionKey”和
“OemDomainName”相对应。
“OemDomainName”域的长度等于(Bytecount-EncryptoinKeyLength)。
“OemDomainName”字符串包含服务器的SMB域名。
SesssetupX(SessionsetupandX)
SesssetupX数据报被用来处理用户鉴别,或在你访问资源时提供一个密码。
SesssetupX的命令代码是:
0x73。
请求数据报头部:
UCHARWordCount;Countofparameterwords=13
UCHARAndXCommand;Secondary(X)command;0xFF=none
UCHARAndXReserved;Reserved(mustbe0)
USHORTAndXOffset;OffsettonextcommandWordCount
USHORTMaxBufferSize;Client'smaximumbuffersize
USHORTMaxMpxCount;Actualmaximummultiplexedpendingrequests
USHORTVcNumber;0=first(only),nonzero=additionalVCnumber
ULONGSessionKey;Sessionkey(validiffVcNumber!
=0)
USHORTCaseInsensitivePasswordLength;Accountpasswordsize,ANSI
USHORTCaseSensitivePasswordLength;Accountpasswordsize,Unicode
ULONGReserved;mustbe0
ULONGCapabilities;Clientcapabilities
USHORTByteCount;Countofdatabytes;min=0
UCHARCaseInsensitivePassword[];AccountPassword,ANSI
UCHARCaseSensitivePassword[];AccountPassword,Unicode
STRINGAccountName[];AccountName,Unicode
STRINGPrimaryDomain[];Client'sprimarydomain,Unicode
STRINGNativeOS[];Client'snativeoperatingsystem,Unicode
STRINGNativeLanMan[];Client'snativeLANManagertype,Unicode
这个报文提供很多关于客户端系统的信息。
“MaxBufferSize”域非常的重要,它提供客户端可以接收数据报的最大长度。
如果你将这个域
设置为零,那么你不会接收到任何类型的数据。
这个数据报内,有几个字符串。
最总要的是“CaseSensitivePassword”(UNICODE编码的密码)
域和“CaseInsensitivePassword”(ANSI编码的密码)域。
这两个域中的一个被使用,它取决于服务器是否支持UNICODE编码