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

• 本文约 1367 字,阅读大致需要 3 分钟 | Security

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

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

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

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

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

答案是:是的。集成了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特征是__可以__被伪造的。不要将这种技术作为一种可信的安全控制机制来使用。