沒相關圖片 嘿嘿封面可以隨邊丟
前言 #
這是自己第一次去嘗試分析以及復現一個CVE的內容,由於是第一次去研究CVE,
因此在一開始要尋找哪個CVE來研究就思考了很久。
最後是決定是研究有關LFI的漏洞,因為我認為這個漏洞對我來講也比較直觀,
而且以前在打CTF也有遇過這種漏洞的問題。
本次CVE復現我也有丟在自己的github上,也歡迎大家去跟著自己實際動手做看看。
This repository is a proof of concept (POC) for CVE-2024-23334, demonstrating an attempt to replicate the bug in aiohttp that leads to Local File Inclusion (LFI).
漏洞 #
漏洞介紹 #
本漏洞發生在python的aiohttp版本=< 3.9.1、其中的follow_symlinks。
在撰寫aiohttp的python檔案建立伺服器時,其中有一項為follow_symlinks,能夠設定是否允許符號鏈接,
若在設定時將此設定為True,由於不會進一步驗證存取位置是否位於該系統目錄中,因此便有Local File Inclusion(LFI)的漏洞產生,能夠透過不斷輸入../來存取到系統根目錄下以外的敏感檔案(例如/etc/passwd之類的)。
符號連結介紹 #
簡單介紹一下符號連接,畢竟一開始我也不知道這是什麼
符號鏈接(symbolic links,也稱為軟連結),簡單來講可以把他想成Windows系統中的捷徑(就是你桌面上一堆點兩下就能開啟該應用程式的東東)。
我們能夠透過ln -s 目標檔案位置 連結名稱
來建立軟連結;而若是不加-s
則可以建立硬連結。
兩者最大的差別為,軟連接只能在當前目錄下生效,若是將其移到其他資料夾中則會失效,
而硬連結則是不論移到哪都能成功生效。
所以如果我們這邊建立12個硬連結的話 就會有12生效
建立軟連結 #
我們可以透過在static資料夾中執行ln -s ~/Desktop/flag.txt flag
來在該資料夾中建立一個軟連結指向桌面的flag.txt,
接著透過python server.py
來執行架設起來的server,並且在網址後面新增/static/flag
,
即可順利查看到桌面的flag.txt內容。
而我們若是將server.py中follow_symlinks改成Flase,
再次連接http://localhost:8081/static/flag
則會變成404: Not Found。
復現 #
本次復現主要是照著 參考github1 來做的
最初是先按照
參考github2
來復現,但由於在最後的時候無法順利成功,
因此最後改成使用其他的,至於為甚麼無法順利LFI則會在下面來做分析。
復現實做 #
本次復現基本上只需要按照github中所提供的指令輸入即可順利達成,
主要是透過python server.py
,將服務架設在localhost 8081,並且將follow_symlinks設定為True即可完成環境架設。
接著執行bash exploit.sh
,透過不斷新增../
的數量,來尋找想LFI的目標(/etc/passwd),
再來透過curl --path-as-is $url$payload$file
來對比回傳的狀態值是否為200,
若為200則代表順利找到該檔案,若為其它結果則是新增繼續../
的數量來嘗試尋找。
因此我們也能透過自己在cmd中執行執行例如curl --path-as-is http://localhost:8081/static/../../../../../../etc/passwd
,來直接手動輸入取得敏感檔案的內容,
而curl
後面接的--path-as-is
主要是為了讓他不會去自動忽略掉../
的內容,而是把../
作為整個網站內容一起輸入
而我們也能夠在本地中隨機放一個flag.txt的檔案,並且將exploit.sh中的內容稍作修改,這樣也能順利取得該flag.txt的內容!這樣一題CTF的題目就出好了
參考github2失敗原因? #
對比兩個github中腳本的不同,
可以發現在github1中是透過使用curl來獲取網站的回傳狀態碼,
而github2中則是透過python中的requests.get。
對比兩者結果後可以發現透過curl都能正常存取到目標檔案,而requests則會有問題。
經過了解後,推測是因為在requests會直接先對內容有../
的路徑進行處理,
進而導致傳輸的請求非預期。
因此這邊我們只需將../
轉換成..%2F
,即可順利執行。
總結 #
現在aiohttp的最新版本為3.11.10,經過實測後,在目前最新版本已經有將本問題修復掉了,
如果透過調用一樣的腳本,將無法再實現LFI的漏洞。
耶這是自己第一次復現CVE,本來在復現以前覺得CVE都是些神仙級別漏洞,那種腳本都要跑一大長串之類的漏洞。
但自己在實際操作過後發現,其實腳本也滿簡單的,觀念也都沒有到太高深。
最困難的部分主要還是在第一個去發現這個漏洞的人,
所以能第一個找到漏洞的人還是一樣是神🛐