macOS IOKit
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
I/O Kit je open-source, objektno-orijentisani okvir drajvera uređaja u XNU kernelu, koji upravlja dinamički učitanim drajverima uređaja. Omogućava dodavanje modularnog koda u kernel u hodu, podržavajući raznovrsni hardver.
IOKit drajveri će u osnovi izvoziti funkcije iz kernela. Ovi parametri funkcija tipovi su preddefinisani i verifikovani. Štaviše, slično XPC-u, IOKit je samo još jedan sloj iznad Mach poruka.
IOKit XNU kernel kod je open-source od strane Apple-a na https://github.com/apple-oss-distributions/xnu/tree/main/iokit. Takođe, komponente IOKit korisničkog prostora su takođe open-source https://github.com/opensource-apple/IOKitUser.
Međutim, nema IOKit drajvera koji su open-source. U svakom slučaju, s vremena na vreme, objavljivanje drajvera može doći sa simbolima koji olakšavaju njegovo debagovanje. Proverite kako da dobijete ekstenzije drajvera iz firmvera ovde.
Napisan je u C++. Možete dobiti demanglovane C++ simbole sa:
IOKit izložene funkcije mogu izvršiti dodatne bezbednosne provere kada klijent pokuša da pozove funkciju, ali imajte na umu da su aplikacije obično ograničene od strane sandbox-a sa kojima IOKit funkcije mogu da komuniciraju.
U macOS-u se nalaze u:
/System/Library/Extensions
KEXT datoteke ugrađene u OS X operativni sistem.
/Library/Extensions
KEXT datoteke instalirane od strane softvera trećih strana
U iOS-u se nalaze u:
/System/Library/Extensions
Dok broj 9, navedeni drajveri su učitani na adresi 0. To znači da to nisu pravi drajveri već deo jezgra i ne mogu se ukloniti.
Da biste pronašli specifične ekstenzije, možete koristiti:
Da biste učitali i ispraznili kernel ekstenzije, uradite:
IORegistry je ključni deo IOKit okvira u macOS-u i iOS-u koji služi kao baza podataka za predstavljanje hardverske konfiguracije i stanja sistema. To je hijerarhijska kolekcija objekata koja predstavlja sav hardver i drajvere učitane na sistemu, kao i njihove međusobne odnose.
Možete dobiti IORegistry koristeći cli ioreg
da biste ga pregledali iz konzole (posebno korisno za iOS).
Možete preuzeti IORegistryExplorer
iz Xcode Dodatnih Alata sa https://developer.apple.com/download/all/ i pregledati macOS IORegistry kroz grafički interfejs.
U IORegistryExplorer-u, "planovi" se koriste za organizovanje i prikazivanje odnosa između različitih objekata u IORegistry-ju. Svaki plan predstavlja specifičnu vrstu odnosa ili poseban prikaz hardverske i drajverske konfiguracije sistema. Evo nekih od uobičajenih planova koje možete sresti u IORegistryExplorer-u:
IOService Plane: Ovo je najopštiji plan, koji prikazuje servisne objekte koji predstavljaju drajvere i nubs (kanale komunikacije između drajvera). Prikazuje odnose između provajdera i klijenata ovih objekata.
IODeviceTree Plane: Ovaj plan predstavlja fizičke veze između uređaja dok su priključeni na sistem. Često se koristi za vizualizaciju hijerarhije uređaja povezanih putem magistrala kao što su USB ili PCI.
IOPower Plane: Prikazuje objekte i njihove odnose u smislu upravljanja energijom. Može pokazati koji objekti utiču na stanje napajanja drugih, što je korisno za otklanjanje grešaka povezanih sa energijom.
IOUSB Plane: Specifično fokusiran na USB uređaje i njihove odnose, prikazuje hijerarhiju USB hub-ova i povezanih uređaja.
IOAudio Plane: Ovaj plan je za predstavljanje audio uređaja i njihovih odnosa unutar sistema.
...
Sledeći kod se povezuje na IOKit servis "YourServiceNameHere"
i poziva funkciju unutar selektora 0. Za to:
prvo poziva IOServiceMatching
i IOServiceGetMatchingServices
da dobije servis.
Zatim uspostavlja vezu pozivajući IOServiceOpen
.
I konačno poziva funkciju sa IOConnectCallScalarMethod
označavajući selektor 0 (selektor je broj koji je funkciji koju želite da pozovete dodeljen).
Postoje druge funkcije koje se mogu koristiti za pozivanje IOKit funkcija pored IOConnectCallScalarMethod
kao što su IOConnectCallMethod
, IOConnectCallStructMethod
...
Možete ih dobiti, na primer, iz firmware slike (ipsw). Zatim, učitajte je u svoj omiljeni dekompajler.
Možete početi dekompilaciju funkcije externalMethod
jer je to funkcija drajvera koja će primati poziv i pozivati odgovarajuću funkciju:
Ta strašna pozivna demagled znači:
Obratite pažnju na to kako u prethodnoj definiciji nedostaje self
parametar, dobra definicija bi bila:
Zapravo, pravu definiciju možete pronaći na https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388:
Sa ovim informacijama možete prepraviti Ctrl+Desno -> Edit function signature
i postaviti poznate tipove:
Novi dekompilirani kod će izgledati ovako:
Za sledeći korak potrebno je definisati IOExternalMethodDispatch2022
strukturu. Ona je otvorenog koda na https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176, možete je definisati:
Sada, prateći (IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
možete videti mnogo podataka:
Promenite tip podataka u IOExternalMethodDispatch2022:
posle promene:
I kao što sada znamo, ovde imamo niz od 7 elemenata (proverite konačni dekompilirani kod), kliknite da kreirate niz od 7 elemenata:
Nakon što je niz kreiran, možete videti sve eksportovane funkcije:
Ako se sećate, da pozovete eksportovanu funkciju iz korisničkog prostora, ne treba da pozivate ime funkcije, već broj selektora. Ovde možete videti da je selektor 0 funkcija initializeDecoder
, selektor 1 je startDecoder
, selektor 2 je initializeEncoder
...
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)