快轉到主要內容

CVE-2024-23334復現

·
貝坦betan
作者
貝坦betan
其實作者也只會是我啦哈哈
甚麼時候才有自己的CVE…
沒相關圖片 嘿嘿封面可以隨邊丟

前言
#

這是自己第一次去嘗試分析以及復現一個CVE的內容,由於是第一次去研究CVE,
因此在一開始要尋找哪個CVE來研究就思考了很久。

最後是決定是研究有關LFI的漏洞,因為我認為這個漏洞對我來講也比較直觀,
而且以前在打CTF也有遇過這種漏洞的問題。

本次CVE復現我也有丟在自己的github上,也歡迎大家去跟著自己實際動手做看看。

Betan423/CVE-2024-23334-PoC

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).

null
0
0



漏洞
#

漏洞介紹
#

本漏洞發生在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內容。

alt text

而我們若是將server.py中follow_symlinks改成Flase,
再次連接http://localhost:8081/static/flag則會變成404: Not Found

alt text

復現
#

本次復現主要是照著 參考github1 來做的

最初是先按照 參考github2 來復現,但由於在最後的時候無法順利成功,
因此最後改成使用其他的,至於為甚麼無法順利LFI則會在下面來做分析。

復現實做
#

本次復現基本上只需要按照github中所提供的指令輸入即可順利達成,
主要是透過python server.py,將服務架設在localhost 8081,並且將follow_symlinks設定為True即可完成環境架設。

alt text

接著執行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則會有問題。

alt text

經過了解後,推測是因為在requests會直接先對內容有../的路徑進行處理,
進而導致傳輸的請求非預期。

因此這邊我們只需將../轉換成..%2F,即可順利執行。

alt text


總結
#

現在aiohttp的最新版本為3.11.10,經過實測後,在目前最新版本已經有將本問題修復掉了,
如果透過調用一樣的腳本,將無法再實現LFI的漏洞。

alt text

耶這是自己第一次復現CVE,本來在復現以前覺得CVE都是些神仙級別漏洞,那種腳本都要跑一大長串之類的漏洞。
但自己在實際操作過後發現,其實腳本也滿簡單的,觀念也都沒有到太高深。

最困難的部分主要還是在第一個去發現這個漏洞的人,
所以能第一個找到漏洞的人還是一樣是神🛐

參考連結
#

CVE連結
參考github1
參考github2
官方文件