背景
CVE-2018-0171漏洞是利用Smart Install功能的TCP 4786端口进行攻击,黑客可以伪造smart install message给该端口,引发路由器重启从而使得网络服务不可用。
Smart Install功能是部署大规模接入交换机是简化配置即插即用的配置和IOS镜像管理特性。
漏洞的具体利用已经公开,详见 Cisco Smart Install Remote Code Execution,通过构造恶意的代码可以造成交换机 crash 并重启和配置丢失。
修复
由于思科尚未放出补丁,所以现在的修复办法只能设法禁用掉 Smart Install 功能。
最快捷的方式是打 ACL 干脆禁掉 4786 端口,就像先前 smb 的漏洞肆虐时一样。
从根本上来看,对于不需要使用 Smart Install 的用户而言,应该干脆关掉这个功能。
switch#conf t
switch(config)#no vstack
switch(config)#do wr
switch(config)#exit
批量处理
由于漏洞可能包含 2960,而 2960 是应用极其广泛的接入层交换机……显然必须要批量来刷才靠谱。
SSH 的批量处理
对于开启了 SSH 的交换机,可以简单的直接使用 multissh 来一波带走。详见用 Go 写一个轻量级的 ssh 批量操作工具
特别的,可以直接对整个网段进行尝试,把超时时间设小一点就是了。
如下例,我们直接对 192.168.15.0/24
整个网段去尝试执行命令,对于没有 vstack 命令的,或者不存在交换机的 ip,在 5 秒后超时。设置 255 的并发,整个扫描和修复 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 的批量处理
很遗憾,我们还有相当一部的交换机没有开启 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')
# 等待读到 > ,尚未进入 enable 模式,输入 en
tn.read_until('>')
tn.write('en\n')
# 等待读到 Password ,输入 enable 的 password
tn.read_until('Password: ')
tn.write(en_password + '\n')
tn.read_until('#')
# 等待读到 #,已经进入 特权模式,开始刷命令
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()
# 关闭连接
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
连接并关掉 vstack
。通过 multiprocessing
来开启并发。
脚本代码在 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 # 并发数
ips = "192.168.12.0/24" # 扫码的地址段
password = "123456" # 密码
en_password = "654321" # enable 密码
#######################################
执行结果
# 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
当然,由于 telnet 的关系,这个脚本只考虑了 telnet 直接输入密码并存在 enable 密码的情况。诸如 telnet 之后跳 username 的,或者没有 enable 密码的,根据实际情况简单修改下 telnet 部分的代码即可。见上例中的注释。
参考文献
Cisco Smart Install Remote Code Execution
用 Go 写一个轻量级的 ssh 批量操作工具
Cisco IOS and IOS XE Software Smart Install Remote Code Execution Vulnerability