delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

24 Oct 2006

根据协议栈特征判断操作系统

传统上判断操作系统是通过扫描进行的,例如,发一个SYN+FIN的包,看对方如何回应,由于各式各样的原因,包括性能考虑,或编程上的疏忽,这些包会留有一些特征。这类典型的应用是nmapNetCraft

这类方法有它的作用,对于尝试攻击的人来说,这些特征能够给他们相当多的信息,这些信息甚至足以让攻击者找到一击毙命的攻击方法(例如,发现那是一台没有打过补丁、没有防火墙的Windows)。然而,它也有一些不可避免的局限:

  • 并不是所有地区的法律都允许网络扫描行为。除此之外,这种行为通常也是不受欢迎的,至少它不是一种友好的行为。(事实上,发生在互联网上的扫描行为几乎都不是友善的)
  • 对于NAT后的服务器,它只能判断出NAT网关所用的操作系统,而无法判断其后的系统所用的操作系统。
  • 事后的「反击」或「报复」性扫描往往于事无补,在第一击的时候遏制攻击,对于安全相当重要。

基于这样的原因,人们有了利用SYN时包特征来判断操作系统的想法。如前面所提到的那样,尽管TCP/IP协议最初在BSD操作系统上开发,但由于这是一个相当复杂的协议,具体的实现,甚至包括不同的BSD实现仍然存在相当多的差异,典型的差异,如初始窗口尺寸、初始TTL、勿分片(no-df)标志、SYN包总尺寸、选项等,几乎足以将操作系统的版本等信息暴露出来。

采用这类「被动式」(即,在连接时进行判断)判断的好处在于:

  • 减少法律风险。它既不是主动的行为,也不是「反击」型行为。
  • 针对NAT后的服务器,它通常(除非是启用了包规则化的防火墙,例如OpenBSD/FreeBSD的pf中的packet正规化,或说scrub功能)能够正确揭示操作系统类型。
  • 能够在连接建立时判断是否应允许连接。

基于这种方式有很多有意思的应用,例如:

  • 作为网关或网桥,禁止没有打过补丁的计算机访问外部网络,从而割断病毒或蠕虫传播的途径。
  • 你认为SCO是一家做了错事的公司吗?遇到这种操作系统的用户,可以把他们转移到一个说明页面。
  • 你知道使用Windows的大多数邮件服务器管理员是不称职的,而Windows是散播蠕虫的主要来源,那么,是否可以限制它的带宽/连接数呢?
  • Linux是一个不太安全的内核,一些使用Linux的管理员甚至比Windows管理员还要不注意安全,允许Linux系统连接管理端口是十分危险的(因为它很可能是一个跳板),是否可以限制它们连接呢?

答案是:是的。集成了p0f(passive Operating-system fingerprinting)能力的pf防火墙中包含了一个默认的操作系统特征库(/etc/pf.os),这个特征库中包含了许多操作系统的TCP SYN特征,因而在设计防火墙规则时,就可以以此为依据来进行一些判断。例如pf.conf(5)中提到的例子:

pass out proto tcp from any os OpenBSD keep state
block out proto tcp from any os Doors
block out proto tcp from any os “Doors PT”
block out proto tcp from any os “Doors PT SP3”
block out from any os “unknown”
pass on lo0 proto tcp from any os “OpenBSD 3.3 lo0” keep state

同样地,类似的用法也可以用于rdr和nat规则。关于目前FreeBSD支持的被动OS特征以及如何自行编写这类信息,请参见/etc/pf.os和pf.os(5);如果你希望为p0f增加更多的特征信息,请访问p0f网站。最后,在真的使用这种技术来改善你的访问策略或安全策略之前,请谨记:

TCP特征是__可以__被伪造的。不要将这种技术作为一种可信的安全控制机制来使用。