macOS Process Abuse

Reading time: 14 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Processes Basic Information

Mchakato ni mfano wa executable inayotembea, hata hivyo michakato haiendeshi msimbo, hizi ni nyuzi. Hivyo basi michakato ni vyombo tu vya nyuzi zinazotembea vinavyotoa kumbukumbu, waelekezi, bandari, ruhusa...

Kawaida, michakato ilianza ndani ya michakato mingine (isipokuwa PID 1) kwa kuita fork ambayo ingekuwa na nakala halisi ya mchakato wa sasa na kisha mchakato wa mtoto kwa ujumla ungetafuta execve ili kupakia executable mpya na kuikimbia. Kisha, vfork ilianzishwa ili kufanya mchakato huu kuwa wa haraka bila nakala ya kumbukumbu.
Kisha posix_spawn ilianzishwa ikichanganya vfork na execve katika wito mmoja na kukubali bendera:

  • POSIX_SPAWN_RESETIDS: Rudisha vitambulisho halisi kwa vitambulisho halisi
  • POSIX_SPAWN_SETPGROUP: Weka ushirikiano wa kundi la mchakato
  • POSUX_SPAWN_SETSIGDEF: Weka tabia ya ishara ya kawaida
  • POSIX_SPAWN_SETSIGMASK: Weka mask ya ishara
  • POSIX_SPAWN_SETEXEC: Exec katika mchakato sawa (kama execve na chaguzi zaidi)
  • POSIX_SPAWN_START_SUSPENDED: Anza ikiwa imekwama
  • _POSIX_SPAWN_DISABLE_ASLR: Anza bila ASLR
  • _POSIX_SPAWN_NANO_ALLOCATOR: Tumia allocator ya Nano ya libmalloc
  • _POSIX_SPAWN_ALLOW_DATA_EXEC: Ruhusu rwx kwenye sehemu za data
  • POSIX_SPAWN_CLOEXEC_DEFAULT: Funga maelezo yote ya faili kwenye exec(2) kwa chaguo-msingi
  • _POSIX_SPAWN_HIGH_BITS_ASLR: Randomize bits za juu za ASLR slide

Zaidi ya hayo, posix_spawn inaruhusu kufafanua array ya posix_spawnattr inayodhibiti baadhi ya vipengele vya mchakato ulioanzishwa, na posix_spawn_file_actions kubadilisha hali ya waelekezi.

Wakati mchakato unakufa unatumia nambari ya kurudi kwa mchakato mzazi (ikiwa mzazi amekufa, mzazi mpya ni PID 1) kwa ishara SIGCHLD. Mzazi anahitaji kupata thamani hii kwa kuita wait4() au waitid() na hadi hiyo itokee mtoto unabaki katika hali ya zombie ambapo bado inatajwa lakini haiwezi kutumia rasilimali.

PIDs

PIDs, vitambulisho vya mchakato, vinatambulisha mchakato wa kipekee. Katika XNU PIDs ni za 64bits zikiongezeka kwa monotoni na hazijawahi kuzunguka (ili kuepuka matumizi mabaya).

Process Groups, Sessions & Coalations

Michakato inaweza kuingizwa katika makundi ili iwe rahisi kuzishughulikia. Kwa mfano, amri katika skripti ya shell zitakuwa katika kundi moja la mchakato hivyo inawezekana kuziashiria pamoja kwa kutumia kill kwa mfano.
Pia inawezekana kundi michakato katika vikao. Wakati mchakato unaanzisha kikao (setsid(2)), michakato ya watoto inawekwa ndani ya kikao, isipokuwa wanapoanzisha kikao chao wenyewe.

Coalition ni njia nyingine ya kuunganisha michakato katika Darwin. Mchakato unaojiunga na coalation unaruhusu kufikia rasilimali za pool, kushiriki ledger au kukabiliana na Jetsam. Coalations zina majukumu tofauti: Kiongozi, huduma ya XPC, Kiongezi.

Credentials & Personae

Kila mchakato una vitambulisho vinavyotambulisha haki zake katika mfumo. Kila mchakato utakuwa na uid moja ya msingi na gid moja ya msingi (ingawa inaweza kuwa katika makundi kadhaa).
Pia inawezekana kubadilisha kitambulisho cha mtumiaji na kikundi ikiwa binary ina setuid/setgid bit.
Kuna kazi kadhaa za kweka uids/gids mpya.

Syscall persona inatoa seti mbadala ya vitambulisho. Kupitisha persona kunachukua uid yake, gid na ushirikiano wa makundi kwa pamoja. Katika source code inawezekana kupata struct:

c
struct kpersona_info { uint32_t persona_info_version;
uid_t    persona_id; /* overlaps with UID */
int      persona_type;
gid_t    persona_gid;
uint32_t persona_ngroups;
gid_t    persona_groups[NGROUPS];
uid_t    persona_gmuid;
char     persona_name[MAXLOGNAME + 1];

/* TODO: MAC policies?! */
}

Threads Basic Information

  1. POSIX Threads (pthreads): macOS inasaidia nyuzi za POSIX (pthreads), ambazo ni sehemu ya API ya kawaida ya nyuzi kwa C/C++. Utekelezaji wa pthreads katika macOS unapatikana katika /usr/lib/system/libsystem_pthread.dylib, ambayo inatokana na mradi wa libpthread unaopatikana kwa umma. Maktaba hii inatoa kazi zinazohitajika kuunda na kusimamia nyuzi.
  2. Creating Threads: Kazi ya pthread_create() inatumika kuunda nyuzi mpya. Ndani, kazi hii inaita bsdthread_create(), ambayo ni wito wa mfumo wa kiwango cha chini maalum kwa kernel ya XNU (kernel ambayo macOS inategemea). Wito huu wa mfumo unachukua bendera mbalimbali zinazotokana na pthread_attr (sifa) ambazo zinaelezea tabia ya nyuzi, ikiwa ni pamoja na sera za kupanga na ukubwa wa stack.
  • Default Stack Size: Ukubwa wa stack wa kawaida kwa nyuzi mpya ni 512 KB, ambayo inatosha kwa shughuli za kawaida lakini inaweza kubadilishwa kupitia sifa za nyuzi ikiwa nafasi zaidi au kidogo inahitajika.
  1. Thread Initialization: Kazi ya __pthread_init() ni muhimu wakati wa kuanzisha nyuzi, ikitumia hoja ya env[] kuchambua mabadiliko ya mazingira ambayo yanaweza kujumuisha maelezo kuhusu eneo na ukubwa wa stack.

Thread Termination in macOS

  1. Exiting Threads: Nyuzi kwa kawaida zinamalizika kwa kuita pthread_exit(). Kazi hii inaruhusu nyuzi kutoka kwa usafi, ikifanya usafi unaohitajika na kuruhusu nyuzi kutuma thamani ya kurudi kwa wanachama wowote.
  2. Thread Cleanup: Wakati wa kuita pthread_exit(), kazi ya pthread_terminate() inaitwa, ambayo inashughulikia kuondoa muundo wote wa nyuzi zinazohusiana. Inafuta bandari za nyuzi za Mach (Mach ni mfumo wa mawasiliano katika kernel ya XNU) na inaita bsdthread_terminate, syscall inayondoa muundo wa kiwango cha kernel unaohusiana na nyuzi.

Synchronization Mechanisms

Ili kusimamia ufikiaji wa rasilimali zinazoshirikiwa na kuepuka hali za mbio, macOS inatoa primitives kadhaa za usawazishaji. Hizi ni muhimu katika mazingira ya nyuzi nyingi ili kuhakikisha uadilifu wa data na utulivu wa mfumo:

  1. Mutexes:
  • Regular Mutex (Signature: 0x4D555458): Mutex ya kawaida yenye alama ya kumbukumbu ya 60 bytes (56 bytes kwa mutex na 4 bytes kwa alama).
  • Fast Mutex (Signature: 0x4d55545A): Inafanana na mutex ya kawaida lakini imeboreshwa kwa shughuli za haraka, pia 60 bytes kwa ukubwa.
  1. Condition Variables:
  • Inatumika kusubiri hali fulani kutokea, ikiwa na ukubwa wa 44 bytes (40 bytes pamoja na alama ya 4 bytes).
  • Condition Variable Attributes (Signature: 0x434e4441): Sifa za usanidi kwa mabadiliko ya hali, zikiwa na ukubwa wa 12 bytes.
  1. Once Variable (Signature: 0x4f4e4345):
  • Inahakikisha kuwa kipande cha msimbo wa kuanzisha kinatekelezwa mara moja tu. Ukubwa wake ni 12 bytes.
  1. Read-Write Locks:
  • Inaruhusu wasomaji wengi au mwandishi mmoja kwa wakati mmoja, ikirahisisha ufikiaji mzuri wa data inayoshirikiwa.
  • Read Write Lock (Signature: 0x52574c4b): Ukubwa wa 196 bytes.
  • Read Write Lock Attributes (Signature: 0x52574c41): Sifa za vizuizi vya kusoma-kandika, 20 bytes kwa ukubwa.

tip

Bytes 4 za mwisho za vitu hivyo zinatumika kugundua kujaa.

Thread Local Variables (TLV)

Thread Local Variables (TLV) katika muktadha wa faili za Mach-O (muundo wa executable katika macOS) zinatumika kutangaza mabadiliko ambayo ni maalum kwa kila nyuzi katika programu yenye nyuzi nyingi. Hii inahakikisha kuwa kila nyuzi ina mfano wake wa kipekee wa mabadiliko, ikitoa njia ya kuepuka migongano na kudumisha uadilifu wa data bila kuhitaji mifumo ya usawazishaji wazi kama mutexes.

Katika C na lugha zinazohusiana, unaweza kutangaza mabadiliko ya nyuzi za ndani kwa kutumia neno __thread. Hapa kuna jinsi inavyofanya kazi katika mfano wako:

c
cCopy code__thread int tlv_var;

void main (int argc, char **argv){
tlv_var = 10;
}

Hii sehemu inaelezea tlv_var kama variable ya thread-local. Kila thread inayokimbia msimbo huu itakuwa na tlv_var yake mwenyewe, na mabadiliko ambayo thread moja inafanya kwa tlv_var hayataathiri tlv_var katika thread nyingine.

Katika binary ya Mach-O, data inayohusiana na variable za thread-local imeandaliwa katika sehemu maalum:

  • __DATA.__thread_vars: Sehemu hii ina metadata kuhusu variable za thread-local, kama vile aina zao na hali ya uanzishaji.
  • __DATA.__thread_bss: Sehemu hii inatumika kwa variable za thread-local ambazo hazijaanzishwa wazi. Ni sehemu ya kumbukumbu iliyotengwa kwa data iliyowekwa sifuri.

Mach-O pia inatoa API maalum inayoitwa tlv_atexit kusimamia variable za thread-local wakati thread inatoka. API hii inakuwezesha kujiandikisha waondoa—kazi maalum zinazosafisha data za thread-local wakati thread inamalizika.

Kipaumbele cha Thread

Kuelewa kipaumbele cha thread kunahusisha kuangalia jinsi mfumo wa uendeshaji unavyamua ni thread zipi zitakazoendesha na lini. Uamuzi huu unategemea kiwango cha kipaumbele kilichopewa kila thread. Katika macOS na mifumo kama Unix, hii inashughulikiwa kwa kutumia dhana kama nice, renice, na daraja la Ubora wa Huduma (QoS).

Nice na Renice

  1. Nice:
  • Thamani ya nice ya mchakato ni nambari inayohusisha kipaumbele chake. Kila mchakato una thamani ya nice inayotofautiana kutoka -20 (kipaumbele cha juu zaidi) hadi 19 (kipaumbele cha chini zaidi). Thamani ya kawaida ya nice wakati mchakato unaundwa kwa kawaida ni 0.
  • Thamani ya nice ya chini (karibu na -20) inafanya mchakato kuwa "mwenye ubinafsi," ikimpa muda zaidi wa CPU ikilinganishwa na michakato mingine yenye thamani za nice za juu.
  1. Renice:
  • renice ni amri inayotumika kubadilisha thamani ya nice ya mchakato unaoendesha tayari. Hii inaweza kutumika kubadilisha kipaumbele cha michakato kwa njia ya kidijitali, ama kuongeza au kupunguza mgawanyo wa muda wa CPU kulingana na thamani mpya za nice.
  • Kwa mfano, ikiwa mchakato unahitaji rasilimali zaidi za CPU kwa muda, unaweza kupunguza thamani yake ya nice kwa kutumia renice.

Daraja la Ubora wa Huduma (QoS)

Daraja la QoS ni njia ya kisasa zaidi ya kushughulikia kipaumbele cha thread, hasa katika mifumo kama macOS inayounga mkono Grand Central Dispatch (GCD). Daraja la QoS linawawezesha waendelezaji kugawanya kazi katika viwango tofauti kulingana na umuhimu au dharura yao. macOS inasimamia kipaumbele cha thread kiotomatiki kulingana na daraja hizi za QoS:

  1. Mtu Anayeingiliana:
  • Daraja hili ni kwa kazi ambazo kwa sasa zinaingiliana na mtumiaji au zinahitaji matokeo ya haraka ili kutoa uzoefu mzuri wa mtumiaji. Kazi hizi zinapewa kipaumbele cha juu ili kuweka kiolesura kuwa na majibu (mfano, animations au kushughulikia matukio).
  1. Ilianzishwa na Mtumiaji:
  • Kazi ambazo mtumiaji anazianzisha na anatarajia matokeo ya haraka, kama kufungua hati au kubonyeza kitufe kinachohitaji hesabu. Hizi ni za kipaumbele cha juu lakini chini ya zile zinazohusiana na mtu anayeingiliana.
  1. Huduma:
  • Kazi hizi ni za muda mrefu na kwa kawaida zinaonyesha kiashiria cha maendeleo (mfano, kupakua faili, kuingiza data). Zinakuwa na kipaumbele cha chini kuliko kazi zilizoanzishwa na mtumiaji na hazihitaji kumalizika mara moja.
  1. Nyuma:
  • Daraja hili ni kwa kazi zinazofanya kazi nyuma na hazionekani kwa mtumiaji. Hizi zinaweza kuwa kazi kama kuorodhesha, kusawazisha, au nakala za akiba. Zinakuwa na kipaumbele cha chini zaidi na athari ndogo kwenye utendaji wa mfumo.

Kwa kutumia daraja la QoS, waendelezaji hawahitaji kusimamia nambari za kipaumbele sahihi bali wanazingatia asili ya kazi, na mfumo unaboresha rasilimali za CPU ipasavyo.

Zaidi ya hayo, kuna sera tofauti za ratiba za thread ambazo zinaelekeza kuweka seti ya vigezo vya ratiba ambavyo ratibu itachukulia. Hii inaweza kufanywa kwa kutumia thread_policy_[set/get]. Hii inaweza kuwa na manufaa katika mashambulizi ya hali ya mbio.

MacOS Process Abuse

MacOS, kama mfumo mwingine wowote wa uendeshaji, inatoa mbinu na mitambo mbalimbali kwa michakato kuingiliana, kuwasiliana, na kushiriki data. Ingawa mbinu hizi ni muhimu kwa utendaji mzuri wa mfumo, zinaweza pia kutumiwa vibaya na wahalifu kufanya shughuli za uhalifu.

Library Injection

Library Injection ni mbinu ambapo mshambuliaji anamlazimisha mchakato kupakia maktaba ya uhalifu. Mara tu inapowekwa, maktaba inakimbia katika muktadha wa mchakato wa lengo, ikimpa mshambuliaji ruhusa na ufikiaji sawa na mchakato huo.

macOS Library Injection

Function Hooking

Function Hooking inahusisha kuingilia simu za kazi au ujumbe ndani ya msimbo wa programu. Kwa kuingilia kazi, mshambuliaji anaweza kubadilisha tabia ya mchakato, kuangalia data nyeti, au hata kupata udhibiti juu ya mtiririko wa utekelezaji.

macOS Function Hooking

Inter Process Communication

Inter Process Communication (IPC) inarejelea mbinu tofauti ambazo michakato tofauti zinashiriki na kubadilishana data. Ingawa IPC ni muhimu kwa programu nyingi halali, inaweza pia kutumiwa vibaya kuondoa kutengwa kwa mchakato, kuvuja taarifa nyeti, au kufanya vitendo visivyoidhinishwa.

macOS IPC - Inter Process Communication

Electron Applications Injection

Electron applications zinazotekelezwa na variables maalum za env zinaweza kuwa na hatari ya mchakato wa kuingiza:

macOS Electron Applications Injection

Chromium Injection

Inawezekana kutumia bendera --load-extension na --use-fake-ui-for-media-stream kufanya shambulio la mtu katikati ya kivinjari linaloruhusu kuiba funguo za kuandika, trafiki, vidakuzi, kuingiza scripts kwenye kurasa...:

macOS Chromium Injection

Dirty NIB

Faili za NIB zinaelezea vipengele vya kiolesura cha mtumiaji (UI) na mwingiliano wao ndani ya programu. Hata hivyo, zinaweza kutekeleza amri zisizo na mipaka na Gatekeeper haizuii programu iliyotekelezwa tayari kutekelezwa ikiwa faili ya NIB imebadilishwa. Kwa hivyo, zinaweza kutumika kufanya programu zisizo na mipaka kutekeleza amri zisizo na mipaka:

macOS Dirty NIB

Java Applications Injection

Inawezekana kutumia uwezo fulani wa java (kama vile variable ya env _JAVA_OPTS) kufanya programu ya java kutekeleza amri/msimbo zisizo na mipaka.

macOS Java Applications Injection

.Net Applications Injection

Inawezekana kuingiza msimbo katika programu za .Net kwa kuitumia kazi ya ufuatiliaji wa .Net (ambayo haijalindwa na ulinzi wa macOS kama vile kuimarisha wakati wa utekelezaji).

macOS .Net Applications Injection

Perl Injection

Angalia chaguzi tofauti za kufanya script ya Perl kutekeleza msimbo zisizo na mipaka katika:

macOS Perl Applications Injection

Ruby Injection

Pia inawezekana kutumia variable za env za ruby kufanya scripts zisizo na mipaka kutekeleza msimbo zisizo na mipaka:

macOS Ruby Applications Injection

Python Injection

Ikiwa variable ya mazingira PYTHONINSPECT imewekwa, mchakato wa python utaanguka kwenye cli ya python mara tu unapomaliza. Pia inawezekana kutumia PYTHONSTARTUP kuashiria script ya python kutekelezwa mwanzoni mwa kikao cha mwingiliano.
Hata hivyo, kumbuka kwamba script ya PYTHONSTARTUP haitatekelezwa wakati PYTHONINSPECT inaunda kikao cha mwingiliano.

Variable nyingine za mazingira kama PYTHONPATH na PYTHONHOME pia zinaweza kuwa na manufaa kufanya amri ya python kutekeleza msimbo zisizo na mipaka.

Kumbuka kwamba executable zilizokusanywa na pyinstaller hazitatumia hizi variable za mazingira hata kama zinakimbia kwa kutumia python iliyojumuishwa.

caution

Kwa ujumla sikuweza kupata njia ya kufanya python kutekeleza msimbo zisizo na mipaka kwa kutumia variable za mazingira.
Hata hivyo, watu wengi huweka python kwa kutumia Hombrew, ambayo itainstall python katika mahali pa kuandika kwa mtumiaji wa kawaida wa admin. Unaweza kuikamata kwa kitu kama:

mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
cat > /opt/homebrew/bin/python3 <<EOF
#!/bin/bash
# Msimbo wa ziada wa kukamata
/opt/homebrew/bin/python3.old "$@"
EOF
chmod +x /opt/homebrew/bin/python3

Hata root atakimbia msimbo huu anapokimbia python.

Ugunduzi

Shield

Shield (Github) ni programu ya chanzo wazi ambayo inaweza gundua na kuzuia vitendo vya kuingiza mchakato:

  • Kutumia Variable za Mazingira: Itasimamia uwepo wa yoyote ya variable za mazingira zifuatazo: DYLD_INSERT_LIBRARIES, CFNETWORK_LIBRARY_PATH, RAWCAMERA_BUNDLE_PATH na ELECTRON_RUN_AS_NODE
  • Kutumia task_for_pid calls: Ili kupata wakati mchakato mmoja unataka kupata task port ya mwingine ambayo inaruhusu kuingiza msimbo katika mchakato.
  • Param za programu za Electron: Mtu anaweza kutumia --inspect, --inspect-brk na --remote-debugging-port kama hoja za amri kuanzisha programu ya Electron katika hali ya ufuatiliaji, na hivyo kuingiza msimbo ndani yake.
  • Kutumia symlinks au hardlinks: Kwa kawaida, matumizi mabaya ya kawaida ni kweka kiungo na ruhusa zetu za mtumiaji, na kuashiria mahali pa juu ya ruhusa. Ugunduzi ni rahisi sana kwa hardlink na symlinks. Ikiwa mchakato unaounda kiungo una kiwango tofauti cha ruhusa na faili lengwa, tunaunda onyo. Kwa bahati mbaya katika kesi ya symlinks kuzuia haiwezekani, kwani hatuna taarifa kuhusu marudio ya kiungo kabla ya kuundwa. Hii ni kikomo cha mfumo wa EndpointSecurity wa Apple.

Simu zinazofanywa na michakato mingine

Katika hiki chapisho la blog unaweza kupata jinsi inavyowezekana kutumia kazi task_name_for_pid kupata taarifa kuhusu michakato mingine inayoungiza msimbo katika mchakato na kisha kupata taarifa kuhusu mchakato huo mwingine.

Kumbuka kwamba ili kuita kazi hiyo unahitaji kuwa uid sawa na ile inayokimbia mchakato au root (na inarudisha taarifa kuhusu mchakato, si njia ya kuingiza msimbo).

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks