Example #1
0
 def test_parse_message(self):
     actual = ContextElement()
     data = b"\x04\x00" \
            b"\x02" \
            b"\x00" \
            b"\xff\xff\xff\xff\xff\xff\xff\xff" \
            b"\xff\xff\xff\xff\xff\xff\xff\xff" \
            b"\x00\x00\x00\x00" \
            b"\xee\xee\xee\xee\xee\xee\xee\xee" \
            b"\xee\xee\xee\xee\xee\xee\xee\xee" \
            b"\x00\x00\x00\x00" \
            b"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd" \
            b"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd" \
            b"\x00\x00\x00\x00"
     data = actual.unpack(data)
     assert len(actual) == 64
     assert data == b""
     assert actual['context_id'].get_value() == 4
     assert actual['n_transfer_syn'].get_value() == 2
     assert actual['reserved'].get_value() == 0
     assert isinstance(actual['abstract_syntax'].get_value(),
                       SyntaxIdElement)
     assert actual['abstract_syntax']['uuid'].get_value() == \
         uuid.UUID(bytes=b"\xff" * 16)
     assert actual['abstract_syntax']['version'].get_value() == 0
     transfer_syntaxes = actual['transfer_syntaxes'].get_value()
     assert len(transfer_syntaxes) == 2
     assert transfer_syntaxes[0]['uuid'].get_value() == \
         uuid.UUID(bytes=b"\xee" * 16)
     assert transfer_syntaxes[0]['version'].get_value() == 0
     assert transfer_syntaxes[1]['uuid'].get_value() == \
         uuid.UUID(bytes=b"\xdd" * 16)
     assert transfer_syntaxes[1]['version'].get_value() == 0
Example #2
0
 def test_create_message(self):
     message = ContextElement()
     message['context_id'] = 4
     syntax1 = SyntaxIdElement()
     syntax1['uuid'] = uuid.UUID(bytes=b"\xff" * 16)
     syntax2 = SyntaxIdElement()
     syntax2['uuid'] = uuid.UUID(bytes=b"\xee" * 16)
     syntax3 = SyntaxIdElement()
     syntax3['uuid'] = uuid.UUID(bytes=b"\xdd" * 16)
     message['abstract_syntax'] = syntax1
     message['transfer_syntaxes'] = [syntax2, syntax3]
     expected = b"\x04\x00" \
                b"\x02" \
                b"\x00" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\x00\x00\x00\x00" \
                b"\xee\xee\xee\xee\xee\xee\xee\xee" \
                b"\xee\xee\xee\xee\xee\xee\xee\xee" \
                b"\x00\x00\x00\x00" \
                b"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd" \
                b"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd" \
                b"\x00\x00\x00\x00"
     actual = message.pack()
     assert len(message) == 64
     assert actual == expected
Example #3
0
 def test_create_message(self):
     message = BindPDU()
     message['pfx_flags'].set_flag(PFlags.PFC_MAYBE)
     packed_drep = DataRepresentationFormat()
     packed_drep['integer_character'] = \
         IntegerCharacterRepresentation.ASCII_LITTLE_ENDIAN
     packed_drep['floating_point'] = FloatingPointRepresentation.IEEE
     message['packed_drep'] = packed_drep
     message['call_id'] = 4
     message['assoc_group_id'] = 2
     con_elem = ContextElement()
     con_elem['context_id'] = 1
     syntax = SyntaxIdElement()
     syntax['uuid'] = uuid.UUID(bytes=b"\xff" * 16)
     con_elem['abstract_syntax'] = syntax
     con_elem['transfer_syntaxes'] = [syntax]
     message['context_elems'] = [con_elem]
     expected = b"\x05" \
                b"\x00" \
                b"\x0b" \
                b"\x40" \
                b"\x10" \
                b"\x00" \
                b"\x00" \
                b"\x00" \
                b"\x48\x00" \
                b"\x00\x00" \
                b"\x04\x00\x00\x00" \
                b"\xb8\x10" \
                b"\xb8\x10" \
                b"\x02\x00\x00\x00" \
                b"\x01" \
                b"\x00" \
                b"\x00\x00" \
                b"\x01" \
                b"\x00" \
                b"\x01" \
                b"\x00" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\x00\x00\x00\x00" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\x00\x00\x00\x00"
     actual = message.pack()
     assert len(message) == 72
     assert actual == expected
Example #4
0
    def open(self):
        log.debug("Connecting to SMB Tree %s for SCMR" % self.tree.share_name)
        self.tree.connect()

        log.debug("Opening handle to svcctl pipe")
        self.handle.create(
            ImpersonationLevel.Impersonation,
            FilePipePrinterAccessMask.GENERIC_READ
            | FilePipePrinterAccessMask.GENERIC_WRITE, 0,
            ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE
            | ShareAccess.FILE_SHARE_DELETE, CreateDisposition.FILE_OPEN,
            CreateOptions.FILE_NON_DIRECTORY_FILE)

        # we need to bind svcctl to SCManagerW over DCE/RPC
        bind = BindPDU()
        bind['pfx_flags'].set_flag(PFlags.PFC_FIRST_FRAG)
        bind['pfx_flags'].set_flag(PFlags.PFC_LAST_FRAG)
        bind['packed_drep'] = DataRepresentationFormat()
        bind['call_id'] = self.call_id
        self.call_id += 1

        context_ndr = ContextElement()
        context_ndr['context_id'] = 0
        context_ndr['abstract_syntax'] = SyntaxIdElement()
        context_ndr['abstract_syntax']['uuid'] = \
            uuid.UUID("367ABB81-9844-35F1-AD32-98F038001003")
        context_ndr['abstract_syntax']['version'] = 2

        # https://msdn.microsoft.com/en-us/library/cc243843.aspx
        ndr_syntax = SyntaxIdElement()
        ndr_syntax['uuid'] = uuid.UUID("8a885d04-1ceb-11c9-9fe8-08002b104860")
        ndr_syntax['version'] = 2
        context_ndr['transfer_syntaxes'] = [ndr_syntax]

        context_bind = ContextElement()
        context_bind['context_id'] = 1
        context_bind['abstract_syntax'] = SyntaxIdElement()
        context_bind['abstract_syntax']['uuid'] = \
            uuid.UUID("367ABB81-9844-35F1-AD32-98F038001003")
        context_bind['abstract_syntax']['version'] = 2

        # https://msdn.microsoft.com/en-us/library/cc243715.aspx
        # uuid prefix = 6CB71C2C-9812-4540
        # uuid prefix bytes = b'\x2c\x1c\xb7\x6c\x12\x98\x40\x45'
        # BindTimeFeatureNegotiateBitmask
        # https://msdn.microsoft.com/en-us/library/cc243884.aspx
        # SecurityContextMultiplexingSupported = 0x01
        # KeepConnectionOnOrphanSupported = 0x02
        # version number is 1
        bind_syntax = SyntaxIdElement()
        bind_syntax['uuid'] = b'\x2c\x1c\xb7\x6c\x12\x98\x40\x45' \
                              b'\x03\x00\x00\x00\x00\x00\x00\x00'
        bind_syntax['version'] = 1
        context_bind['transfer_syntaxes'] = [bind_syntax]

        bind['context_elems'] = [context_ndr, context_bind]
        bind_data = bind.pack()

        log.info("Sending bind request to svcctl")
        log.debug(str(bind))
        self.handle.write(bind_data)

        log.info("Receiving bind result for svcctl")
        bind_data = self.handle.read(0, 1024)
        bind_result = parse_pdu(bind_data)
        log.debug(str(bind_result))
        if not isinstance(bind_result, BindAckPDU):
            raise PDUException("Expecting BindAckPDU for initial bind result "
                               "but got: %s" % str(bind_result))