1、背景
现代大型公司往往都有自己的内部办公网络,根据公司业务的规模及分布,有的办公网络集中于某个地区,有的则跨省跨国。使用计算机网络的地方就必须考虑安全问题,这是计算机网络发展多年以来大家早已达成的共识。面对公司规模庞大、主机众多的网络,我们怎么能够快速检查,找到那些存在安全隐患的主机?这是网络管理员躲避不了的问题。目前人们对于内网安全的研究比较广泛,总结起来大致是三个方面:1)加强员工安全意识教育;2)提高终端安全管理水平;3)完善终端安全防护措施。笔者认为除了正面防御之外,还应考虑检查手段,不然无法验证我们的防御手段是否有效。考虑到完整的***测试未必适用于每个公司,因此本文提出利用端口扫描进行终端合规性检查的办法,并举例说明。希望以点带面、抛砖引玉,促进网络管理人员对内网安全的思考。

2、端口及端口扫描
端口只是一种软件中的抽象概念,用于区分通信信道。 这与IP地址用于识别网络上的计算机的方式类似,端口用来标识在单个计算机上使用的特定应用程序。例如,你的Web浏览器将默认连接到HTTP URLs中的TCP端口80。 如果您指定安全的HTTPS协议,浏览器将默认尝试端口443。
端口扫描是远程测试多个端口以确定它们处于什么状态的行为。通常我们最感兴趣的状态是open,这意味着应用程序正在侦听并接受端口上的连接。 虽然许多端口扫描程序传统上将所有端口都集中到open或closed状态,但我们将要使用的工具Nmap更加精细,它将端口划分为六个状态。 这些状态不是端口本身的固有属性,而是描述Nmap如何看待它们。例如,来自与目标相同的网络的Nmap扫描可能会将端口135/tcp显示为open,而同时使用来自Internet的相同选项的扫描可能会将该端口显示为filtered。
3、问题
在真实环境中有时我们会需要从一个网络中快速找出某个TCP端口开放的主机。例如:在Microsoft IIS的漏洞曝光后,我们很想知道网络中的这些主机上哪一台的TCP 80端口是打开的,并且还在运行着该服务;或者,当你发现一台被攻陷的主机上***留下的后门在端口31337上运行,你会希望快速扫描网络,找到其它被攻陷的主机,等等。
4、解决办法
要解决上面的问题,最直接的办法就是运行下面的命令:
#nmap -Pn -p<portnumber> -oG <logfilename.gnmap> <target network>
这是一个搜索4096个IP的Web服务器(端口80打开)的具体示例:
#nmap -Pn -p80 -oG logs/pb-port80scan-%D.gnmap 216.163.128.0/20
文件名中的“%D”将替换为扫描运行的数字日期(例如,2007年9月1日为“ 090107”)。尽管此扫描命令有效,但做一些选项上的优化会大大减少扫描时间。
#nmap -T4 -Pn -p80 - -max-rtt-timeout 200ms - -initial-rtt-timeout 150ms - -min-hostgroup 512 -oG logs/pb-port80scan-%D.gnmap 216.163.128.0/20
Nmap实用专题系列(二)利用端口扫描进行终端合规性检查的一个示例
 我们发现大部分时间都花在了反向DNS解析上。通过在上面的命令行中添加-n来禁止DNS解析,可以大大减少等待的时间。
上面的命令将grepable格式结果存储在指定的文件中。 然后,我们再用一个简单的egrep命令将找到端口80打开的机器:
egrep ‘[^0-9]80/open’ logs/pb-port80scan-%D.gnmap
egrep模式前面带有[^ 0-9],以避免虚假匹配端口(例如3180)。由于我们仅扫描端口80,因此当然不可能发生,但是这在进行多端口扫描时是一种好习惯。 如果只需要IP地址,则使用egrep awk'{print $ 2}’。
5、实例演示
有时,故事是理解决策的最佳方法,在实际例子中我们才能更好的理解如何决定在解决方案中使用哪些命令行。例如,在一家公司里,有大约4096台终端,这些终端上能够使用的应用程序公司有明确的要求,其中有一条“用户终端不得提供web服务”,但面对数量如此庞大的终端数,网络管理员不可能进行普查,即便逐台检查过,你也无法保证之后会不会有人违规。运行web服务器的主机通常会开放TCP 80端口,尽管理论上此类服务器可以侦听任何端口,但可能性最大的还是80端口。因此,我们可以通过找到网络中80端口开放的终端来确定那些违反公司规定的员工。
为了优化扫描的效果,我们先对网络延迟进行了测量,平均延迟60毫秒。考虑平均延迟影响之后,我们使用如下选项:- -max-rtt-timeout 200ms - -initial-rtt-timeout 150ms。然后再使用一个更加积极的时间模版-T4。
由于我们重视最小化整个扫描的完成时间,而不是最小化返回第一批主机结果之前的时间,因此,可以指定了较大的扫描组大小,选项- -min-hostgroup 512设定每次并行扫描512台主机。使用精确的子地址块能够避免出现低效的扫描子块,就像本例中的4096台主机如果用- -min-hostgroup 500,最后就会出现96台主机的扫描子块。
由于一次ping需要花费的时间与单端口扫描本身消耗的时间相同,因此无需在先前的ping阶段浪费时间。 因此,指定了-Pn以禁用该阶段。通过使用-n参数跳过反向DNS解析,可以节省大量时间。否则,在禁用ping扫描的情况下,Nmap会尝试查找所有4096个IP。由于我们是要寻找web服务器,所以将端口设定为80。当然,这样的设置会错过在非标准端口(例如81或8080)上运行的所有HTTP服务器。也不会找到使用443端口的SSL服务器。你也可以把这些端口加到选项-p之后,但是即使是多加一个端口也会让扫描时间翻倍,这大致与扫描的端口数成正比。
最后一个选项是-oG,后跟要存储grepable结果的文件名。Gordon将目标网络添加到命令的最后,然后按下enter键开始扫描。如例6所示:
例1: 开始扫描
Nmap实用专题系列(二)利用端口扫描进行终端合规性检查的一个示例

Nmap会在大约三分钟内扫描所有4096个IP。 正常输出显示一堆处于过滤状态的端口。这些IP中的大多数可能不是活动主机(端口仅显示为已过滤),因为Nmap没有收到对其SYN探针的响应。我们使用egrep命令,从输出文件中获得web服务器的列表。如例7所示:
例2: egrep命令查询开放80端口的主机

Nmap实用专题系列(二)利用端口扫描进行终端合规性检查的一个示例

在经过所有努力之后,发现了在4096个IP中有两台主机的80端口开放。上述例子描述的情况可能已经有很多网络管理员遇到过,比起一台主机一台主机的排查,使用端口扫描的效率明显更高。当然,如果出现了极端的用户,例如:故意躲避扫描;修改web服务端口;设置本地防火墙策略等,我们目前使用的办法效果就会大打折扣,不过有这种技术的用户本身在公司里应该就很显眼吧。

6、总结
终端合规性检查这个话题的范围其实挺大,并不仅仅只有应用程序检查这一个方面。本文以检查终端TCP 80端口开放的终端为例,介绍了端口扫描技术在此方面的应用。当然,没有一种技术能够单独解决终端合规性检查的问题,我们还需要综合利用其它手段,扩大检查范围,提高检查效率,减轻网络管理人员的工作负担。