Python a kybernetická bezpečnosť / 15. časť
V predošlej časti seriálu sme ukázali, ako možno zneužiť mechanizmus Distributed Computing Environment/Remote Procedure Call (DCE/RPC) a jeden z jeho transportných protokolov Server Message Block (SMB) na vykonanie príkazu, resp. kódu v rámci vzdialeného adresného priestoru, teda na vzdialenom počítači pripojenom do počítačovej siete. Predstavili sme knižnicu Pypsexec a uviedli sme štyri podmienky jej použitia. DCE/RPC však nemusí využívať iba transportný protokol SMB, ale vie pracovať aj priamo cestou protokolov TCP/UDP (port 135). V takomto prípade netreba splniť žiadnu zo spomínaných podmienok. Stačí nám poznať používateľské údaje bežného používateľa a mať „otvorený“ port 135, ba v niektorých prípadoch nie je potrebné ani to...
UUID – Universally Unique IDentifier (datatracker.ietf.org/doc/html/rfc4122)
UUID, nazývaný aj Globally Unique Identifier (GUID), je 128-bitový reťazec, ktorý možno využiť na rôzne identifikačné účely, najmä na jednoznačnú identifikáciu objektov, ale aj pri vzájomnej komunikácii medzi procesmi v rámci mechanizmu RPC. Reťazec je rozdelený na päť častí (obr. 1) a jeho zvláštnosťou je, že sa čisto teoreticky môže opakovať. Táto možnosť je však v bežnej aplikačnej praxi veľmi nepravdepodobná až zanedbateľná.
Obr. 1 128-bit time-node-based UUID version 1.0
UUID možno použiť na najrôznejšie účely, pričom sa spomína najmä pri indexovaní buniek databázových tabuliek, kde možno veľmi ľahko vytvárať rôzne vzájomné prepojenia medzi tabuľkami bez kolízie medzi takto indexovanými bunkami. UUIDs možno prideliť službám, dajú sa nimi označiť diskové oddiely, sieťové uzly (nodes), možno pomocou nich identifikovať sessions, zabezpečovať synchronizáciu a integritu údajov, spravovať výmenu správ, môžete ich použiť pri testovaní, na bezpečnostné účely a pri mnohých ďalších aplikáciách. V našom konkrétnom prípade využijeme fakt, že UUIDs sa používajú v rámci RPC na identifikáciu rozhraní (Interface IDs) Windows RPC služieb. Jedna služba RPC pritom môže mať viacero Interface ID.
DCE/RPC over TCP
Cieľom tohto článku nie je opísať spôsob fungovania RPC ani venovať sa detailom protokolu TCP. Naopak, naším cieľom je ukázať, ako možno naprogramovať jednoduchý skript Python, ktorý na základoch RPC získa údaje. Konkrétne nám ide o získanie známych Interface IDs (teda UUIDs), ktoré patria rozhraniam Windows RPC služieb, z cieľového počítača, a to bez toho, aby sme museli splniť priveľa podmienok. Využijeme pri tom fakt, že DCE/RPC dokáže využiť funkcionalitu connection-oriented Transmission Control Protocol (TCP). Tento typ transportu na porte 135 sa označuje aj ako ncacn_ip_tcp. Detaily týkajúce sa tu rozoberaných faktov si môžete naštudovať z nasledujúcej stránky Microsoft Learn: learn.microsoft.com/en-us/windows/win32/rpc. Len na doplnenie uvedieme, že získané Interface IDs možno neskôr využiť napr. na „lámanie“ hesiel (online password cracking).
Obr. 2 RPC traffic over TCP
Impacket (coresecurity.com/core-labs/open-source-tools/impacket)
Na získanie Interface IDs využijeme funkcionalitu balíka Impacket. Ide o kolekciu tried, ktoré sú určené na prácu so sieťovými protokolmi. Triedy Impacket a ich metódy predstavujú nízkoúrovňové (low-level) API určené na prístup k paketom, resp. plne implementujú niektoré sieťové protokoly. Balík sa dá nainštalovať jednoducho pomocou príkazu pip install impacket. Najmarkantnejším problémom uvedeného balíka je absencia dokumentácie. Funkcionalitu jednotlivých metód a princípy ich práce možno naštudovať jedine prostredníctvom niekoľkých vzorových skriptov nachádzajúcich sa na stránke coresecurity.com, resp. na iných stránkach, ktoré sa zaoberajú balíkom Impacket. Každopádne existencia balíka Impacket a štúdium jeho funkcionality je jasný prínos pre každého laika či experta, ktorý sa zaoberá kybernetickou bezpečnosťou. Jeho jednotlivé aplikácie (vzorové kódy) možno rozdeliť do niekoľkých skupín, a to na aplikácie určené na vzdialené vykonávanie procedúr, na prácu s protokolom Kerberos, na prácu s prihlasovacími údajmi, so súbormi, so známymi zraniteľnosťami, ďalej na prácu s WMI, SMB/MSRPC, MS SQL/TDS, resp. ide o rôzne serverové a iné bezpečnostné nástroje.
getUUIDs.py
Napriek „chudobnej“ dokumentácii balíka Impacket možno využiť na štúdium už spomínané vzorové kódy a pripraviť vlastné skripty. Stalo sa tak aj v našom prípade, keď sme na základe viacerých vstupov a znalostí týkajúcich sa fungovania RPC s využitím transportu TCP naprogramovali aplikáciu getUUIDs.py, ktorá využíva hneď niekoľko modulov balíka Impacket:
transport.py |
Implementácia transportného protokolu pre protokol DCE/RPC |
epm.py |
Implementácia MS-RPCE Interface pre RPC Portmapper |
uuid.py |
Správa UUIDs v súlade s webdav.org/specs/draft-leach-uuids-guids-01.txt |
mgmt.py |
Implementácia Remote Management Interface |
rpcrt.py |
Implementácia častí MS-RPCE |
Na začiatku našej aplikácie vytvárame objekt vlastnej triedy getUUIDs a zároveň za použitia výrazu ncacn_ip_tcp nastavujeme požadovaný typ transportu (vytvárame objekt triedy impacket.dcerpc.v5.transport.TCPTransport). Okrem toho získavame objekt triedy impacket.dcerpc.v5.rpcrt.DCERPC_v5, prostredníctvom ktorého neskôr v rámci metódy getUUIDs.execute() vykonávame pripojenie (bind) k cieľovému počítaču a zaslanie požiadavky (request) na vrátenie Interface IDs – voláme metódu hinq_if_ids() modulu mgmt.py. Prvky množiny získaných údajov (ifids) porovnávame s databázou známych protokolov (epm.KNOWN_PROTOCOLS) a známych UUIDs (epm.KNOWN_UUIDS), pričom výsledky vypisujeme do okna terminálu. Na záver si pripomeňme, že na správnu funkčnosť aplikácie getUUIDs.py musí byť na cieľovom počítači „otvorený“ port 135, ale použitý používateľský účet nemusí byť príslušníkom skupiny Administrator.
Obr. 3 UUIDs získané z cieľového počítača s OS Windows
Poznámka: Všetky zdrojové kódy možno stiahnuť zo stránky softengine.sk.
Zobrazit Galériu