背景
CVE-2018-0171漏洞是利用Smart Install功能的TCP 4786端口進(jìn)行攻擊沧卢,黑客可以偽造smart install message給該端口斜脂,引發(fā)路由器重啟從而使得網(wǎng)絡(luò)服務(wù)不可用。
Smart Install功能是部署大規(guī)模接入交換機(jī)是簡化配置即插即用的配置和IOS鏡像管理特性席怪。
漏洞的具體利用已經(jīng)公開瓦哎,詳見 Cisco Smart Install Remote Code Execution,通過構(gòu)造惡意的代碼可以造成交換機(jī) crash 并重啟和配置丟失夜涕。
修復(fù)
由于思科尚未放出補(bǔ)丁,所以現(xiàn)在的修復(fù)辦法只能設(shè)法禁用掉 Smart Install 功能属愤。
最快捷的方式是打 ACL 干脆禁掉 4786 端口女器,就像先前 smb 的漏洞肆虐時一樣。
從根本上來看住诸,對于不需要使用 Smart Install 的用戶而言驾胆,應(yīng)該干脆關(guān)掉這個功能。
switch#conf t
switch(config)#no vstack
switch(config)#do wr
switch(config)#exit
批量處理
由于漏洞可能包含 2960贱呐,而 2960 是應(yīng)用極其廣泛的接入層交換機(jī)……顯然必須要批量來刷才靠譜丧诺。
SSH 的批量處理
對于開啟了 SSH 的交換機(jī),可以簡單的直接使用 multissh 來一波帶走奄薇。詳見用 Go 寫一個輕量級的 ssh 批量操作工具
特別的驳阎,可以直接對整個網(wǎng)段進(jìn)行嘗試,把超時時間設(shè)小一點(diǎn)就是了馁蒂。
如下例呵晚,我們直接對 192.168.15.0/24
整個網(wǎng)段去嘗試執(zhí)行命令,對于沒有 vstack 命令的沫屡,或者不存在交換機(jī)的 ip饵隙,在 5 秒后超時。設(shè)置 255 的并發(fā)沮脖,整個掃描和修復(fù) 5 秒左右就能完成癞季。
.\multissh.exe -ips "192.168.15.0/24" -cmds "conf t;no vstack;do wr;exi
t;exit" -t 5 -n 255 -u "admin" -p "123456"
2018/04/08 11:29:14 Multissh start
2018/04/08 11:29:19 Multissh finished. Process time 5.0243802s. Number of active ip is 254
host: 192.168.15.1
========= Result =========
sw-Core>conf t
^
% Invalid input detected at '^' marker.
sw-Core>no vstack
^
% Invalid input detected at '^' marker.
sw-Core>do wr
^
% Invalid input detected at '^' marker.
sw-Core>exit
SSH run timeout:5 second.
host: 192.168.15.140
========= Result =========
SSH run timeout:5 second.
host: 192.168.15.141
========= Result =========
North-sw-1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
North-sw-1(config)#no vstack
North-sw-1(config)#do wr
Building configuration...
[OK]
North-sw-1(config)#exit
North-sw-1#exit
<dial tcp 192.168.15.254:22: connectex: No connection could be made because the target machine actively refused it.>
telnet 的批量處理
很遺憾劫瞳,我們還有相當(dāng)一部的交換機(jī)沒有開啟 ssh,必須通過 telnet 來操作绷柒。telnet 由于各家提示符不一,做批量工具很麻煩涮因。不過這里我們要處理的都是思科废睦,所以可以弄個腳本來刷掉。如下所示养泡。
#!/usr/bin/python
import telnetlib
import os
from IPy import IP
from multiprocessing.dummy import Pool as ThreadPool
threads = 32
ips = "192.168.0.0/24"
password = "123456"
en_password = "654321"
##############################################################
def no_smart(host,password,en_password):
rt =''
try:
tn = telnetlib.Telnet(host, port=23, timeout=3)
except:
print host + ' telnet connect error'
# 嘗試 telnet 連接
# 等待讀到 Password嗜湃,輸入 password
tn.read_until('Password: ')
tn.write(password + '\n')
# 等待讀到 > ,尚未進(jìn)入 enable 模式,輸入 en
tn.read_until('>')
tn.write('en\n')
# 等待讀到 Password ,輸入 enable 的 password
tn.read_until('Password: ')
tn.write(en_password + '\n')
tn.read_until('#')
# 等待讀到 #澜掩,已經(jīng)進(jìn)入 特權(quán)模式购披,開始刷命令
tn.write("conf t"+"\n")
tn.read_until('#')
tn.write('no vstack'+'\n')
tn.write('do wr'+'\n')
while True:
t = tn.read_eager()
rt = rt + t
if '#' in t:
break
tn.close()
# 關(guān)閉連接
return rt
def nmap_check(host):
cmd = "nmap -p T:4786 " + host
res = os.popen(cmd).readlines()
if "4786/tcp open" in res[-3]:
return True
else:
return False
def do(ip):
host = str(ip)
if nmap_check(host) == True:
no_smart(host,password,en_password)
print host + "smart install disabled"
if __name__=='__main__':
pool = ThreadPool(threads)
pool.map(do,IP(ips))
pool.close()
pool.join()
思路,先通過 nmap
做個試探肩榕,如果開啟了端口就去做 telnet
連接并關(guān)掉 vstack
刚陡。通過 multiprocessing
來開啟并發(fā)。
腳本代碼在 github 上 cisco_disable_smart_install株汉,依賴 nmap 和 IPy
yum -y install epel-release
yum -y install python-pip
yum -y install nmap
pip install virtualenv
virtualenv ./env
source env/bin/activate
pip install -r requirement.txt
在腳本的開始修改基本配置
threads = 128 # 并發(fā)數(shù)
ips = "192.168.12.0/24" # 掃碼的地址段
password = "123456" # 密碼
en_password = "654321" # enable 密碼
#######################################
執(zhí)行結(jié)果
# python disable_smart_install.py
192.168.12.6 smart install disabled
192.168.12.24 smart install disabled
192.168.12.18 smart install disabled
192.168.12.20 smart install disabled
192.168.12.14 smart install disabled
192.168.12.22 smart install disabled
192.168.12.13 smart install disabled
192.168.12.17 smart install disabled
192.168.12.15 smart install disabled
192.168.12.21 smart install disabled
192.168.12.19 smart install disabled
192.168.12.23 smart install disabled
192.168.12.5 smart install disabled
192.168.12.11 smart install disabled
當(dāng)然筐乳,由于 telnet 的關(guān)系,這個腳本只考慮了 telnet 直接輸入密碼并存在 enable 密碼的情況乔妈。諸如 telnet 之后跳 username 的蝙云,或者沒有 enable 密碼的,根據(jù)實(shí)際情況簡單修改下 telnet 部分的代碼即可润努。見上例中的注釋挪略。
參考文獻(xiàn)
Cisco Smart Install Remote Code Execution
用 Go 寫一個輕量級的 ssh 批量操作工具
Cisco IOS and IOS XE Software Smart Install Remote Code Execution Vulnerability