From 05ee89de81a34a9b579f7390235b35b99d4105c5 Mon Sep 17 00:00:00 2001 From: hakril Date: Mon, 14 Oct 2019 21:52:54 +0200 Subject: [PATCH] Adding some service related definition + added services specific access right to security.py --- .../definitions/defines/services.txt | 82 +++++++++++++++- .../defines/specific_access_right.txt | 47 ++++++++- .../definitions/defines/windef.txt | 96 ------------------- .../definitions/functions/atoms.txt | 46 +++++++++ .../definitions/functions/service.txt | 74 ++++++++++++++ windows/security.py | 29 ++++++ 6 files changed, 276 insertions(+), 98 deletions(-) create mode 100644 ctypes_generation/definitions/functions/atoms.txt create mode 100644 ctypes_generation/definitions/functions/service.txt diff --git a/ctypes_generation/definitions/defines/services.txt b/ctypes_generation/definitions/defines/services.txt index 5c697e6..21a2960 100644 --- a/ctypes_generation/definitions/defines/services.txt +++ b/ctypes_generation/definitions/defines/services.txt @@ -17,4 +17,84 @@ #define SERVICE_TRIGGER_DATA_TYPE_STRING 2 #define SERVICE_TRIGGER_DATA_TYPE_LEVEL 3 #define SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ANY 4 -#define SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ALL 5 \ No newline at end of file +#define SERVICE_TRIGGER_DATA_TYPE_KEYWORD_ALL 5 + +// Specific Access Rights are in + + +#define SERVICE_RUNS_IN_SYSTEM_PROCESS 0x00000001 + + +#define SERVICE_KERNEL_DRIVER 0x00000001 +#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 +#define SERVICE_ADAPTER 0x00000004 +#define SERVICE_RECOGNIZER_DRIVER 0x00000008 + +#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER) + +#define SERVICE_WIN32_OWN_PROCESS 0x00000010 +#define SERVICE_WIN32_SHARE_PROCESS 0x00000020 + +#define SERVICE_USER_OWN_PROCESS 0x00000050 +#define SERVICE_USER_SHARE_PROCESS 0x00000060 + +#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS) + +#define SERVICE_INTERACTIVE_PROCESS 0x00000100 + +#define SERVICE_TYPE_ALL (SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS) + + +#define SERVICE_BOOT_START 0x00000000 +#define SERVICE_SYSTEM_START 0x00000001 +#define SERVICE_AUTO_START 0x00000002 +#define SERVICE_DEMAND_START 0x00000003 +#define SERVICE_DISABLED 0x00000004 + +#define SERVICE_ERROR_IGNORE 0x00000000 +#define SERVICE_ERROR_NORMAL 0x00000001 +#define SERVICE_ERROR_SEVERE 0x00000002 +#define SERVICE_ERROR_CRITICAL 0x00000003 + +#define SERVICE_ACTIVE 0x00000001 +#define SERVICE_INACTIVE 0x00000002 +#define SERVICE_STATE_ALL (SERVICE_ACTIVE | SERVICE_INACTIVE) + +#define SERVICE_CONTROL_STOP 0x00000001 +#define SERVICE_CONTROL_PAUSE 0x00000002 +#define SERVICE_CONTROL_CONTINUE 0x00000003 +#define SERVICE_CONTROL_INTERROGATE 0x00000004 +#define SERVICE_CONTROL_SHUTDOWN 0x00000005 +#define SERVICE_CONTROL_PARAMCHANGE 0x00000006 +#define SERVICE_CONTROL_NETBINDADD 0x00000007 +#define SERVICE_CONTROL_NETBINDREMOVE 0x00000008 +#define SERVICE_CONTROL_NETBINDENABLE 0x00000009 +#define SERVICE_CONTROL_NETBINDDISABLE 0x0000000A +#define SERVICE_CONTROL_DEVICEEVENT 0x0000000B +#define SERVICE_CONTROL_HARDWAREPROFILECHANGE 0x0000000C +#define SERVICE_CONTROL_POWEREVENT 0x0000000D +#define SERVICE_CONTROL_SESSIONCHANGE 0x0000000E +#define SERVICE_CONTROL_PRESHUTDOWN 0x0000000F +#define SERVICE_CONTROL_TIMECHANGE 0x00000010 +#define SERVICE_CONTROL_TRIGGEREVENT 0x00000020 + +#define SERVICE_STOPPED 0x00000001 +#define SERVICE_START_PENDING 0x00000002 +#define SERVICE_STOP_PENDING 0x00000003 +#define SERVICE_RUNNING 0x00000004 +#define SERVICE_CONTINUE_PENDING 0x00000005 +#define SERVICE_PAUSE_PENDING 0x00000006 +#define SERVICE_PAUSED 0x00000007 + + +#define SERVICE_ACCEPT_STOP 0x00000001 +#define SERVICE_ACCEPT_PAUSE_CONTINUE 0x00000002 +#define SERVICE_ACCEPT_SHUTDOWN 0x00000004 +#define SERVICE_ACCEPT_PARAMCHANGE 0x00000008 +#define SERVICE_ACCEPT_NETBINDCHANGE 0x00000010 +#define SERVICE_ACCEPT_HARDWAREPROFILECHANGE 0x00000020 +#define SERVICE_ACCEPT_POWEREVENT 0x00000040 +#define SERVICE_ACCEPT_SESSIONCHANGE 0x00000080 +#define SERVICE_ACCEPT_PRESHUTDOWN 0x00000100 +#define SERVICE_ACCEPT_TIMECHANGE 0x00000200 +#define SERVICE_ACCEPT_TRIGGEREVENT 0x00000400 \ No newline at end of file diff --git a/ctypes_generation/definitions/defines/specific_access_right.txt b/ctypes_generation/definitions/defines/specific_access_right.txt index fde2969..0f19755 100644 --- a/ctypes_generation/definitions/defines/specific_access_right.txt +++ b/ctypes_generation/definitions/defines/specific_access_right.txt @@ -289,4 +289,49 @@ #define FILE_MAP_WRITE SECTION_MAP_WRITE #define FILE_MAP_READ SECTION_MAP_READ #define FILE_MAP_ALL_ACCESS SECTION_ALL_ACCESS -#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT \ No newline at end of file +#define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE_EXPLICIT + + +// +// Service object specific access type +// +#define SERVICE_QUERY_CONFIG 0x0001 +#define SERVICE_CHANGE_CONFIG 0x0002 +#define SERVICE_QUERY_STATUS 0x0004 +#define SERVICE_ENUMERATE_DEPENDENTS 0x0008 +#define SERVICE_START 0x0010 +#define SERVICE_STOP 0x0020 +#define SERVICE_PAUSE_CONTINUE 0x0040 +#define SERVICE_INTERROGATE 0x0080 +#define SERVICE_USER_DEFINED_CONTROL 0x0100 + +#define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \ + SERVICE_QUERY_CONFIG | \ + SERVICE_CHANGE_CONFIG | \ + SERVICE_QUERY_STATUS | \ + SERVICE_ENUMERATE_DEPENDENTS | \ + SERVICE_START | \ + SERVICE_STOP | \ + SERVICE_PAUSE_CONTINUE | \ + SERVICE_INTERROGATE | \ + SERVICE_USER_DEFINED_CONTROL) + + +// +// Service Control Manager object specific access types +// + +#define SC_MANAGER_CONNECT 0x0001 +#define SC_MANAGER_CREATE_SERVICE 0x0002 +#define SC_MANAGER_ENUMERATE_SERVICE 0x0004 +#define SC_MANAGER_LOCK 0x0008 +#define SC_MANAGER_QUERY_LOCK_STATUS 0x0010 +#define SC_MANAGER_MODIFY_BOOT_CONFIG 0x0020 + +#define SC_MANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \ + SC_MANAGER_CONNECT | \ + SC_MANAGER_CREATE_SERVICE | \ + SC_MANAGER_ENUMERATE_SERVICE | \ + SC_MANAGER_LOCK | \ + SC_MANAGER_QUERY_LOCK_STATUS | \ + SC_MANAGER_MODIFY_BOOT_CONFIG) \ No newline at end of file diff --git a/ctypes_generation/definitions/defines/windef.txt b/ctypes_generation/definitions/defines/windef.txt index 5d30275..65ca2e4 100644 --- a/ctypes_generation/definitions/defines/windef.txt +++ b/ctypes_generation/definitions/defines/windef.txt @@ -429,102 +429,6 @@ -#define SC_MANAGER_CONNECT 0x0001 -#define SC_MANAGER_CREATE_SERVICE 0x0002 -#define SC_MANAGER_ENUMERATE_SERVICE 0x0004 -#define SC_MANAGER_LOCK 0x0008 -#define SC_MANAGER_QUERY_LOCK_STATUS 0x0010 -#define SC_MANAGER_MODIFY_BOOT_CONFIG 0x0020 - -#define SC_MANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG) - -#define SERVICE_QUERY_CONFIG 0x0001 -#define SERVICE_CHANGE_CONFIG 0x0002 -#define SERVICE_QUERY_STATUS 0x0004 -#define SERVICE_ENUMERATE_DEPENDENTS 0x0008 -#define SERVICE_START 0x0010 -#define SERVICE_STOP 0x0020 -#define SERVICE_PAUSE_CONTINUE 0x0040 -#define SERVICE_INTERROGATE 0x0080 -#define SERVICE_USER_DEFINED_CONTROL 0x0100 - -#define SERVICE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL) - - -#define SERVICE_RUNS_IN_SYSTEM_PROCESS 0x00000001 - - -#define SERVICE_KERNEL_DRIVER 0x00000001 -#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 -#define SERVICE_ADAPTER 0x00000004 -#define SERVICE_RECOGNIZER_DRIVER 0x00000008 - -#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER) - -#define SERVICE_WIN32_OWN_PROCESS 0x00000010 -#define SERVICE_WIN32_SHARE_PROCESS 0x00000020 -#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS) - -#define SERVICE_INTERACTIVE_PROCESS 0x00000100 - -#define SERVICE_TYPE_ALL (SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS) - - -#define SERVICE_BOOT_START 0x00000000 -#define SERVICE_SYSTEM_START 0x00000001 -#define SERVICE_AUTO_START 0x00000002 -#define SERVICE_DEMAND_START 0x00000003 -#define SERVICE_DISABLED 0x00000004 - -#define SERVICE_ERROR_IGNORE 0x00000000 -#define SERVICE_ERROR_NORMAL 0x00000001 -#define SERVICE_ERROR_SEVERE 0x00000002 -#define SERVICE_ERROR_CRITICAL 0x00000003 - -#define SERVICE_ACTIVE 0x00000001 -#define SERVICE_INACTIVE 0x00000002 -#define SERVICE_STATE_ALL (SERVICE_ACTIVE | SERVICE_INACTIVE) - -#define SERVICE_CONTROL_STOP 0x00000001 -#define SERVICE_CONTROL_PAUSE 0x00000002 -#define SERVICE_CONTROL_CONTINUE 0x00000003 -#define SERVICE_CONTROL_INTERROGATE 0x00000004 -#define SERVICE_CONTROL_SHUTDOWN 0x00000005 -#define SERVICE_CONTROL_PARAMCHANGE 0x00000006 -#define SERVICE_CONTROL_NETBINDADD 0x00000007 -#define SERVICE_CONTROL_NETBINDREMOVE 0x00000008 -#define SERVICE_CONTROL_NETBINDENABLE 0x00000009 -#define SERVICE_CONTROL_NETBINDDISABLE 0x0000000A -#define SERVICE_CONTROL_DEVICEEVENT 0x0000000B -#define SERVICE_CONTROL_HARDWAREPROFILECHANGE 0x0000000C -#define SERVICE_CONTROL_POWEREVENT 0x0000000D -#define SERVICE_CONTROL_SESSIONCHANGE 0x0000000E -#define SERVICE_CONTROL_PRESHUTDOWN 0x0000000F -#define SERVICE_CONTROL_TIMECHANGE 0x00000010 -#define SERVICE_CONTROL_TRIGGEREVENT 0x00000020 - -#define SERVICE_STOPPED 0x00000001 -#define SERVICE_START_PENDING 0x00000002 -#define SERVICE_STOP_PENDING 0x00000003 -#define SERVICE_RUNNING 0x00000004 -#define SERVICE_CONTINUE_PENDING 0x00000005 -#define SERVICE_PAUSE_PENDING 0x00000006 -#define SERVICE_PAUSED 0x00000007 - - -#define SERVICE_ACCEPT_STOP 0x00000001 -#define SERVICE_ACCEPT_PAUSE_CONTINUE 0x00000002 -#define SERVICE_ACCEPT_SHUTDOWN 0x00000004 -#define SERVICE_ACCEPT_PARAMCHANGE 0x00000008 -#define SERVICE_ACCEPT_NETBINDCHANGE 0x00000010 -#define SERVICE_ACCEPT_HARDWAREPROFILECHANGE 0x00000020 -#define SERVICE_ACCEPT_POWEREVENT 0x00000040 -#define SERVICE_ACCEPT_SESSIONCHANGE 0x00000080 -#define SERVICE_ACCEPT_PRESHUTDOWN 0x00000100 -#define SERVICE_ACCEPT_TIMECHANGE 0x00000200 -#define SERVICE_ACCEPT_TRIGGEREVENT 0x00000400 - - #define DRIVE_UNKNOWN 0 #define DRIVE_NO_ROOT_DIR 1 #define DRIVE_REMOVABLE 2 diff --git a/ctypes_generation/definitions/functions/atoms.txt b/ctypes_generation/definitions/functions/atoms.txt new file mode 100644 index 0000000..c54c1ed --- /dev/null +++ b/ctypes_generation/definitions/functions/atoms.txt @@ -0,0 +1,46 @@ +ATOM AddAtomA( + LPCSTR lpString +); + + +ATOM AddAtomW( + LPCWSTR lpString +); + + +ATOM GlobalAddAtomA( + LPCSTR lpString +); + +ATOM GlobalAddAtomExA( + LPCSTR lpString, + DWORD Flags +); + +ATOM GlobalAddAtomExW( + LPCWSTR lpString, + DWORD Flags +); + + +ATOM GlobalAddAtomW( + LPCWSTR lpString +); + + +ATOM GlobalDeleteAtom( + ATOM nAtom +); + + +UINT GlobalGetAtomNameA( + ATOM nAtom, + LPSTR lpBuffer, + INT nSize +); + +UINT GlobalGetAtomNameW( + ATOM nAtom, + LPWSTR lpBuffer, + INT nSize +); \ No newline at end of file diff --git a/ctypes_generation/definitions/functions/service.txt b/ctypes_generation/definitions/functions/service.txt new file mode 100644 index 0000000..33d97fe --- /dev/null +++ b/ctypes_generation/definitions/functions/service.txt @@ -0,0 +1,74 @@ +SC_HANDLE WINAPI OpenSCManagerA( + __in_opt LPCSTR lpMachineName, + __in_opt LPCSTR lpDatabaseName, + __in DWORD dwDesiredAccess +); + +SC_HANDLE WINAPI OpenSCManagerW( + __in_opt LPCWSTR lpMachineName, + __in_opt LPCWSTR lpDatabaseName, + __in DWORD dwDesiredAccess +); + +BOOL WINAPI CloseServiceHandle( + _In_ SC_HANDLE hSCObject +); + +BOOL WINAPI EnumServicesStatusExA( + __in SC_HANDLE hSCManager, + __in SC_ENUM_TYPE InfoLevel, + __in DWORD dwServiceType, + __in DWORD dwServiceState, + _Out_opt_ LPBYTE lpServices, + __in DWORD cbBufSize, + __out LPDWORD pcbBytesNeeded, + __out LPDWORD lpServicesReturned, + __inout_opt LPDWORD lpResumeHandle, + __in_opt LPCSTR pszGroupName +); + + +BOOL WINAPI EnumServicesStatusExW( + __in SC_HANDLE hSCManager, + __in SC_ENUM_TYPE InfoLevel, + __in DWORD dwServiceType, + __in DWORD dwServiceState, + _Out_opt_ LPBYTE lpServices, + __in DWORD cbBufSize, + __out LPDWORD pcbBytesNeeded, + __out LPDWORD lpServicesReturned, + __inout_opt LPDWORD lpResumeHandle, + __in_opt LPCWSTR pszGroupName + ); + + +BOOL WINAPI StartServiceA( + _In_ SC_HANDLE hService, + _In_ DWORD dwNumServiceArgs, + _In_opt_ LPCSTR *lpServiceArgVectors +); + +BOOL WINAPI StartServiceW( + _In_ SC_HANDLE hService, + _In_ DWORD dwNumServiceArgs, + _In_opt_ LPCWSTR *lpServiceArgVectors +); + +SC_HANDLE WINAPI OpenServiceA( + _In_ SC_HANDLE hSCManager, + _In_ LPCSTR lpServiceName, + _In_ DWORD dwDesiredAccess +); + + +SC_HANDLE WINAPI OpenServiceW( + _In_ SC_HANDLE hSCManager, + _In_ LPCWSTR lpServiceName, + _In_ DWORD dwDesiredAccess +); + +BOOL ControlService( + SC_HANDLE hService, + DWORD dwControl, + LPSERVICE_STATUS lpServiceStatus +); \ No newline at end of file diff --git a/windows/security.py b/windows/security.py index 6f76800..1177acd 100644 --- a/windows/security.py +++ b/windows/security.py @@ -181,6 +181,18 @@ COM_ACCESS_RIGHT = gdef.FlagMapper( gdef.COM_ACTIVATE_REMOTE, ) +SERVICE_ACCESS_RIGHT = gdef.FlagMapper( + gdef.SERVICE_QUERY_CONFIG, + gdef.SERVICE_CHANGE_CONFIG, + gdef.SERVICE_QUERY_STATUS, + gdef.SERVICE_ENUMERATE_DEPENDENTS, + gdef.SERVICE_START, + gdef.SERVICE_STOP, + gdef.SERVICE_PAUSE_CONTINUE, + gdef.SERVICE_INTERROGATE, + gdef.SERVICE_USER_DEFINED_CONTROL, +) + SPECIFIC_ACCESS_RIGTH_BY_TYPE = { None: gdef.FlagMapper(), @@ -204,6 +216,7 @@ SPECIFIC_ACCESS_RIGTH_BY_TYPE = { "job": JOB_ACCESS_RIGHT, "key": KEY_ACCESS_RIGHT, "com": COM_ACCESS_RIGHT, + "service": SERVICE_ACCESS_RIGHT, } # SD @@ -646,6 +659,15 @@ class SecurityDescriptor(gdef.PSECURITY_DESCRIPTOR): gdef.SCOPE_SECURITY_INFORMATION | gdef.PROCESS_TRUST_LABEL_SECURITY_INFORMATION ) + + # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-queryserviceobjectsecurity + # Default flags for services + SERVICE_SECURITY_INFORMATION = ( + gdef.OWNER_SECURITY_INFORMATION | + gdef.GROUP_SECURITY_INFORMATION | + gdef.DACL_SECURITY_INFORMATION + ) + """The default ``flags`` value for functions expecting a `SECURITY_INFORMATION `_. @@ -831,6 +853,13 @@ class SecurityDescriptor(gdef.PSECURITY_DESCRIPTOR): """Retrieve the security descriptor for the file ``filename``""" return cls._from_name_and_type(filename, gdef.SE_FILE_OBJECT, flags=flags, query_sacl=query_sacl) + @classmethod + def from_service(cls, filename, query_sacl=False, flags=SERVICE_SECURITY_INFORMATION): + """Retrieve the security descriptor for the service named ``service``""" + sd = cls._from_name_and_type(filename, gdef.SE_SERVICE, flags=flags, query_sacl=query_sacl) + sd.obj_type = "service" + return sd + @classmethod def from_handle(cls, handle, query_sacl=False, flags=DEFAULT_SECURITY_INFORMATION, obj_type=None): """Retrieve the security descriptor for the kernel object described by``handle``"""