krot

RDP

Sep 1st, 2016
3,961
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     import socket  
  2.        
  3.     def dump_packet(name, data):  
  4.        fd = open('./_logs/' + name, "wb")  
  5.        fd.write(data)  
  6.        fd.close()  
  7.        
  8.     CR = '\x0d'  
  9.     LF = '\x0a'  
  10.        
  11.     class PDU_conn_req:  
  12.        # Client X.224 Connection Request PDU  
  13.        ''''' 4.1.1 Client X.224 Connection Request PDU  
  14.      
  15.           The following is an annotated dump of the X.224 Connection Request PDU (section 2.2.1.1).  
  16.           00000000 03 00 00 2c 27 e0 00 00 00 00 00 43 6f 6f 6b 69     ...,'......Cooki  
  17.           00000010 65 3a 20 6d 73 74 73 68 61 73 68 3d 65 6c 74 6f     e: mstshash=elto  
  18.           00000020 6e 73 0d 0a 01 00 08 00 00 00 00 00                 ns..........  
  19.      
  20.           03 -> TPKT Header: version = 3  
  21.           00 -> TPKT Header: Reserved = 0  
  22.           00 -> TPKT Header: Packet length - high part  
  23.           2c -> TPKT Header: Packet length - low part (total = 44 bytes)  
  24.           27 -> X.224: Length indicator (39 bytes)  
  25.           e0 -> X.224: Type (high nibble) = 0xe = CR TPDU; credit (low nibble)  = 0  
  26.           00 00 -> X.224: Destination reference = 0  
  27.           00 00 -> X.224: Source reference = 0  
  28.           00 -> X.224: Class and options = 0  
  29.      
  30.           43 6f 6f 6b 69 65 3a 20 6d 73 74 73 68 61 73 68  
  31.           3d 65 6c 74 6f 6e 73 -> "Cookie: mstshash=eltons"  
  32.           0d -> CR (carriage return)  
  33.           0a -> LF (line feed)  
  34.      
  35.           01 -> RDP_NEG_REQ::type (TYPE_RDP_NEG_REQ)  
  36.           00 -> RDP_NEG_REQ::flags (0)  
  37.           08 00 -> RDP_NEG_REQ::length (8 bytes)  
  38.           00 00 00 00 -> RDP_NEG_REQ: Requested protocols (PROTOCOL_RDP)  
  39.           '''  
  40.          
  41.        def __init__(self, cookie = "Cookie: mstshash=Administr"):  
  42.            self.cookie = cookie + CR + LF  
  43.              
  44.        def RDP_NEG_REQ(self, proto = "PROTOCOL_RDP_FLAG"):  
  45.            requestedProtocols = {'PROTOCOL_RDP_FLAG'     : '\x00\x00\x00\x00',  
  46.                                   'PROTOCOL_SSL_FLAG'    : '\x01\x00\x00\x00',  
  47.                                   'PROTOCOL_HYBRID_FLAG' : '\x02\x00\x00\x00'}  
  48.            # [TYPE] [FLAGS] [LEN 2 BYTES] [PROTO]  
  49.            RDP_NEG_REQ = chr(0x01) + chr(0x00) + chr(0x08) + chr(0x00)    
  50.            RDP_NEG_REQ += requestedProtocols[proto]  
  51.            return RDP_NEG_REQ  
  52.              
  53.        def get_packet(self):  
  54.            prpk = self.cookie + self.RDP_NEG_REQ()  
  55.            # X.224  
  56.            X_224 = '\xe0\x00\x00\x00\x00\x00'  
  57.            l1 = len(prpk + X_224)  
  58.            X_224 = chr(l1) + X_224  
  59.            tpktHeader =  chr(0x03)  #proto  
  60.            tpktHeader += chr(0x00) #reserved  
  61.            tpktHeader += chr(0x00) #packet len high part  
  62.            tpktHeader += chr(l1 + 4 + 1) #packet len low part  
  63.            return tpktHeader + X_224 + prpk  
  64.     #  
  65.     class PDU_conn_conf:  
  66.        '''''  
  67.       0000  03 00 00 13 0E D0 00 00  12 34 00 03 00 08 00 02  .........4......  
  68.       0010  00 00 00                                          ...        
  69.       '''  
  70.        def __init__(self, packet):  
  71.            self.packet = packet  
  72.            self.is_PDU()  
  73.              
  74.        def is_PDU(self):  
  75.            self.ok = False  
  76.            if self.packet[0] == '\x03':  
  77.                self.ok = True  
  78.            if len(self.packet) > 11: # 4 + 7  
  79.                self.NType = None  
  80.                self.proto = None  
  81.                self.RDP_negotiation_type()  
  82.                  
  83.        def RDP_negotiation_type(self):  
  84.            protocols = {'\x00\x00\x00\x00' : 'PROTOCOL_RDP_FLAG',  
  85.                         '\x01\x00\x00\x00' : 'PROTOCOL_SSL_FLAG',  
  86.                         '\x02\x00\x00\x00' : 'PROTOCOL_HYBRID_FLAG'}  
  87.            if self.packet[11] == '\x02':  
  88.                self.NType = "TYPE_RDP_NEG_RESP" # response  
  89.                self.proto = protocols[self.packet[15:19]] # response  
  90.            elif self.packet[11] == '\x03':  
  91.                self.NType = "TYPE_RDP_NEG_FAILURE" # failure  
  92.                # print failure code  
  93.     #  
  94.     class xxx:  
  95.        ''''' 4.1.3 Client MCS Connect Initial PDU with GCC Conference Create Request  
  96.            
  97.           The following is an annotated dump of the MCS Connect Initial PDU  
  98.           with GCC Conference Create Request (section 2.2.1.3).  
  99.           00000000 03 00 01 a0 02 f0 80 7f 65 82 01 94 04 01 01 04 ........e.......  
  100.           00000010 01 01 01 01 ff 30 19 02 01 22 02 01 02 02 01 00 .....0..."......  
  101.           00000020 02 01 01 02 01 00 02 01 01 02 02 ff ff 02 01 02 ................  
  102.           00000030 30 19 02 01 01 02 01 01 02 01 01 02 01 01 02 01 0...............  
  103.           00000040 00 02 01 01 02 02 04 20 02 01 02 30 1c 02 02 ff ....... ...0....  
  104.           00000050 ff 02 02 fc 17 02 02 ff ff 02 01 01 02 01 00 02 ................  
  105.           00000060 01 01 02 02 ff ff 02 01 02 04 82 01 33 00 05 00 ............3...  
  106.           00000070 14 7c 00 01 81 2a 00 08 00 10 00 01 c0 00 44 75 .|...*........Du  
  107.           00000080 63 61 81 1c 01 c0 d8 00 04 00 08 00 00 05 00 04 ca..............  
  108.           00000090 01 ca 03 aa 09 04 00 00 ce 0e 00 00 45 00 4c 00 ............E.L.  
  109.           000000a0 54 00 4f 00 4e 00 53 00 2d 00 44 00 45 00 56 00 T.O.N.S.-.D.E.V.  
  110.           000000b0 32 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 2...............  
  111.           000000c0 00 00 00 00 0c 00 00 00 00 00 00 00 00 00 00 00 ................  
  112.           000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................  
  113.           000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................  
  114.           000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................  
  115.           00000100 00 00 00 00 00 00 00 00 01 ca 01 00 00 00 00 00 ................  
  116.           00000110 18 00 07 00 01 00 36 00 39 00 37 00 31 00 32 00 ......6.9.7.1.2.  
  117.           00000120 2d 00 37 00 38 00 33 00 2d 00 30 00 33 00 35 00 -.7.8.3.-.0.3.5.  
  118.           00000130 37 00 39 00 37 00 34 00 2d 00 34 00 32 00 37 00 7.9.7.4.-.4.2.7.  
  119.           00000140 31 00 34 00 00 00 00 00 00 00 00 00 00 00 00 00 1.4.............  
  120.           00000150 00 00 00 00 00 00 00 00 01 00 00 00 04 c0 0c 00 ................  
  121.           00000160 0d 00 00 00 00 00 00 00 02 c0 0c 00 1b 00 00 00 ................  
  122.           00000170 00 00 00 00 03 c0 2c 00 03 00 00 00 72 64 70 64 ......,.....rdpd  
  123.           00000180 72 00 00 00 00 00 80 80 63 6c 69 70 72 64 72 00 r.......cliprdr.  
  124.           00000190 00 00 a0 c0 72 64 70 73 6e 64 00 00 00 00 00 c0 ....rdpsnd......  
  125.           '''  
  126.        def __init__(self):  
  127.            pass  
  128.              
  129.        def get_packet(self):  
  130.            dump  = "\x03\x00\x01\xA0" # tpktHeader  
  131.            dump += "\x02\xF0\x80" # X.224  
  132.            # 02 -> X.224: Length indicator = 2  
  133.            # f0 -> X.224: Type = 0xf0 = Data TPDU  
  134.            # 80 -> X.224: EOT  
  135.            dump += "\x7F\x65"     # BER: Application-Defined Type = APPLICATION 101 = Connect-Initial  
  136.            dump += "\x82\x01\x94" # BER: Type Length = 404 bytes  
  137.            dump += "\x04\x01\x01" # Connect-Initial::callingDomainSelector    
  138.            dump += "\x04\x01\x01" # Connect-Initial::calledDomainSelector  
  139.            dump += "\x01\x01\xFF" # Connect-Initial::upwardFlag = TRUE  
  140.            dump += "\x30\x19"     # Connect-Initial::targetParameters (25 bytes)  
  141.            dump += "\x02\x01\x22" # DomainParameters::maxChannelIds = 34  
  142.            dump += "\x02\x01\x02" # DomainParameters::maxUserIds = 2  
  143.            dump += "\x02\x01\x00" # DomainParameters::maxTokenIds = 0  
  144.            dump += "\x02\x01\x01" # DomainParameters::numPriorities = 1  
  145.            dump += "\x02\x01\x00" # DomainParameters::minThroughput = 0  
  146.            dump += "\x02\x01\x01" # DomainParameters::maxHeight = 1  
  147.            dump += "\x02\x02\xFF\xFF" # DomainParameters::maxMCSPDUsize = 65535  
  148.            dump += "\x02\x01\x02" # DomainParameters::protocolVersion = 2  
  149.              
  150.            dump += "\x30\x19" # Connect-Initial::minimumParameters (25 bytes)  
  151.            dump += "\x02\x01\x01" # DomainParameters::maxChannelIds = 1  
  152.            dump += "\x02\x01\x01" # DomainParameters::maxUserIds = 1  
  153.            dump += "\x02\x01\x01" # DomainParameters::maxTokenIds = 1  
  154.            dump += "\x02\x01\x01" # DomainParameters::numPriorities = 1  
  155.            dump += "\x02\x01\x00" # DomainParameters::minThroughput = 0  
  156.            dump += "\x02\x01\x01" # DomainParameters::maxHeight = 1  
  157.            dump += "\x02\x02\x04\x20" # DomainParameters::maxMCSPDUsize = 1056  
  158.            dump += "\x02\x01\x02" # DomainParameters::protocolVersion = 2  
  159.              
  160.            dump += "\x30\x1C" # Connect-Initial::maximumParameters (28 bytes)  
  161.            dump += "\x02\x02\xFF\xFF" # DomainParameters::maxChannelIds = 65535  
  162.            dump += "\x02\x02\xFC\x17" # DomainParameters::maxUserIds = 64535  
  163.            dump += "\x02\x02\xFF\xFF" # DomainParameters::maxTokenIds = 65535  
  164.            dump += "\x02\x01\x01" # DomainParameters::numPriorities = 1  
  165.            dump += "\x02\x01\x00" # DomainParameters::minThroughput = 0  
  166.            dump += "\x02\x01\x01" # DomainParameters::maxHeight = 1  
  167.            dump += "\x02\x02\xFF\xFF" # DomainParameters::maxMCSPDUsize = 65535  
  168.            dump += "\x02\x01\x02" # DomainParameters::protocolVersion = 2  
  169.              
  170.            dump += "\x04\x82\x01\x33" # Connect-Initial::userData (307 bytes)  
  171.              
  172.            # PER encoded (basic aligned variant) GCC Connection Data (ConnectData):  
  173.            dump += "\x00\x05\x00\x14\x7c\x00\x01\x81\x2a\x00\x08\x00\x10\x00\x01\xc0"  
  174.            dump += "\x00\x44\x75\x63\x61\x81\x1c"  
  175.              
  176.            #dump += "\x05" # object length = 5 bytes  
  177.              
  178.            #dump += "\x00\x14\x7c\x00\x01" # object  
  179.            #dump += "\x81\x2a" # ConnectData::connectPDU length = 298 bytes    
  180.            # PER encoded (basic aligned variant) GCC Conference Create Request PDU:  
  181.            #dump += "\x00\x08\x00\x10\x00\x01\xc0\x00\x44\x75\x63\x61\x81\x1c"  
  182.            #"\x44\x75\x63\x61" # h221NonStandard (client-to-server H.221 key) = "Duca"  
  183.              
  184.            #"\x81\x1c"#UserData::value length = 284 bytes  
  185.              
  186.            dump += "\x01\xc0\xd8\x00"#TS_UD_HEADER::type = CS_CORE (0xc001), length = 216 bytes  
  187.              
  188.            dump += "\x04\x00\x08\x00"#TS_UD_CS_CORE::version = 0x0008004  
  189.            dump += "\x00\x05"#TS_UD_CS_CORE::desktopWidth = 1280  
  190.            dump += "\x00\x04"#TS_UD_CS_CORE::desktopHeight = 1024  
  191.            dump += "\x01\xca"#TS_UD_CS_CORE::colorDepth = RNS_UD_COLOR_8BPP (0xca01)  
  192.            dump += "\x03\xaa"#TS_UD_CS_CORE::SASSequence  
  193.            dump += "\x09\x04\x00\x00"#TS_UD_CS_CORE::keyboardLayout = 0x409 = 1033 = English (US)  
  194.            dump += "\xce\x0e\x00\x00"#TS_UD_CS_CORE::clientBuild = 3790    
  195.              
  196.            dump += "\x45\x00\x4c\x00\x54\x00\x4f\x00\x4e\x00\x53\x00\x2d\x00\x44\x00"  
  197.            dump += "\x45\x00\x56\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" # TS_UD_CS_CORE::clientName = ELTONS-TEST2  
  198.              
  199.            dump += "\x04\x00\x00\x00" # TS_UD_CS_CORE::keyboardType  
  200.            dump += "\x00\x00\x00\x00" # TS_UD_CS_CORE::keyboardSubtype  
  201.            dump += "\x0c\x00\x00\x00" # TS_UD_CS_CORE::keyboardFunctionKey  
  202.              
  203.            dump += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  
  204.            dump += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  
  205.            dump += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  
  206.            dump += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" # TS_UD_CS_CORE::imeFileName = ""  
  207.              
  208.            dump += "\x01\xca" # TS_UD_CS_CORE::postBeta2ColorDepth = RNS_UD_COLOR_8BPP (0xca01)  
  209.              
  210.            dump += "\x01\x00" # TS_UD_CS_CORE::clientProductId  
  211.            dump += "\x00\x00\x00\x00" # TS_UD_CS_CORE::serialNumber  
  212.            dump += "\x18\x00" # TS_UD_CS_CORE::highColorDepth = 24 bpp  
  213.              
  214.            dump += "\x07\x00"#TS_UD_CS_CORE::supportedColorDepths  
  215.            # 0x07 = 0x01 | 0x02 | 0x04  
  216.            # = RNS_UD_24BPP_SUPPORT | RNS_UD_16BPP_SUPPORT | RNS_UD_15BPP_SUPPORT  
  217.              
  218.            dump += "\x01\x00" # TS_UD_CS_CORE::earlyCapabilityFlags  
  219.            # 0x01 = RNS_UD_CS_SUPPORT_ERRINFO_PDU  
  220.              
  221.            dump += "\x36\x00\x39\x00\x37\x00\x31\x00\x32\x00\x2d\x00\x37\x00\x38\x00"  
  222.            dump += "\x33\x00\x2d\x00\x30\x00\x33\x00\x35\x00\x37\x00\x39\x00\x37\x00"  
  223.            dump += "\x34\x00\x2d\x00\x34\x00\x32\x00\x37\x00\x31\x00\x34\x00\x00\x00"  
  224.            dump += "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"  
  225.            # TS_UD_CS_CORE::clientDigProductId = "69712-783-0357974-42714"  
  226.              
  227.              
  228.            dump += "\x00" # TS_UD_CS_CORE::connectionType = 0 (not used as RNS_UD_CS_VALID_CONNECTION_TYPE not set)  
  229.            dump += "\x00" # TS_UD_CS_CORE::pad1octet  
  230.              
  231.            dump += "\x00\x00\x00\x00"#TS_UD_CS_CORE::serverSelectedProtocols  
  232.              
  233.            dump += "\x04\xc0\x0c\x00"#TS_UD_HEADER::type = CS_CLUSTER (0xc004), length = 12 bytes  
  234.              
  235.            dump += "\x0d\x00\x00\x00"#TS_UD_CS_CLUSTER::Flags = 0x0d  
  236.            # 0x0d = 0x03 << 2 | 0x01 = REDIRECTION_VERSION4 << 2 | REDIRECTION_SUPPORTED  
  237.              
  238.            dump += "\x00\x00\x00\x00" # TS_UD_CS_CLUSTER::RedirectedSessionID  
  239.              
  240.            dump += "\x02\xc0\x0c\x00" # TS_UD_HEADER::type = CS_SECURITY (0xc002), length = 12 bytes  
  241.              
  242.            dump += "\x1b\x00\x00\x00" # TS_UD_CS_SEC::encryptionMethods  
  243.            # 0x1b = 0x01 | 0x02 | 0x08 | 0x10  
  244.            # = 40BIT_ENCRYPTION_FLAG | 128BIT_ENCRYPTION_FLAG | 56BIT_ENCRYPTION_FLAG | FIPS_ENCRYPTION_FLAG  
  245.              
  246.            dump += "\x00\x00\x00\x00" # TS_UD_CS_SEC::extEncryptionMethods  
  247.              
  248.            dump += "\x03\xc0\x2c\x00" # TS_UD_HEADER::type = CS_NET (0xc003), length = 44 bytes  
  249.              
  250.            dump += "\x03\x00\x00\x00" # TS_UD_CS_NET::channelCount = 3  
  251.            dump += "\x72\x64\x70\x64\x72\x00\x00\x00" # CHANNEL_DEF::name = "rdpdr"  
  252.              
  253.            dump += "\x00\x00\x80\x80" # CHANNEL_DEF::options = 0x80800000  
  254.            # 0x80800000 = 0x80000000 | 0x00800000 = INITIALIZED | COMPRESS_RDP  
  255.              
  256.            dump += "\x63\x6c\x69\x70\x72\x64\x72\x00" # CHANNEL_DEF::name = "cliprdr"  
  257.              
  258.            dump += "\x00\x00\xa0\xc0" # CHANNEL_DEF::options = 0xc0a00000  
  259.            # 0xc0a00000 = 0x80000000 | 0x40000000 | 0x00800000 | 0x00200000  
  260.            # = INITIALIZED | ENCRYPT_RDP | COMPRESS_RDP | SHOW_PROTOCOL  
  261.              
  262.            dump += "\x72\x64\x70\x73\x6e\x64\x00\x00" # CHANNEL_DEF::name = "rdpsnd"    
  263.              
  264.            dump += "\x00\x00\x00\xc0" # CHANNEL_DEF::options = 0xc0000000  
  265.            # 0xc0000000 = 0x80000000 | 0x40000000 = INITIALIZED | ENCRYPT_RDP  
  266.              
  267.            return dump  
  268.     #  
  269.     def Client_MCS_Erect_Domain_Request_PDU():  
  270.        #4.1.5 Client MCS Erect Domain Request PDU  
  271.        '''''  
  272.           The following is an annotated dump of the MCS Erect Domain Request PDU (section 2.2.1.5).  
  273.           00000000 03 00 00 0c 02 f0 80 04 01 00 01 00     ............  
  274.            
  275.           03 00 00 0c -> TPKT Header (length = 12 bytes)  
  276.           02 f0 80 -> X.224 Data TPDU  
  277.            
  278.           PER encoded (basic aligned variant) PDU contents:  
  279.           04 01 00 01 00  
  280.            
  281.           0x04:  
  282.           0 - --\
  283.           0 -   |  
  284.           0 -   | CHOICE: From DomainMCSPDU select erectDomainRequest (1) of type ErectDomainRequest  
  285.           0 -   |  
  286.           0 -   |  
  287.           1 - --/  
  288.           0 - padding  
  289.           0 - padding  
  290.            
  291.           0x01:  
  292.           0 - --\
  293.           0 -   |  
  294.           0 -   |  
  295.           0 -   | ErectDomainRequest::subHeight length = 1 byte  
  296.           0 -   |  
  297.           0 -   |  
  298.           0 -   |  
  299.           1 - --/  
  300.            
  301.           0x00:  
  302.           0 - --\
  303.           0 -   |  
  304.           0 -   |  
  305.           0 -   | ErectDomainRequest::subHeight = 0  
  306.           0 -   |  
  307.           0 -   |  
  308.           0 -   |  
  309.           0 - --/  
  310.            
  311.           0x01:  
  312.           0 - --\
  313.           0 -   |  
  314.           0 -   |  
  315.           0 -   | ErectDomainRequest::subInterval length = 1 byte  
  316.           0 -   |  
  317.           0 -   |  
  318.           0 -   |  
  319.           1 - --/  
  320.            
  321.           0x00:  
  322.           0 - --\
  323.           0 -   |  
  324.           0 -   |  
  325.           0 -   | ErectDomainRequest::subInterval = 0  
  326.           0 -   |  
  327.           0 -   |  
  328.           0 -   |  
  329.           0 - --/  
  330.           '''  
  331.        # mstsc.exe sends:    
  332.        logged_mstsc = "\x03\x00\x00\x0C\x02\xF0\x80\x04\x01\x00\x01\x00\x03\x00\x00\x08\x02\xF0\x80\x28"  
  333.        from_ms_docs = "\x03\x00\x00\x0c\x02\xf0\x80\x04\x01\x00\x01\x00"  
  334.        return from_ms_docs  
  335.        #22.12.2009 03:49:15.171; 364: Server to Client (11 bytes)  
  336.        #0000  03 00 00 0B 02 F0 80 2E  00 00 07  
  337.     def Client_MCS_Attach_User_Request_PDU():  
  338.        '''''4.1.6 Client MCS Attach User Request PDU  
  339.           The following is an annotated dump of the MCS Attach User Request PDU (section 2.2.1.6).  
  340.           00000000 03 00 00 08 02 f0 80 28                     .......(  
  341.      
  342.           03 00 00 08 -> TPKT Header (length = 8 bytes)  
  343.           02 f0 80 -> X.224 Data TPDU  
  344.      
  345.           PER encoded (basic aligned variant) PDU contents:  
  346.           28  
  347.      
  348.           0x28:  
  349.           0 - --\
  350.           0 -   |  
  351.           1 -   | CHOICE: From DomainMCSPDU select attachUserRequest (10) of  
  352.           type AttachUserRequest  
  353.           0 -   |  
  354.           1 -   |  
  355.           0 - --/  
  356.           0 - padding  
  357.           0 - padding'''  
  358.              
  359.        return '\x03\x00\x00\x08\x02\xF0\x80\x28'  
  360.          
  361.     def Server_MCS_Attach_User_Confirm_PDU(packet):  
  362.        # returns initiator  
  363.        '''''4.1.7 Server MCS Attach-User Confirm PDU  
  364.           The following is an annotated dump of the MCS Attach User Confirm PDU (section 2.2.1.7).  
  365.           00000000 03 00 00 0b 02 f0 80 2e 00 00 06           ...........  
  366.      
  367.           03 00 00 0b -> TPKT Header (length = 11 bytes)  
  368.           02 f0 80 -> X.224 Data TPDU  
  369.      
  370.           PER encoded (basic aligned variant) PDU contents:  
  371.           2e 00 00 06  
  372.      
  373.           0x2e:  
  374.           0 - --\
  375.           0 -   |  
  376.           1 -   | CHOICE: From DomainMCSPDU select attachUserConfirm (11) of  
  377.           type AttachUserConfirm  
  378.           0 -   |  
  379.           1 -   |  
  380.           1 - --/  
  381.           1 - AttachUserConfirm::initiator present  
  382.           0 - --\
  383.                 |  
  384.           0x00: | AttachUserConfirm::result = rt-successful (0)  
  385.           0 -   |  
  386.           0 -   |  
  387.           0 - --/  
  388.           0 - padding  
  389.           0 - padding  
  390.           0 - padding  
  391.           0 - padding  
  392.           0 - padding  
  393.      
  394.           0x00:  
  395.           0 - --\
  396.           0 -   |  
  397.           0 -   |  
  398.           0 -   |  
  399.           0 -   |  
  400.           0 -   |  
  401.           0 -   |  
  402.           0 -   |  
  403.                 | AttachUserConfirm::initiator = 0x0006 + 1001 = 0x03ef = 1007 (user channel)  
  404.           0x06: |  
  405.           0 -   |  
  406.           0 -   |  
  407.           0 -   |  
  408.           0 -   |  
  409.           0 -   |  
  410.           1 -   |  
  411.           1 -   |  
  412.           0 - --/'''  
  413.          
  414.        return packet[-1]  
  415.          
  416.     def Client_Join_Request_PDU_for_Channel(chan_num, initiator):  
  417.        ''''' 4.1.9.1 Client Join Request PDU for Channel 1007 (User Channel)  
  418.           The following is an annotated dump of the MCS Channel Join Request PDU (section 2.2.1.8).  
  419.           00000000 03 00 00 0c 02 f0 80 38 00 06 03 ef             .......8....  
  420.      
  421.           03 00 00 0c -> TPKT Header (length = 12 bytes)  
  422.           02 f0 80 -> X.224 Data TPDU  
  423.      
  424.           PER encoded (basic aligned variant) PDU contents:  
  425.           38 00 06 03 ef  
  426.      
  427.           0x38:  
  428.           0 - --\
  429.           0 -   |  
  430.           1 -   | CHOICE: From DomainMCSPDU select channelJoinRequest (14) of  
  431.           type ChannelJoinRequest  
  432.           1 -   |  
  433.           1 -   |  
  434.           0 - --/  
  435.           0 - padding  
  436.           0 - padding  
  437.      
  438.           0x00:  
  439.           0 - --\
  440.           0 -   |  
  441.           0 -   |  
  442.           0 -   |  
  443.           0 -   |  
  444.           0 -   |  
  445.           0 -   |  
  446.           0 -   |  
  447.                 | ChannelJoinRequest::initiator =  = 1007 (0x03ef)  
  448.           0x06: |  
  449.           0 -   |  
  450.           0 -   |  
  451.           0 -   |  
  452.           0 -   |  
  453.           0 -   |  
  454.           1 -   |  
  455.           1 -   |  
  456.           0 - --/  
  457.      
  458.           0x03:  
  459.           0 - --\
  460.           0 -   |  
  461.           0 -   |  
  462.           0 -   |  
  463.           0 -   |  
  464.           0 -   |  
  465.           1 -   |  
  466.           1 -   |  
  467.                 | ChannelJoinRequest::channelId = 0x03ef = 1007  
  468.           0xef: |  
  469.           1 -   |  
  470.           1 -   |  
  471.           1 -   |  
  472.           0 -   |  
  473.           1 -   |  
  474.           1 -   |  
  475.           1 -   |  
  476.           1 - --/  
  477.           '''  
  478.          
  479.        xv1 = (chan_num) / 256  
  480.        val = (chan_num) % 256  
  481.        return '\x03\x00\x00\x0c\x02\xf0\x80\x38\x00' + initiator + chr(xv1) + chr(val)  
  482.     def Server_Join_Confirm_PDU_for_Channel():  
  483.        ''''' 4.1.9.2 Server Join Confirm PDU for Channel 1007 (User Channel)  
  484.           The following is an annotated dump of the MCS Channel Join Confirm PDU (section 2.2.1.9).  
  485.           00000000 03 00 00 0f 02 f0 80 3e 00 00 06 03 ef 03 ef    .......>.......  
  486.      
  487.           03 00 00 0f -> TPKT Header (length = 15 bytes)  
  488.           02 f0 80 -> X.224 Data TPDU  
  489.      
  490.           PER encoded (basic aligned variant) PDU contents:  
  491.           3e 00 00 06 03 ef 03 ef  
  492.      
  493.           0x3e:  
  494.           0 - --\
  495.           0 -   |  
  496.           1 -   | CHOICE: From DomainMCSPDU select channelJoinConfirm (15) of  
  497.           type ChannelJoinConfirm  
  498.           1 -   |  
  499.           1 -   |  
  500.           1 - --/  
  501.           1 - ChannelJoinConfirm::channelId present  
  502.           0 - --\
  503.                 |  
  504.           0x00: | ChannelJoinConfirm::result = rt-successful (0)  
  505.           0 -   |  
  506.           0 -   |  
  507.           0 - --/  
  508.           0 - padding  
  509.           0 - padding  
  510.           0 - padding  
  511.           0 - padding  
  512.           0 - padding  
  513.      
  514.           0x00:  
  515.           0 - --\
  516.           0 -   |  
  517.           0 -   |  
  518.           0 -   |  
  519.           0 -   |  
  520.           0 -   |  
  521.           0 -   |  
  522.           0 -   |  
  523.                 | ChannelJoinConfirm::initiator = 0x06 + 1001 = 1007 (0x03ef)  
  524.           0x06: |  
  525.           0 -   |  
  526.           0 -   |  
  527.           0 -   |  
  528.           0 -   |  
  529.           0 -   |  
  530.           1 -   |  
  531.           1 -   |  
  532.           0 - --/  
  533.      
  534.           0x03:  
  535.           0 - --\
  536.           0 -   |  
  537.           0 -   |  
  538.           0 -   |  
  539.           0 -   |  
  540.           0 -   |  
  541.           1 -   |  
  542.           1 -   |  
  543.                 | ChannelJoinConfirm::requested = 0x03ef = 1007  
  544.           0xef: |  
  545.           1 -   |  
  546.           1 -   |  
  547.           1 -   |  
  548.           0 -   |  
  549.           1 -   |  
  550.           1 -   |  
  551.           1 -   |  
  552.           1 - --/  
  553.      
  554.           0x03:  
  555.           0 - --\
  556.           0 -   |  
  557.           0 -   |  
  558.           0 -   |  
  559.           0 -   |  
  560.           0 -   |  
  561.           1 -   |  
  562.           1 -   |  
  563.                 | ChannelJoinConfirm::channelId = 0x03ef = 1007  
  564.           0xef: |  
  565.           1 -   |  
  566.           1 -   |  
  567.           1 -   |  
  568.           0 -   |  
  569.           1 -   |  
  570.           1 -   |  
  571.           1 -   |  
  572.           1 - --/  
  573.           '''  
  574.        pass  
  575.     #  
  576.     class RDP_CLIENT:  
  577.        def __init__(self):  
  578.            # socks4-5 support  
  579.            self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  580.              
  581.        def connect(self, host, port = 3389):  
  582.            # todo try / except block  
  583.            self.conn.connect((host, port))  
  584.              
  585.        def PDU_conn_req(self):  
  586.            '''''  
  587.           0000  03 00 00 2F 2A E0 00 00  00 00 00 43 6F 6F 6B 69  .../*......Cooki  
  588.           0010  65 3A 20 6D 73 74 73 68  61 73 68 3D 41 64 6D 69  e: mstshash=Admi  
  589.           0020  6E 69 73 74 72 0D 0A 01  00 08 00 01 00 00 00     nistr..........  
  590.           '''  
  591.            dump_packet("PDU_serv_recv.raw", PDU_conn_req().get_packet())  
  592.            self.conn.send( PDU_conn_req().get_packet() )  
  593.            answ = self.conn.recv(1024)  
  594.            answ_desc = PDU_conn_conf(answ)  
  595.            if answ_desc.ok:  
  596.                if answ_desc.proto == "PROTOCOL_RDP_FLAG":  
  597.                    print "NEXT STAGE"  
  598.                else:  
  599.                    print answ_desc.NType  
  600.              
  601.        def other_req(self):  
  602.            self.conn.send( xxx().get_packet() )  
  603.            #dump_packet("syka.raw", xxx().get_packet())  
  604.            dump_packet("PDU_serv_tn2.raw", self.conn.recv(4096))  
  605.            self.conn.send( Client_MCS_Erect_Domain_Request_PDU() )  
  606.            self.conn.send( Client_MCS_Attach_User_Request_PDU() )  
  607.            confirm = self.conn.recv(4096)  
  608.            dump_packet("PDU_serv_erect.raw", confirm)  
  609.            initor = Server_MCS_Attach_User_Confirm_PDU(confirm)  
  610.            self.conn.send( Client_Join_Request_PDU_for_Channel(1007, initor) )  
  611.            dump_packet("PDU_serv_-1007.raw", self.conn.recv(4096))  
  612.            self.conn.send( Client_Join_Request_PDU_for_Channel(1003, initor) )  
  613.            dump_packet("PDU_serv_-1003.raw", self.conn.recv(4096))  
  614.            self.conn.send( Client_Join_Request_PDU_for_Channel(1004, initor) )  
  615.            dump_packet("PDU_serv_-1004.raw", self.conn.recv(4096))  
  616.            self.conn.send( Client_Join_Request_PDU_for_Channel(1005, initor) )  
  617.            dump_packet("PDU_serv_-1005.raw", self.conn.recv(4096))  
  618.            self.conn.send( Client_Join_Request_PDU_for_Channel(1006, initor) )  
  619.            dump_packet("PDU_serv_-1006.raw", self.conn.recv(4096))  
  620.              
  621.        def __del__(self):  
  622.            self.conn.close()  
  623.        
  624.     def automatiks(login, passw, domain = None):  
  625.        client = RDP_CLIENT()  
  626.        client.connect("192.168.0.2")  
  627.        client.PDU_conn_req()  
  628.        client.other_req()  
  629.        print client.auth_probe(login, passw, domain)  
  630.        
  631.     automatiks(u"Админ", u"Пар0ль")
RAW Paste Data