macOS Thread Injection via Task port

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Code

1. Thread Hijacking

рд╢реБрд░реБрдЖрдд рдореЗрдВ, task_threads() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рд░реНрдп рдкреЛрд░реНрдЯ рдкрд░ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдп рд╕реЗ рдереНрд░реЗрдб рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдереНрд░реЗрдб рдХреЛ рд╣рд╛рдИрдЬреИрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреЛрдб рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирдП рдорд╛рдЗрдЯрд┐рдЧреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рдирдП рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИ рдЬреЛ thread_create_running() рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред

рдереНрд░реЗрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, thread_suspend() рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХреА рдирд┐рд╖реНрдкрд╛рджрди рд░реБрдХ рдЬрд╛рддреА рд╣реИред

рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдкрд░ рдХреЗрд╡рд▓ рд░реЛрдХрдирд╛ рдФрд░ рд╢реБрд░реВ рдХрд░рдирд╛, рдкрдВрдЬреАрдХрд░рдг рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рджреВрд░рд╕реНрде рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ x0 рд╕реЗ x7 рдХреЛ рдЖрд░реНрдЧреБрдореЗрдВрдЯреНрд╕ рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ, pc рдХреЛ рд▓рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ, рдФрд░ рдереНрд░реЗрдб рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдереНрд░реЗрдб рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд╛рдж рдХреНрд░реИрд╢ рди рд╣реЛ, рд░рд┐рдЯрд░реНрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдПрдХ рд░рдгрдиреАрддрд┐ рдореЗрдВ рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрдкреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЛ thread_set_exception_ports() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ lr рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдПрдХ рдЕрдорд╛рдиреНрдп рдкрддреЗ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЕрдкрд╡рд╛рдж рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдереНрд░реЗрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрдпрд╛рди рдмреАрдпрд░ рдХреЗ рдЯреНрд░рд┐рдкрд▓_рдлреЗрдЪ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рд╕реЗ рдЕрдкрдирд╛рдИ рдЧрдИ рд╡рд┐рдзрд┐ рдореЗрдВ, lr рдХреЛ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдереНрд░реЗрдб рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рддрдм рд▓рдЧрд╛рддрд╛рд░ рдореЙрдирд┐рдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ pc рдЙрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред

2. Mach ports for communication

рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Mach рдкреЛрд░реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпреЗ рдкреЛрд░реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдордирдорд╛рдиреЗ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рджреНрд╡рд┐рджрд┐рд╢ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рджреЛ Mach рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдПрдХ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рдФрд░ рджреВрд╕рд░рд╛ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдп рдореЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╕рдордХрдХреНрд╖ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред

рд╕реНрдерд╛рдиреАрдп рдкреЛрд░реНрдЯ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреЛрд░реНрдЯ рдХреЛ mach_port_allocate() рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреБрдиреМрддреА рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рднреЗрдЬрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╣реИред

рдПрдХ рд░рдгрдиреАрддрд┐ рдореЗрдВ thread_set_special_port() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдХреЗ THREAD_KERNEL_PORT рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд░рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдлрд┐рд░, рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдХреЛ mach_thread_self() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рджреВрд░рд╕реНрде рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрд▓рдЯ рд╣реЛрддреА рд╣реИред рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдХреЛ mach_reply_port() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ Mach рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ mach_port_allocate() рдЗрд╕рдХреА рд░рд┐рдЯрд░реНрди рдореИрдХреЗрдирд┐рдЬреНрдо рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИ)ред рдкреЛрд░реНрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, mach_port_insert_right() рдХреЛ рджреВрд░рд╕реНрде рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдлрд┐рд░ thread_set_special_port() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдп рдореЗрдВ рд╡рд╛рдкрд╕, thread_get_special_port() рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдп рдореЗрдВ рдирдП рдЖрд╡рдВрдЯрд┐рдд Mach рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рднреЗрдЬрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ Mach рдкреЛрд░реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рджреНрд╡рд┐рджрд┐рд╢ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

3. Basic Memory Read/Write Primitives

рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдмреБрдирд┐рдпрд╛рджреА рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрджрдо рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡ рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЬрд▓реНрдж рд╣реА, рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

Memory Reading and Writing Using Execute Primitive

рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реИред рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

uint64_t read_func(uint64_t *address) {
return *address;
}

рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

void write_func(uint64_t *address, uint64_t value) {
*address = value;
}

рдпреЗ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдП рдЧрдП рдЕрд╕реЗрдВрдмрд▓реА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:

_read_func:
ldr x0, [x0]
ret
_write_func:
str x1, [x0]
ret

рдЙрдкрдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреА рдкрд╣рдЪрд╛рди

рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╕реНрдХреИрди рдЗрди рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЙрдореНрдореАрджрд╡рд╛рд░реЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

  1. рдореЗрдореЛрд░реА рдкрдврд╝рдирд╛: property_getName() рдлрд╝рдВрдХреНрд╢рди Objective-C рд░рдирдЯрд╛рдЗрдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЧрдпрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИ:

const char *property_getName(objc_property_t prop) {
return prop->name;
}

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ read_func рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ objc_property_t рдХрд╛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИред

  1. рдореЗрдореЛрд░реА рд▓рд┐рдЦрдирд╛: рдореЗрдореЛрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдЦреЛрдЬрдирд╛ рдЕрдзрд┐рдХ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, libxpc рд╕реЗ _xpc_int64_set_value() рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рд╕реНрд╕реЗрдореНрдмрд▓реА рд╣реИ:

__xpc_int64_set_value:
str x1, [x0, #0x18]
ret

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ 64-рдмрд┐рдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

_xpc_int64_set_value(address - 0x18, value)

With these primitives established, the stage is set for creating shared memory, marking a significant progression in controlling the remote process.

4. рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╕реЗрдЯрдЕрдк

рдЙрджреНрджреЗрд╢реНрдп рд╕реНрдерд╛рдиреАрдп рдФрд░ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдФрд░ рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг libxpc рдФрд░ рдЗрд╕рдХреЗ OS_xpc_shmem рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдордЪ рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд╡рд▓реЛрдХрди:

  1. рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди:

  • рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ mach_vm_allocate() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

  • рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП OS_xpc_shmem рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП xpc_shmem_create() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдордЪ рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдЧрд╛ рдФрд░ OS_xpc_shmem рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдСрдлрд╕реЗрдЯ 0x18 рдкрд░ рдордЪ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред

  1. рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдмрдирд╛рдирд╛:

  • рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ OS_xpc_shmem рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ malloc() рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЗ рд╕рд╛рдеред

  • рд╕реНрдерд╛рдиреАрдп OS_xpc_shmem рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЙрдкреА рдСрдлрд╕реЗрдЯ 0x18 рдкрд░ рдЧрд▓рдд рдордЪ рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╛рдо рд╣реЛрдЧрд╛ред

  1. рдордЪ рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рд╣реА рдХрд░рдирд╛:

  • рджреВрд░рд╕реНрде рдХрд╛рд░реНрдп рдореЗрдВ рдордЪ рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рднреЗрдЬрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП thread_set_special_port() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

  • рджреВрд░рд╕реНрде рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдХреЗ рдСрдлрд╕реЗрдЯ 0x18 рдкрд░ рдордЪ рдореЗрдореЛрд░реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╣реА рдХрд░реЗрдВред

  1. рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╕реЗрдЯрдЕрдк рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдирд╛:

  • рджреВрд░рд╕реНрде OS_xpc_shmem рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗрдВред

  • xpc_shmem_remote() рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореИрдкрд┐рдВрдЧ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рд╕реНрдерд╛рдиреАрдп рдФрд░ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдФрд░ рдХрдИ рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓реЗрдЧреАред

рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯреНрд╕

рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдФрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП:

mach_vm_allocate();
xpc_shmem_create();

рд░рд┐рдореЛрдЯ рдкреНрд░реЛрд╕реЗрд╕ рдореЗрдВ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП:

malloc(); // for allocating memory remotely
thread_set_special_port(); // for inserting send right

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╕реЗрдЯрдЕрдк рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Mach рдкреЛрд░реНрдЯ рдФрд░ рдореЗрдореЛрд░реА рдПрдВрдЯреНрд░реА рдирд╛рдореЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВред

5. рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдордирдорд╛рдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░, рд╣рдордиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдПрдБ рд╣реИрдВ:

  1. рдордирдорд╛рдиреА рдореЗрдореЛрд░реА рд╕рдВрдЪрд╛рд▓рди:

  • рд╕рд╛рдЭрд╛ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП memcpy() рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдордирдорд╛рдиреА рдореЗрдореЛрд░реА рдкрдврд╝реЗрдВред

  • рд╕рд╛рдЭрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП memcpy() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордирдорд╛рдиреА рдореЗрдореЛрд░реА рд▓рд┐рдЦреЗрдВред

  1. рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛:

  • рдЙрди рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ 8 рд╕реЗ рдЕрдзрд┐рдХ рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВред

  1. Mach рдкреЛрд░реНрдЯ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг:

  • рдкреВрд░реНрд╡ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Mach рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ Mach рдкреЛрд░реНрдЯ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред

  1. рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг:

  • triple_fetch рдореЗрдВ Ian Beer рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдХреА рдЧрдИ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред

рдпрд╣ рд╡реНрдпрд╛рдкрдХ рдирд┐рдпрдВрддреНрд░рдг threadexec рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рднреАрддрд░ рд╕рдВрдХреБрдЪрд┐рдд рд╣реИ, рдЬреЛ рдкреАрдбрд╝рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░:

  • рд╕рд┐рд╕реНрдЯрдо рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП memcpy() рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

  • Mach рдкреЛрд░реНрдЯ рдпрд╛ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЙрдЪрд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рд░рд┐рд╕реЛрд░реНрд╕реЗрд╕ рдХреЛ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ рддрд╛рдХрд┐ рд▓реАрдХ рдпрд╛ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рдФрд░ threadexec рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдХреЛрдИ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реВрдХреНрд╖реНрдо рд╕реНрддрд░ рдкрд░ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated