Python a kybernetická bezpečnosť / 14. časť
V predošlej časti seriálu sme ukázali, ako možno veľmi užitočnú funkcionalitu zneužiť na nekalé účely. Teraz na túto tému nadviažeme a ukážeme si, ako možno zneužiť ďalšiu z užitočných funkcionalít, a to konkrétne mechanizmus Distributed Computing Environment / Remote Procedure Call (DCE/RPC). DCE/RPC s výhodami využívajú najmä systémoví administrátori, a to na vzdialený prístup na počítače v ich správe. V prípade potreby teda nemusia fyzicky prísť ku konkrétnym počítačom, ale z pohodlia vlastnej kancelárie ich dokážu spravovať s využitím funkcionality vzdialeného prístupu, resp. vzdialeného vykonania príkazov. DCE/RPC je okrem správy vzdialených počítačov použiteľný napr. na vykonanie časovo náročných úloh na výkonnejších počítačoch, na efektívnu distribúciu úloh, na vykonanie špecializovaných úloh na špecializovaných platformách a pod. Ako obyčajne budeme pracovať v rámci OS Linux s nainštalovanými virtuálnymi strojmi, pričom napadneme OS Windows.
Vzdialený prístup
Takmer všetky moderné operačné systémy schopné pracovať v počítačovej sieti poskytujú nejakú formu vzdialeného prístupu, a to prostredníctvom rôznych sieťových protokolov. V rámci OS Windows sa v tomto smere najčastejšie stretneme s tzv. sharing protokolom Server Message Block (SMB), resp. s jeho verziami (dialektmi) Common Internet File System (CIFS), SMB 2 a SMB 3 (doplnené šifrovanie AES). Ide o protokol klient/server, ktorý sa používa na zdieľanie súborov, tlačiarní a portov, no možno ho použiť aj ako transakčný protokol pri vzájomnej komunikácii medzi procesmi (IPC – Inter-Process Communication) s využitím tzv. Named Pipes. Protokol SMB pracuje na aplikačnej vrstve modelu OSI, konkrétne na porte TCP 445, resp. 139. Je jedným z transportných protokolov komunikačného frameworku DCE/RPC, ktorý predstavuje mechanizmus, pomocou ktorého možno vykonávať príkazy, resp. kód v rámci vzdialených adresných priestorov, teda na vzdialených počítačoch pripojených do počítačovej siete. Zjednodušene sa príkaz vrátane jeho argumentov na strane klienta „zabalí“ do formy vhodnej na prenos (marshalling), následne sa prenesie na server, tu sa „rozbalí“, vykoná, výstupy príkazu sa „zabalia“ a prenesú spätne na klienta kde sa „rozbalia“ a odovzdajú nadradenému procesu.
Napriek tomu, že DCE/RPC a SMB boli vytvorené na to, aby pomáhali, ak sa dostanú do nesprávnych rúk, predstavujú isté bezpečnostné riziko. Ide o to, že potenciálny útočník dokáže s ich využitím spúšťať na cieľovom počítači príkazy bez toho, aby o tom vedel jeho aktívny používateľ. Na cieľovom počítači pritom nemusí byť nainštalovaná ani spustená žiadna špeciálna služba a navyše na počítači útočníka môže byť nainštalovaný ľubovoľný OS.
Obr. 1 Pracovné prostredie na prípravu a vykonanie príkazu na vzdialenom PC
Python PsExec (pypi.org/project/pypsexec)
Pypsexec je knižnica Python využívajúca funkcionalitu knižnice PAExec (poweradmin.com/paexec), ktorá je open source alternatívou proprietárnej knižnice PsExec (ako súčasť nástrojov Sysinternals – learn.microsoft.com/en-us/sysinternals).
Knižnica Pypsexec implementuje protokol SMB a DCE/RPC, ktorý spolupracuje s Windows Service Control Manager Remote (SCMR) API. Práve toto API je zodpovedné za manažment služieb vykonávaných na vzdialenom počítači.
Knižnica PAExec sa používa na strane servera vo forme služby, ktorá vykonáva požadované procesy, pričom vytvára tri Named Pipes – Out, Err, In (stdout, stderr, stdin).
Na to, aby sme dokázali využiť funkcionalitu knižnice Pypsexec, je potrebné splniť 4 základné podmienky (obr. 1 Splnenie podmienok):
1. na cieľovom počítači musí byť „otvorený“ port 445,
2. na cieľovom počítači musí byť povolené zdieľanie zložky ADMIN$ (štandardne je povolené),
3. používateľský účet musí byť členom skupiny Local Administrators,
4. Windows User Access Control (UAC) nesmie filtrovať tzv. remote logon token.
Obr. 2 Výstup príkazov vykonaných na počítači s OS Windows v rámci shellu OS Linux
Predstavme si prípad, že sme získali prihlasovacie údaje používateľa, ktorý je (možno nedopatrením) členom skupiny Administrators a na cieľovom počítači je spustená služba telnet či SSH. Nič nám nebráni cestou SSH vykonať Windows príkaz:
netsh advfirewall firewall add rule name="otvor445" dir=in action=allow protocol=TCP localport=445
ktorým otvoríme port 445, a následne spustiť jednoduchý skript Python:
import winreg
reg = winreg.HKEY_LOCAL_MACHINE
regpath = "SOFTWARE\\Microsoft\\Windows\\
CurrentVersion\\Policies\\System"
winreg.ConnectRegistry(None, reg)
key = winreg.OpenKey(reg, regpath, 0, access=winreg.KEY_WRITE)
winreg.SetValueEx(key, "LocalAccountTokenFilterPolicy", 0, winreg.REG_DWORD, 1)
ktorým zabránime UAC filtrovať remote logon tokeny (kód je obsahom súboru RemoteCommand1.py – transformáciu súboru PY na spustiteľný EXE sme ukázali v predchádzajúcich častiach seriálu).
V jednoduchosti uvedieme, že logon token obsahuje limitované oprávnenia k účtu pre prípad vzdialeného prihlásenia. Aby UAC použil úplnú súpravu používateľských oprávnení (full elevated token), treba vykonať jeden z možných krokov, pričom jedným z nich je úprava príslušnej položky v registri Windows, ktorú realizujeme uvedeným skriptom.
RemoteCommand2.py
Po splnení uvedených podmienok nám nič nebráni naprogramovať skript využívajúci funkcionalitu knižnice Pypsexec na vzdialené vykonanie ľubovoľných príkazov Windows. V našom prípade sme vybrali príkazy „whoami /all“ a „netstat -a“. Skript je triviálny, začína sa vytvorením objektu triedy pypsexec.Client s odovzdaním IP adresy cieľového počítača, prihlasovacieho mena/hesla a príkazu, ktorý sa má vykonať, vrátane jeho parametrov. Následne je volaná metóda Client.connect(), ktorá vytvorí spojenie SMB s požadovaným cieľovým počítačom a nadviaže kontakt so službami SCMR a PAExec. Najdôležitejšia je metóda Client.create_service(), ktorá vytvorí službu PAExec, prostredníctvom ktorej sa následne vykoná konkrétny proces určený v parametroch metódy Client.run_executable().
Všetky zdrojové kódy možno stiahnuť zo stránky www.softengine.sk.
Zobrazit Galériu