在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用Boofuzz框架編寫腳本并進行IoT設備服務

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 作者:c4se ? 2022-10-10 17:00 ? 次閱讀

本環境是蛇矛實驗室基于"火天網演攻防演訓靶場"進行搭建,通過火天網演中的環境構建模塊,可以靈活的對目標網絡進行設計和配置,并且可以快速進行場景搭建和復現驗證工作。

自 2005年國際電信聯盟正式提出“物聯網IoT)”這一概念以來,物聯網在全球范圍內迅速獲得認可,并成為信息產業革命第三次浪潮和第四次工業革命的核心支撐。同時,數以億計的設備接入物聯網,這些設備如今已滲透到我們生活的方方面面,從家居到工廠無處不在。一方面物聯網設備使我們的生活更加便捷,而另一方面物聯網安全事件頻發,全球物聯網安全支出不斷增加。

當前,大量物聯網設備及云服務端直接暴露于互聯網,這些設備和云服務端存在的漏洞一旦被利用,可導致設備被控制、用戶隱私泄露、云服務端數據被竊取等安全風險,甚至會對基礎通信網絡造成嚴重影響。從2018年全球統計數據來看,路由器、視頻監控設備暴漏數量占比較高。

路由器暴漏數量超過3000萬臺,視頻監控設備暴露數量超過1700萬臺,并且這些設備往后幾年會一年比一年多,物聯網安全的事件也會越來越多。由此,物聯網安全行業需要大力發展,物聯網安全人才的培養也刻不容緩。

蛇矛實驗室在后續將利用火天網境系列靶場中的相關目標仿真和環境構建的特性,將持續發布關于“物聯網安全-CVE實戰分析”系列的文章來幫助大家入門物聯網安全。

關于模糊測試

模糊測試(Fuzz Testing)是一種自動化的軟件測試技術,最初是由威斯康辛大學的Barton Miller于1989年開發的,通常用于識別程序中的潛在漏洞。其核心思想是自動或半自動的生成隨機數據輸入到一個程序中,并監視程序異常,如***,斷言 (assertion)失敗,以發現可能的程序錯誤,比如內存泄漏。

模糊測試常常用于檢測軟件或計算機系統的安全漏洞。Boofuzz是一個基于python生成的協議Fuzz工具,它通過python語言來描述協議的格式。Boofuzz對協議的模糊測試有著良好的支持,且其代碼開源,目前被廣泛使用,但Boofuzz無法直接獲取協議相關知識,需人工定義協議模型。這一小節,我們將使用Boofuzz實戰測試vivotek攝像頭棧溢出漏洞。

漏洞分析

下載好固件后,我們使用"binwalk 固件名"進行分析,發現固件并沒有加密,并且文件系統是squashfs格式,固件中的數據都經過了xz壓縮。

904b4f34-35a9-11ed-ba43-dac502259ad0.png

我們使用"binwalk -Me 固件名"遞歸提取里面的文件系統。

9087a394-35a9-11ed-ba43-dac502259ad0.png

里面的目錄比較多,我們可以使用”find . -name ’squashfs-root‘ “,也可以使用tree命令快速預覽文件目錄分布情況。這里我使用"tree -d -L 5"命令,遞歸查看5層以內的目錄,然后就找到了"squashfs-root"文件目錄。

90c123da-35a9-11ed-ba43-dac502259ad0.png

還是和前面小節的步驟相同,我們進入到文件系統的根目錄中,查看開機自啟"etc/init.d/rcS"文件。

90ee1070-35a9-11ed-ba43-dac502259ad0.png

開機自啟文件中,首先初始化系統,然后使用run-parts命令遍歷執行"/etc/rcS.d"目錄下的所有可執行腳本。

91244226-35a9-11ed-ba43-dac502259ad0.png

進入"etc/rcS.d/"目錄下后發現執行腳本均為軟連接文件,連接至"etc/init.d/"下的對應文件。我們在這里看到了httpd腳本,一般情況下路由器系統中的httpd為web服務程序,所以這里可能是啟動httpd服務的腳本。

914fc6f8-35a9-11ed-ba43-dac502259ad0.png

我們查看"/etc/init.d/httpd"文件,發現httpd程序為 "/usr/sbin/httpd"程序,并且執行參數為"-c /etc/conf.d/boa -d"。確定了路由器的服務器程序,我們進行漏洞分析。

91880608-35a9-11ed-ba43-dac502259ad0.png

這一小節的漏洞信息以及POC已經在[exploit-db]中詳細的展示了出來。根據這里的漏洞詳情我們知道了vivotek攝像頭漏洞是棧溢出漏洞,觸發的具體位置為"Content-Length"頭。根據以上信息,我們將httpd程序放入IDA Pro進行分析。

91b9e9de-35a9-11ed-ba43-dac502259ad0.png

IDA Pro分析完畢后,我們按"shift+F12"搜索Content-Length字符串,雙擊進入其存儲變量地址。

91e2c30e-35a9-11ed-ba43-dac502259ad0.png

鼠標點擊"Content-Length"存儲變量,按“x”可以找到該變量的交叉引用。發現sub_17F80函數引用了該變量。進入函數進行分析

920b1610-35a9-11ed-ba43-dac502259ad0.png

函數獲取由用戶"POST或PUT"方法請求包中的"Content-Length"頭位置并存入v33變量中。然后獲取" "的位置賦值給v34,獲取":"的位置賦值給v35變量。

隨后使用strncpy函數從":"后面+1位置的字節一直復制到“ "字符前面一字節的位置,將所有的字節復制到dest變量,dest變量為4字節的char型數組。

由于開發者沒有對“Content-Length”參數的值進行限制,導致攻擊者可以偽造"Content-Length"頭,寫入大量不為"x00"的垃圾數據就可以導致棧溢出。

923d0abc-35a9-11ed-ba43-dac502259ad0.png

知道了漏洞成因以及觸發位置,下面我們使用boofuzz進行fuzz測試,以下測試環境在ubuntu18.04中完成。

首先安裝boofuzz:

Boofuzz 官方要求 Python ≥ 3.5,并且推薦安裝方式為pip。那么我們先確保python和pip已經安裝。

sudo apt-getinstall python3python3-pip python3-dev

Boofuzz官方建議我們在虛擬環境 (venv)中設置 boofuzz 。那么我們需要安裝boofuzz的依賴

sudo apt-get installpython3-venv build-essential

創建boofuzz目錄,并在其目錄下啟動虛擬環境env,使其與其他包隔離

mkdirboofuzz && cdboofuzz
python3-mvenv env

926a222c-35a9-11ed-ba43-dac502259ad0.png

這會在當前文件夾中創建一個新的虛擬環境 env。這里的虛擬環境中的 Python 版本是固定的,并且可以在創建時選擇。與全局安裝不同,虛擬環境中的虛擬環境python別名為 Python 版本。然后我們使用下面的命令來激活虛擬環境:

sourceenv/bin/activate

激活環境后,我們終端前面的標識多了一個"(env)",這代表我們在虛擬環境中操作。

然后安裝最新版的pip和setuptools:

pip install-U pip setuptools

最后,安裝 boofuzz:

pip installboofuzz

安裝好以后,進入python3,測試導入boofuzz庫不報錯即為安裝成功。

92a10d78-35a9-11ed-ba43-dac502259ad0.png

安裝好boofuzz以后,我們就可以使用boofuzz框架進行fuzz測試了。我們需要編寫一個fuzz腳本,腳本如下:

fromboofuzz import*
IP = "127.0.0.1"
PORT = 80

defcheck_response(target,fuzz_data_logger,session,*args,**kwargs):
fuzz_data_logger.log_info("Checking for response ...")
try:
response = target.recv(512)
except:
fuzz_data_logger.log_fail("Unable to connect ...")
return
ifnotresponse:
fuzz_data_logger.log_fail("Empty response ...")
target.close()
return
fuzz_data_logger.log_info("Start checking ...
"+response.decode())
target.close()
return

defmain():
session = Session(
target=Target(connection=SocketConnection(IP,PORT,proto="tcp"),
),
post_test_case_callbacks=[check_response],
)
s_initialize(name="FUZZ")
withs_block("Request-Line"):
# Method
s_group("Method",["POST"])
s_delim(" ",fuzzable=False)
s_string("/cgi-bin/admin/upgrade.cgi ",fuzzable=False,name="URI")
s_static("HTTP/1.1",name="Version")
s_static("
",name="CRLF")
# Host
s_static("Host")
s_delim(": ",fuzzable=False)
s_string("127.0.0.1",fuzzable=False,name="IP")
s_static("
")
# Connection
s_static("Connection")
s_delim(": ",fuzzable=False)
s_string("Close",fuzzable=False,name="Active")
s_static("
")
# Content-Length
s_static("Content-Length")
s_delim(": ", fuzzable=False)
s_string("65", fuzzable=True)
# End
s_static("
")
s_static("
")

session.connect(s_get("FUZZ"))
session.fuzz()

if__name__=="__main__":
main()

上面的腳本***有倆個函數,一個main函數(腳本入口函數),一個check_response函數(回調函數)。

main函數中,首先我們創建一個session,session可以設置一些基礎屬性,我們可以使用Target設置我們要fuzz的目標的ip地址和端口號以及協議類型(這里我們要fuzz的目標為httpd服務器,即tcp協議)。Target還可以使用post_test_case_callbacks指定回調函數。

當我們發送fuzz的請求包后,boofuzz需要判斷返回包的內容來確定是否具有漏洞特點,這里就需要用到回調函數。我們可以自己編寫回調函數,這里我們將回調函數指定為check_response函數,回調函數的參數'fuzz_data_logger'記錄測試檢查和通過/失敗。

boofuzz數據生成的特點為一個數據報文由Primitives和Blocks組成,多個Primitives可以組成Block,Blocks之間可以相互嵌套。所以我們需要初始化一個消息請求塊,這里我設置請求塊的名稱為FUZZ,然后通過s_block設置對應的http請求數據。然后我們可以指定對應的字段選擇fuzz,設置Content-Length參數的值為”fuzzable=True“。使用session.connect(s_get("FUZZ"))發送請求包裹,session.fuzz()開始驅動整個fuzz過程。

下面開始測試fuzz腳本,我們先模擬運行vivotek的httpd服務,訪問后發現服務正常。

92c39afa-35a9-11ed-ba43-dac502259ad0.png

運行我們的fuzz腳本,藍色字體的部分為腳本發送的request包數據,我們發現Content-Length參數后面的值確實是由boofuzz產生的fuzz數據。這里case 1中出現了紅色字體的報錯,為"Empty reponse ...",也就是說沒有返回包。猜測服務器可能已經***,切換至模擬的路由器系統進行查看

9303d2d2-35a9-11ed-ba43-dac502259ad0.png

果然,服務器已經***,說明我們的fuzz腳本是正確的,服務器不能正確處理Content-Length的垃圾數據,導致服務器***。

933f1afe-35a9-11ed-ba43-dac502259ad0.png

這時,我們可以訪問localhost:26000可以觀察boofuzz web服務中這次fuzz的詳細信息。

9367f26c-35a9-11ed-ba43-dac502259ad0.png

確定了確實是有棧溢出漏洞后,我們寫一個poc測試一下棧溢出偏移

正式運行路由器httpd服務,使用gdbserver進行attach,使用gdb-multiarch進行遠程調試。

93904fd2-35a9-11ed-ba43-dac502259ad0.png

我們在0x18538(strncpy函數)處下斷點,然后c運行,這時發送poc,程序斷在了strncpy處。pwndbg中顯示了strncpy函數執行時src和dest的地址。

93c24a00-35a9-11ed-ba43-dac502259ad0.png

拷貝到棧上時,0x7effeb4c處為返回地址,那么我們就算出了拷貝字符串到返回地址的偏移為0x34字節。下面我們開始寫exp

93f94258-35a9-11ed-ba43-dac502259ad0.png

編寫exp的過程中,需要注意的點為strncpy復制時遇到"x00"停止,所以我們需要繞過"x00"找到可以用的rop gadget,然后通過已知的libc基地址找到system函數的地址運行命令。最終代碼如下

94270a9e-35a9-11ed-ba43-dac502259ad0.png

動態調試整個過程,下斷strncpy,沒拷貝前棧空間正常

94533704-35a9-11ed-ba43-dac502259ad0.png

strncpy拷貝完成后,我們觀察一下棧的空間分布

94811e8a-35a9-11ed-ba43-dac502259ad0.png

返回地址確實被我們覆蓋成了gadget的地址,說明我們前面的分析正確。

94b40084-35a9-11ed-ba43-dac502259ad0.png

漏洞復現

啟動路由器后,運行我們的exp腳本

94fdfc3e-35a9-11ed-ba43-dac502259ad0.png

此時路由器系統中,已經運行了"nc -lp2222 -e /bin/sh",我們使用nc連接后就可以獲得shell

952a3d44-35a9-11ed-ba43-dac502259ad0.png

使用nc連接2222端口后,隨意運行命令,命令成功執行,本次攻擊成功。

956b360a-35a9-11ed-ba43-dac502259ad0.png

總結

這一小節,我們以vivotek攝像頭為例,簡短介紹了模糊測試框架Boofuzz,以及學習了如何利用該框架編寫腳本進行IoT設備服務進行fuzz。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 路由器
    +關注

    關注

    22

    文章

    3738

    瀏覽量

    114123
  • python
    +關注

    關注

    56

    文章

    4801

    瀏覽量

    84855
  • IOT
    IOT
    +關注

    關注

    187

    文章

    4221

    瀏覽量

    197166

原文標題:物聯網安全實戰從零開始-Vivotek的Fuzzing 棧溢出

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    shell腳本編寫之本地腳本編寫和執行

    過,我們指定的shell應用為/bin/bash,所以,我們使用bash程序直接執行myshell.sh,或者/bin/bash myshell.sh:如果使用shell應用進行執行,那么在腳本編寫
    發表于 08-28 09:36

    腳本引擎編寫

    tcl腳本小白,我現在需要編寫一個腳本引擎,目前已經建立好了自己的一套指令系統,需要能使用這個腳本引擎將我記事本編寫的程序翻譯成機器碼,換句
    發表于 03-19 16:16

    利用xposed框架模擬真實手機環境和建立引流腳本矩陣的方法

    如何利用xposed框架模擬真實手機環境,建立引流腳本矩陣
    發表于 05-31 11:46

    如何使用STM32串口中斷服務函數進行接收并進行轉化為int型?

    如何使用STM32串口中斷服務函數進行接收并進行轉化為int型?
    發表于 12-07 08:03

    如何利用STM32通過ESP8266接入阿里云IoT平臺并進行相關溫濕度的應用開發

    ??本文通過實例來詳細介紹如何利用STM32,通過ESP8266接入阿里云IoT平臺并進行相關溫濕度的應用開發。具體分3個部分來做說明,第一部分介紹硬件的準備與連接;第二部分說明在阿里云IoT
    發表于 01-27 07:30

    HamronyOS自動化測試框架使用指南

    腳本編寫主要基于 DevEco Studio,并建議使用 3.1.0.400 之后的版本進行腳本編寫腳本執行需要 PC 連接 Harm
    發表于 12-19 10:26

    python編寫腳本方法

    對于具有484個引腳的芯片,如果手動一個一個設置引腳,必然是一場噩夢。網上有使用Capture進行自動導入的帖子,不過沒有找到AD方面的帖子。本文使用python,編寫腳本,自動分配引腳。
    發表于 11-17 11:38 ?4957次閱讀

    如何在代碼編寫器StudioIDE開發環境中使用腳本實用程序的詳細描寫

    腳本是代碼編寫器Studio集成開發的一種新實用工具。環境(IDE)V2.10。它提供了一個集成到Perl或Visual中的命令庫。基本應用程序(VBA),提供可利用的批處理模式腳本
    發表于 04-25 14:09 ?8次下載
    如何在代碼<b class='flag-5'>編寫</b>器StudioIDE開發環境中使用<b class='flag-5'>腳本</b>實用程序的詳細描寫

    使用傳統的IDE對51單片機進行邏輯編寫的基本框架程序免費下載

    本文檔的主要內容詳細介紹的是使用傳統的IDE對51單片機進行邏輯編寫的基本框架程序免費下載。
    發表于 09-03 17:28 ?0次下載
    使用傳統的IDE對51單片機<b class='flag-5'>進行</b>邏輯<b class='flag-5'>編寫</b>的基本<b class='flag-5'>框架</b>程序免費下載

    淺談IoT Power的Lua腳本開發應用

    Lua腳本開發簡單快速,在Cat.1和MCU開發應用中已歷經驗證并廣受好評。所以LuatOS社群經常有人問:合宙推出的口袋神器——IoT Power,可以腳本開發嗎?
    的頭像 發表于 09-05 14:43 ?1204次閱讀

    Linux命令行與shell腳本編寫

    Linux命令行與shell腳本編寫
    發表于 01-11 16:50 ?4次下載

    編寫一個點名器腳本

    目的:編寫一個腳本,可以將準別好的名字合集的.txt傳入腳本,然后每次隨機顯示一個人的姓名
    的頭像 發表于 11-06 12:41 ?605次閱讀
    <b class='flag-5'>編寫</b>一個點名器<b class='flag-5'>腳本</b>

    shell腳本編寫程序

    編寫Shell腳本時,你需要按照以下步驟進行: 打開一個文本編輯器,例如vi、nano或gedit。 創建一個新文件,并將其保存為以.sh為擴展名的文件, 例如script.sh 。 在文件的第一
    的頭像 發表于 11-08 10:12 ?909次閱讀

    如何利用shell進行腳本程序的設計?

    利用Shell進行腳本程序的設計可以按照以下步驟進行: 選擇Shell解釋器:在Unix和Linux系統中,通常會默認安裝一個或多個Shell解釋器,其中最常見且功能強大的是Bash(Bourne
    的頭像 發表于 11-08 10:17 ?655次閱讀

    shell實例三(編寫批量修改擴展名腳本)

    實現功能: 編寫批量修改擴展名腳本,如批量將 txt 文件修改為 doc 文件 執行腳本時,需要給腳本添加位置參數
    的頭像 發表于 11-09 09:35 ?714次閱讀
    shell實例三(<b class='flag-5'>編寫</b>批量修改擴展名<b class='flag-5'>腳本</b>)
    主站蜘蛛池模板: 欧美黑人粗硬大在线看| 国产午夜爽爽窝窝在线观看| 久久久五月| 精品xxxxxbbbb欧美中文| 黄色录像三级| 丁香花在线视频| 一本视频在线| 色天天综合色天天天天看大| 免费国产午夜高清在线视频| www奇米影视com| 真爽~张开腿~让我插| 好硬好湿好爽再深一点h| 亚洲天堂电影在线观看| 婷婷四房综合激情五月性色| 日本视频网站在线www色| 免费黄色| 黄色国产网站| 一区二区福利| 在线观看你懂的网站| 五月天情网| 欧美三级小视频| 国产日韩三级| 午夜快播| 国产精品资源在线观看网站| ccav在线永久免费看| 3p高h文| 四虎影院免费在线| 久久精品国产2020观看福利色| www.色com| 狠狠久| 欧美亚洲网站| 色综合九九| 国产三级视频| 男人天堂资源网| 亚洲一区二区三区免费观看| 亚洲va中文字幕| 美女网色| 天天干视频网站| 555夜色555亚洲夜色| 亚洲成a人片毛片在线| 久久全国免费久久青青小草|