Skip to content

Instantly share code, notes, and snippets.

@Brandon7CC
Created December 16, 2023 01:29
Show Gist options
  • Save Brandon7CC/e5e54978b1484fd09f5e201a4fd9dbfc to your computer and use it in GitHub Desktop.
Save Brandon7CC/e5e54978b1484fd09f5e201a4fd9dbfc to your computer and use it in GitHub Desktop.
Enumerate Endpoint Security event subscription requests made by an arbitrary client (e.g. an EDR sensor's System Extension)
/*
Author: Brandon Dalton (Red Canary Threat Research)
Date: 2023-12-07
Summary: This script enumerates the event subscriptions requested by an arbitrary client
by hooking the `es_subscribe` function.
Target: Any arbitrary ES client like an EDR sensor's System Extension
Usage: `sudo frida -p $(TARGET_CLIENT) -l event_subscription_interceptor.js`
*/
const eventTypeMapping = {
// Complete mapping based on es_event_type_t enumeration
0: 'ES_EVENT_TYPE_AUTH_EXEC',
1: 'ES_EVENT_TYPE_AUTH_OPEN',
2: 'ES_EVENT_TYPE_AUTH_KEXTLOAD',
3: 'ES_EVENT_TYPE_AUTH_MMAP',
4: 'ES_EVENT_TYPE_AUTH_MPROTECT',
5: 'ES_EVENT_TYPE_AUTH_MOUNT',
6: 'ES_EVENT_TYPE_AUTH_RENAME',
7: 'ES_EVENT_TYPE_AUTH_SIGNAL',
8: 'ES_EVENT_TYPE_AUTH_UNLINK',
9: 'ES_EVENT_TYPE_NOTIFY_EXEC',
10: 'ES_EVENT_TYPE_NOTIFY_OPEN',
11: 'ES_EVENT_TYPE_NOTIFY_FORK',
12: 'ES_EVENT_TYPE_NOTIFY_CLOSE',
13: 'ES_EVENT_TYPE_NOTIFY_CREATE',
14: 'ES_EVENT_TYPE_NOTIFY_EXCHANGEDATA',
15: 'ES_EVENT_TYPE_NOTIFY_EXIT',
16: 'ES_EVENT_TYPE_NOTIFY_GET_TASK',
17: 'ES_EVENT_TYPE_NOTIFY_KEXTLOAD',
18: 'ES_EVENT_TYPE_NOTIFY_KEXTUNLOAD',
19: 'ES_EVENT_TYPE_NOTIFY_LINK',
20: 'ES_EVENT_TYPE_NOTIFY_MMAP',
21: 'ES_EVENT_TYPE_NOTIFY_MPROTECT',
22: 'ES_EVENT_TYPE_NOTIFY_MOUNT',
23: 'ES_EVENT_TYPE_NOTIFY_UNMOUNT',
24: 'ES_EVENT_TYPE_NOTIFY_IOKIT_OPEN',
25: 'ES_EVENT_TYPE_NOTIFY_RENAME',
26: 'ES_EVENT_TYPE_NOTIFY_SETATTRLIST',
27: 'ES_EVENT_TYPE_NOTIFY_SETEXTATTR',
28: 'ES_EVENT_TYPE_NOTIFY_SETFLAGS',
29: 'ES_EVENT_TYPE_NOTIFY_SETMODE',
30: 'ES_EVENT_TYPE_NOTIFY_SETOWNER',
31: 'ES_EVENT_TYPE_NOTIFY_SIGNAL',
32: 'ES_EVENT_TYPE_NOTIFY_UNLINK',
33: 'ES_EVENT_TYPE_NOTIFY_WRITE',
34: 'ES_EVENT_TYPE_AUTH_FILE_PROVIDER_MATERIALIZE',
35: 'ES_EVENT_TYPE_NOTIFY_FILE_PROVIDER_MATERIALIZE',
36: 'ES_EVENT_TYPE_AUTH_FILE_PROVIDER_UPDATE',
37: 'ES_EVENT_TYPE_NOTIFY_FILE_PROVIDER_UPDATE',
38: 'ES_EVENT_TYPE_AUTH_READLINK',
39: 'ES_EVENT_TYPE_NOTIFY_READLINK',
40: 'ES_EVENT_TYPE_AUTH_TRUNCATE',
41: 'ES_EVENT_TYPE_NOTIFY_TRUNCATE',
42: 'ES_EVENT_TYPE_AUTH_LINK',
43: 'ES_EVENT_TYPE_NOTIFY_LOOKUP',
44: 'ES_EVENT_TYPE_AUTH_CREATE',
45: 'ES_EVENT_TYPE_AUTH_SETATTRLIST',
46: 'ES_EVENT_TYPE_AUTH_SETEXTATTR',
47: 'ES_EVENT_TYPE_AUTH_SETFLAGS',
48: 'ES_EVENT_TYPE_AUTH_SETMODE',
49: 'ES_EVENT_TYPE_AUTH_SETOWNER',
50: 'ES_EVENT_TYPE_AUTH_CHDIR',
51: 'ES_EVENT_TYPE_NOTIFY_CHDIR',
52: 'ES_EVENT_TYPE_AUTH_GETATTRLIST',
53: 'ES_EVENT_TYPE_NOTIFY_GETATTRLIST',
54: 'ES_EVENT_TYPE_NOTIFY_STAT',
55: 'ES_EVENT_TYPE_NOTIFY_ACCESS',
56: 'ES_EVENT_TYPE_AUTH_CHROOT',
57: 'ES_EVENT_TYPE_NOTIFY_CHROOT',
58: 'ES_EVENT_TYPE_AUTH_UTIMES',
59: 'ES_EVENT_TYPE_NOTIFY_UTIMES',
60: 'ES_EVENT_TYPE_AUTH_CLONE',
61: 'ES_EVENT_TYPE_NOTIFY_CLONE',
62: 'ES_EVENT_TYPE_NOTIFY_FCNTL',
63: 'ES_EVENT_TYPE_AUTH_GETEXTATTR',
64: 'ES_EVENT_TYPE_NOTIFY_GETEXTATTR',
65: 'ES_EVENT_TYPE_AUTH_LISTEXTATTR',
66: 'ES_EVENT_TYPE_NOTIFY_LISTEXTATTR',
67: 'ES_EVENT_TYPE_AUTH_READDIR',
68: 'ES_EVENT_TYPE_NOTIFY_READDIR',
69: 'ES_EVENT_TYPE_AUTH_DELETEEXTATTR',
70: 'ES_EVENT_TYPE_NOTIFY_DELETEEXTATTR',
71: 'ES_EVENT_TYPE_AUTH_FSGETPATH',
72: 'ES_EVENT_TYPE_NOTIFY_FSGETPATH',
73: 'ES_EVENT_TYPE_NOTIFY_DUP',
74: 'ES_EVENT_TYPE_AUTH_SETTIME',
75: 'ES_EVENT_TYPE_NOTIFY_SETTIME',
76: 'ES_EVENT_TYPE_NOTIFY_UIPC_BIND',
77: 'ES_EVENT_TYPE_AUTH_UIPC_BIND',
78: 'ES_EVENT_TYPE_NOTIFY_UIPC_CONNECT',
79: 'ES_EVENT_TYPE_AUTH_UIPC_CONNECT',
80: 'ES_EVENT_TYPE_AUTH_EXCHANGEDATA',
81: 'ES_EVENT_TYPE_AUTH_SETACL',
82: 'ES_EVENT_TYPE_NOTIFY_SETACL',
83: 'ES_EVENT_TYPE_NOTIFY_PTY_GRANT',
84: 'ES_EVENT_TYPE_NOTIFY_PTY_CLOSE',
85: 'ES_EVENT_TYPE_AUTH_PROC_CHECK',
86: 'ES_EVENT_TYPE_NOTIFY_PROC_CHECK',
87: 'ES_EVENT_TYPE_AUTH_GET_TASK',
88: 'ES_EVENT_TYPE_AUTH_SEARCHFS',
89: 'ES_EVENT_TYPE_NOTIFY_SEARCHFS',
90: 'ES_EVENT_TYPE_AUTH_FCNTL',
91: 'ES_EVENT_TYPE_AUTH_IOKIT_OPEN',
92: 'ES_EVENT_TYPE_AUTH_PROC_SUSPEND_RESUME',
93: 'ES_EVENT_TYPE_NOTIFY_PROC_SUSPEND_RESUME',
94: 'ES_EVENT_TYPE_NOTIFY_CS_INVALIDATED',
95: 'ES_EVENT_TYPE_NOTIFY_GET_TASK_NAME',
96: 'ES_EVENT_TYPE_NOTIFY_TRACE',
97: 'ES_EVENT_TYPE_NOTIFY_REMOTE_THREAD_CREATE',
98: 'ES_EVENT_TYPE_AUTH_REMOUNT',
99: 'ES_EVENT_TYPE_NOTIFY_REMOUNT',
100: 'ES_EVENT_TYPE_AUTH_GET_TASK_READ',
101: 'ES_EVENT_TYPE_NOTIFY_GET_TASK_READ',
102: 'ES_EVENT_TYPE_NOTIFY_GET_TASK_INSPECT',
103: 'ES_EVENT_TYPE_NOTIFY_SETUID',
104: 'ES_EVENT_TYPE_NOTIFY_SETGID',
105: 'ES_EVENT_TYPE_NOTIFY_SETEUID',
106: 'ES_EVENT_TYPE_NOTIFY_SETEGID',
107: 'ES_EVENT_TYPE_NOTIFY_SETREUID',
108: 'ES_EVENT_TYPE_NOTIFY_SETREGID',
109: 'ES_EVENT_TYPE_AUTH_COPYFILE',
110: 'ES_EVENT_TYPE_NOTIFY_COPYFILE',
111: 'ES_EVENT_TYPE_NOTIFY_AUTHENTICATION',
112: 'ES_EVENT_TYPE_NOTIFY_XP_MALWARE_DETECTED',
113: 'ES_EVENT_TYPE_NOTIFY_XP_MALWARE_REMEDIATED',
114: 'ES_EVENT_TYPE_NOTIFY_LW_SESSION_LOGIN',
115: 'ES_EVENT_TYPE_NOTIFY_LW_SESSION_LOGOUT',
116: 'ES_EVENT_TYPE_NOTIFY_LW_SESSION_LOCK',
117: 'ES_EVENT_TYPE_NOTIFY_LW_SESSION_UNLOCK',
118: 'ES_EVENT_TYPE_NOTIFY_SCREENSHARING_ATTACH',
119: 'ES_EVENT_TYPE_NOTIFY_SCREENSHARING_DETACH',
120: 'ES_EVENT_TYPE_NOTIFY_OPENSSH_LOGIN',
121: 'ES_EVENT_TYPE_NOTIFY_OPENSSH_LOGOUT',
122: 'ES_EVENT_TYPE_NOTIFY_LOGIN_LOGIN',
123: 'ES_EVENT_TYPE_NOTIFY_LOGIN_LOGOUT',
124: 'ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD',
125: 'ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_REMOVE',
126: 'ES_EVENT_TYPE_NOTIFY_PROFILE_ADD',
127: 'ES_EVENT_TYPE_NOTIFY_PROFILE_REMOVE',
128: 'ES_EVENT_TYPE_NOTIFY_SU',
129: 'ES_EVENT_TYPE_NOTIFY_AUTHORIZATION_PETITION',
130: 'ES_EVENT_TYPE_NOTIFY_AUTHORIZATION_JUDGEMENT',
131: 'ES_EVENT_TYPE_NOTIFY_SUDO',
132: 'ES_EVENT_TYPE_NOTIFY_OD_GROUP_ADD',
133: 'ES_EVENT_TYPE_NOTIFY_OD_GROUP_REMOVE',
134: 'ES_EVENT_TYPE_NOTIFY_OD_GROUP_SET',
135: 'ES_EVENT_TYPE_NOTIFY_OD_MODIFY_PASSWORD',
136: 'ES_EVENT_TYPE_NOTIFY_OD_DISABLE_USER',
137: 'ES_EVENT_TYPE_NOTIFY_OD_ENABLE_USER',
138: 'ES_EVENT_TYPE_NOTIFY_OD_ATTRIBUTE_VALUE_ADD',
139: 'ES_EVENT_TYPE_NOTIFY_OD_ATTRIBUTE_VALUE_REMOVE',
140: 'ES_EVENT_TYPE_NOTIFY_OD_ATTRIBUTE_SET',
141: 'ES_EVENT_TYPE_NOTIFY_OD_CREATE_USER',
142: 'ES_EVENT_TYPE_NOTIFY_OD_CREATE_GROUP',
143: 'ES_EVENT_TYPE_NOTIFY_OD_DELETE_USER',
144: 'ES_EVENT_TYPE_NOTIFY_OD_DELETE_GROUP',
145: 'ES_EVENT_TYPE_NOTIFY_XPC_CONNECT',
146: 'ES_EVENT_TYPE_LAST'
};
const moduleName = 'libEndpointSecurity.dylib';
const functionName = 'es_subscribe';
const address = Module.findExportByName(moduleName, functionName);
if (address != null) {
Interceptor.attach(address, {
onEnter: function(args) {
// Pull the number of events requested from the stack (arg 2)
const eventCount = args[2].toInt32();
console.log('Number of events requested: ' + eventCount);
if (eventCount > 0) {
// The events are stored in a list of es_event_type_t values
const eventsPtr = args[1];
for (let i = 0; i < eventCount; i++) {
const eventType = eventsPtr.add(i * 4).readInt();
// Convert the event type to a human readable string
const eventName = eventTypeMapping[eventType] || `Unknown (${eventType})`;
console.log(eventName);
}
}
}
});
} else {
console.log('es_subscribe not found in :(');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment