Coverage for /private/tmp/im/impacket/impacket/dcerpc/v5/dcom/scmp.py : 59%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# SECUREAUTH LABS. Copyright 2018 SecureAuth Corporation. All rights reserved. # # This software is provided under under a slightly modified version # of the Apache Software License. See the accompanying LICENSE file # for more information. # # Author: Alberto Solino (@agsolino) # # Description: # [MS-SCMP]: Shadow Copy Management Protocol Interface implementation # This was used as a way to test the DCOM runtime. Further # testing is needed to verify it is working as expected # # Best way to learn how to use these calls is to grab the protocol standard # so you understand what the call does, and then read the test case located # at https://github.com/SecureAuthCorp/impacket/tree/master/tests/SMB_RPC # # Since DCOM is like an OO RPC, instead of helper functions you will see the # classes described in the standards developed. # There are test cases for them too. #
DCERPCException.__init__(self, error_string, error_code, packet)
if self.error_code in hresult_errors.ERROR_MESSAGES: error_msg_short = hresult_errors.ERROR_MESSAGES[self.error_code][0] error_msg_verbose = hresult_errors.ERROR_MESSAGES[self.error_code][1] return 'SCMP SessionError: code: 0x%x - %s - %s' % (self.error_code, error_msg_short, error_msg_verbose) else: return 'SCMP SessionError: unknown error code: 0x%x' % self.error_code
################################################################################ # CONSTANTS ################################################################################ # 1.9 Standards Assignments
# 2.2.1.1 VSS_ID ('Data','16s=b""'), )
return 2
#2.2.1.2 VSS_PWSZ
# 2.2.1.3 VSS_TIMESTAMP
################################################################################ # STRUCTURES ################################################################################ # 2.2.2.1 VSS_OBJECT_TYPE Enumeration
# 2.2.2.2 VSS_MGMT_OBJECT_TYPE Enumeration
# 2.2.2.3 VSS_VOLUME_SNAPSHOT_ATTRIBUTES Enumeration
# 2.2.2.4 VSS_SNAPSHOT_STATE Enumeration
# 2.2.2.5 VSS_PROVIDER_TYPE Enumeration
# 2.2.3.7 VSS_VOLUME_PROP Structure ('m_pwszVolumeName', VSS_PWSZ), ('m_pwszVolumeDisplayName', VSS_PWSZ), )
# 2.2.3.5 VSS_MGMT_OBJECT_UNION Union ('tag', ULONG), ) VSS_MGMT_OBJECT_TYPE.VSS_MGMT_OBJECT_VOLUME: ('Vol', VSS_VOLUME_PROP), #VSS_MGMT_OBJECT_DIFF_VOLUME: ('DiffVol', VSS_DIFF_VOLUME_PROP), #VSS_MGMT_OBJECT_DIFF_AREA: ('DiffArea', VSS_DIFF_AREA_PROP), }
# 2.2.3.6 VSS_MGMT_OBJECT_PROP Structure ('Type', VSS_MGMT_OBJECT_TYPE), ('Obj', VSS_MGMT_OBJECT_UNION), )
################################################################################ # RPC CALLS ################################################################################ # 3.1.3 IVssEnumMgmtObject Details
# 3.1.3.1 Next (Opnum 3) ('celt', ULONG), )
('rgelt', VSS_MGMT_OBJECT_PROP), ('pceltFetched', ULONG), ('ErrorCode', error_status_t), )
# 3.1.2.1 Next (Opnum 3) ('celt', ULONG), )
('rgelt', VSS_MGMT_OBJECT_PROP), ('pceltFetched', ULONG), ('ErrorCode', error_status_t), )
('ProviderId', VSS_ID), ('InterfaceId', VSS_ID), )
('ppItf', PMInterfacePointer), ('ErrorCode', error_status_t), )
('ProviderId', VSS_ID), ('IContext', LONG), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
('pwszVolumeName', VSS_PWSZ), ('ProviderId', VSS_ID), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.4.5 QueryDiffAreasForVolume (Opnum 6) ('pwszVolumeName', VSS_PWSZ), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
# 3.1.4.4.6 QueryDiffAreasOnVolume (Opnum 7) ('pwszVolumeName', VSS_PWSZ), )
('ppEnum', PMInterfacePointer), ('ErrorCode', error_status_t), )
################################################################################ # OPNUMs and their corresponding structures ################################################################################ }
################################################################################ # HELPER FUNCTIONS AND INTERFACES ################################################################################ IRemUnknown2.__init__(self, interface) self._iid = IID_IVssEnumMgmtObject
request = IVssEnumMgmtObject_Next() request['ORPCthis'] = self.get_cinstance().get_ORPCthis() request['ORPCthis']['flags'] = 0 request['celt'] = celt resp = self.request(request, self._iid, uuid = self.get_iPid()) return resp
IRemUnknown2.__init__(self, interface) self._iid = IID_IVssEnumObject
request = IVssEnumObject_Next() request['ORPCthis'] = self.get_cinstance().get_ORPCthis() request['ORPCthis']['flags'] = 0 request['celt'] = celt dce = self.connect() resp = dce.request(request, self._iid, uuid = self.get_iPid()) return resp
IRemUnknown2.__init__(self, interface) self._iid = IID_IVssSnapshotMgmt
req = GetProviderMgmtInterface() classInstance = self.get_cinstance() req['ORPCthis'] = classInstance.get_ORPCthis() req['ORPCthis']['flags'] = 0 req['ProviderId'] = providerId req['InterfaceId'] = interfaceId resp = self.request(req, self._iid, uuid = self.get_iPid()) return IVssDifferentialSoftwareSnapshotMgmt(INTERFACE(classInstance, ''.join(resp['ppItf']['abData']), self.get_ipidRemUnknown(), target = self.get_target()))
req = QueryVolumesSupportedForSnapshots() classInstance = self.get_cinstance() req['ORPCthis'] = classInstance.get_ORPCthis() req['ORPCthis']['flags'] = 0 req['ProviderId'] = providerId req['IContext'] = iContext resp = self.request(req, self._iid, uuid = self.get_iPid()) return IVssEnumMgmtObject(INTERFACE(self.get_cinstance(), ''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(),target = self.get_target()))
req = QuerySnapshotsByVolume() classInstance = self.get_cinstance() req['ORPCthis'] = classInstance.get_ORPCthis() req['ORPCthis']['flags'] = 0 req['pwszVolumeName'] = volumeName req['ProviderId'] = providerId try: resp = self.request(req, self._iid, uuid = self.get_iPid()) except DCERPCException as e: print(e) from impacket.winregistry import hexdump data = e.get_packet() hexdump(data) kk = QuerySnapshotsByVolumeResponse(data) kk.dump() #resp.dump() return IVssEnumObject(INTERFACE(self.get_cinstance(), ''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(), target = self.get_target()))
IRemUnknown2.__init__(self, interface) self._iid = IID_IVssDifferentialSoftwareSnapshotMgmt
req = QueryDiffAreasOnVolume() classInstance = self.get_cinstance() req['ORPCthis'] = classInstance.get_ORPCthis() req['ORPCthis']['flags'] = 0 req['pwszVolumeName'] = pwszVolumeName resp = self.request(req, self._iid, uuid = self.get_iPid()) return IVssEnumMgmtObject(INTERFACE(self.get_cinstance(), ''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(), target = self.get_target()))
req = QueryDiffAreasForVolume() classInstance = self.get_cinstance() req['ORPCthis'] = classInstance.get_ORPCthis() req['ORPCthis']['flags'] = 0 req['pwszVolumeName'] = pwszVolumeName resp = self.request(req, self._iid, uuid = self.get_iPid()) return IVssEnumMgmtObject(INTERFACE(self.get_cinstance(), ''.join(resp['ppEnum']['abData']), self.get_ipidRemUnknown(), target = self.get_target())) |