macOS XPC
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
κΈ°λ³Έ μ 보
XPCλ macOSμμ μ¬μ©νλ 컀λμΈ XNUμ νλ‘μΈμ€ κ° ν΅μ μ μλ―Ένλ©°, macOSμ iOSμμ νλ‘μΈμ€ κ°μ ν΅μ μ μν νλ μμν¬μ λλ€. XPCλ μμ€ν μ μλ‘ λ€λ₯Έ νλ‘μΈμ€ κ°μ μμ νκ³ λΉλκΈ°μ μΈ λ©μλ νΈμΆμ μννλ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ Appleμ 보μ ν¨λ¬λ€μμ μΌλΆλ‘, κ° κ΅¬μ± μμκ° μμ μ μννλ λ° νμν κΆνλ§μΌλ‘ μ€νλλ κΆν λΆλ¦¬ μ ν리μΌμ΄μ μ μμ±μ κ°λ₯νκ² νμ¬, μμλ νλ‘μΈμ€λ‘ μΈν μ μ¬μ νΌν΄λ₯Ό μ νν©λλ€.
XPCλ λμΌν μμ€ν μμ μ€νλλ λ€μν νλ‘κ·Έλ¨μ΄ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°κΈ° μν μΌλ ¨μ λ°©λ²μΈ νλ‘μΈμ€ κ° ν΅μ (IPC)μ ν ννλ₯Ό μ¬μ©ν©λλ€.
XPCμ μ£Όμ μ΄μ μ λ€μκ³Ό κ°μ΅λλ€:
- 보μ: μμ μ μλ‘ λ€λ₯Έ νλ‘μΈμ€λ‘ λΆλ¦¬ν¨μΌλ‘μ¨ κ° νλ‘μΈμ€λ νμν κΆνλ§ λΆμ¬λ°μ μ μμ΅λλ€. μ΄λ νλ‘μΈμ€κ° μμλλλΌλ νΌν΄λ₯Ό μ€μΌ μ μμμ μλ―Έν©λλ€.
- μμ μ±: XPCλ μΆ©λμ΄ λ°μν κ΅¬μ± μμλ‘ μΆ©λμ 격리νλ λ° λμμ μ€λλ€. νλ‘μΈμ€κ° μΆ©λνλ©΄ μμ€ν μ λλ¨Έμ§ λΆλΆμ μν₯μ μ£Όμ§ μκ³ μ¬μμν μ μμ΅λλ€.
- μ±λ₯: XPCλ μλ‘ λ€λ₯Έ μμ μ λμμ λ€λ₯Έ νλ‘μΈμ€μμ μ€νν μ μλλ‘ νμ¬ μ½κ² λμμ±μ νμ©ν©λλ€.
μ μΌν λ¨μ μ μ¬λ¬ νλ‘μΈμ€μμ μ ν리μΌμ΄μ μ λΆλ¦¬νκ³ XPCλ₯Ό ν΅ν΄ ν΅μ νκ² νλ κ²μ΄ ν¨μ¨μ±μ΄ λ¨μ΄μ§λ€λ κ²μ λλ€. κ·Έλ¬λ μ€λλ μ μμ€ν μμλ κ±°μ λμ λμ§ μμΌλ©° μ΄μ μ΄ λ ν½λλ€.
μ ν리μΌμ΄μ νΉμ XPC μλΉμ€
μ ν리μΌμ΄μ
μ XPC κ΅¬μ± μμλ μ ν리μΌμ΄μ
μ체 λ΄λΆμ μμ΅λλ€. μλ₯Ό λ€μ΄, Safariμμλ **/Applications/Safari.app/Contents/XPCServices**μμ μ°Ύμ μ μμ΅λλ€. μ΄λ€μ .xpc νμ₯μλ₯Ό κ°μ§λ©°(μ: com.apple.Safari.SandboxBroker.xpc) μ£Όμ λ°μ΄λ리μ ν¨κ» λ²λ€λ‘ μ 곡λ©λλ€: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker λ° Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
λΉμ μ΄ μκ°ν μ μλ―μ΄, XPC κ΅¬μ± μμλ λ€λ₯Έ XPC κ΅¬μ± μμλ μ£Όμ μ± λ°μ΄λ리μ λ€λ₯Έ κΆνκ³Ό νΉκΆμ κ°μ§ κ²μ λλ€. λ¨, XPC μλΉμ€κ° Info.plist νμΌμμ JoinExistingSessionμ βTrueβλ‘ μ€μ νμ¬ κ΅¬μ±λ κ²½μ°λ₯Ό μ μΈν©λλ€. μ΄ κ²½μ°, XPC μλΉμ€λ νΈμΆν μ ν리μΌμ΄μ κ³Ό κ°μ 보μ μΈμ μμ μ€νλ©λλ€.
XPC μλΉμ€λ νμν λ launchdμ μν΄ μμλλ©°, λͺ¨λ μμ μ΄ μλ£λλ©΄ μμ€ν 리μμ€λ₯Ό ν΄μ νκΈ° μν΄ μ’ λ£λ©λλ€. μ ν리μΌμ΄μ νΉμ XPC κ΅¬μ± μμλ μ ν리μΌμ΄μ μ μν΄μλ§ μ¬μ©λ μ μμ΄ μ μ¬μ μΈ μ·¨μ½μ±κ³Ό κ΄λ ¨λ μνμ μ€μ λλ€.
μμ€ν μ 체 XPC μλΉμ€
μμ€ν
μ 체 XPC μλΉμ€λ λͺ¨λ μ¬μ©μκ° μ κ·Όν μ μμ΅λλ€. μ΄λ¬ν μλΉμ€λ launchd λλ Mach μ νμΌλ‘, /System/Library/LaunchDaemons, /Library/LaunchDaemons, /System/Library/LaunchAgents, λλ **/Library/LaunchAgents**μ κ°μ μ§μ λ λλ ν 리μ μμΉν plist νμΌμ μ μλμ΄μΌ ν©λλ€.
μ΄ plist νμΌμλ μλΉμ€ μ΄λ¦μ κ°μ§ **MachServices**λΌλ ν€μ λ°μ΄λ리 κ²½λ‘λ₯Ό κ°μ§ **Program**μ΄λΌλ ν€κ° ν¬ν¨λ©λλ€:
cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Program</key>
<string>/Library/Application Support/JAMF/Jamf.app/Contents/MacOS/JamfDaemon.app/Contents/MacOS/JamfDaemon</string>
<key>AbandonProcessGroup</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>com.jamf.management.daemon</string>
<key>MachServices</key>
<dict>
<key>com.jamf.management.daemon.aad</key>
<true/>
<key>com.jamf.management.daemon.agent</key>
<true/>
<key>com.jamf.management.daemon.binary</key>
<true/>
<key>com.jamf.management.daemon.selfservice</key>
<true/>
<key>com.jamf.management.daemon.service</key>
<true/>
</dict>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
**LaunchDameons**μ μλ κ²λ€μ rootμ μν΄ μ€νλ©λλ€. λ°λΌμ κΆνμ΄ μλ νλ‘μΈμ€κ° μ΄λ€ μ€ νλμ ν΅μ ν μ μλ€λ©΄ κΆν μμΉμ΄ κ°λ₯ν μ μμ΅λλ€.
XPC κ°μ²΄
xpc_object_t
λͺ¨λ XPC λ©μμ§λ μ§λ ¬ν λ° μμ§λ ¬νλ₯Ό λ¨μννλ μ¬μ κ°μ²΄μ
λλ€. κ²λ€κ°, libxpc.dylibλ λλΆλΆμ λ°μ΄ν° μ νμ μ μΈνλ―λ‘ μμ λ λ°μ΄ν°κ° μμλ μ νμΈμ§ νμΈν μ μμ΅λλ€. C APIμμ λͺ¨λ κ°μ²΄λ xpc_object_tμ΄λ©°(κ·Έ μ νμ xpc_get_type(object)λ₯Ό μ¬μ©νμ¬ νμΈν μ μμ΅λλ€).
λν, xpc_copy_description(object) ν¨μλ₯Ό μ¬μ©νμ¬ λλ²κΉ
λͺ©μ μΌλ‘ μ μ©ν μ μλ κ°μ²΄μ λ¬Έμμ΄ ννμ μ»μ μ μμ΅λλ€.
μ΄ κ°μ²΄λ€μ xpc_<object>_copy, xpc_<object>_equal, xpc_<object>_hash, xpc_<object>_serialize, xpc_<object>_deserializeμ κ°μ νΈμΆν μ μλ λͺ κ°μ§ λ©μλλ₯Ό κ°μ§κ³ μμ΅λλ€β¦
xpc_object_tλ xpc_<objetType>_create ν¨μλ₯Ό νΈμΆνμ¬ μμ±λλ©°, μ΄ ν¨μλ λ΄λΆμ μΌλ‘ _xpc_base_create(Class, Size)λ₯Ό νΈμΆνμ¬ κ°μ²΄μ ν΄λμ€ μ ν(νλμ XPC_TYPE_*)κ³Ό ν¬κΈ°(λ©νλ°μ΄ν°λ₯Ό μν΄ μΆκ°λ‘ 40Bκ° ν¬κΈ°μ μΆκ°λ¨)λ₯Ό μ§μ ν©λλ€. μ΄λ κ°μ²΄μ λ°μ΄ν°κ° 40B μ€νμ
μμ μμλ¨μ μλ―Έν©λλ€.
λ°λΌμ xpc_<objectType>_tλ xpc_object_tμ νμ ν΄λμ€μ κ°μ κ²μ΄λ©°, μ΄λ os_object_t*μ νμ ν΄λμ€κ° λ©λλ€.
Warning
xpc_dictionary_[get/set]_<objectType>λ₯Ό μ¬μ©νμ¬ ν€μ μ νκ³Ό μ€μ κ°μ κ°μ Έμ€κ±°λ μ€μ νλ κ²μ κ°λ°μμ¬μΌ νλ€λ μ μ μ μνμμμ€.
xpc_pipe
**xpc_pipe**λ νλ‘μΈμ€κ° ν΅μ νλ λ° μ¬μ©ν μ μλ FIFO νμ΄νμ
λλ€(ν΅μ μ Mach λ©μμ§λ₯Ό μ¬μ©ν©λλ€).
νΉμ Mach ν¬νΈλ₯Ό μ¬μ©νμ¬ XPC μλ²λ₯Ό μμ±νλ €λ©΄ xpc_pipe_create() λλ xpc_pipe_create_from_port()λ₯Ό νΈμΆν μ μμ΅λλ€. κ·Έλ° λ€μ λ©μμ§λ₯Ό μμ νλ €λ©΄ xpc_pipe_receive λ° xpc_pipe_try_receiveλ₯Ό νΈμΆν μ μμ΅λλ€.
xpc_pipe κ°μ²΄λ λ κ°μ Mach ν¬νΈμ μ΄λ¦(μλ κ²½μ°)μ λν μ λ³΄κ° ν¬ν¨λ **xpc_object_t**μ
λλ€. μλ₯Ό λ€μ΄, plist /System/Library/LaunchDaemons/com.apple.secinitd.plistμ μλ λ°λͺ¬ secinitdλ com.apple.secinitdλΌλ νμ΄νλ₯Ό ꡬμ±ν©λλ€.
**xpc_pipe**μ μλ **launchd**μ μν΄ μμ±λ bootstrap pipeλ‘, Mach ν¬νΈλ₯Ό 곡μ ν μ μκ² ν©λλ€.
NSXPC*
μ΄λ€μ XPC μ°κ²°μ μΆμμ νμ©νλ Objective-C κ³ κΈ κ°μ²΄μ
λλ€.
λν, μ΄λ¬ν κ°μ²΄λ μ΄μ κ°μ²΄λ€λ³΄λ€ DTraceλ‘ λλ²κΉ
νκΈ°κ° λ μ½μ΅λλ€.
GCD Queues
XPCλ λ©μμ§λ₯Ό μ λ¬νκΈ° μν΄ GCDλ₯Ό μ¬μ©νλ©°, xpc.transactionq, xpc.io, xpc-events.add-listenerq, xpc.service-instanceμ κ°μ νΉμ λμ€ν¨μΉ νλ₯Ό μμ±ν©λλ€β¦
XPC μλΉμ€
μ΄λ€μ λ€λ₯Έ νλ‘μ νΈμ XPCServices ν΄λμ μμΉν .xpc νμ₯μλ₯Ό κ°μ§ λ²λ€μ
λλ€. Info.plistμμ CFBundlePackageTypeμ΄ **XPC!**λ‘ μ€μ λμ΄ μμ΅λλ€.
μ΄ νμΌμλ Application, User, System λλ _SandboxProfileκ³Ό κ°μ λ€λ₯Έ κ΅¬μ± ν€κ° μμΌλ©°, μ΄λ μλλ°μ€λ₯Ό μ μνκ±°λ _AllowedClientsλ μλΉμ€μ μ°λ½νλ λ° νμν κΆν λλ IDλ₯Ό λνλΌ μ μμ΅λλ€. μ΄λ¬ν κ΅¬μ± μ΅μ
μ μλΉμ€κ° μμλ λ μ μ©ν©λλ€.
μλΉμ€ μμνκΈ°
μ±μ xpc_connection_create_mach_serviceλ₯Ό μ¬μ©νμ¬ XPC μλΉμ€μ μ°κ²°μ μλνλ©°, κ·Έλ° λ€μ launchdλ λ°λͺ¬μ μ°Ύκ³ **xpcproxy**λ₯Ό μμν©λλ€. **xpcproxy**λ ꡬμ±λ μ νμ μννκ³ μ 곡λ FD λ° Mach ν¬νΈλ‘ μλΉμ€λ₯Ό μμ±ν©λλ€.
XPC μλΉμ€ κ²μ μλλ₯Ό κ°μ νκΈ° μν΄ μΊμκ° μ¬μ©λ©λλ€.
xpcproxyμ μμ
μ μΆμ ν μ μμ΅λλ€:
supraudit S -C -o /tmp/output /dev/auditpipe
XPC λΌμ΄λΈλ¬λ¦¬λ kdebugλ₯Ό μ¬μ©νμ¬ xpc_ktrace_pid0 λ° xpc_ktrace_pid1λ₯Ό νΈμΆνλ μμ
μ κΈ°λ‘ν©λλ€. μ¬μ©λλ μ½λλ λ¬Έμνλμ΄ μμ§ μμΌλ―λ‘ /usr/share/misc/trace.codesμ μΆκ°ν΄μΌ ν©λλ€. μ΄λ€μ 0x29 μ λμ¬λ₯Ό κ°μ§λ©°, μλ₯Ό λ€μ΄ νλλ 0x29000004: XPC_serializer_packμ
λλ€.
μ νΈλ¦¬ν° xpcproxyλ 0x22 μ λμ¬λ₯Ό μ¬μ©νλ©°, μλ₯Ό λ€μ΄: 0x2200001c: xpcproxy:will_do_preexec.
XPC μ΄λ²€νΈ λ©μμ§
μμ© νλ‘κ·Έλ¨μ λ€μν μ΄λ²€νΈ λ©μμ§μ ꡬλ
ν μ μμΌλ©°, μ΄λ¬ν μ΄λ²€νΈκ° λ°μν λ μμ²μ λ°λΌ μμλ μ μμ΅λλ€. μ΄λ¬ν μλΉμ€μ μ€μ μ μ΄μ κ³Ό λμΌν λλ ν 리μ μμΉν launchd plist νμΌμμ μ΄λ£¨μ΄μ§λ©°, μΆκ° LaunchEvent ν€λ₯Ό ν¬ν¨ν©λλ€.
XPC μ°κ²° νλ‘μΈμ€ νμΈ
νλ‘μΈμ€κ° XPC μ°κ²°μ ν΅ν΄ λ©μλλ₯Ό νΈμΆνλ €κ³ ν λ, XPC μλΉμ€λ ν΄λΉ νλ‘μΈμ€κ° μ°κ²°ν μ μλμ§ νμΈν΄μΌ ν©λλ€. μ΄λ₯Ό νμΈνλ μΌλ°μ μΈ λ°©λ²κ³Ό μΌλ°μ μΈ ν¨μ μ λ€μκ³Ό κ°μ΅λλ€:
macOS XPC Connecting Process Check
XPC κΆν λΆμ¬
Appleμ λν μ±μ΄ μΌλΆ κΆνμ ꡬμ±νκ³ μ΄λ₯Ό μ»λ λ°©λ²μ μ€μ ν μ μλλ‘ νμ©νλ―λ‘, νΈμΆ νλ‘μΈμ€κ° μ΄λ₯Ό κ°μ§κ³ μλ€λ©΄ XPC μλΉμ€μ λ©μλλ₯Ό νΈμΆν μ μλλ‘ νμ©λ©λλ€:
XPC μ€λνΌ
XPC λ©μμ§λ₯Ό μ€λννλ €λ©΄ xpcspyλ₯Ό μ¬μ©ν μ μμΌλ©°, μ΄λ Fridaλ₯Ό μ¬μ©ν©λλ€.
# Install
pip3 install xpcspy
pip3 install xpcspy --no-deps # To not make xpcspy install Frida 15 and downgrade your Frida installation
# Start sniffing
xpcspy -U -r -W <bundle-id>
## Using filters (i: for input, o: for output)
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
λ λ€λ₯Έ κ°λ₯ν λꡬλ XPoCe2μ λλ€.
XPC ν΅μ C μ½λ μμ
// gcc xpc_server.c -o xpc_server
#include <xpc/xpc.h>
static void handle_event(xpc_object_t event) {
if (xpc_get_type(event) == XPC_TYPE_DICTIONARY) {
// Print received message
const char* received_message = xpc_dictionary_get_string(event, "message");
printf("Received message: %s\n", received_message);
// Create a response dictionary
xpc_object_t response = xpc_dictionary_create(NULL, NULL, 0);
xpc_dictionary_set_string(response, "received", "received");
// Send response
xpc_connection_t remote = xpc_dictionary_get_remote_connection(event);
xpc_connection_send_message(remote, response);
// Clean up
xpc_release(response);
}
}
static void handle_connection(xpc_connection_t connection) {
xpc_connection_set_event_handler(connection, ^(xpc_object_t event) {
handle_event(event);
});
xpc_connection_resume(connection);
}
int main(int argc, const char *argv[]) {
xpc_connection_t service = xpc_connection_create_mach_service("xyz.hacktricks.service",
dispatch_get_main_queue(),
XPC_CONNECTION_MACH_SERVICE_LISTENER);
if (!service) {
fprintf(stderr, "Failed to create service.\n");
exit(EXIT_FAILURE);
}
xpc_connection_set_event_handler(service, ^(xpc_object_t event) {
xpc_type_t type = xpc_get_type(event);
if (type == XPC_TYPE_CONNECTION) {
handle_connection(event);
}
});
xpc_connection_resume(service);
dispatch_main();
return 0;
}
Save server on itβs location
cp xpc_server /tmp
Load daemon
sudo cp xyz.hacktricks.service.plist /Library/LaunchDaemons sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.service.plist
Call client
./xpc_client
Clean
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.service.plist sudo rm /Library/LaunchDaemons/xyz.hacktricks.service.plist /tmp/xpc_server
## XPC ν΅μ Objective-C μ½λ μμ
<div class="mdbook-tabs-container">
<nav class="mdbook-tabs">
<button class="mdbook-tab active" data-tabname="oc_xpc_server.m">oc_xpc_server.m</button>
<button class="mdbook-tab" data-tabname="oc_xpc_client.m">oc_xpc_client.m</button>
<button class="mdbook-tab" data-tabname="xyz.hacktricks.svcoc.plist">xyz.hacktricks.svcoc.plist</button>
</nav>
<div class="mdbook-tab-content" data-tabname="oc_xpc_server.m">
```objectivec
// gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server
#include <Foundation/Foundation.h>
@protocol MyXPCProtocol
- (void)sayHello:(NSString *)some_string withReply:(void (^)(NSString *))reply;
@end
@interface MyXPCObject : NSObject <MyXPCProtocol>
@end
@implementation MyXPCObject
- (void)sayHello:(NSString *)some_string withReply:(void (^)(NSString *))reply {
NSLog(@"Received message: %@", some_string);
NSString *response = @"Received";
reply(response);
}
@end
@interface MyDelegate : NSObject <NSXPCListenerDelegate>
@end
@implementation MyDelegate
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
newConnection.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(MyXPCProtocol)];
MyXPCObject *my_object = [MyXPCObject new];
newConnection.exportedObject = my_object;
[newConnection resume];
return YES;
}
@end
int main(void) {
NSXPCListener *listener = [[NSXPCListener alloc] initWithMachServiceName:@"xyz.hacktricks.svcoc"];
id <NSXPCListenerDelegate> delegate = [MyDelegate new];
listener.delegate = delegate;
[listener resume];
sleep(10); // Fake something is done and then it ends
}
```bash
# Compile the server & client
gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server
gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
Save server on itβs location
cp oc_xpc_server /tmp
Load daemon
sudo cp xyz.hacktricks.svcoc.plist /Library/LaunchDaemons sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
Call client
./oc_xpc_client
Clean
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc_xpc_server
## Dylb μ½λ λ΄μ ν΄λΌμ΄μΈνΈ
```objectivec
// gcc -dynamiclib -framework Foundation oc_xpc_client.m -o oc_xpc_client.dylib
// gcc injection example:
// DYLD_INSERT_LIBRARIES=oc_xpc_client.dylib /path/to/vuln/bin
#import <Foundation/Foundation.h>
@protocol MyXPCProtocol
- (void)sayHello:(NSString *)some_string withReply:(void (^)(NSString *))reply;
@end
__attribute__((constructor))
static void customConstructor(int argc, const char **argv)
{
NSString* _serviceName = @"xyz.hacktricks.svcoc";
NSXPCConnection* _agentConnection = [[NSXPCConnection alloc] initWithMachServiceName:_serviceName options:4096];
[_agentConnection setRemoteObjectInterface:[NSXPCInterface interfaceWithProtocol:@protocol(MyXPCProtocol)]];
[_agentConnection resume];
[[_agentConnection remoteObjectProxyWithErrorHandler:^(NSError* error) {
(void)error;
NSLog(@"Connection Failure");
}] sayHello:@"Hello, Server!" withReply:^(NSString *response) {
NSLog(@"Received response: %@", response);
} ];
NSLog(@"Done!");
return;
}
Remote XPC
RemoteXPC.framework (from libxpc)μμ μ 곡νλ μ΄ κΈ°λ₯μ μλ‘ λ€λ₯Έ νΈμ€νΈ κ°μ XPCλ₯Ό ν΅ν΄ ν΅μ ν μ μκ² ν΄μ€λλ€.
μ격 XPCλ₯Ό μ§μνλ μλΉμ€λ /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plistμ κ°μ΄ plistμ UsesRemoteXPC ν€λ₯Ό κ°μ§λλ€. κ·Έλ¬λ μλΉμ€κ° launchdμ λ±λ‘λλλΌλ, κΈ°λ₯μ μ 곡νλ κ²μ com.apple.remoted.plugin λ° com.apple.remoteservicediscovery.events.plugin νλ¬κ·ΈμΈμ κ°μ§ UserEventAgentμ
λλ€.
λν, RemoteServiceDiscovery.frameworkλ com.apple.remoted.pluginμμ μ 보λ₯Ό κ°μ Έμ¬ μ μκ² ν΄μ£Όλ©°, get_device, get_unique_device, connectμ κ°μ ν¨μλ₯Ό λ
ΈμΆν©λλ€β¦
μ°κ²°μ΄ μ¬μ©λκ³ μλΉμ€μ μμΌ fdκ° μμ§λλ©΄, remote_xpc_connection_* ν΄λμ€λ₯Ό μ¬μ©ν μ μμ΅λλ€.
CLI λꡬ /usr/libexec/remotectlμ μ¬μ©νμ¬ λ€μκ³Ό κ°μ λ§€κ°λ³μλ‘ μ격 μλΉμ€μ λν μ 보λ₯Ό μ»μ μ μμ΅λλ€:
/usr/libexec/remotectl list # Get bridge devices
/usr/libexec/remotectl show ...# Get device properties and services
/usr/libexec/remotectl dumpstate # Like dump withuot indicateing a servie
/usr/libexec/remotectl [netcat|relay] ... # Expose a service in a port
...
BridgeOSμ νΈμ€νΈ κ°μ ν΅μ μ μ μ© IPv6 μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ΄λ£¨μ΄μ§λλ€. MultiverseSupport.frameworkλ ν΅μ μ μ¬μ©λ fdλ₯Ό κ°μ§ μμΌμ μ€μ ν μ μκ² ν΄μ€λλ€.netstat, nettop λλ μ€ν μμ€ μ΅μ
μΈ netbottomμ μ¬μ©νμ¬ μ΄λ¬ν ν΅μ μ μ°Ύλ κ²μ΄ κ°λ₯ν©λλ€.
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


