1.1.1 资产扫描

企业在知己的过程中,首先要做的就是资产扫描,即通过资产扫描来了解并管理企业所有的资产。

需要注意的是,这里所说的资产管理与IT资产管理(IT Asset Management,ITAM)中的资产管理想要达到的目的是不太一样的,这里更倾向于从安全视角对资产进行管理。但如果企业已经部署了ITAM,则双方的数据可以进行必要的整合或验证,例如资产扫描可以基于ITAM中的数据进行操作,或是资产扫描后的数据可以同步到ITAM中。

1.扫描内容

资产扫描的目的是全面了解企业的各种IT资产,例如物理服务器、虚拟机、网络设备、存储设备、打印机、安全设备、物联网设备等。所有通过网络可以访问的资产,除了硬件形态的资产外,还包括软件形态的资产,例如数据库服务器、Web服务器、文件服务器等对外提供服务支撑的服务器软件。当然,企业还有数据资产等其他更为重要的无形资产。资产扫描的对象还是以硬件资产和软件资产为主。

(1)资产存活

首先,可以通过网络连通性的测试,例如,利用ping来判断硬件类资产是否存活。


root@target:~# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=2.94 ms
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 2.941/47.468/91.996/44.528 ms
root@target:~#

(2)开放端口

其次,可以通过尝试连接端口,例如,利用telnet来判断端口是否开放。


root@target:~# telnet 192.168.1.1 80
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.

服务器软件对外提供服务时,通常都会通过某个固定的端口进行,例如Web应用通常是通过80端口对外提供服务的,SSH应用是通过22端口对外提供服务的。

(3)运行服务

仅获得开放的端口并没有太大的意义,重点是需要获得在开放端口上提供的服务类型、运行软件、软件版本等。因此,最后还需要通过对开放端口的识别,以及访问端口时的返回信息,例如Banner信息,来判断运行的服务器软件。


root@target:~# nc localhost 22
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.8

现在很多流行的服务器软件都运行在默认的端口,例如HTTP(80)、HTTPS(443)、SSH(22)、Telnet(23)、SMTP(25)、NTP(123)、SNMP(161)、LDAP(389)、MySQL(3306)等,所以通常情况下,如果确定了开放的端口,也就大概了解到了端口运行的服务。

2.扫描手段

为了完成对企业IT资产的画像,有时会利用多种资产扫描、资产采集的手段,具体内容如下所示。

(1)网络层直接扫描

通过主动对企业进行网络扫描,来对企业IT资产进行画像,这是最简单、直接的技术手段,也是大多数安全厂商采用的方式。同时,这种扫描手段也在最大程度上模拟了攻击者的攻击路径。

通过直接扫描来探测资产存活是资产扫描的初级阶段,是其他扫描的基础。ping是一种基础的扫描工具,它利用了ICMP(Internet Control Message Protocol)的Echo字段,发出的请求如果收到回应,则代表地址是存活的。包括ping在内,常用的扫描手段有如下几类。

·ICMP Echo:精度相对较高。简单地向目标主机发送ICMP Echo Request,并等待回复的ICMP Echo Reply。

·ICMP Sweep:进行批量并发性扫描。使用ICMP Echo Request一次探测多个目标地址。通常这种探测包会并行发送,以提高探测效率,适用于大范围的扫描。

·Broadcast ICMP:广播型ICMP扫描。利用一些主机在ICMP实现上的差异,设置ICMP请求包的目标地址为广播地址或网络地址,这样就可以探测广播域或整个网络范围内的主机,子网内所有存活主机都会给予回应。但这种情况只适用于UNIX/Linux系统。

·Non-Echo ICMP:在ICMP协议中不仅有基于ICMP Echo的查询方式,还可以用Non-Echo ICMP。利用ICMP的服务类型,例如发出ICMP Timestamp Request、ICMP Address Mask Request等数据包,并且等待回应,根据回应来判断资产存活状态。

通过网络层直接扫描来对开放端口进行探测,通常是资产存活扫描之后的动作,telnet是最为直接、简单的探测工具,它基于的是TCP Connect方式实现的。下面罗列了部分用于端口扫描的技术,供大家参考。

·TCP Connect:一种简单的端口扫描技术,它的实现基于TCP协议建立的过程,通过完成与被扫描端口之间的三次握手过程(SYN、SYN/ACK和ACK)来识别端口是否处于开放状态。如果结果为成功,则表示端口处于开放状态;否则,这个端口是不开放的,即没有对外提供服务。

·TCP SYN:与TCP Connect不同的是,它没有完成一个完整的TCP连接,在和被探测端口之间建立连接时,只完成了前两次握手,到第三步就中断了,使连接没有完全建立。因此,这种端口扫描又被称为半连接扫描。

·TCP FIN:这种扫描方式不依赖TCP协议建立的三次握手过程,而是直接向被探测端口发送带有FIN标志位的数据包。如果端口处于开放状态,则会将它直接丢弃;反之,则会返回一个带有RST标志位的响应数据包。因此,可以根据是否收到RST来判断端口是否开放。

·TCP Xmas Tree:这种方法和TCP FIN类似,不同的是,它向被探测的端口发送的数据包中包含了3个标志位——FIN、PSH和URG。

·TCP Null:这种方法和TCP FIN类似,不同的是,它向被探测的端口发送的数据包中不包含任何标志位。

在确认开放端口后,需要对端口上运行的服务器软件(或者提供的服务)进行识别,这种识别技术相对比较简单,通常有如下两种使用方式。

·端口对应:根据一些常用端口与服务的对应关系,来判断端口上运行的服务。比如识别80端口处于开放状态,那可以初步判断在80端口上运行的是网站类型的服务;识别22端口处于开放状态,那可以初步判断在22端口上运行的是SSH服务。

·Banner:根据端口返回数据包中的Banner信息来判断运行的服务。

(2)网络层流量监测

除了直接扫描之外,企业安全人员还可以通过对企业中的网络流量进行采集和分析(例如全流量、NetFlow信息),从而梳理出所有有真实流量的硬件资产和软件资产。基于对流量的监测,也同样可以对资产存活以及开放端口进行非常高效的识别。和直接扫描不同,这是一种被动的信息采集方式。

(3)云环境开放接口

通过直接扫描或流量采集的方式固然可以获得比较全面的资产信息,但对于新兴的虚拟化环境、混合云环境,甚至是多云环境就都有一定的局限了。所以,除了网络层的手段外,企业还可以通过云环境的开放接口,直接获取IAAS或PAAS层的资产信息。这种数据获取的方式更加直接、准确且高效,随时都可以执行,不需要等到下一个扫描周期。

利用阿里云的开发接口,获得阿里云租户的虚拟机资源的代码如下所示。


...
    List<Instance> instanceList = null;
    DescribeInstancesRequest describeInstancesRequest = new DescribeInstances-Request();
    describeInstancesRequest.setRegionId(regionID);
    describeInstancesRequest.setVpcId(vpcID);
    try {
        DescribeInstancesResponse dir = client.getAcsResponse(describeInstances-Request);
        instanceList = dir.getInstances();
        ...
    }
...

(4)操作系统登录扫描

除了在网络层进行扫描的方式外,如果有服务器权限的话,还可以登录服务器,通过运行一些命令来获得开放端口以及运行服务。

利用netstat命令来获得操作系统上开放的端口的方法如下所示。我们可以看到,这台虚拟机上运行了多个服务,包括80端口的网站服务、22端口的SSH服务、389端口的LDAP服务、27017端口的MongoDB服务、3306端口的MySQL服务。


root@target:~# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
tcp        0      0 192.168.43.92:22        192.168.43.115:55152    ESTABLISHED
tcp6       0      0 :::21                   :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::389                  :::*                    LISTEN
tcp6       0      0 :::3306                 :::*                    LISTEN
root@target:~#

利用apt命令来获得安装的软件以及安装软件的版本,可以看到这台虚拟机上运行的MySQL版本是5.7.29。


root@target:~# apt list --installed |grep mysql
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
mysql-client-5.7/xenial-updates,xenial-security,now 5.7.29-0ubuntu0.16.04.1 amd64 [installed,automatic]
mysql-client-core-5.7/xenial-updates,xenial-security,now 5.7.29-0ubuntu0.16.04.1 amd64 [installed,automatic]
mysql-common/xenial-updates,xenial-updates,xenial-security,xenial-security,now 5.7.29-0ubuntu0.16.04.1 all [installed,automatic]
mysql-server/xenial-updates,xenial-updates,xenial-security,xenial-security,now 5.7.29-0ubuntu0.16.04.1 all [installed]
mysql-server-5.7/xenial-updates,xenial-security,now 5.7.29-0ubuntu0.16.04.1 amd64 [installed,automatic]
mysql-server-core-5.7/xenial-updates,xenial-security,now 5.7.29-0ubuntu0.16.04.1 amd64 [installed,automatic]
root@target:~# apt show mysql-server
Package: mysql-server
Version: 5.7.29-0ubuntu0.16.04.1
...
root@target:~#

(5)与CMDB进行整合

如果企业已经建有配置管理数据库(Configuration Management Database,CMDB),那么很多信息都可以从CMDB中直接获得,不必再通过扫描手段来获得了。

无论采用哪种扫描手段,最终目的都是一样的,即通过获取“网络地址+开放端口+运行服务”这种组合信息,对企业的IT资产进行画像。这个组合信息虽然简单,但却非常重要,它是我们实现知己这个大目标迈出的第一步。