AS3 का उपयोग करके RDP में प्रवेश करने की कोशिश कर रहा है


147

मैं AS3 (वायु) का उपयोग करके RDP में प्रवेश करने की कोशिश कर रहा हूं। वास्तविक प्रक्रिया को समझने के लिए संसाधनों की कमी को देखते हुए मैं ठीक कर रहा हूं।

मैंने प्रारंभिक भेजने वाले उपयोगकर्ता नाम को पा लिया है, सर्वर से प्रतिक्रिया प्राप्त की है, और मैं अब प्रारंभिक अनुरोध कनेक्शन पर हूं।

मैं अपना सारा डेटा भेज रहा हूं और ट्रैफिक सूंघते समय, मैं देखता हूं कि नेटमोन सही तरीके से पहचान रहा है कि मैं किस तरह का पैकेट भेज रहा हूं (t125)। मुझे RDP द्वारा डिस्कनेक्ट नहीं किया जा रहा है और वे एक ackपैकेट भेजते हैं - लेकिन मुझे वह प्रतिक्रिया नहीं मिलती है जिसकी मुझे उम्मीद है।

मेरे साथ क्रॉस रेफ़रिंग की गई है connectoid, जो एक ओपन सोर्स आरडीपी क्लाइंट है। कनेक्शन कोड में, मैं फंस गया हूं जहां वे छोटे और बड़े-एंडियन पूर्णांक का मिश्रण लिखते हैं।

जब मैं वहां के सीमित उदाहरणों को देखता हूं (जैसे पैकेट डंप), तो मैं देखता हूं कि इस प्रक्रिया के लिए कनेक्शन की लंबाई 412 है, लेकिन मेरी bytearray470 की तरह अधिक है।

मैंने उन connectoidतरीकों को परिवर्तित किया है जो मुझे विश्वास है कि सही है, लेकिन एंडियन प्रकार के मिश्रण के साथ, मैं अभी भी अनिश्चित हूं।

मुझे खेद है कि अगर यह गड़बड़ है, लेकिन मैं आपकी मदद करने की पूरी कोशिश कर रहा हूं। मैं कुछ कोड दिखाऊंगा जो मैंने रूपांतरण में करने की कोशिश की है।

public function sendMcsData(): void {
    trace("Secure.sendMcsData");
    var num_channels: int = 2;
    //RdpPacket_Localised dataBuffer = new RdpPacket_Localised(512);
    var hostlen: int = 2 * "myhostaddress.ath.cx".length;
    if (hostlen > 30) {
        hostlen = 30;
    }
    var length: int = 158;
    length += 76 + 12 + 4;
    length += num_channels * 12 + 8;
    dataBuffer.writeShort(5); /* unknown */
    dataBuffer.writeShort(0x14);
    dataBuffer.writeByte(0x7c); //set 8 is write byte //write short is setbigendian 16 //
    dataBuffer.writeShort(1);
    dataBuffer.writeShort(length | 0x8000); // remaining length
    dataBuffer.writeShort(8); // length?
    dataBuffer.writeShort(16);
    dataBuffer.writeByte(0);
    var b1: ByteArray = new ByteArray();
    b1.endian = Endian.LITTLE_ENDIAN;
    b1.writeShort(0xc001);
    dataBuffer.writeBytes(b1);
    dataBuffer.writeByte(0);
    var b2: ByteArray = new ByteArray();
    b2.endian = Endian.LITTLE_ENDIAN;
    b2.writeInt(0x61637544);
    dataBuffer.writeBytes(b2);
    //dataBuffer.setLittleEndian32(0x61637544); // "Duca" ?!
    dataBuffer.writeShort(length - 14 | 0x8000); // remaining length
    var b3: ByteArray = new ByteArray();
    b3.endian = Endian.LITTLE_ENDIAN;
    // Client information
    b3.writeShort(SEC_TAG_CLI_INFO);
    b3.writeShort(true ? 212 : 136); // length
    b3.writeShort(true ? 4 : 1);
    b3.writeShort(8);
    b3.writeShort(600);
    b3.writeShort(1024);
    b3.writeShort(0xca01);
    b3.writeShort(0xaa03);
    b3.writeInt(0x809); //should be option.keybaortd layout just guessed 1
    b3.writeInt(true ? 2600 : 419); // or 0ece
    dataBuffer.writeBytes(b3);
    // // client
    // build? we
    // are 2600
    // compatible
    // :-)
    /* Unicode name of client, padded to 32 bytes */
    dataBuffer.writeMultiByte("myhost.ath.cx".toLocaleUpperCase(), "ISO");
    dataBuffer.position = dataBuffer.position + (30 - "myhost.ath.cx".toLocaleUpperCase()
        .length);
    var b4: ByteArray = new ByteArray();
    b4.endian = Endian.LITTLE_ENDIAN;
    b4.writeInt(4);
    b4.writeInt(0);
    b4.writeInt(12);
    dataBuffer.writeBytes(b4);
    dataBuffer.position = dataBuffer.position + 64; /* reserved? 4 + 12 doublewords */
    var b5: ByteArray = new ByteArray();
    b5.endian = Endian.LITTLE_ENDIAN;
    b5.writeShort(0xca01); // out_uint16_le(s, 0xca01);
    b5.writeShort(true ? 1 : 0);
    if (true) //Options.use_rdp5)
    {
        b5.writeInt(0); // out_uint32(s, 0);
        b5.writeByte(24); // out_uint8(s, g_server_bpp);
        b5.writeShort(0x0700); // out_uint16_le(s, 0x0700);
        b5.writeByte(0); // out_uint8(s, 0);
        b5.writeInt(1); // out_uint32_le(s, 1);
        b5.position = b5.position + 64;
        b5.writeShort(SEC_TAG_CLI_4); // out_uint16_le(s,
        // SEC_TAG_CLI_4);
        b5.writeShort(12); // out_uint16_le(s, 12);
        b5.writeInt(false ? 0xb : 0xd); // out_uint32_le(s,
        // g_console_session
        // ?
        // 0xb
        // :
        // 9);
        b5.writeInt(0); // out_uint32(s, 0);
    }
    // Client encryption settings //
    b5.writeShort(SEC_TAG_CLI_CRYPT);
    b5.writeShort(true ? 12 : 8); // length
    // if(Options.use_rdp5) dataBuffer.setLittleEndian32(Options.encryption ?
    // 0x1b : 0); // 128-bit encryption supported
    // else
    b5.writeInt(true ? (false ? 0xb : 0x3) : 0);
    if (true) b5.writeInt(0); // unknown
    if (true && (num_channels > 0)) {
        trace(("num_channels is " + num_channels));
        b5.writeShort(SEC_TAG_CLI_CHANNELS); // out_uint16_le(s,
        // SEC_TAG_CLI_CHANNELS);
        b5.writeShort(num_channels * 12 + 8); // out_uint16_le(s,
        // g_num_channels
        // * 12
        // + 8);
        // //
        // length
        b5.writeInt(num_channels); // out_uint32_le(s,
        // g_num_channels);
        // // number of
        // virtual
        // channels
        dataBuffer.writeBytes(b5);
        trace("b5 is bigendin" + (b5.endian == Endian.BIG_ENDIAN));
        for (var i: int = 0; i < num_channels; i++) {
            dataBuffer.writeMultiByte("testtes" + i, "ascii"); //, 8); // out_uint8a(s,
            // g_channels[i].name,
            // 8);
            dataBuffer.writeInt(0x40000000); // out_uint32_be(s,
            // g_channels[i].flags);
        }
    }
    //socket.
    //buffer.markEnd();
    //return buffer;
}

3
क्या आप एक ज्ञात अच्छे आरडीपी ग्राहक से आपत्तिजनक पैकेट पर कब्जा कर सकते हैं और उन पैकेटों की तुलना कर सकते हैं जिनके बारे में आप उत्सुक हैं? यह एक बग हो सकता है कि आप अपने बाइट सरणी के एक सेगमेंट को कैसे एन्कोडिंग कर सकते हैं।
बेन

क्या आप इस बात पर विस्तार से बता सकते हैं कि आपके द्वारा "प्रारंभिक अनुरोध कनेक्शन" पर क्या मतलब है? प्रारंभिक अनुरोध आपको लॉगिन करने के लिए पहले ही पारित कर दिया जाना चाहिए था, इसलिए यह स्पष्ट नहीं है कि आप किस स्थिति में फंस गए हैं। आपने अपना कनेक्शन अनुरोध (0xe0) भेजा है और अपना पुष्टिकरण (0xd0) प्राप्त किया है और अब आप "कनेक्ट-प्रारंभिक" चरण में हैं? या कहीं और घटनाओं की रेखा से नीचे? क्या वह पैकेट जो आप उपरोक्त कोड "MCS: कनेक्ट-प्रारंभिक" पैकेट में उत्पन्न कर रहे हैं?
मैक्स वर्ग

2
मूर्खतापूर्ण सवाल लेकिन क्या आपने उस बॉक्स में RDP को मैन्युअल रूप से देखने की कोशिश की है कि यह काम करता है? एक बैनर की तरह लॉगिन को रोकने के लिए कुछ हो सकता है "यह मशीन केवल ब्ला ब्ला के अधिकृत उपयोग के लिए है"
क्रिप्टोग्राफ़िक_एससी

पता नहीं अगर तुम यह पहले से ही किया है, लेकिन आप KRDC (के लिए स्रोत कोड पर एक नज़र रखना चाहिए लिंक ) या freerdp ( लिंक )। वे आपकी समस्या को बहुत जानकारी दे सकते हैं।
नदीम दुबा

जैसा कि कनेक्टॉयड स्रोत कोड से लगता है, इन पैकेटों में डेटा बीईआर एनकोडेड है; आपको पैकेट डेटा को मैन्युअल रूप से तैयार करने और अपने (और हमारे) आपके कोड को डीबग करने में मदद करने के लिए कुछ फ़ंक्शन लिखने चाहिए।
एलेक्स माजारिओल

जवाबों:


4

जाहिर तौर पर बफर का अधिकांश हिस्सा थोड़ा सा एंडियन है, लेकिन इसकी शुरुआत में कई बाइट्स 16 बिट (शॉर्ट) के बड़े एंडियन नंबर होने की उम्मीद है। इसका मतलब है, आपको थोड़ा एंडियन में डेटा लिखना होगा जैसे कि इसे बड़े एंडियन के रूप में व्याख्या किया जाएगा। बड़े एंडियन से डेटा को छोटे एंडियन में बदलने के लिए, आप एक अस्थायी का उपयोग कर सकते हैं, ByteArrayजिसके एंडियन को बड़े पर सेट किया गया है, इसमें डेटा लिखें, फिर writeBytes()अपने मुख्य बफर सरणी पर कॉल करें , फिर अस्थायी बड़े एंडियन सरणी को साफ़ करें। लेखन स्थिरांक को मैन्युअल रूप से किया जा सकता है, चूंकि आप बाइट ऑर्डर को स्वयं स्थानांतरित कर सकते हैं, कह सकते हैं कि जब आप 0x0005बड़े एंडियन में लिख रहे हैं , तो आप केवल 0x0500छोटे एंडियन के रूप में लिखते हैं । आपने प्रतीत होता है कि विलुप्त होने के साथ कोड लिखा थाdataBufferएंडियन बड़ा होने के साथ, इसलिए आप इस तकनीक को जानते हैं। फिर भी, यह बेहतर है कि आप dataBufferफ़ंक्शन में उचित उत्पादन करेंगे । मैं आपके connectoidद्वारा डाउनलोड किए गए कोड के आधार पर आपके कोड को ठीक करने का प्रयास कर रहा हूं , ताकि यह ByteArrayएंडियन के ठीक से बने होने के साथ ठीक से वापस आ जाए - यह केवल तभी मायने रखता है जब आप इससे डेटा ऑर्डर करेंगे, जब आप बाइट्स नहीं पढ़ते हैं।

public function sendMcsData(): ByteArray {
    trace("Secure.sendMcsData");
    var num_channels: int = 2;
    var dataBuffer:ByteArray=new ByteArray(); //RdpPacket_Localised dataBuffer = new RdpPacket_Localised(512);
    // it's better to build the data buffer in the function, as in java, otherwise you can receive interference
    dataBuffer.endian=Endian.LITTLE_ENDIAN; // for clarity
    var hostlen: int = 2 * "myhost.ath.cx".length; // hardcoded? TODO FIX
    if (hostlen > 30) {
        hostlen = 30;
    }
    var length: int = 158;
    length += 76 + 12 + 4; // Options.use_rdp5 is true, apparently
    length += num_channels * 12 + 8;
    dataBuffer.writeShort(0x0500); // writing big-endian 0x5 *unknown*
    dataBuffer.writeShort(0x1400); // writing big-endian 0x14
    dataBuffer.writeByte(0x7c); //set 8 is write byte 
    //write short is setbigendian 16 //
    dataBuffer.writeShort(0x0100); // writing big-endian 0x01
    var be:ByteArray=new ByteArray();
    be.endian=Endian.BIG_ENDIAN; // create big-endian array for the data that's not static
    be.writeShort(length | 0x8000); // remaining length
    dataBuffer.writeBytes(be);
    be.clear(); // so that extra writing will not spoil the array
    dataBuffer.writeShort(0x0800); // writing big-endian 0x08 (length?)
    dataBuffer.writeShort(0x1000); // writing big-endian 16 (0x10)
    dataBuffer.writeByte(0);
    dataBuffer.writeShort(0xc001); // this one is little endian by default
    dataBuffer.writeByte(0);
    dataBuffer.writeUnsignedInt(0x61637544);
    //dataBuffer.setLittleEndian32(0x61637544); // "Duca" ?!
    be.writeShort((length - 14) | 0x8000); // remaining length
    dataBuffer.writeBytes(be);
    be.clear();
    dataBuffer.writeShort(SEC_TAG_CLI_INFO);
    dataBuffer.writeShort(212); // length
    dataBuffer.writeShort(4);
    dataBuffer.writeShort(8);
    dataBuffer.writeShort(600); // Options.width
    dataBuffer.writeShort(1024); // Options.height
    dataBuffer.writeShort(0xca01);
    dataBuffer.writeShort(0xaa03);
    dataBuffer.writeInt(0x0409); //Options.keylayout, default English/US - fixed
    dataBuffer.writeInt(2600); // or 0ece
    dataBuffer.writeBytes(b3);
    // // client
    // build? we
    // are 2600
    // compatible
    // :-)
    /* Unicode name of client, padded to 32 bytes */
    var targetPos:int=dataBuffer.position+32; // to account for padding
    dataBuffer.writeMultiByte("myhost.ath.cx".toLocaleUpperCase(), "UTF-16"); 
    // buffer.outUnicodeString(Options.hostname.toUpperCase(), hostlen);
    // apparently encoding is used "Unicode" that is UTF-16. If that will not work, set UTF-8 here
    // and by all means check what is on the wire when you connect via conventional RDP

    dataBuffer.position = targetPos;
    // this seems to be your mistake in converting position truncate, 
    // as position after writing already accounts for the writing been processed.
    // This line alone can be the source of size discrepancy you observe.
    dataBuffer.writeInt(4);
    dataBuffer.writeInt(0);
    dataBuffer.writeInt(12);
    dataBuffer.position = dataBuffer.position + 64; // /* reserved? 4 + 12 doublewords */
    // note, if the position wouldn't shift forward, write zeroes manually
    dataBuffer.writeShort(0xca01); // out_uint16_le(s, 0xca01);
    dataBuffer.writeShort(1);
    if (true) //Options.use_rdp5)
    {
        dataBuffer.writeInt(0); // out_uint32(s, 0);
        dataBuffer.writeByte(24); // out_uint8(s, g_server_bpp);
        dataBuffer.writeShort(0x0700); // out_uint16_le(s, 0x0700);
        dataBuffer.writeByte(0); // out_uint8(s, 0);
        dataBuffer.writeInt(1); // out_uint32_le(s, 1);
        dataBuffer.position = dataBuffer.position + 64;
        dataBuffer.writeShort(SEC_TAG_CLI_4); // out_uint16_le(s,
        // SEC_TAG_CLI_4);
        dataBuffer.writeShort(12); // out_uint16_le(s, 12);
        dataBuffer.writeInt(0xd); // out_uint32_le(s,
        // g_console_session
        // ?
        // 0xb
        // :
        // 9);
        // the comments say 9, but the code says 0xd - leaving 0xd in place
        // Options.console_session is hardcoded false
        dataBuffer.writeInt(0); // out_uint32(s, 0);
    }
    // Client encryption settings //
    dataBuffer.writeShort(SEC_TAG_CLI_CRYPT);
    dataBuffer.writeShort(12); // length
    // if(Options.use_rdp5) dataBuffer.setLittleEndian32(Options.encryption ?
    // 0x1b : 0); // 128-bit encryption supported
    // else
    dataBuffer.writeInt(true ? (false ? 0xb : 0x3) : 0);
    dataBuffer.writeInt(0); // unknown
    if (true && (num_channels > 0)) {
        trace(("num_channels is", num_channels));
        dataBuffer.writeShort(SEC_TAG_CLI_CHANNELS); // out_uint16_le(s,
        // SEC_TAG_CLI_CHANNELS);
        dataBuffer.writeShort(num_channels * 12 + 8); // out_uint16_le(s,
        // g_num_channels
        // * 12
        // + 8);
        // //
        // length
        dataBuffer.writeInt(num_channels); // out_uint32_le(s,
        // g_num_channels);
        // // number of
        // virtual
        // channels
        for (var i: int = 0; i < num_channels; i++) {
            targetPos=dataBuffer.position+8; // account for padding/truncation
            dataBuffer.writeMultiByte("testtes" + i, "ascii"); //, 8); // out_uint8a(s,
            // g_channels[i].name,
            // 8);
            dataBuffer.position=targetPos;
            dataBuffer.writeInt(0x00000040); // out_uint32_be(s,
            // g_channels[i].flags);
            // writing big-endian 0x40000000
        }
    }
    trace("sendMCSData: Data buffer length is",dataBuffer.length); // debug
    return dataBuffer;
}

उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.