Beispiel #1
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
Beispiel #2
0
 def test_parse_message(self):
     actual = SyntaxIdElement()
     data = b"\xff\xff\xff\xff\xff\xff\xff\xff" \
            b"\xff\xff\xff\xff\xff\xff\xff\xff" \
            b"\x02\x00\x00\x00"
     data = actual.unpack(data)
     assert len(actual) == 20
     assert data == b""
     assert actual['uuid'].get_value() == uuid.UUID(bytes=b"\xff" * 16)
     assert actual['version'].get_value() == 2
Beispiel #3
0
 def test_create_message(self):
     message = SyntaxIdElement()
     message['uuid'] = uuid.UUID(bytes=b"\xff" * 16)
     message['version'] = 2
     expected = b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\x02\x00\x00\x00"
     actual = message.pack()
     assert len(message) == 20
     assert actual == expected
Beispiel #4
0
    def test_create_message(self):
        message = BindAckPDU()
        message['packed_drep'] = DataRepresentationFormat()
        message['call_id'] = 4
        message['max_xmit_frag'] = 4280
        message['max_recv_frag'] = 4280
        message['assoc_group_id'] = 2
        message['sec_addr'] = b"\x5C\x70\x69\x70\x65\x5C\x6E\x74" \
                              b"\x73\x76\x63\x73\x00"

        syntax = SyntaxIdElement()
        syntax['uuid'] = uuid.UUID(bytes=b"\xff" * 16)
        syntax['version'] = 2
        res1 = Result()
        res1['result'] = ContextResult.ACCEPTANCE
        res1['reason'] = ResultReason.REASON_NOT_SPECIFIED
        res1['transfer_syntax'] = syntax
        res2 = Result()
        res2['result'] = ContextResult.NEGOTIATE_ACK
        res2['reason'] = ResultReason.LOCAL_LIMIT_EXCEEDED
        res2['transfer_syntax'] = syntax
        message['results'] = [res1, res2]
        expected = b"\x05" \
                   b"\x00" \
                   b"\x0c" \
                   b"\x00" \
                   b"\x10\x00\x00\x00" \
                   b"\x5c\x00" \
                   b"\x00\x00" \
                   b"\x04\x00\x00\x00" \
                   b"\xb8\x10" \
                   b"\xb8\x10" \
                   b"\x02\x00\x00\x00" \
                   b"\x0d\x00" \
                   b"\x5c\x70\x69\x70\x65\x5C\x6e\x74" \
                   b"\x73\x76\x63\x73\x00" \
                   b"\x00" \
                   b"\x02" \
                   b"\x00" \
                   b"\x00\x00" \
                   b"\x00\x00" \
                   b"\x00\x00" \
                   b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                   b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                   b"\x02\x00\x00\x00" \
                   b"\x03\x00" \
                   b"\x03\x00" \
                   b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                   b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                   b"\x02\x00\x00\x00"
        actual = message.pack()
        assert len(message) == 92
        assert actual == expected
Beispiel #5
0
 def test_create_message(self):
     message = Result()
     message['result'] = ContextResult.ACCEPTANCE
     message['reason'] = ResultReason.REASON_NOT_SPECIFIED
     syntax = SyntaxIdElement()
     syntax['uuid'] = uuid.UUID(bytes=b"\xff" * 16)
     syntax['version'] = 2
     message['transfer_syntax'] = syntax
     expected = b"\x00\x00" \
                b"\x00\x00" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\xff\xff\xff\xff\xff\xff\xff\xff" \
                b"\x02\x00\x00\x00"
     actual = message.pack()
     assert len(message) == 24
     assert actual == expected
Beispiel #6
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
Beispiel #7
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))