空会话攻击可以说是一种很古老的网络攻击形式,已经古老到系统管理员几乎忘却了还有这种攻击形式的存在。但现在它却又开始像几年前一样肆虐起来。尽管现在的系统已经不那么容易受到攻击,然而在针对windows设备执行渗透测试时,空会话枚举仍然是最先要做的事情之一。本文的目的在于分析空会话攻击,并探讨如何防止空会话攻击的发生。
空会话攻击过程
当用户使用用户名和密码(可以访问系统资源的登陆帐户)远程登陆到计算机时就创建了一个远程会话,这是通过服务器消息模块(SMB)和Windows Server服务来实现的,当提供正确登陆信息时这些连接都是完全合理的。
当用户没有使用用户名或者密码来与windows系统建立连接时就会出现空会话,这种类型的连接不能进行任何典型的windows共享,但是可以进行进程间通信(IPC)管理共享。IPC共享,是windows进程(通过SYSTEM用户名)来与网络其他进程进行通信的,IPC共享是SMB协议专用的。
没有登陆凭证使用IPC共享是专供程序间通信使用的,但这并不是说用户不能通过IPC连接代替连接到计算机。这种方式不允许对计算机的无限制访问,但广泛枚举可能会帮助攻击者发起攻击。
通过空会话进行枚举
现在我们知道空会话是如何发生的,那么攻击者如何利用空会话发动攻击呢?可以说,攻击者可以很轻松地利用空会话。空会话连接可以通过简单使用NET命令从windows命令行直接产生,不需要额外的工具。NET命令可以用来执行各种管理功能,使用NET命令我们可以尝试对目标主机(命名为HACKME)上的标准共享建立连接,但是这样会失败,因为我们没有提供正确的登陆凭证。
如何防御空会话攻击
首先你会问的问题是:“我的系统容易受到攻击吗?”这个问题的答案取决于网络环境中的操作系统,如果运行的是Windows XP、Windows Server 2003或者Windows 2000,答案是肯定的,至少在某种程度上来看。虽然现在大多数人都在使用这些版本以上的系统,不过Windows XP和Server 2003仍然是使用最多的系统,但还是可以通过其他防御来防止空会话攻击的。
在注册表中限制空会话攻击
事实上,大多数公司由于资金紧缺问题,一直还在使用旧版本的软件,这也是为什么到处可见windows 2000工作站和服务器的原因。如果你仍然在使用Windows 2000,那么可以通过简单的修改注册表来防止通过空会话的信息提取。
打开regedit,浏览HKLM/System/CurrentControlSet/Control/LSA/RestrictAnonymous,你可以配置这三种设置选择:
· 0 – 默认设置,无限制空会话访问
· 1 – 不排除空会话,但是防止用户名和共享的枚举
· 2 – 通过严格限制对所有资源的访问,从而防止任何值从空会话流失
正如你所见,你不能100%的消除空会话,但是你可以通过设置2来严格限制攻击者的攻击,在windows2000服务器上配置时要非常注意,因为可能会破坏集群。
你可以在windows XP和2003服务器中执行类似的操作,主要通过以下三种不同的注册表项:
HKLM\System\CurrentControlSet\Control\Lsa\RestrictAnonymous
· 0 – 默认设置,空会话可以用于枚举共享
· 1 –空会话不可以用于枚举共享
HKLM\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM
· 0 –空会话可以用于枚举用户名
· 1 –默认设置,空会话不可以用于枚举用户名
HKLM\System\CurrentControlSet\Control\Lsa\EveryoneIncludesAnonymous
· 0 –默认设置,空会话没有特殊权力
· 1 – 空会话被认为是成员组的部分(非常危险,可以允许共享访问)
你可以清楚地从上述内容中看出,默认情况下,windows XP只允许共享的枚举,这样比windows 2000更加安全。
从网络级别阻止访问
如果你不能对上述注册表进行修改,那么你可以通过windows防火墙或者网络防火墙阻止空会话攻击,这可以通过组织与NetBIOS和SMB TCP/IP有关的端口来实现,这些端口包括:
· TCP Port 135
· UDP Port 137
· UDP Port 138
· TCP Port 139
· TCP和 UDP Port 445
这些端口用于windows的各种网络功能,包括文件共享,网络打印功能、集群和远程管理等。话虽如此,在关闭这些端口之前应该进行全面的测试,以确保系统正常运行。
使用IDS识别空会话
如果上述注册表修改或者防火墙政策破坏了网络应用程序的功能性,那么你必须将防御工作调整为被动方式,而不是主动方式。除了阻止空会话枚举之外,最后的希望就是在发生枚举的时候我们能够阻止它。
如果你正在使用Snort,也就是现在最常用的IDS,那么进行以下操作就可以检测所有空会话枚举:
alert tcp $EXTERNAL_NET any -> $HOME_NET 139 (msg:”NETBIOS NT NULL session”; flow:to_server.establshed;
content: ‘|00 00 00 00 57 00 69 00 6E 00 64 00 6F 00 77 00 73 00 20 00 4E 00 54 00 20 00 31 00 33 00 38 00 31|’; classtype:attempted-recon;)
这不能够阻止空会话枚举的发生,但是会提醒你枚举的发生,从而采取适当行动。
总结
空会话攻击概念并不是新的攻击方式,但是却常常被忘记和误解。这种方式对于攻击者而言,仍然是非常可行的攻击策略,了解空会话攻击的方式是系统管理员的必修课。
【编辑推荐】