汇编网首页登录博客注册
240420643的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏

[2010-03-31 10:45] 《网络对抗原理》第十一章笔记

11.2.9 抓取用户输入口令
1.获取口令的原理
Edit控件时windows的一个标准控件,当把其password属性设为true时,就会将输入的内容屏蔽为星号,从而达到保护的目的。虽然我们看来都是星号,但程序中的edit空间实际仍是用户输入的密码,应用程序可以获取该控件中的密码,其他应用程序也可以通过向其发送vm_gettext或em_getline消息来获取edit控件并且具有es_password属性时,则通过sendmessage向此窗口发送wm_gettext或em_getline消息,这样edit编辑框中的内容就一目了然了。
2.软件实现
首先要取得当前的窗口,并判断是否是edit控件,一般都通过鼠标来指定要探测的窗口。例如,在vm_mousemove消息的响应函数中进行判断,其代码片段如下:
 
上述代码中值得注意的有以下几个关键地方:
 
 
这三句代码可以获取当前鼠标位置所在窗口的窗口句柄,在sendmessage中要用到的。 
这便是真正起作用的sendmessage了,其第一个参数指定了要接收的窗口句柄,我们已经通过上面的代码获取到了,第二个参数就是让edit控件返回字符的wm_gettext消息了,并将得到的内容保存在sztext中。
3.防范措施
从以上分析我们可以看出,edit控件的漏洞主要在于没有对发送vm_gettext或em_getline消息者的身份进行检查,只要能找到edit窗口句柄,任何进程都可获取其内容。所以必须对发送消息者的身份进行验证,这里给出一种方法来验证发送消息者的身份是否合法。
创建新cedit类
从cedit继承一个子类cpasswordexit,声明全局变量g_bsenderidentity表明消息发送者的身份:
Bool g_bsenderidentity
然后响应cwnd的虚函数defwindowproc,在这个回调函数中进行身份认证。
 
在数据输入对话框中做些处理
在对话框中声明一个类成员m_edtpassword:
Cpasswordedit m_edtpassword;
然后再对话框的oninitdialog()中加入如下代码:
M_edtpassword.subclassdlgitem(IDC_EDIT_PASSWORD,this);
将控制与新类做关联。之后要在对话框的数据交换函数中将身份设为合法:
 
这样,password输入框就拥有了合法身份,会受到保护。
11.3  SMB/NETBIOS协议攻击
11.3.1  SMB/CIFS简介
CIFS(common internet file system)是为客户系统在网络上向服务器请求文件和打印服务的开放跨平台的运行机制。它是建立在广泛应用于个人电脑和工作站等操作系统的标准服务器模块(smb,server message block)协议之上。
实际上,SMB是一种通过网络在共享文件、设备、命名管道和邮槽之间操作数据的协议。CIFS是SMB的一个公共版本。Windows系统下的SMB可以运行在TCP/IP、netbeui、decnet和IPX/SPX协议之上。目前运行在端口TCP/139或端口TCP/445上,这主要依赖于NETBIOS是否运行在TCP/IP协议之上。
SMB的工作原理
图11-13所示为SMB工作机制。
 
图11-13给出了SMB工作机制。一般来说SMB是一种请求——响应协议:客户发送请求,服务器返回应答。客户与服务器建立SMB会话主要包括以下几个步骤:
首先客户端向服务器请求建立一个NetBIOS会话。客户端发送自己编码后的NetBIOS名字到SMB服务器(在139号端口监听连接请求)。服务器接收到NetBIOS名字后回复一个NetBIOS会话数据包以表示会话连接的有效性,即客户端向SMB服务器表明自己的身份。
客户端发送一个SMB negprot请求数据包(negprot代表是协商协议“negotiate protocol”)。客户端列出了它所支持的所有SMB协议版本。然后,服务器发送一个smb negprot响应包,内容包括SMB域名,最大连接数,支持的SMB协议版本等。
通过协议协商之后,客户端进程向服务器发起一个用户或共享的认证。这个过程是通过发送sesssetupX(sesssetupX表示会话建立)和X请求数据包实现的。客户端发送一对登录名/口令或一个口令到服务器,然后服务器通过发送一个sesssetupX应答数据包来允许或拒绝本次连接。
在客户端完成了协商和认证之后,它会发送一个Tconx数据包并列出它想访问的特定网络资源的名称,之后服务器会发送一个Tconx应答数据包,用以表示此次连接是否接受或拒绝。
SMB的安全等级
在SMB中有两种安全模式:
第一种是“共享”级的安全模式。这种安全模式把一个网络上的共享资源同一个口令关联起来。用户通过这个正确的口令来访问网络资源(IPC、磁盘和打印机)。用户可以是网络上任何一个知道共享资源服务器名字的用户。
第二种是“用户”级的安全模式。这是对第一种模式的增强。它是把一对登录名/口令同共享资源关联起来,所以如果一个用户想访问这种类型的共享资源,就必须同时提供用户名和口令。这种模式对审计用户如何使用共享资源是很有帮助的。
口令
在SMB协议中,客户在请求认证时所使用的口令可以以明文或加密的形式发送到服务器端。如果服务器支持加密,客户端必须对挑战进行应答。在negprot应答数据包中,服务器会给客户端发送一个加密密钥。然后,客户端将口令加密并通过sesssetupX请求数据包发送到服务器端。服务器将会核查口令的有效性,并由此允许或拒绝客户端的访问。
一个SMB口令(未加密)的最大长度是14个字节。加密密钥的长度一般为8字节,加密后的口令长度为24字节。对于标准的字符口令,口令中的所有自己都转换成大写的形式然后再加密。口令用分组DES加密算法加密。
11.3.2 SMB数据包
这一部分,将对SMB协议中涉及到的大多数重要的数据包类型进行分析。它们是了解SMB的工作机制和实施攻击的基础。每种命令都对应两种数据包类型:请求数据包和应答数据包。
SMB协议概述
通常情况下,SMB运行于TCP/IP协议组之上。我们在此假设SMB运行在TCP层之上。在TCP层上面,你常常会发现NetBIOS(NBT)头部。在NBT上面,有SMB基础报文头部。在SMB基础报文头部之上,是另一种依赖于特定请求命令的报文头,如图
 
“SMB base header”包含了接收缓冲区的大小、允许的最大连接数目等消息。它也包含了以个鉴别请求命令用的数字。
“SMB command header”包含了请求命令的所有参数。
“DATA”包含了请求命令的数据。
我们把SMB包认为由以下四部分组成: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字符串。
NetBIOS与SMB
NetBIOS(network basic input and output system)在微软的网络系统中被广泛使用。它是一个软件接口和命令系统。每台主机都有一个长度为15个字符的NetBIOS名字,第十六个字符用来标识主机的类型(域名服务器,工作站等)。
第十六个字符的值可以是:0x00计算机,工作站;0x20资源共享服务器。
还有一些其他的值就不在此讨论了。
在一个SMB包中,NetBIOS头对应NetBIOS会话头,定义如下:
UCHAR type;包的类型
UCHAR flags;标志
USHORT length;数据的字节长度(不包括NetBIOS头)
其中,“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 0x20…0x00
每个字节又都分裂为4位一组:
 
然后每个4位都和ASCII码“A”的值(0x41)相加:
 
最后NetBIOS名字被编码为32字节长。
【注意】SMB可以直接运行于TCP之上而无需NBT(在windows 2000和XP上它们使用455端口)。此时,NetBIOS名字没有被限制在15字符以内,更多信息可以参考RFC1001和RFC1002
11.3.3 SMB的基础报文头部
这个头部在所有的SMB数据报中都会使用,以下是它的定义。
 
“protocol”域包含协议(SMB)的名字,前面放了以个0xff。
“command”域包含请求命令的值。例如,0x72就是“协商协议”命令。
“Tid”域在客户端成功和一台SMB服务器上的资源建立连接后被使用,tid号用来鉴别资源。
“pid”域表示客户端成功地在服务器上创建了一个进程,pid数字用来标识该进程。
“UID”域表示一个用户成功通过服务器的验证,uid数字用来标识用户。
“MID”域和pid同时使用以区别客户端对同一个服务器的多个请求(进程、线程、文件访问等)。
“flags2”域也很重要,如果第15位置1,则字符串都使用Unicode编码。
11.3.4 重要SMB命令
1. SMB协商协议
协商协议(negprot)命令在SMB会话建立过程的第一步中使用。
在SMB基础报文头部中的“command”域被填充为0x72。下面是negprot请求与应答数据包的定义。
 
这个数据包用于客户端向服务器发送的它所支持SMB协议的所有版本信息。
在这个报文中:“wordcount”域总是被置为0;“bytecount”域等于结构“dialects”的长度;“bufferformat”域总是等于0x02。“dialectname”包含SMB协议支持的几种版本信息。
 
 
这个数据报由服务器发出,它包含支持的SMB协议版本列表,服务器的SMB域名,如果需要还要包含一个加密密钥。
最重要的域是“securitymode”位。如果第0位被置位,那么我们就选择了用户安全模式;如果没有,则使用共享安全模式。如果第1位被选中,口令就使用分组DES加密算法加密。
“sessionkey”域被用来识别会话。一个会话有单一的一个会话密钥。
“capabilities”域表明服务器是否支持unicode字符串,或NTLM 0.12的特别命令。
数据被放在报文头部的最后。在一个netgprot应答中,这些数据与“encryptionkey”和“oemdomainname”相对应。这两个域的总长度由“bytecount”给出。
“oemdomainname”字符串包含服务器的SMB域名。其长度等于bytecountencryptionkeylength。
2.sesssetupX
Sesssetup数据报被用来处理用户鉴别,或在你访问资源时提供一个密码。
SesssetupX的命令代码是:0x73。
 
这个报文提供了很多关于客户端系统的信息。
“maxbuffersize”域非常重要,它提供客户端可以接受的数据报最大长度。如果你将这个域设置为0,那么你将接收不到任何类型的数据。
“casesensitivepassword”(Unicode编码的口令)域和“caseinsensitivepassword”(ANSI编码的口令)域中的一个被使用,它取决于服务器是否支持unicode编码(在协商协议应答报文中描述)。口令的长度保存在“caseinsesitivepasswordlength”或“casesensitivepasswordlength”里。数据的长度保存在“bytecount”域中。

 
在这个数据报文里也包含了很多信息:操作系统类型,SMB服务器版本信息和服务器的域名。如果连接失败,那么在nativeOS、nativelanman和primarydomain里面讲没有任何内容。
有关SMB协议的更多细节,可以参考网站:http://www.snia.org/tech_activities/CIFS/CIFS-TR-1p00_FINAL.PDF
11.3.5 还原本应加密的SMB密码
在会话建立过程当中,口令是在SMB sesssetupX会话阶段被发送到服务器的。而SMB negprot应答包包含了一个“securitymode”字段,该字段决定是否允许口令加密。因此,如果你想在所有内容都加密的情况下获得一个明文口令,有两种可能的选择。
第一种方法是得到加密密钥和加密过的口令,然后暴力破解。一些破解程序如l0phtcrack(附SMBGrinder),dsniff或readsmb2都可以嗅探到SMB加密后的口令。
第二种方法是劫持(Hijack)连接,并使客户端确信口令用明文方式进行传送。
第一种方法我们已经在前面几节讨论过,下面主要讨论第二种方法。
如果服务器的配置是需要对口令进行加密,那么SMB negprot应答数据包就会选中“securitymode”的第一位。但是,如果攻击者赶在服务器之前给客户发送一个negprot应答数据包,且相应的第一位被置0,那么口令就会以明文的形式出现在sesssetupX请求报文。口令劫持的攻击场景如图11-15所示。
解决方法就是使用ARP毒药(ARP-poisoning)来避免上面的所有问题。有了ARP毒药,被欺骗主机之间的所有通信都会首先发送给中间的攻击者。这种攻击就是中间人攻击(man in the middle)。
 
中间人攻击
首先我们利用ARP毒药,使得客户端和服务器之间的通信杯重定向到攻击者。
客户端向服务器请求一个SMB会话,它会向服务器的139号端口发送一个数据包。这时攻击者接收到这个数据包,但是攻击者并不发送这个数据包到服务器。
所有接收到的发送给服务器SMB端口的数据报(因为ARP毒药,现在发送到攻击者的主机),被重新定向到攻击者主机的本地端口1139(使用NAT或iptables非常容易实现)。在攻击者的本地端口1139,运行有一个程序(一个透明的代理程序),专门负责SMB数据包内容的修改并重定向给服务器。
Iptables/NAT的命令如下:
将接收到的数据包(139端口)重定向到本地端口(1139): 
在此192.168.1.3是客户端的地址。
重定向所有的网络通信:
 
代理程序需要修改negprot应答数据包使口令以明文的形式传送,攻击者同样还要回复加密密钥。它将加密密钥的长度设置为0,并用域名代替加密密钥。攻击者将“securitymode”位设置为0.这样,口令就不会被加密了。
此后,客户端将会在sesssetupX请求数据包中把口令以明文的方式传送。在攻击者获得口令后,利用先前获得的加密密钥对口令加密,然后发送sesssetupX请求数据包给服务器。
服务器发送一个sesssetupX应答报文以接受或拒绝会话。攻击者重定向sesssetupX应答报文和以后的所有网络通信。
中间人攻击的完整描述如图11-16所示。
 
网络传输的重定向依靠NAT或iptables来实现,如图11-17所示
 
攻击者将它重定向到1139端口。在1139端口上,我们的代理程序正在监听。
 
攻击者收到了negprot请求数据包。
 
攻击者重定向negprot请求数据包到服务器。
 
攻击者不会重定向这个数据包。它改变了要求加密的那一位,而高速客户端不对口令进行加密。
 
攻击者将修改过的无需加密口令的negprot应答报文发送到客户端。
 
客户端将口令以明文形式传送,攻击者得到口令!
 
攻击者将口令加密后通过sesssetupX请求数据报发送到服务器。
 
攻击者继续在服务器域客户端之间重定向数据报,知道SMB会话结束。攻击的实现代码可以在网站:http://khdp.org/docs/project/phrack/60/phrack-60-11.txt中下载。
windows 2000/xp系统下基于TCP的SMB操作
正如前面所说的,在windows 2000/XP中,SMB可以直接运行于TCP之上,而不用NBT(NetBIOS over TCP/IP)。SMB 服务器在445端口上监听所有进入的连接。
如果客户端(运行于windows 2000或XP之上)使用NBT,它在连接时总是同时使用139和445端口。如果客户端在445端口接收到一个应答报文,客户端就会在139端口发送一个RST数据报文。如果客户端在445端口没有接收到应答报文,他会试图使用139端口进行连接。如果在两个端口都没有回应,那么这次会话就算失败了。
如果客户端没有使用NBT,它仅在445端口上进行连接。
为了完成上述攻击,必须强迫客户端不使用445端口而使用139端口,你必须让客户端确定445端口是关闭。在使用透明代理攻击的情况下,可以使用iptables让攻击者的主机将接收的所有网络数据包从445端口重定向到其他没有使用的端口上。这样客户端就会使用139端口了。
如果客户端没有使用NBT,那么透明代理可以在445端口上进行数据包的重定向。
注:windows 2000系统可以在“本地连接属性/internet 协议/属性/高级/wins中设置启用或者禁用NBT”
11.3.6 空会话(Null session)攻击
Windows NT/2000都可以使用前面所述的挑战—响应协议同远程主机建立一个会话。会话时通信双方交换信息的安全通道。每次会话都包含了访问资源所需的认证信息。
而同远程服务器建立的空会话则没有用户认证。换句话说,就好比是一个匿名访问。在会话建立时,用户不提供用户和口令凭证,所以令牌中不包含用户信息。因此,建立会话双方没有密钥的交换,也不能再系统间发送加密信息和签名信息。访问令牌包含用户的SID:“S-1-5-7”,以及用户名“ANONYMOUS LOGON”。
这个用户名可以在用户列表中看到,但是不能再SAM数据库中找到,属于系统内置的账号。有关空会话的详细论述,可以参考网站:http://rr.sans.org/win/null.php。
空会话的建立
从用户的角度来看,在登录系统或者访问服务器的某些资源时需要同服务器建立会话。例如,名为“BOB”的用户希望访问名为“DATASTORE”的服务器上的共享资源“DATA”,那么它可以发布以下命令:
 
他可能被要求提供口令,只有通过认证,才能获得授权令牌或者票据。
另一方面,如果允许空会话,即“DATA”共享是一个空共享,那么它只要输入:
 
那么BOB将作为匿名用户获得DATA共享的访问权,而不需要提供用户名和口令。
除了利用net use命令来建立空会话以外,还可以使用WIN32 API编程实现,感兴趣的读者可以参考网站:http://www.securityfocus.com/bid/494/exploit。
空会话可以把连接建立成所谓的空会话管道(Null session pipes),如果服务器许可的话。管道是一种工具,允许不同系统之间的进程互相通信。空会话还可以用来建立共享连接,包括\\servername\$ipc这一类的系统级共享。IPC$是一种特殊的隐藏的共享,它给用户提供了一个同服务器进程通信的接口。它同样也是和管道相关联的,从而可以远程访问。
空会话的安全问题
在默认安全设置下,借助空会话可以列举目标用户和共享资源,访问everyone权限的共享,访问部分注册表等。
最简单的办法就是用net use命令建立空会话,然后利用net view命令获得目标系统的共享资源名列表。利用工具sid2user.exe和user2sid.exe列举用户名和对应的SID。
使用enum工具(http://razor.bindview.com/tools/index.shtml)还可以获得用户、机器、名字、口令和LSA策略信息,甚至进行穷举口令攻击。例如:
Enum –D –u “administration” –f pswdfile.txt nnn.nnn.nnn.nnn
【说明】-D 执行字典攻击
        -u 代表用户名
        -f 需要的口令字列表文件
        Nnn.nnn.nnn.nnn 远程主机的IP地址
有关口令的蛮力攻击还有很多方法,举例如下。
利用net use命令:
For /f “tokens=1” %a in(pswdfile.txt)do net use \\nnn.nnn.nnn.nnn\c$ %a /user:”administrator”
Token=1 表示从文件pswdfile.txt取出的第一个符号给变量%a
For \L %i IN(1,1,254)Do nat –u userlist.txt –p pawdfile.txt nnn.nnn.nnn.nnn.%i>>nat——output.txt
其中,NAT(NetBIOS auditing tool)是NetBIOS审计工具,每次连接一个目标系统。NAT的缺点是,一旦猜中第一个口令,就立刻尝试访问远程系统,因此不会再猜解其他的口令字。此工具可以在网站http://www.tux.org/pub/security/secnet/tools/nat10中下载。
也可以参考TOo2y的文章“探测远程windows主机的NetBIOS信息”及配套工具T-SMB.EXE(http://www.safechina.net/article/article.php?type=漏洞探测),其中详尽地讨论了如何利用win API编程技术实现信息的收集。
其中,IPC$空会话的建立和断开主要用到了以下两个网络管理函数。
DWORD WNetaddrconnection2(LPNETRESOURCE  lpNetresource ,LPCTSTRlppassword,LPCTSTR lpusername,DWORD dwflags);
上面的函数是建立一个会话连接,其中LPCTSTR lppassword,LPCTSTR lpusername分别是用户口令和用户名,要想建立空会话,则一定要把这两项设置成空(NULL)。
DWORD wnetcancelconnection2(LPCTSTR lpname,DWORD dwflags,BOOL fFORCE);
Wnetcancelconnection2的作用则和wnetaddconnection2是相反的,在获取用户信息后,为了确保安全,用它迅速断开与服务器之间的会话。
如何预防空会话攻击
预防空会话攻击最简单的办法是设置复杂密码,防止通过IPC$穷举密码。但如果有其他漏洞,IPC$将为进一步入侵提供方便。
禁止空会话的办法就是修改以下注册表键值:
 
Windows 2000和XP,值为“2”,NT系统值为“1”。“1”表示禁止匿名用户列举SAM账号和共享。“2”表示限制所有的匿名访问,除非明确许可。
禁止自动打开默认共享则是,对于server版,找到如下主键:
 
把autoshereserver(DWORD)的键值改为00000000。
对于pro版,则是
 
把autosharewks(DWORD)的键值改成00000000。
如果上面所说的主键不存在,就新建一个再修改键值。
11.4 windows NT/2000权限提升
攻击者在获得目标系统一定的访问权限后通常需要把自己的权限提升到管理员组,这样攻击者就可以完全控制该系统。这个过程在计算机安全领域被称为“权限提升”。通常情况下,从普通账户提升到超级用户要比远程进行攻击直接获得超级用户权限要来得容易。
我们先简要介绍在windows NT4和windows 2000系统下,攻击者常用的提升权限的方法。
windows NT4专用提升方法
getadmin(windows NT4下)、pipeupadmin(windows 2000下),在本机运行可以把当前用户账号加入管理员组。而pipeupadmin可以让普通用户和guests用户都成功提升权限。Getadmin已经由SP4补丁修复,不能用于高于SP4的windows NT4系统,当然后来又有getadmin的增强版本,不过在SP6a下已经不能成功运行了。
在windows NT4和windows 2000注册表里指定用户使用shell程序(explorer.exe)时没有使用绝对路径,而是使用了一个相对路径的文件名(考虑到兼容性问题)。由于系统在启动时,“当前目录”肯定是%systemderive%(系统驱动器),这样,系统搜索explorer.exe的顺序应该是:
%systemdrive%(例如C:)
%systemroot%system32(例如c:\WINNT\SYSTEM32);
%systemroot%(例如c:\WINNT)。
如果把一个名为explorer.exe的文件放到系统根目录下,这样在每次启动系统的时候就会自动先运行根目录下的explorer.exe而不是windows目录下的explorer.exe了。这给攻击者提供了一个机会在用户下次登录时执行攻击者提供的程序。问题是攻击者必须有安装系统逻辑盘根目录的写权限才行,而一般管理员都设置该目录普通用户禁写。详细信息可以参考网址:http://www.microsoft/technet/treeview/default.asp?url=/technet/security/bulletin/ms00-052.asp。
本地溢出。缓冲区溢出是进行攻击的最好办法,因为一般都可以获得系统权限或者管理员权限;windows NT4的IIS4的ASP扩展有一个本地溢出漏洞,windows 2000的静态图像服务也有一个溢出漏洞,利用该漏洞,攻击者可以获得系统权限(www.atstake.com/research/advisories/2000/a090700-x.txt)。当如windows NT 和windows 2000还有很多程序有溢出漏洞,只是这些程序不总是在运行,因此被利用的可能性比较小。ASP扩展的溢出漏洞需要攻击者有向网站的脚本目录的写权限,才能把攻击程序放到网站上,然后执行。而静态图像服务缺省没有安装,只有用户在windows 2000上安装静态图像设备(如数码相机、扫描仪等)时才自动安装。
任意用户利用smss.exe中的调试子系统,可能获得对系统任意进程或线程句柄的控制,或以系统用户身份执行任意命令。普通用户先请求调试子系统(位于smss.exe)创建或复制目标进程句柄(或线程句柄):
利用Dbguiconnecttodbg成为调试子系统客户端;
利用Zwconnectport连接dbgssapiportlpc端口( 任何用户都可访问该端口);
利用Zwrequestport请求调试子系统以目标客户ID身份处理createprocess ssapi;
等待调试子系统响应create_process_debug_event,返回的消息中包含句柄副本;
当调试器线程结束时,目标进程或线程也会结束。
以下网站提供了该漏洞的测试程序:http://online.securityfocus.com/data/vulnerabilities/exploits/deplot.zip。
windows 2000专用提升漏洞方法
windows 2000的输入法漏洞,利用这个漏洞任何人都可以以localsystem身份执行程序,从而可以用来提升权限,不过该漏洞一般仅限于物理接触windows 2000计算机的人。当然如果开放了终端服务的话,攻击者也可以远程利用该漏洞。
利用windows 2000的network DDE DSDM服务漏洞普通用户可以以localsystem身份执行任意程序,可以借此更改口令、添加用户等。Guests组用户也可以成功利用该漏洞。这个服务缺省没有启动。
Windows 2000的telnet服务进程建立时,该服务会创建一个命名管道,并用它来执行命令。由于该管道的名字能被预见,如果telnet发现一个已存在的管道名,它将直接用它。攻击者利用此漏洞,能预先建立一个管道名,当下一次telnet创建服务进程时,便会在本地system环境中运行攻击者代码。
Windows 2000存在一个利用debug registers提升权限的漏洞。如果攻击者能在windows 2000中运行程序,利用此漏洞(http://www.guninski.com/pipe3.cpp),他至少能取得对%windir%\system32和注册表HKCR的写权限。因为x86 Debug registers DR0-7对于所有进程都是全局共享的,因此在一个进程中设置硬件断点,将影响其他进程和服务程序。
11.4.1 利用windows 2000的命名管道来提升权限
Windows 2000中的runas服务进程可以让用户甲以用户乙的权限运行程序,这类似于Unix和Linux系统中的suid位功能。Windows 2000中的一个API:createprocesswithlogonW时把用户乙的账号(account)、域(domain)和口令(password)提交给windows操作系统进行认证,如果认证成功,那么就可以运行执行的程序,而且这个程序运行时具有用户乙的权限。
CreateprocesswithlogonW API的定义如下:
 
那么createprocesswithlogonW是如何把用户乙的账号信息传给runas服务进程的呢?在windows操作系统中游很多进程间通信的方法,最常见的就属管道(pipe)了。这里createprocesswithlogonW是通过命名管道(named pipe)与runas服务联络的,这个命名管道就是\\.\pipe\secondarylogon。
当用户甲调用createprocesswithlogonW创建具有用户乙权限的进程时,它没有检查“\\.\pipe\secondarylogon”的服务器端究竟是连接到runas进程还是连接到其他的进程。如果runas服务进程在某一时刻停止运行的话,黑客进程可以趁机创建一个也叫“\\.\pipe\secondarylogon”的命名管道,然后黑客进程就伪装成runas服务进程在管道的服务器端等着接收信息。接着用户甲调用createprocesswithlogonW,它也没有检查命名管道另一端的进程身份,就把用户乙的账号信息由伪造的命名管道传了过去。
RADIX小组编写了一个演示程序radix1112200101(http://lists.insecure.org/lists/bugtraq/2001/nov/0076.html),这个程序把通过命名管道\\.\pipe\secondarylogon传来的用户乙账号信息(包括用户名、域名和密码)统统显示出来。
 
 
【注意】在伪造命名管道之前,必须关闭runas的\\.\pipe\secondarylogon,要不然运行radix1112200101时会得到permission denied之类的错误。
下面我们讨论如何利用radix1112200101来获得本地域(local domain)的超级用户的口令。存在漏洞的程序(就是因为使用createprocesswithlogonW而泄露口令的)称之为radixvictim.cpp,例如,它以超级用户administration的权限启动一个notepad程序。
 
 
我们先以超级用户登录本地域,然后从administrative tools->services中种植runas服务进程(一般情况下,只有超级用户才能终止runas服务进程)。这样runas拥有的\\.\pipe\secondarylogon就关闭了。
再以一般用户账号(假设为moda)登录,接着运行radix1112200101伪造一个新的named pipe\\.\pipe\secondarylogon。
D:\ecm204\radix\debug>radix1112200101
Created pipe and waiting for clients…
我们使用pipelist程序确定\\.\pipe\secondarylogon是否已经被成功地创建,这个工具可以从网站http://www.sysinternals.com/ntw2k/info/tips.shtml中下载。它能列出系统中所有的命名管道。
 
最后一个命名管道就是radix1112200101程序刚刚伪造的secondarylogon,现在运行radixvictim。请注意程序radix1112200101的输出。
 
显然,超级用户的信息(包括口令)全部都被radix1112200101接收到了。得到administrator的账号信息后,再提升权限就容易了!
这个漏洞利用程序的关键在于:第一,命名管道的名字是广为人知的,入侵者的命名管道也可以用同样的名字\\.\pipe\secondarylogon去冒充;第二,createprocesswithlogonW在使用命名管道之前并没有核实命名管道的服务器端进程,它并不关心服务器端是连接到runas进程还是其他的进程。类似这样的问题在windows操作系统中广泛存在,再看下面的例子。
根据maceo的研究,windows 2000操作系统广泛使用了命名管道来控制服务进程,包括像clipbook服务进程、telnetd服务进程等,而且这些命名管道的名字是可以猜到的。如果入侵者抢先用猜到的名字创建命名管道的话,服务进程启动时会直接连接到入侵者的命名管道上,于是攻击程序就可以通过impersonatenamedpipeclient()取得服务进程的权限(缺省设置为localsystem权限)。那么,入侵者是怎样猜到这些命名管道的名字的呢?很简单,这些名字可以从registry中查询到,具体位置为:
 
如果servicecurrent的双字节值(DWORD Value)是X,那么服务进程所用到的命名管道的名字就是\\.\pipe\net\ntcontrolpipe(x+1),这也就是入侵者要伪造的命名管道的名字。
Maceo给出了几个漏洞利用程序(http://www.dogmile.com),下面就以pipeup为例进行说明。这个漏洞利用程序首先从注册表中取得下一个服务进程要使用的命名管道名字,然后抢先创建这个命名管道;紧接着它启动服务进程clipbook,由于clipbook启动后会主动连接这个伪造的命名管道,于是pipeup就通过函数impersonatenamedpipeclient获取了localsystem的账号权限(因为clipbook一般以localsystem的账号运行)。这样,进程pipeup就有足够的权限把localsystem在security account manager(SAM)中的信息读出来了。
先以administrator的账号登陆dallas,把clipbook服务进程停止。再以一般用户moda登录,运行漏洞利用程序pipeup,以下是pipeup的运行及其结果。
 
由于运行radix1112200101(或pipeup)之前,我们必须先终止runas(或clipbook)服务进程才有可能伪造命名管道,从而窃取administrator(或local system)的账号信息;而终止runas(或clipbook)进程必须先取得之上administrator的权限才能实现。因此要实现这个漏洞利用确实有些难度,但这并不意味这不可能发生!例如,某个服务进程有漏洞,那么可能意外终止这个服务进程。如果服务器每次提供服务时都产生一个新的命名管道,我们甚至都不需要先终止服务进程。Windows 2000的telnet服务就存在这样的安全漏洞(http://support.microsoft.com/?kbid=287912)。
通过telnet远程连线到windows 2000系统中的telnetd服务进程时,telnetd会创建一个新的命名管道,同时运行这个命名管道携带的初始化程序。由于这个命名管道的名字可以实现预测,所以入侵者可以抢先用预测出来的名字创建这个命名管道。当telnet服务进程发现这个命名管道已经存在时,它既不重新创建一个新的命名管道,也不核实一下这个命名管道的创建者是否可信(trustable)。相反,它直接使用这个命名管道,并且把其携带的攻击代码当成初始化程序运行。由于在缺省设置的情况下,telnetd服务进程具有local system的权限,因此攻击代码也将以这个最高权限运行。
具体这个可预测的命名管道是什么并没有说明,不过我们可以通过telnet连接试验得到。在本地机器上打开两个telnet会话,然后用pipelist工具观察在telnet后命名管道的变化情况。
 
上面用黑体字标出来的命名管道net\Ntcontrolpipe28属于telnetd服务进程,而telnetd\000001fc.00000000域telnetd\000001fc.00000001属于第一个telnet会话,telnetd\000001fc.00000002与telnetd\000001fc.00000003属于第二个telnet会话。如果这时有第三个用户telnet进来的话,telnetd要用到的命名管道名字间会是telnetd\000001fc.000000004域telnetd\000001fc.00000005!
在这个例子中,我们并不需要终止任何服务进程,理论上说你只需要具有一般用户账号就可以提升你的权限到local system级别。先以一般用户账号伪造命名管道并让它附带攻击代码作为初始化程序,然后以同一账号远程联线到机器上,telnetd服务进程会主动运行你附带在命名管道上的攻击代码,而且你的攻击代码是以local system权限运行的。
最新的利用命名管道的漏洞提升权限是利用windows的createfile API函数(http://www.atstake.com/research/advisories/2003/a070803-1.txt)。createfile函数调用可以用来打开或者创建文件、命名管道和邮槽等。
在WIN32系统中,大多数服务都运行在本地系统账号(SYSTEM)下而且都需要同文件打交道。如果我们可以指定服务需要打开的文件,就有可能伪造该服务所运行的账号。
这种权限提升在微软SQL服务器中非常容易实现,因为其中有很多过程,允许用户任意执行要使用的文件。作为一个例子,我们使用xp_fileexit,一般用户都可执行的扩展存贮过程。首先创建一个名字任意的命名管道服务器,然后以命名管道的UNC名字为参数执行xp_fileexit,结果我们就可以获得SQL服务器运行账号的权限。
Mssqlpipe.exe程序用于创建一条命名管道,等待客户来连接,然后伪装成客户。最后以客户身份执行命名行所提供的程序(在此为cmd.exe)
 
最后返回命令窗口#1.
伪装用户成功,现在可以以SYSTEM用户执行其他程序了。
Maceo提供了该漏洞的利用程序(http://sh0dan.org)。
11.4.2 攻击终端服务器
Windows 2000中文简体版存在的输入法(input method)漏洞,可以使本地用户绕过身份验证机制进入系统内部。而windows 2000中文简体版的终端服务(TS,terminal service),在远程操作时仍然存在这一安全漏洞,使得其造成的危害更大。
Windows 2000的终端服务功能,能使系统管理员通过各种类型的网络连接对windows 2000进行远程操作,采用的图形界面与用户本地使用的一样,终端服务的默认监听端口为3389.用户只要装了windows 2000的客户端连接管理器就能与提供了该服务的计算机相连。因此,这一漏洞使终端服务成为windows 2000的合法木马。
识别和查找TS
识别和查找TS的一种办法是搜索WEB认证表单所在是网页:TSWeb/default.htm,该表单可以指定屏幕分辨率和目标终端服务器的IP地址。另一种办法就是使用端口扫描,如果终端服务器运行在默认的端口3389上,就可以发现这个服务。
由于终端服务器的监听端口可以通过对注册表键值(HKLM\system\currentcontrolset\control\terminal server\winstations\RDP-Tcp)来修改实现,这就增加了寻找终端服务器的难度。Tim mullen(http://www.hammerofgod.com)开发了两个工具TSProbe.exe和TSEnum.exe可以找到终端服务器的自定义监听端口。
攻击TS
运行客户端连接管理器,加入扫描到的任一地址,设置好客户端连接管理器,然后与服务器连接。几秒钟后,屏幕上显示出windows 2000登录界面(如果发现时英文或繁体中文版,放弃,另换一个地址),用ctrl+shift快速切换输入法,切换至全拼,这时在登录界面左下角将出现输入法状态条(如果没有出现,请耐心等待,因为对方的数据流传输还有一个过程)。用右键点击状态条上的微软徽标,弹出“帮助”(如果“帮助”呈灰色,放弃,因为对方很可能已经修补这个漏洞),打开“帮助”一栏中“操作指南”,在最上面的任务栏点击右键,会弹出一个菜单,打开“跳至URL”。此时将出现windows 2000的系统安装路径和要求我们填入的路径的空白栏。例如,该系统安装在C盘上,就在空白栏中填入“c:\winnt\system32”。然后按“确定”,于是就成功绕过身份验证,进入了系统的SYSTEM32目录。
现在我们要获得一个账号,成为系统的合法用户。在该目录下找到“net.exe”,为“net.exe”创建一个快捷方式,右键点击该快捷方式,在“属性”-》“目标”-》c:\winnt\system32\net.exe后面空一格,填入“user guest /active :yes”然后点“确定”。这一步骤的目的在于用net.exe激活被禁止使用的guest账户,当如也可以利用“user 用户名 密码 /add”,创建一个新账号,但容易引起怀疑。运行该快捷方式,此时你不会看到运行状态,但guest用户已被激活。然后又修改该快捷方式,填入“user guest 密码”运行,于是guest便有了密码。最后,再次修改,填“localgroup administrators guest/add”,将guest用户加入系统管理员组。
【注意】
在该过程中,如果对方管理员正在使用终端服务管理器,他将看到你所打开的进程id,你的IP和机器名,甚至能够给你发送消息。
终端服务器在验证你的身份的时候只给你留了一分钟的时间,在这一分钟内如果你不能完成上述操作,你只能再次连接。
你做看到的图像与操作会有所延迟,这受网速的影响。
11.4.3 NetDDE权限提升
2001年2月,@stake的dildog(http://www.atstake.com/research/advisories/2001/a020501-1.txt)发现了windows 2000的网络动态数据交换服务(NetDDE,network dynamic data exchange service)中的一个漏洞可以用于提升权限。
网络动态数据交换是一种在不同的windows机器上的应用程序之间动态共享数据的技术。这种共享是通过名为受信任共享(trusted shares)的通信通道来完成的,受信任共享由网络DDE代理服务来管理。本地机器上的进程可以向网络DDE代理发出请求,包括指定针对某个特定的受信任共享应该运行什么应用程序。但是由于网络DDE代理运行在本地系统用户的安全上下文中,并在此安全上下文中处理请求,因此攻击者就有机会让网络DDE代理在本地系统用户的安全上下文中执行其指定的代码,从而提升权限并完全控制本地机器。
 Network DDE DSDM(DDE Share database manager)服务负责维护所有活动的网络DDE共享的一个列表并管理NetDDE连接。当该服务启动时,在当前登录用户的桌面上将创建一个隐藏的IPC窗口,用来与支持DDE特性的应用程序进行通信。该窗口所处理的消息及其格式未在正式文档中描述。
窗口的名字是“NetDDE Agent“,类名是“NDDEAgent”。由于窗口是由WINLOGON创建的,窗口过程将运行在WINLOGON的进程空间中,它以SYSTEM的权限来处理消息。该窗口所处理的消息之一是“WM_COPYDATA”消息,DDE用该消息将一块内存从一个进程传递给另一个进程。不像大多数窗口间通信时使用postmessage()函数来完成的,“WM_COPYDATA”消息却是由sendmessage()函数来发送的,并由底层的消息子系统(CSRSS)作为一种特殊情况进行处理。
通过该消息发送给隐藏窗口的结构具有如下结构:
 
当上述缓冲区传递给窗口过程时,它将首先检查3个磨数(即前12个字节)的值,如果与上述的值不同,则消息处理过程将返回一个错误。否则就取出两个ASCIIZ并将其转换成unicode串,然后检查共享名以确保它存在并且是一个受信任的共享。
由于在默认情况下系统存在多个受信任共享,因此可以对其进行穷举。对每个共享名都尝试运行命令直到找到一个受信任的共享。“DDE Share Mod ID”将和上述结构中的对应的数进行比较,如果相等则将在WINLOGON进程的上下文中执行上述第二个ASCIIZ串所指定的命令,因此将创建一个继承了SYSTEM进程令牌的进程。“DDE Share Mod Id”本应是一个相对随机的8字节数,但实际上却一直是个常数“0x0100000009000005”。以下代码仅仅用来测试和研究这个漏洞。注意确保已经运行了network DDE DSDM服务,然后执行如下代码。
 
 
 
 
 
11.5 攻击SQL服务器
11.5.1 安全模式
SQL server是由微软公司出品的流行关系数据库软件。SQL server在管理系统安全性的问题上采用了两种安全认证模式:
Windows认证模式;
SQL server和windows混合认证模式。
SQL server 2000的默认模式为windows认证模式,在该模式下,windows用户能够使用操作系统的的用户口令来直接访问SQL server。
在混合模式下,需要显式提供用户名和口令。这种模式经常用于不支持windows认证的windows 98/me系统。
11.5.2 定位SQL server
有经验的入侵者在采取行动之前都会花费一定的时间,尽可能多地收集与目标有关的信息。同样要对SQL服务器进行入侵,就必须首先知道目标是否在运行SQL server。这可以通过以下三种途径来实现。
端口扫描
在默认情况下,SQL server使用TCP/IP和命名管道来监听网络连接。因此通过对默认的TCP端口1433进行扫描,可以很容易地识别出典型的SQL server。
使用SQLPing
SQL server 2000支持多个实例,因此服务器需要与客户端进行通信,通知客户端在该服务器上存在的每个SQL server实例信息。SQL server使用的实例映射器端口为UDP 1434。SQLPing工具就是通过对该端口发送查询(广播)包来实现。
例如,下面的SQLPing扫描找到了两台运行SQL server 2000的主机。
 
从中我们可以获得以下信息:
SQL服务器的名字;
实例名称;
群集状态;
版本;
网络库(netlib)信息(包括TCP端口和管道名称)。;
本地网段查询
通过使用SQL server的分布式管理对象,我们可以列出本地网段上运行的SQL服务器。微软的知识库文章(http://support.microsoft.com/support/kb/articles/q287/7/37.asp)分别给出了用VB和VC编写的实现代码。
另外,使用SQL客户端工具包中的osql.exe和isqo.exe命令行工具(-L选项),也能列举本地网的SQL服务器(http://www.sqlteam.com/item.asp?itemID=5403)。
11.5.3 SQL server口令攻击
最简单的口令攻击就是蛮力猜测,当然这也可以用于口令审核。
sqlbf
这是由Xaphan(http://newdata.box.sk/2001/may/)编写的SQL server口令蛮力猜测工具,可以使用字典、口令列表和IP地址列表来提高猜测效率。Sqlbf还可以使用命名管道进行猜测,不过使用此选项时,需要建立一条windows NT/2000 NetBIOS连接,从而被记录windows NT/2000日志和标准的SQL SERVER日志中。Sqlbf的用法如下:
 
 
sqlpoke
sqlpoke同样来自xaphan,只不过这个工具并不尝试猜测SA账户口令,而是搜索口令为空的SQL Server。当发现SQL server的sa账号口令为空时(经常有的事),它就执行最多由32个命名组成的预定义脚本。使得入侵者可以批量进行预先设计的操纵,包括tftp下载工具并执行木马程序等等。
Sqlpoke允许用户自行指定端口。另外,这个工具最大只能扫描B类IP网络。
SQL server的sa空口令攻击
在安装了微软的SQL server后,将产生一个默认的sa用户,而且初始密码在管理员没有设置的情况下为空。由于sa是SQL Server中非常重要的安全模块成员,这样一来,入侵者就可以通过SQL Server的客户端进行数据库远程连接,然后再通过SQL的远程数据库管理命令xp_cmdshell扩展存储过程(stored procedure)进行命名操作命令为
 
利用上面两条简单的命令,入侵者立刻就能在SQL Server的服务器上新建一个管理员级别的administrators组的用户username。
如果不需要SQL Server的xp_cmdshell(use sp_dropextendedproc “xp_cmdshell”)这项功能,就不要把xp_cmdshell扩展存储过程命令功能留着。我们只需要在isql窗口中输入:
 
利用ASP页面
很多情况下,入侵者不希望直接利用本机来扫描目标网络。显然利用先前入侵的受害者主机进行扫描是一种比较好的思路。在此,我们在受害主机的主页空间放置ASP页面实现间接扫描存在空口令的SQL Server。
ASP是功能强大、易于学习的服务器端脚本编程环境。ASP内置ADO(active data object)组件,可以很轻松的存取各种数据库。详细扫描代码如下:
 
 
如果想在上述代码中使用其他的Netlib,你可以使用下列值替换“Network=参数”,如表11-1所示。
 

SQL Server的口令明文传输缺陷
通过嗅探客户端和服务器之间的通信,我们可以发现,用户名是完全明文的,而口令似乎是打乱的,每隔一个字节就会出现一个A5,显然不是加密的。而且同一个字符的编码结果是一样的。通过注意改变每个字节,我们可以分析出其编码方案。表11-2给出了口令的解码过程,从中可以得知SQL Server只是用异或(XOR)方法来隐藏口令。
 
11.5.4 SQL Server的扩展存储过程
扩展存储过程是SQL Server可以动态装载并执行的动态链接库(DLL)。扩展存储过程直接在SQL Server的地址空间运行,并使用SQL Server开放式数据服务(Open Data Server)API编程。
扩展存储过程架构
Microsoft sql server 2000扩展存储过程使您能够在动态链接库(DLL)文件所包含的函数中实现逻辑,从而扩展了transact-sql的功能,并且可以像调用Transact-sql过程那样从transact-sql语句中调用这些函数。动态链接库的文件扩展名为“.dll”。扩展存储过程可以包括Microsoft WIN32和COM应用程序的大多数功能。
DLL文件必须遵从扩展存储过程API才能作为扩展存储过程运行。对于SQL Server,.dll可以包含多个标识为扩展存储过程的函数,每个函数都由单独的扩展存储过程名标识。当Transact-SQL语句引用其中一个扩展存储过程时,关系数据库引擎调用与该扩展存储过程名相关联的函数。扩展存储过程可以与调用它们的SQL Server实例重新建立连接,或者连接到远程SQL Server安装。
扩展存储过程是关系数据库引擎的开放式数据服务层的一部分,而开放式数据服务层是该引擎和服务器net-library之间的接口。服务器net-library接收客户端列表数据流数据包并将它们传递给开放式数据服务。开放式数据服务将列表数据流数据包转换成事件并传递到关系数据库引擎的其他部分,然后数据库引擎使用开放式数据服务,通过服务器net-library将恢复发送给SQL Server客户端。
当关系数据库引擎确定transact-sql语句引用扩展存储过程时,其工作过程如下:
当一个客户执行一个扩展存储过程,该请求就会以列表数据流(TDS,tabular data stream)格式通过网络库和开放数据服务发送到SQL Server。
SQL Server搜索与该扩展存储过程相关联的DLL。如果没有加载,则加载该DLL。
SQL Server调用被请求的扩展存储过程(作为DLL内的一个函数实现)。
扩展存储过程使用开放数据服务API,把结果和返回参数传递给服务器。
扩展存储过程的架构如图11-18所示。
 
在SQL Server中游很多系统扩展存储过程,有些供数据库内部使用,还有一些用于调用系统命名。
更详细的资料可以参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/architecture/8_ar_sa2_14dh.asp。
2.系统存储过程
系统存储过程以操作系统命令行解释器的方式,执行给定的命令字符串。具体语法为xp_cmdshell {‘command_string’}【,no_output】
xp_cmdshell在默认情况下,只有sysadmin的成员才能执行。但是,sysadmin也可以授予其他用户这个执行权限。
对于windows NT和2000,当用户不是sysadmin组的成员时,xp_cmdshell将模拟使用xp_aqlagent_proxy_account指定的SQL Server代理程序的代理账户。如果代理账户不能用,则xp_cmdshell将失败。所以,即使有一个账户是master数据库的db_owner,也不能执行这个存储过程。
如果我们有一个能执行xp_cmdshell的数据库账号,例如是空口令的sa账号。那么,我们可以执行以下命令:
 
上面两次调用就在系统的管理员组中添加了一个用户名为“refdom”,口令为“123456”的用户。
如果管理员关闭了xp_cmdshell扩展存储过程,而且SQL Server服务在本地系统(localsystem)账户下运行,并且,如果系统上没有安装syskey,那么下面的命令:
 
就可以返回注册表中加密的口令或者SID。
下面的例子演示了利用windows NT/2000自带的FTP客户端的脚本模式来下载攻击工具(前提条件是目标网络允许FTP连接)。
 
其中192.168.111.222是入侵者所在的机器,*.exe文件都是攻击工具。现在入侵者可以连接到目标SQL Server的2003端口,并且可以获得localsystem身份运行的远程命令shell(cmd.exe)。
d:\attacker>nc –vv 10.10.10.1 2003
部分Microsoft提供的扩展存储过程可以允许用户任意访问,任何非特权用户可以提交SQL请求,但是这些存储过程会重新连接SQL数据库,并且以SQL Server服务的账户执行查询,所以可能导致权限提升。这些扩展过程包括:
 
攻击者可以利用Web的SQL代码注入进行攻击,也可以直接利用这个漏洞以本地权限用户身份执行这个漏洞。
为了防止滥用扩展存储过程,必须对其进行严格限制。建议删除那些不使用的扩展存储过程。其具体操作如下:
对Public可以执行的扩展存储过程:
xp_fileexit,用来确定一个文件是否存在。
xp_getfiledetails,可以获得文件详细资料。
xp_dirtree,可以展开你需要了解的目录,获得所有目录深度。
xp_getnetname,可以获得服务器名称。
可以操作注册表的扩展存储过程,这些不是对Public可以执行的,需要系统管理员或者授权执行:
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumvalues
xp_regread(对Public可以执行)
xp_regremovemultistring
xp_regwrite
11.5.5 微软SQL Server/msde扩展存储国策和那个缓冲区溢出漏洞
在微软SQL Server 7.0/2000以及MSDE中提供了一个API函数srv_paraminfo(),它用来为扩展存储过程调用解释输入参数。由于它没有对输入参数的长度进行检查,因此如果输入参数的长度超过一定限制,就可能发生缓冲区溢出。任何在调用srv_paraminfo()前没有进行长度检查的扩展存储过程,都可能受到此问题的影响。
调用扩展存储过程的语法为
exec <存储过程名><参数 1><参数 2>,…
例如,如下的查询将返回“c:\winnt”的目录树:
exec xp_dirtree ‘c:\winnt’
通过给各个参数传递超长的字符串,有可能覆盖为这些参数所分配的缓冲区并执行任意代码。
目前已知受影响的扩展存储过程如下:
xp_peekqueue(xpqueue.dll)
xp_printstatements(xprepl.dll)
给第一个参数传递超长的串,将导致非法操作并覆盖异常处理程序所保存的返回地址。
xp_proxiedmetadata(xprepl.dll)
该存储过程使用4个参数。给第二个参数传递超长的串,将导致非法操作并覆盖异常处理程序所保存的返回地址。
xp_setsqlsecurity(xpstar.dll)
该存储过程使用四个参数。给三个参数传递超长的串,将引发异常并导致整个SQL Server进程立即终止。
xp_displayparamstmt(xprepl.dll)
xp_enumresultset(xprepl.dll)
xp_showclv(xprepl.dll)
xp_updatecolvbm(xprepl.dll)
给第一个参数传递超长的串,将导致非法操作并覆盖异常处理程序所保存的返回地址。如果要知道扩展存储过程调用了哪些DLL文件,可以进行如下操作:
 
这样,就可以获得调用该扩展存储过程的dll文件了。
扩展存储过程可以被任何客户组件调用,只要这些客户组件能够执行普通的SQL Server查询即可,比如Microsoft access或者MSQuery。SQL Server中提供的isql实用也可以用来调用扩展存储过程。运行于IIS之上的Web应用程序也可以使用ADO(activeX Data Objects)API来连接SQL Server数据库。
入侵者可能通过两种途径进行攻击,这两种途径是:
如果入侵者可以登录进入SQL Server数据库,就可以通过直接调用有问题的扩展存储过程来进行攻击。如果溢出成功,可能获取SYSTEM权限。
入侵者也可能通过Web应用程序来进行攻击,但是需要攻击者了解应用程序在何处调用了有问题的扩展存储过程,同时提供有效的参数。
@stake发现并提供了有关的演示代码,可在以下网站找到:
HTTP://Www.atstake.com/research/advisories/2000/sqladv2-poc.c
11.5.6 SQL Server 2000 bulk插入过程缓冲区溢出漏洞
Microsoft SQL Server 2000的bulk插入过程一般被管理员用来往数据库的表中插入数据,或以定制的格式直接从数据文件中查看数据。由于在处理过程参数的数据复制操作时没有检查边界,使此过程的实现存在缓冲区溢出漏洞,入侵者就可能通过构造恶意的参数来利用此漏洞执行任意代码。
这只是微软安全公告牌MS02-034(http://www.microsoft.com/technet/security/bulletin/MS02-034.MSPX)给出的三个漏洞之一。在用于加密SQL server凭证信息的过程当中,同样存在缓冲区溢出漏洞。入侵者有可能获得数据库甚至服务器的控制权。第三个漏洞则是因为注册表键值的权限设置不当引起的。保存SQL Server服务账号信息的注册表键值有可能泄露,从而导致权限提升。
11.5.7 特殊异种查询漏洞
另一种漏洞,是关于特殊异种查询(adhoc heterogenous queries)的拒绝服务、权限提升和缓存溢出攻击(http://lists.insecure.org/lists/bugtraq/2002/feb/0273.html)。分布式查询需要访问多个异种数据源,这些数据可以位于相同或者不同的主机。SQL Server实现分布式查询需要使用OLE DB(微软的通用数据访问API规范)。SQL Server用户可以通过分布式查询访问:
存储在多台机器上的分布式数据;
存储在相关和不相关数据源当中的异种数据,需要使用一个OLE DB供应者。
我们可以在transact-sql语句中引用异种OLE DB数据源,通过:
——linked servers,openquery函数
——opendatasource和openrowset函数
所有用户都可以访问opendatasource和openrowset函数,其中某个参数(providername:供应者的名字)存在未经检查的缓冲区。当一个超常字符串被传递给该参数时,就会出现缓存溢出和拒绝服务。
在SQL Server 7当中,字符数超过6819就会溢出;超过6918,服务就死机。
 
在SQL Server 2000当中,字符数超过6887就会溢出;超过6998,服务器就死机。
 
而权限提升漏洞在于SQL Server没有对执行命令的用户进行权限检查引起的。
只要一般用户能够通过SQL Server认证并通过ODBC,OLE DB或DB库来提交SQL Select语句,即可用下面的命令来获得权限的提升(http://www.microsoft.com/technet/security/bulletin/fq00-014.mspx):
11.5.8 Microsoft SQL Server存在远程缓冲溢出
Microsoft SQL Server存在另一漏洞可导致远程攻击者远程访问目标主机。远程攻击者可以对SQL Server进行缓冲区溢出攻击,并以本地系统权限在主机上执行任意代码,读取数据中的内容。根据报告,此漏洞发生在验证处理以前,问题是由默认系统的配置产生的。
目前还不知道哪个SQL Server版本存在此漏洞。
可以在以下网站下载Spike工具进行此漏洞的利用:
http://www.immunitysec.com/spike.html
也可以使用NUSSUS的NASL语言触发此漏洞。使用NASL语言进行攻击的代码如下:
 
 
 
 
11.5.9 SQL Server可信连接漏洞
MS SQL服务器允许通过可信连接(trusted connection)访问数据库。缺省安装情况下,入侵者不用提供口令就可以获得服务器的“system”级访问权限。
下面的批处理文件(batch-file)验证了该漏洞。只要用isql.exe执行下面的文件即可利用该漏洞。验证代码如下:
 
 
 
 
 
 
11.5.10 SQL代码注入攻击
SQL代码注入攻击是指,将开发人员没有想到的SQL命令注入现有的应用程序中去。只要能够接受SQL命令的数据库都会不同程度的受到这种攻击的影响。
很多web网页都需要从用户那儿接收参数,依据这些参数对数据库进行SQL查询。SQL代码注入攻击技术就是把SQL查询/命令作为Web网页的输入来实现的。例如,当一个用户要登录时,web网页根据用户提供的用户名和口令,对数据库发送SQL查询,从而验证口令的正确性。利用SQL注入攻击,我们有可能对用户名和口令域进行加工处理,改变SQL查询,从而获准作其他操作。
识别潜在的脆弱网页
尝试搜寻那些允许用户提交数据的网页,例如注册(login)页、搜索(search)页、反馈(feedback)页等等。有时,HTML网页使用POST方法(命令)把参数发送给另外的ASP网页。因此,在URL当中或许看不到这些参数。不过,我们可以通过检查HTML的源代码,寻找“FORM”标记来识别。例如:
 
位于标记<FORM>和</FORM>之间的参数都可能用来发起SQL代码注入攻击。
如果没有发现带输入参数的网页,那么我们应当寻找那些ASP、JSP、CGI或PHP Web网页,特别是类似如下形式的URL:
 
测试这些网页
检查一个web网页是否存在SQL注入漏洞必须进行综合的测试。在服务器脚本(script)的第一个参数引入一个单引号(single quote),然后检验服务器是否会返回带有一个ODBC错误的网页,确实是一个非常好的测试办法。但通常这样做很容易忽略更脆弱的脚本,我们必须仔细检查每个脚本的每一个参数。
对每一个参数都单独用一个单引号和一个SQL关键词(“‘WHERE”)进行替换。输入的字符串类似如下格式:
Hi’ or 1=1—
或者直接使用URL:
 
如果面对的是隐藏域(Hidden Field),那么可以下载HTML源代码,保存在本地硬盘上,修改URL和隐藏域。例如:
 
如果幸运的话,你就可以不用用户名和口令就能登录对方网站。
测试结果评估
如果测试结果返回了一个数据库服务器错误消息,通常就意味着注入代码攻击成功了。但很多情况下,对方并不一定会明确地给出数据库错误消息。因此,有必要仔细搜查整个返回的网页信息,特别是以下一些词汇:“ODBC”、“SQL Server”和“Syntax”。更多的细节有可能再需要查看隐藏域、注释和网页头。
除了返回的网页之外,网页中的链接也是必须加以关注的。更多的信息可以参考网站:http://www.spidynamics.com/whitepapers.html。
为什么要使用“‘or 1=1--”
我们前面已经使用“‘or 1=1--”来绕过用户的注册,除此以外,它还可以用来获取通常情况下无法得到的其他信息。假设有一张ASP网页,它通过以下URL链接到其他网页:
 
在此URL中,“category”是变量的名字,“food”是赋给该变量的值。为了实现这一点,ASP网页可能包含以下实现代码:
 
如程序所实现的,我们提交的变量被传递给v_cat,因此,整个的SQL语句就变成了:
 
该查询将返回满足where条件的多行表格。
现在,如果我们提交的URL为
 
那么,变量v_cat等于“food‘or 1=1--”,如果把字符串提交给上述SQL查询,查询语句就成了:
 
这个查询语句的结果是从product表格当中选择所有的行,不管pcategory是否等于“food”。双短线“--”告诉MS SQL Server忽略后续的查询字符串,这样就相当于删除了最后的单引号(‘).有些情况下,可以用“#”替换双短线。
如果对方数据库不是SQL Server,或者无法忽略后续的字符串,我们也可以使用:
‘or’a’=’a
此时SQL查询就成了:
 
返回的结果是一样的。
根据实际使用的SQL查询,以下字符串都能奏效:
 
利用SQL注入来远程执行命令
能够注入SQL命令通常意味着我们可以执行任何的SQL查询。缺省安装的MS SQL Server以SYSTEM账户运行,在windows系统当中等价于administrator访问权限。我们可以使用像master..xp_cmdshell这样的扩展存储过程来执行命令:
 
分号(semi colon)用于表示当前SQL查询的结尾,可以另起一条新的SQL命令。要验证命令是否成功执行,可以监听来自服务器的icmp分组。
#tcpdump icmp
如果没有得到任何来自服务器的ping请求,表示中间环节出错了。可能是管理员限制了扩展存贮过程的使用,也可能是权限不够等。
获得SQL查询结果
获得SQL查询结果可以使用xp_makewebtask把查询结果写入HTML页面:
 
【注意】目标IP所在的主机必须把文件夹“share”共享出来才有效。
利用ODBC错误消息获得有用数据
我们可以利用MS SQL Server返回的错误消息来获得消息,以下面的URL为例:
http://domain.name/index.asp?id=10
在此,我们使用关键词UNION把SQL查询子句同整数“10”连接起来:
 
系统表INFORMATION_SCHEMA.TABLES包含了服务器当中所有表格的信息。字段TABLE_NAME显然包含数据库中每张表格的名字。发送如下查询:
 
这将返回数据库当中的第一张表格名字。当我们利用UNION把此字符串和整数10连接起来后,MS SQL Server试图把一个字符串转换成一个整数,因而导致错误消息产生,服务器将显示下列错误信息:
 
 
错误消息告诉我们,类型为nvarchar的值‘table1‘无法转换成整数,从而我们可以知道数据库的第一个表格名字为’table1’。
要获得下一张表格的名字,可以使用下列查询:
 
我们还可以使用关键词LIKE来搜索特定数据:
 
数据结果为
 
其中,字符串模式“%25login%25”将被转换成%login%(SQL Server中,%25等于%的ascii码)。在此,我们可以获得匹配上述字符串的第一张表格名字“admin_login”。
我们还可以使用另外一张有用的表格INFORMATION_SCHEMA.COLUMNS,用此来映射出表格当中所有的域名。
 
输出结果为
 
有了第一列的列名,可以使用NOT IN()获取下一列的列名:
 
输出结果为
 
继续往下深挖,可以获得其他列的列名,即“password”,“details”等。
 
输出结果为
 
在知道表格名和表格的列以后,我们可以使用同样的技术获得数据库中更多的信息。例如,获得“admin_login”表格当中第一个登录名:
 
输出结果为
 
知道了登录名“neo”,就可以获得对应的口令字:
 
输出结果为
 
登录名为“neo”的用户口令字为“m4trix”。
不过,上述技术也有一定的缺陷。我们无法获得任何错误信息,如果被转换的字符串当中包含任何有效的数字(字符0~9)。例如,登录名为“trinity”的用户考虑字是“31173”;
 
我们可能获得“页面不存在(page not found)”错误消息。原因是口令字“31173”在UNION之前可以转换成一个数字。因此,该查询语句是合法的,SQL Server不会抛出任何ODBC的错误消息,我们也无法获得任何数字消息。
为解决这个问题,我们可以在数字字符之前插入一些字母,故意让它无法成功转换。
例如:
 
我们使用‘+‘号(ASCII码:‘+’=0x2b)把口令字同我们想要的字母连接起来。在这个例子当中,我们用的是‘(space)ecm’。因此,即使口令字字符串是数字字符串“31173”,它也会被转换成“31173 ecm”。通过调用函数convert(),试图把“31173 ecm”转换成整数,SQL Server就给出了ODBC错误消息:
 
 
利用UPDATE或者INSERT,我们甚至可以修改或添加数据库记录。例如,修改“neo”的口令:
 
往数据库中插入一条新的记录:
 
8.常用系统表格
这里给出了对SQL代码注入攻击有帮助的系统表格名字。可以通过google搜索这些表格以获得详细列名字信息。
 
9.预防措施
不允许使用单引号作为输入,始终用两个单引号代替单个单引号;
使用提交的用户来查找记录,然后同存储在数据库中的口令进行比较;
如果字段是数值类型,确保提交的值也是数值类型的;
确保错误消息不包含任何有用信息;
确保应用程序以最小权限运行。
11.5.11 SQL Server 2000缓存溢出和SQL代码注入漏洞
数据库一致性检查器(DBCCs,Database Consistency Checkers)是命令行方式的控制台工具,用于SQL服务器的维护和其他一些操作。其中,某些DBCC函数存在缓存溢出漏洞。
这些漏洞有可能导致攻击者可以以SQL服务器的服务权限运行任意代码。
其他一些扩展存储过程,例如,用于数据库复制的过程,容易受到代码注入攻击。这些漏洞可以让攻击者以xp_cmdshell所处的安全上下文权限运行任意系统命令。
下列DBCC函数包含未经检查的缓存:
 
只有sysadmin固定服务器角色的成员才能运行此命令。
只有sysadmin固定服务器角色的成员,db_owner或db_ddladmin固定数据库角色成员才能执行该命令。
只有sysadmin固定服务器角色的成员,db_owner固定数据库角色成员才能执行该命令。
所有用户都可以执行该命令。
【注意】DBCC ADDEXTENDEDFROC溢出漏洞还影响SQL Server 7.0。
sp_mscopyscriptfile是存在SQL代码注入漏洞的扩展存储过程之一。sp_mscopyscriptfile首先在SQL Server的复制目录中创建一个目录,然后把脚本文件拷贝进去。其中有一个输入参数是@scriptfile,该参数保存了被拷贝的脚本名字。这个参数有可能被注入系统命令,这些命令是通过xp_cmdshell被执行的。
 
要利用此SQL代码注入漏洞,需要打开SQL Server Agent proxy账号。缺省情况下,此账号是关闭的。
下面的漏洞利用程序给参数@sriptfile提供了畸形的参数:
 
11.6 windows NT/2000溢出攻击
11.6.1 windows NT/2000 cmd.exe溢出漏洞
cmd.exe是windows NT/2000操作系统的命令处理器。它还可以处理.bat和.cmd批处理文件。
cmd.exe在用cd命令处理长路路径名时存在的一个安全漏洞(http://www.securityfocus.com/archive/1/311359)。在windows NT 4.0系统中导致缓存溢出,在windows 2000系统下处理批处理文件失败。
NTFS文件系统允许建立无限长度的路径,而windows API不允许路径超过256字节。为了防止windows API检查所请求的路径,需要在文件名之前使用“ \\?\”前缀。
Windows NT系统下的cmd.exe没有正确处理超过256字节的目录。如果使用cd命令进入一个超过256字节的子目录会产生缓存区溢出。
而windows 2000里的cmd.exe不存在缓存溢出,但是用cd命令切换到一个名字超过256字节的路径时,很容易使cmd.exe失败,导致拒绝服务漏洞。
可以利用以下代码进行测试:
 
上述命令先创建一个目录,然后再次目录中创建两个子目录。前两个cd演示了NT 4.0的缓存溢出漏洞,第三个cd切换目录到AA…\BB…,但是cd..时命令失败。
11.6.2 windows RPC溢出漏洞
远程过程调用(RPC)是windows操作系统使用的一个协议。RPC提供了一种进程间通信机制,通过这一机制,在一台计算机上运行的程序,可以很容易地执行某个远程系统上的代码。该协议本身是从开放式软件基础(OSF)RPC协议衍生出来的,只是增加了一些Microsoft特定的扩展。
RPC处理通过TCP/IP交换消息的部分代码存在一个漏洞。此问题是由错误地处理格式不正确的消息造成的。这种特定的漏洞影响分布组件对象模型(DCOM)与RPC间的一个接口,此接口侦听在TCP/IP端口135。此接口处理客户端计算机向服务器发送的DCOM对象激活请求(例如通用命名约定(UNC)路径)。有关漏洞的补丁信息可以参考网站:http://www.microsoft.com/security/security_bulletins/ms03-026.asp。
为了利用此漏洞,攻击者可能需要向远程计算机的端口135发送特殊格式的请求。导致问题的函数调用如下:
Hr=cogetinstancefromfile(pserverinfo,NULL,0,CLSCTX_REMOTE_SERVER,STGM_READWRITE,L”C:\\123456111111111111111111111111111111.doc”,1,&qi);
该函数用于远程调用一个对象的接口,他首先从指定的文件里读取内容,然后按照文件内容对接口进行初始化。而提供给该调用的文件名参数(第6个参数)超过一定长度时会引起溢出。
在客户端给服务器传递这个参数的时候,会自动转化为如下格式(\\主机名\\共享名\\文件名):
L\\servername\\c$\\1234561111111111111111111111111.DOC
这样的形式传递给远程服务器(具体是传递给ISystemactivator接口的remoteactivation函数的pwszobjectname参数),于是在远程服务器的处理中会先取出servername名,但是这里没做长度检查,值给定了0x20(默认NetBIOS名)大小的空间,因此产生堆栈溢出。
问题代码如下:
 
 
 
由于\\servername是由系统自动生成的,我们只能利用手工直接生成RPC包来实现,另外shellcode中不能包含0X5C,因为它是判断\\servername结束的标志。
下面给出了一个具体实现的代码,需要注意的是:
由于RPCT4、RPCSS中没有JMP ESP的代码,这里使用了OLE32.DLL中的,但是这些代码可能会重定位,测试的时候需要再确定或自己找一个存在的JMP ESP的代码,以下代码用的是windows 2000+SP3上的地址且OLE32未定位情况下的。
这里使用了反向连接的shellcode,需要先运行netcat。
程序中的SC的整体长度必须满足sizeof(sz)%16=12的关系,因为不是整数的话,整个包的长度会有一些填充,那么计算就不能满足这里给出的简单关系了,这样就会导致RPC包的解析无效。
在溢出返回前,返回地址后面的2个参数还会使用,所以需要保证是个内存可写空间地址。
这里是直接使用堆栈溢出返回的,也可以尝试一下覆盖SHE,这里就不多讲了。
 
 
 
 
 
除了远程溢出漏洞,RPC中处理TCP/IP信息交换的模块由于错误的处理畸形信息,远程攻击者可利用此缺陷进行拒绝服务攻击,在RPC服务崩溃后,可用来提升权限。
问题主要发生在RPC服务为DCOM服务提供的__RemoteGetClassObject接口上。当传送一个特定包导致解析一个结构的的指针参数为NULL的时候,__RemoteGetClassObject未对此结构参数进行有效性检查,在后续代码中就直接引用了此地址(此时为0)做读写操作,这样就导致了内存访问违例,RPC服务进程崩溃。攻击之后,许多基于RPC的应用无法使用,如使用网络与拨号连接,配置本地连接等,一些基于RPC、DCOM的服务与应用将无法正常运行。
由于RPC服务是MS windows中一个重要的服务,他开放的端口135同时用于DCOM的认证,epmapper管道用于RPC端点的映射,并默认为系统信任。如果一个攻击者能够以低权限在被攻击机器上运行一个程序,在RPC服务崩溃以后,就可以通过劫持epmapper管道和端口135的方法来提升权限,或获得DCOM客户端认证的消息。
 
 
 
 
11.6.3 微软RPC Locator服务远程溢出
微软将windows RPC(remote procedure call)locator服务面熟为一种名字服务,用来将逻辑名映射成与网络相关的名字。例如,打印服务器有一个逻辑名字“laserprinter”,那么,RPC客户端可以调用Locator服务,找出同此逻辑名字相对应的网络相关名字,然后利用网络相关名字发起服务的RPC调用。由于该服务所存在的漏洞,远程攻击者可以通过大量的请求来引起缓冲区溢出,以便在受害系统上执行任意代码,或者造成服务器失败。此外,攻击者还可以使受害系统的域控制器信任攻击者所在的域(http://www.microsoft.com/security/security_bulletins/ms03-001.asp)。
Microsoft RPC locator服务维护网络内RPC服务和服务器列表,默认情况下只有域控制器运行该服务。
当在网络上搜索RPC服务时,windows RPC客户端会连接域控制器上的TCP 139/445(SMB)端口,并通过“Locator”命名管道搜索服务或服务器,攻击者通过提供包含超长字符串作为搜索条目名,locator服务在处理的时候就可以导致堆栈溢出。问题主要是由不安全的wcscpy()函数调用引起的。
 
 
 
 
 
 
 
11.7 windows NT/2000日志删除
windows 2000的日志文件通常有:应用程序日志、安全日志、系统日志、smtp服务日志、DNS服务器日志、FTP日志和WWW日志等等。根据服务器所开启的服务不同,日志可能也会有所不同。另外还有一些网络管理软件的日志,因此,入侵者可能再被攻击主机上留下更多的攻击记录。
在此我们只讨论如何在命令行喜爱删除FTP,IIS应用程序日志,SMTP服务器日志和系统日志的方法。
1.        scheduler日志
scheduler服务日志默认位置:
windows 2000下为%systemroot%\schedlgu.txt
windows NT workstation下为schedlog.txt
可以打开schedlgu.txt,删除里面的内容。
schedluler服务日志在注册表中的位置:
 
先停掉schedulaer服务:net stop “task scheduler”(注意,不停时删不掉的)。然后再执行del schedlgu.txt或schedlog.txt即可。
del sched9*.txt
2.        FTP 日志
Internet信息服务FTP日志默认位置:%systemroot%\system32\logfiles\msftpsvc1\,默认每天一个日志。格式如下:
ex*.log
日志文件的格式为
 
停掉ftp服务:net stop msftpsvc,然后删除……
记住:NET START MSFTPSVC把服务打开。
当然也可以修改有关你自己的日志。
3.        WWW日志
Internet信息服务WWW日志默认位置:%systemroot%\system32\logfiles\w3svc1\,默认每天一个日志。先net stop w3svc关闭后台服务,然后尽管删除即可。别忘了再用NET START w3svc把服务打开。
4.        SMTP日志
SMTP服务日志默认位置:%systemroot%\system32\logfiles\smtpsvc1\。删除方法同上。
5.        eventlog日志文件
eventlog日志包含安全日志、系统日志和应用程序日志。如果不用第三方工具,在命名行上几乎没有删除安全日志和系统日志的可能。
最简单的方法是打开“控制面版“的“管理工具”中的“时间查看器”,在菜单的“操作”项有一个名为“连接到另一台计算机”的菜单,点击它。然后输入远程计算机的IP,再选择远程计算机的安全性日志,右键选择它的属性,点击属性里的“清除日志”按钮,清除安全日志。
来自ntsecurity.nu的winzapper工具(http://ntsecurity.nu/toolbox/winzapper/)可以有选择性地删除windows NT/2000安全日志的时间记录项。在进行删除操作之后,需要重新启动计算机。该工具只能在本地系统上使用。
11.8 小结
本章比较系统地堆windows系统下的入侵对抗技术进行了阐述。首先对操作系统的NTFS文件系统、口令漏洞、NetBIOS协议的攻击机理进行了研究;然后分别从普通权限的提升,微软数据库服务器和系统溢出三个方面对可能存在的入侵手段进行了讨论。
评论次数(0)  |  浏览次数(4595)  |  类型(网络对抗原理笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码