写点什么

思科设备漏洞 CVE-2018-0171 的快速修复

用户头像
冯骐
关注
发布于: 2021 年 03 月 04 日

背景


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;exit;exit" -t 5 -n 255 -u "admin" -p "123456"2018/04/08 11:29:14 Multissh start2018/04/08 11:29:19 Multissh finished. Process time 5.0243802s. Number of active ip is 254host:  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 tEnter configuration commands, one per line. End with CNTL/Z.North-sw-1(config)#no vstackNorth-sw-1(config)#do wrBuilding configuration...[OK]North-sw-1(config)#exitNorth-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/pythonimport telnetlibimport osfrom IPy import IPfrom multiprocessing.dummy import Pool as ThreadPool
threads = 32ips = "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-releaseyum -y install python-pipyum -y install nmappip install virtualenv
virtualenv ./envsource env/bin/activatepip 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 disabled192.168.12.18 smart install disabled 192.168.12.20 smart install disabled192.168.12.14 smart install disabled192.168.12.22 smart install disabled192.168.12.13 smart install disabled192.168.12.17 smart install disabled192.168.12.15 smart install disabled192.168.12.21 smart install disabled192.168.12.19 smart install disabled192.168.12.23 smart install disabled192.168.12.5 smart install disabled192.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


以上


原文于 2018 年 4 月首发于简书,搬家存档。

行文有微调。


发布于: 2021 年 03 月 04 日阅读数: 16
用户头像

冯骐

关注

教育行业码农 2020.06.19 加入

一个教育行业的码农

评论

发布
暂无评论
思科设备漏洞 CVE-2018-0171 的快速修复