企業(yè)網(wǎng)絡(luò )安全漏洞掃描
網(wǎng)絡(luò )安全漏洞掃描的工作原理
安全漏洞掃描技能是一類(lèi)重要的網(wǎng)絡(luò )安全技能。安全漏洞掃描技能與防火墻、侵略檢測體系互相配合,能夠有效提高網(wǎng)絡(luò )的安全性。經(jīng)過(guò)對網(wǎng)絡(luò )的掃描,網(wǎng)絡(luò )管理員能夠了解網(wǎng)絡(luò )的安全裝備和運轉的應用效勞,及時(shí)發(fā)現安全漏洞,客觀(guān)評估網(wǎng)絡(luò )危險等級。網(wǎng)絡(luò )管理員能夠根據掃描的成果更正網(wǎng)絡(luò )安全漏洞和體系中的錯誤裝備,在黑客進(jìn)犯前進(jìn)行防范。假如說(shuō)防火墻和網(wǎng)絡(luò )監控體系是被迫的防護手法,那么安全漏洞掃描就是一種自動(dòng)的前范辦法,能夠有效避免黑客進(jìn)犯行為,做到防患于未然。
網(wǎng)絡(luò )安全漏洞掃描技能是計算機安全掃描技能的主要分類(lèi)之一。網(wǎng)絡(luò )安全漏洞掃描技能主要針對體系中設置的不合適軟弱的口令,以及針對其他同安全規矩沖突的方針進(jìn)行檢查等。
網(wǎng)絡(luò )安全漏洞掃描技能是一種根據 Internet 遠程檢測方針網(wǎng)絡(luò )或本地主機安全性軟缺點(diǎn)的技能。
經(jīng)過(guò)網(wǎng)絡(luò )安全漏洞掃描,體系管理員能夠發(fā)現所維護的 Web 效勞器的各種TCP/IP 端口的分配、開(kāi)放的效勞、 Web 效勞軟件版別和這些效勞及軟件呈現在 Internet上的安全漏洞。網(wǎng)絡(luò )安全漏洞掃描技能也是采用活躍的、非破壞性的辦法來(lái)檢驗體系是否有或許被進(jìn)犯崩潰。其利用了一系列的腳本模仿對體系進(jìn)行進(jìn)犯的行為,并對成果進(jìn)行剖析。這種技能通常被用來(lái)進(jìn)行模仿進(jìn)犯實(shí)驗和安全審計。
注:網(wǎng)絡(luò )安全漏洞掃描技能與防火墻、安全監控體系互相配合就能夠為網(wǎng)絡(luò )供給很高的安全性。
一次完整的網(wǎng)絡(luò )安全漏洞掃描分為三個(gè)階段:
第一階段:發(fā)現方針主機或網(wǎng)絡(luò )。
第二階段:發(fā)現方針后進(jìn)一步搜集方針信息,包含操作體系類(lèi)型、運轉的效勞以及效勞軟件的版別等。假如方針是一個(gè)網(wǎng)絡(luò ),還能夠進(jìn)一步發(fā)現該網(wǎng)絡(luò )的拓撲結構、路由設備以及各主機的信息。
第三階段:根據搜集到的信息判別或者進(jìn)一步測試體系是否存在安全漏洞。
網(wǎng)絡(luò )安全漏洞掃描技能包含有 PING 掃射(Ping sweep)、操作體系探測 (Operating system identification)、怎么探測拜訪(fǎng)操控規矩 (firewalking)、端口掃描 (Port scan)以及漏洞掃描 (vulnerability scan)等。這些技能在網(wǎng)絡(luò )安全漏洞掃描的三個(gè)階段中各有體現。
PING 掃描用于網(wǎng)絡(luò )安全漏洞掃描的第一階段,能夠協(xié)助咱們辨認體系是否處于活動(dòng)狀況。
操作體系探測、怎么探測拜訪(fǎng)操控規矩和端口掃描用于網(wǎng)絡(luò )安全漏洞掃描的第二階段,其中操作體系探測顧名思義就是對方針主機運轉的操作體系進(jìn)行辨認;怎么探測拜訪(fǎng)操控規矩用于獲取被防火墻維護的遠端網(wǎng)絡(luò )的材料;而端口掃描是經(jīng)過(guò)與方針體系的 TCP/IP 端口銜接,并檢查該體系處于監聽(tīng)或運轉狀況的效勞。
網(wǎng)絡(luò )安全漏洞掃描第三階段采用的漏洞掃描通常是在端口掃描的基礎上,對得到的信息進(jìn)行相關(guān)處理,進(jìn)而檢測出方針體系存在的安全漏洞。
網(wǎng)絡(luò )安全漏洞掃描技能的兩大核心技能就是端口掃描技能和漏洞掃描技能,這兩種技能廣泛運用于當前較老練的網(wǎng)絡(luò )掃描器中,如聞名的 Nmap 和 Nessus 就是利用了這兩種技能。
企業(yè)的安全工程師在業(yè)務(wù)上線(xiàn)前或對公司所有資產(chǎn)進(jìn)行周期性地例行掃描,可以在被攻擊者發(fā)現可利用的漏洞之前發(fā)現并修復,將可能帶來(lái)的損害減少到最低,對企業(yè)信息安全來(lái)說(shuō)有積極主動(dòng)、防患于未然的作用。外部黑客前需要踩點(diǎn),在得知域名及IP等有限的信息逐步進(jìn)行嘗試、還需要繞過(guò)ACL、IDS、WAF等防御措施。企業(yè)內部掃描可以直接拿到所有服務(wù)器的資產(chǎn)列表、所有Web的域名及在每個(gè)IDC部署掃描服務(wù)器,所以?xún)炔繏呙韪臃奖?、更全面。即便是這種信息不對稱(chēng)的情況下,外部的黑客或白帽子總有辦法找到漏洞,所以各大互聯(lián)網(wǎng)公司紛紛都建立了自己的應急響應中心(俗稱(chēng)SRC),并給報漏洞的白帽子發(fā)豐厚的獎勵。(注:當下的SRC已經(jīng)不只獎勵漏洞,同時(shí)還獎勵舉報的危害線(xiàn)索)可以說(shuō)內部掃描可以發(fā)現99%以上的漏洞,剩余的則需要建立應急響應中心借助廣大白帽子的力量(眾測,類(lèi)似眾籌的一種形式)一起消滅掉,比如接收外部白帽子提供的漏洞和威脅情報信息并進(jìn)行獎勵。
一、漏洞掃描的種類(lèi)
1、按漏洞類(lèi)型分類(lèi)
●ACL掃描
●系統及應用服務(wù)漏洞掃描
(1)ACL掃描
ACL掃描是用來(lái)按一定的周期監視公司服務(wù)器及網(wǎng)絡(luò )的ACL的,比如無(wú)需對外開(kāi)放的端口或IP是否暴露在了公網(wǎng)中。ACL掃描器的作用如下:
1)安全部門(mén)可以根據掃描報告督促網(wǎng)絡(luò )管理員和系統管理員關(guān)閉暴露在公網(wǎng)中的高危服務(wù),避免重要的服務(wù)因放在公網(wǎng)中被入侵的風(fēng)險。
2)等某些應用或某些版本的應用發(fā)現新時(shí),安全部門(mén)可以快速從中查到存在的服務(wù)及版本,直接報到業(yè)務(wù)部門(mén)去修復。
ACL掃描的周期至少為一天一次,對于不同規模服務(wù)器的企業(yè)可以采用以下的方式:
1)對于數量較少的公司,可以直接用掃描,并將掃描出來(lái)的IP、端口、應用服務(wù)名、應用版本、時(shí)間等信息存放到中。
2)對于數量很多的公司,可以用Masscan掃描出所有的端口信息,然后再用去識別端口的協(xié)議及應用程序版本信息,可以根據實(shí)際情況部署掃描的數量、形成分布式的架構,加快掃描速度。
(2)弱口令掃描
管理員因疏忽大意或安全意識薄弱給網(wǎng)絡(luò )設備、或應用使用了默認的和簡(jiǎn)單的口令,這種的設備掛在公網(wǎng)上后很快就被或蠕蟲(chóng)掃描到并快速。常見(jiàn)的掃描器如Nessus、x-scan、h-scan、Hydra都具備掃描的功能,其中hydra支持的服務(wù)列表如下:
asterisk cisco cisco-enable cvs ftp ftps http[s]-{head|get}http[s]-{get|post}-form http-proxy http-proxy-urlenum
icq imap[s]irc ldap2[s]ldap3[-{cram|digest}md5][s]mssql mysql(v4)nntp oracle-listener oracle-sid pcanywhere
pcnfs pop3[s]postgres rdp redis rexec rlogin rsh s7-300 sip smb smtp[s]smtp-enum snmp
socks5 ssh sshkey svn teamspeak telnet[s]vmauthd vnc xmpp
以下為一個(gè)Python調用hydra掃描SSH的腳本,掃描結束后會(huì )將結果寫(xiě)到一個(gè)文本文件中:
import os
import re
import glob
import datetime
# import subprocess
import torndb
from bs4 import BeautifulSoup
# honeypot white db
db_info = dict(
hostname='127.0.0.1',
database='honeypot',
username='xxxxx',
password='xxxxxx
)
# Nmap scan class
# ------------------------------------------------------------------------------
class NmapScaner(object):
def __init__(self, ip_list, exclude_file):
self.dir = '/data1/ssh_scan'
self.ip_list = "%s/%s" % (self.dir, ip_list)
self.exclude_file = exclude_file
self.report = "%s/report_%s.xml" % (self.dir, str(datetime.datetime.now)[:10])
self.ssh_list = "%s/report_%s.ssh" % (self.dir, str(datetime.datetime.now)[:10])
self.cmd = '/usr/bin/nmap -iL %s --excludefile %s -p 22,8022 -oX %s -n --open -vv' % (
self.ip_list, self.exclude_file, self.report
)
self.hosts = []
def start(self):
print self.cmd
os.system(self.cmd)
# p = subprocess.Popen(self.cmd, shell=True)
# p.wait
def result(self):
print "report: ", self.report, type(self.report)
p1 = r'<address addr="(.+?)" addrtype=".*"></address>'
r1 = re.compile(p1)
p2 = r'<port portid="(.+?)" protocol=".*">'
r2 = re.compile(p2)
soup = BeautifulSoup(open(self.report).read)
results = soup.find_all("host")
for item in results:
host = dict
host["ports"] = list
ret_ip = r1.findall(str(item.address))
if ret_ip:
ip = ret_ip[0]
host["ip"] = ip
for port in item.ports:
ret_port = r2.findall(str(port))
if ret_port:
host["ports"].append(ret_port[0])
self.hosts.append(host)
# print hosts
f = open(self.ssh_list, "w")
for item in self.hosts:
ports = item.get('ports')
ip = item.get('ip')
if ip in CONST_HONEYPOT:
continue
for port in ports:
f.write('%s:%sn' % (ip, port))
return self.ssh_list
# Crack ssh passwd
# ------------------------------------------------------------------------------
class CrackSSH(object):
def __init__(self, ssh_filename):
self.ssh_file = ssh_filename
self.dir = '/data1/ssh_scan'
self.dir1 = '/data1/ssh_scan/scan_ssh'
self.hydra = '/usr/local/bin/hydra'
def prepare(self):
cmd = 'rm -f %s/x*' % self.dir1
print cmd
os.system(cmd)
cmd = "/usr/bin/killall -9 hydra"
os.system(cmd)
# ret = subprocess.call(cmd, shell=True)
# print ret
os.environ = '/data1/ssh_scan'
cmd = 'cd %s;/usr/bin/split -l 2000 %s' % (self.dir1, self.ssh_file)
# print cmd
# ret = subprocess.call(cmd, shell=True)
# print ret
os.system(cmd)
os.environ = None
def scan(self):
search = r'%s/x*' % self.dir1
# print search, type(search)
iplist = glob.glob(search)
# print iplist
for ip in iplist:
cmd = '%s -vV -L %s/user.txt -P %s/password.txt -M %s ssh -o
%s.log -t 4 -w 10 -e nsr >> %s.log &' %
(self.hydra, self.dir, self.dir, ip, ip, self.ssh_file)
# print cmd
os.system(cmd)
# Honeypot white list
# ------------------------------------------------------------------------------
class HoneyWhite(object):
def __init__(self):
self.db = torndb.Connection(
host=db_info.get('hostname'), database=db_info.get('database'),
user=db_info.get('username'), password=db_info.get('password')
)
self.whiteList = []
def result(self):
sql = "select * from honeypotip"
ret = self.db.query(sql)
for item in ret:
self.whiteList.append(item.get('ip').strip)
return self.whiteList
# Main Function
# ------------------------------------------------------------------------------
if __name__ == '__main__':
# get honeypot white list
honey_white = HoneyWhite
CONST_HONEYPOT = honey_white.result
print "Honeypot white listn", CONST_HONEYPOT
start_time = datetime.datetime.now
ip_list_file = 'ip_list_test.txt'
exclude_file = "exclude_file.txt"
h_exclude_file = open(exclude_file, "w")
for ip in CONST_HONEYPOT:
h_exclude_file.write("%sn" % ip)
h_exclude_file.close
nmap_scanner = NmapScaner(ip_list_file, exclude_file)
nmap_scanner.start
ssh_file = nmap_scanner.result
end_time = datetime.datetime.now
use_time = (end_time - start_time).seconds / 60.0
print "Start Time:%s, End Time:%s, Cost %s minutes" % (start_time, end_time, use_time)
# start to crack ssh weak password
crack_ssh = CrackSSH(ssh_file)
crack_ssh.prepare
crack_ssh.scan
(3)系統及應用服務(wù)漏洞掃描
常見(jiàn)的系統及應用服務(wù)掃描器有Nessus及開(kāi)源的openVAS,當數量巨大時(shí),需要部署多臺Nessus以集群模式進(jìn)行掃描。
實(shí)踐方法如下:
1)用程序調用Nessus的接口,將Nessus的掃描做成周期性任務(wù),每天對全部進(jìn)行一次安全掃描,并將掃描結果入庫,按級別進(jìn)行分級。
2)程序自動(dòng)建立工單并提交到業(yè)務(wù)部門(mén)進(jìn)行修復,修復好后再轉到安全部門(mén)確認,形成一個(gè)良性的閉環(huán)(如果您所在的公司沒(méi)有工單系統,則至少需要建立一個(gè)漏洞管理系統代替)。
Nessus官方提供的REST API接口的GitHub地址為:https://github.com/tenable/nessrest。
(4)Web漏洞掃描
業(yè)內常用的Web掃描工具列表如下:
● Acunetix Web Vulnerability Scanner(AWVS)
● IBM Rational AppScan
● sqlmap
● w3af
● arachni
● Zed Attack Proxy
以上幾款掃描器中,前2款是商業(yè)軟件,后幾款是免費開(kāi)源的。
實(shí)踐方法如下:
網(wǎng)站較少的公司。安全工程師手工用掃描器進(jìn)行Web掃描即可,但至少要使用2款以上掃描器進(jìn)行交叉確認,避免因某款掃描器漏報導致漏洞沒(méi)掃到而被外界黑客利用的情況發(fā)生。一般建議AWVS必用,再配合zap或arachni進(jìn)行確認。
網(wǎng)站較多的公司。大中型的互聯(lián)網(wǎng)公司有成千上萬(wàn)個(gè)大大小小的網(wǎng)站,安全工程師人肉利用掃描工具進(jìn)行掃描已經(jīng)不現實(shí)了,需要自研掃描工具,實(shí)現自動(dòng)化、批量化的漏洞掃描。常見(jiàn)的一個(gè)自動(dòng)化Web掃描器的架構圖1所示。
圖1 自動(dòng)化Web安全檢測平臺
2、按掃描器行為分類(lèi)
根據掃描器是否主動(dòng)發(fā)包的行為,可將掃描器分為以下幾種:
1)主動(dòng)掃描
2)半被動(dòng)掃描器
3)全被動(dòng)掃描器
(1)主動(dòng)掃描
常規的掃描器都是主動(dòng)發(fā)包,然后根據返回的包判斷目標設備是否存在。對于掃描器來(lái)說(shuō),是先將URL爬出來(lái),然后再在該URL中各個(gè)可以輸入參數的地方測試注入、等負載。常用的AWVS、、Nessus等都是主動(dòng)掃描器。
(2)半被動(dòng)掃描
其實(shí)該類(lèi)掃描器還是屬于主動(dòng)掃描器,區別是URL的獲取途徑不是爬蟲(chóng),而是以下幾種方式。
1)通過(guò)Access log獲取URL
例如將用戶(hù)或QA訪(fǎng)問(wèn)站點(diǎn)的Access log去重后進(jìn)行掃描。
2)通過(guò)流量鏡像的方式獲取URL
通過(guò)旁路鏡像得到全流量URL,去重后進(jìn)行掃描。對于比較大規模的Web資源掃描,可以通過(guò)Storm流式計算平臺將來(lái)自分光的全流量URL庫rewrite替換,去重歸一,驗證真實(shí)性后作為掃描器的輸入源,由消息隊列推送至分布式掃描器中。以下為一個(gè)利用WAF log、爬蟲(chóng)結果及流量鏡像中的URL作為輸入源的掃描器的架構如圖2所示。
圖2 URL庫作為掃描器輸入源
3)HTTP代理式的掃描器
這種方式常被QA或滲透測試人員使用,在瀏覽器設置一個(gè)代理,然后去訪(fǎng)問(wèn)網(wǎng)站的頁(yè)面,每訪(fǎng)問(wèn)一個(gè)URL就會(huì )被放到后臺去掃描,基本的框架代碼如下:
class ProxyHandler(tornado.web.RequestHandler):
SUPPORTED_METHODS = ['GET', 'POST', 'CONNECT']
@tornado.web.asynchronous
def get(self):
url_info = dict(
method=
self.request.method,
url=self.request.uri
)
self.request_info = None
def handle_response
(response):
if (response.error and not
isinstance(response.error, tornado.httpclient.HTTPError)):
self.set_status(500)
self.write('Internal server error:n' + str(response.error))
else:
self.set_status(response.code)
for header in ('Date', 'Cache-Control', 'Server','Content-Type', 'Location'):
v = response.headers.get(header)
if v:
self.set_header(header, v)
v = response.headers.get_list('Set-Cookie')
if v:
for i in v:
self.add_header('Set-Cookie', i)
if response.body:
self.write(response.body)
# Insert http request and response into mongodb
if self.application.scan:
url = url_info.get('url')
url_filter = UrlFilter(url)
if url_filter.filter:
http_info = HttpInfo(url_info, self.request_info, response)
values = http_info.get_info
mongodb = Mongodb(db_info)
mongodb.insert(values)
self.finish
body = self.request.body
self.request_info = self.request
if not body:
body = None
try:
fetch_request(
self.request.uri, handle_response,
method=
self.request.method, body=body,
headers=self.request.headers, follow_redirects=False,
allow_nonstandard_methods=True)
except tornado.httpclient.HTTPError as e:
if hasattr(e, 'response') and e.response:
handle_response(e.response)
else:
self.set_status(500)
self.write('Internal server error:n' + str(e))
self.finish
完整的demo代碼請參考:https://github.com/netxfly/passive_scan。
4)vpn式的掃描器
與前一種類(lèi)似,不過(guò)該種掃描需要播入一個(gè)特定的VPN中,在VPN中會(huì )設置一個(gè)透明代理,將80和443端口的數據轉發(fā)到透明代理中,之后測試者每訪(fǎng)問(wèn)一個(gè)URL也會(huì )放到后臺去掃描,以下的golang代碼就實(shí)現了一個(gè)透明代理:
package main
import (
"flag"
"fmt"
"github.com/netxfly/Transparent-Proxy-Scanner/hyperfox/proxy"
"github.com/netxfly/Transparent-Proxy-Scanner/hyperfox/tools/capture"
"strings"
// "github.com/netxfly/Transparent-Proxy-Scanner/hyperfox/tools/logger"
"github.com/toolkits/slice"
"log"
"net/http"
"net/url"
"os"
"time"
"upper.io/db"
"upper.io/db/mongo"
)
const version = "0.9"
const (
defaultAddress = `0.0.0.0`
defaultPort = uint(3129)
defaultSSLPort = uint(3128)
)
const (
Host = "127.0.0.1"
Port = "27017"
User = "xsec"
Password = "x@xsec.io"
Database = "passive_scan"
)
var settings = mongo.ConnectionURL{
Address: db.Host(Host), // MongoDB hostname.
Database: Database, // Database name.
User: User, // Optional user name.
Password: Password, // Optional user password.
}
var (
flagAddress = flag.String("l", defaultAddress, "Bind address.")
flagPort = flag.Uint("p", defaultPort, "Port to bind to, default is 3129")
flagSSLPort = flag.Uint("s", defaultSSLPort, "Port to bind to (SSL mode),
default is 3128.")
flagSSLCertFile = flag.String("c", "", "Path to root CA certificate.")
flagSSLKeyFile = flag.String("k", "", "Path to root CA key.")
)
var (
sess db.Database
col db.Collection
)
var (
static_resource []string = []string{"js", "css", "jpg", "gif", "png", "exe",
"zip", "rar", "ico",
"gz", "7z", "tgz", "bmp", "pdf", "avi", "mp3", "mp4", "htm", "html", "shtml"}
)
// dbsetup sets up the database.
func dbsetup error {
var err error
// Attemping to establish a connection to the database.
sess, err = db.Open(mongo.Adapter, settings)
fmt.Println(sess)
if err != nil {
log.Fatalf("db.Open: %qn", err)
}
// Pointing to the "http_info" table.
col, err = sess.Collection("http_info")
return nil
}
// filter function
func filter(content_type string, raw_url string) bool {
ret := false
if strings.Contains(content_type, "text/plain") || strings.Contains
(content_type, "application/x-gzip") {
url_parsed, _ := url.Parse(raw_url)
path := url_parsed.Path
t := strings.Split(path[1:], ".")
suffix := t[len(t)-1]
if !slice.ContainsString(static_resource, suffix) {
ret = true
}
}
return ret
}
// Parses flags and initializes Hyperfox tool.
func main {
var err error
var sslEnabled bool
// Parsing command line flags.
flag.Parse
// Opening database.
if err = dbsetup; err != nil {
log.Fatalf("db: %q", err)
}
// Remember to close the database session.
defer sess.Close
// Is SSL enabled?
if *flagSSLPort > 0 && *flagSSLCertFile != "" {
sslEnabled = true
}
// User requested SSL mode.
if sslEnabled {
if *flagSSLCertFile == "" {
flag.Usage
log.Fatal(ErrMissingSSLCert)
}
if *flagSSLKeyFile == "" {
flag.Usage
log.Fatal(ErrMissingSSLKey)
}
os.Setenv(proxy.EnvSSLCert, *flagSSLCertFile)
os.Setenv(proxy.EnvSSLKey, *flagSSLKeyFile)
}
// Creatig proxy.
p := proxy.NewProxy
// Attaching logger.
// p.AddLogger(logger.Stdout{})
// Attaching capture tool.
res := make(chan capture.Response, 256)
p.AddBodyWriteCloser(capture.New(res))
// Saving captured data with a goroutine.
go func {
for {
select {
case r := <-res:
if filter(r.ContentType, r.URL) {
// fmt.Println(r.Method, r.URL, r.ContentType)
if _, err := col.Append(r); err != nil {
log.Printf(ErrDatabaseError.Error, err)
}
}
}
}
}
cerr := make(chan error)
// Starting proxy servers.
go func {
if err := p.Start(fmt.Sprintf("%s:%d", *flagAddress, *flagPort)); err != nil {
cerr <- err
}
}
if sslEnabled {
go func {
if err := p.StartTLS(fmt.Sprintf("%s:%d", *flagAddress, *flagSSLPort)); err != nil {
cerr <- err
}
}
}
err = <-cerr
log.Fatalf(ErrBindFailed.Error, err)
}
完整的實(shí)現代碼請參考GitHub
(3)全被動(dòng)掃描
部署方式上類(lèi)似于,不主動(dòng)爬URL,而是對B/S & C/S雙向交互的數據流進(jìn)行掃描以期發(fā)現,全被動(dòng)掃描的特點(diǎn)如下:
1)不需要聯(lián)網(wǎng),不會(huì )主動(dòng)爬取URL,不會(huì )主動(dòng)發(fā)出任何數據包。
2)更關(guān)注漏洞感知,而不是入侵行為。
何時(shí)需要被動(dòng)掃描?在日常的安全管理中,經(jīng)常有一些業(yè)務(wù)部門(mén)會(huì )引發(fā)安全管理之痛,例如:
● 業(yè)務(wù)部門(mén)沒(méi)有經(jīng)過(guò)安全部門(mén)的安全掃描和評估就擅自上線(xiàn),結果上線(xiàn)的服務(wù)器或站點(diǎn)被入侵了。
● 業(yè)務(wù)上線(xiàn)時(shí)確實(shí)經(jīng)過(guò)安全掃描和評審環(huán)節,當時(shí)證明是安全的,但在業(yè)務(wù)運營(yíng)的過(guò)程中,經(jīng)過(guò)幾次更新,把安全漏洞更新到生產(chǎn)環(huán)境中了。
● 部分業(yè)務(wù)因人員更換或離職變成了無(wú)人管理的業(yè)務(wù),也有可能資產(chǎn)不在公司的資產(chǎn)列表中,因長(cháng)期無(wú)人維護被攻擊者鉆了空子。
有了被動(dòng)式掃描器后,可以對這些處于灰色地帶的資產(chǎn)進(jìn)行防護。
二、如何應對大規模的資產(chǎn)掃描
近年來(lái)和很火,不少廠(chǎng)商的安全部門(mén)也紛紛引入了及分布式運算,比如安全日志分析、通過(guò)反爬蟲(chóng)、用流量鏡像中的URL進(jìn)行掃描、分布式掃描器等。普通的掃描方式在數萬(wàn)或幾十萬(wàn)臺的環(huán)境下會(huì )遇到以下問(wèn)題:
1)單臺或數臺掃描器仍不足以覆蓋海量IDC,完成全網(wǎng)掃描需要很多資源。
2)大量的并發(fā)掃描占用網(wǎng)絡(luò )帶寬,高峰時(shí)影響用戶(hù)體驗,執行深度檢測可能會(huì )使應用或服務(wù)直接宕掉。
3)大量的誤報以及中低風(fēng)險漏洞會(huì )使人工解讀和后續整理難上加難。
因此海量IDC規模下漏洞掃描需要尋求高效的方式,總體思路是減少工作量,有幾個(gè)方法:
1)簡(jiǎn)化漏洞評估鏈,減少需要掃描的任務(wù)。
2)減少漏洞掃描的網(wǎng)絡(luò )開(kāi)銷(xiāo)和被檢查者的性能損耗。
3)減少漏洞掃描的種類(lèi)。
4)減少手工確認的工作量。
在實(shí)踐中,需要從以下幾方面進(jìn)行優(yōu)化:
1)不做全網(wǎng)的掃描,先做端口掃描,這樣做的前提是訪(fǎng)問(wèn)控制和縱深防御做到位,利用ACL大幅減少攻擊面,把需要掃描的端口減少到22、80、443等,開(kāi)的端口少了,全網(wǎng)全協(xié)議掃描就縮減為全網(wǎng)幾個(gè)關(guān)鍵應用的掃描。
2)做好高危端口監控,防止“計劃外”應用的濫用,這樣漏洞掃描這件事就瘦身為端口監控加關(guān)鍵應用掃描。
3)在系統和應用掃描上,不完全依賴(lài)于網(wǎng)絡(luò )掃描器,可同時(shí)借助于本機agent掃描,類(lèi)似心臟滴血的與其從網(wǎng)絡(luò )上去獲取掃,不如在本地獲取OpenSSL的版本更簡(jiǎn)單。OS本地的agent除了可以?huà)呦到y型,還可以?huà)弑镜嘏渲眯?,相對?lái)說(shuō)本地獲取的信息比網(wǎng)絡(luò )獲取更準確,但代價(jià)是會(huì )消耗資源,所以這塊需要盡可能地減少性能損耗。
除了極個(gè)別大公司,對于絕大多數企業(yè)而言,自研掃描器比商業(yè)產(chǎn)品或成熟的開(kāi)源產(chǎn)品掃描能力更強的可能性是不高的,但是單機掃描又嚴重影響效率,所以對于業(yè)務(wù)有一定規模但安全團隊又沒(méi)能力自制掃描器的公司,可以考慮將現有的掃描器改成分布式的,如下所示:
● 對于Web掃描,可以通過(guò)任務(wù)隊列的方式將掃描任務(wù)發(fā)給awvs、arachni、w3af等掃描器,改成分布式掃描器。
● 對于及網(wǎng)絡(luò )掃描,可以多部署幾臺Nessus掃描器,并配置為集群模式,調用API進(jìn)行大規模掃描。
三、結語(yǔ)
在愈演愈烈的現代,光有基于靜態(tài)規則和帶fuzz功能的掃描還是會(huì )有許多覆蓋不到,安全部門(mén)需要采取基于數據的掃描,比如結合等。其次需要建立中心,讓廣大也參與到的挖掘與發(fā)現中,盡可能多地把暴露在外面的消滅掉。
大型公司在安全實(shí)踐上可能采取一些精簡(jiǎn)手段,只做某些事情,前提是他們已經(jīng)做了另外一些看不見(jiàn)的防御措施,在某處精簡(jiǎn)必然是因為在其他地方削減了攻擊面,并且有多層次的防御機制做互補,也就是說(shuō)他們的方案往往是針對自身特點(diǎn)的,不是一個(gè)完全意義上的通用方案,如果我們的安全建設尚未到達那個(gè)階段,直接和安全走在前沿的大型公司看齊,采用人家“高大上”的安全解決方案時(shí),很有可能會(huì )發(fā)生刻舟求劍的笑話(huà),需要實(shí)事求是,根據實(shí)際情況逐步地建設所在機構的安全體系。