企业在知己的过程中,首先要做的就是资产扫描,即通过资产扫描来了解并管理企业所有的资产。
需要注意的是,这里所说的资产管理与IT资产管理(IT Asset Management,ITAM)中的资产管理想要达到的目的是不太一样的,这里更倾向于从安全视角对资产进行管理。但如果企业已经部署了ITAM,则双方的数据可以进行必要的整合或验证,例如资产扫描可以基于ITAM中的数据进行操作,或是资产扫描后的数据可以同步到ITAM中。
资产扫描的目的是全面了解企业的各种IT资产,例如物理服务器、虚拟机、网络设备、存储设备、打印机、安全设备、物联网设备等。所有通过网络可以访问的资产,除了硬件形态的资产外,还包括软件形态的资产,例如数据库服务器、Web服务器、文件服务器等对外提供服务支撑的服务器软件。当然,企业还有数据资产等其他更为重要的无形资产。资产扫描的对象还是以硬件资产和软件资产为主。
首先,可以通过网络连通性的测试,例如,利用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:~#
其次,可以通过尝试连接端口,例如,利用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端口对外提供服务的。
仅获得开放的端口并没有太大的意义,重点是需要获得在开放端口上提供的服务类型、运行软件、软件版本等。因此,最后还需要通过对开放端口的识别,以及访问端口时的返回信息,例如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)等,所以通常情况下,如果确定了开放的端口,也就大概了解到了端口运行的服务。
为了完成对企业IT资产的画像,有时会利用多种资产扫描、资产采集的手段,具体内容如下所示。
通过主动对企业进行网络扫描,来对企业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信息来判断运行的服务。
除了直接扫描之外,企业安全人员还可以通过对企业中的网络流量进行采集和分析(例如全流量、NetFlow信息),从而梳理出所有有真实流量的硬件资产和软件资产。基于对流量的监测,也同样可以对资产存活以及开放端口进行非常高效的识别。和直接扫描不同,这是一种被动的信息采集方式。
通过直接扫描或流量采集的方式固然可以获得比较全面的资产信息,但对于新兴的虚拟化环境、混合云环境,甚至是多云环境就都有一定的局限了。所以,除了网络层的手段外,企业还可以通过云环境的开放接口,直接获取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(); ... } ...
除了在网络层进行扫描的方式外,如果有服务器权限的话,还可以登录服务器,通过运行一些命令来获得开放端口以及运行服务。
利用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:~#
如果企业已经建有配置管理数据库(Configuration Management Database,CMDB),那么很多信息都可以从CMDB中直接获得,不必再通过扫描手段来获得了。
无论采用哪种扫描手段,最终目的都是一样的,即通过获取“网络地址+开放端口+运行服务”这种组合信息,对企业的IT资产进行画像。这个组合信息虽然简单,但却非常重要,它是我们实现知己这个大目标迈出的第一步。