Toon posts:

C# vnc wachtwoord verranderen

Pagina: 1
Acties:
  • 518 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Voor school moet ik een project maken waarbij ik elke keer dat een gebruiker inlogd het vnc wachtwoord moet verranderen.

Dit is is wel gelukt door het volgende programma te gebruiken :
http://www.sysworksoft.net/products/vncpwd.html

Alleen dit is geen mooie manier omdat er dan een appart exe bestand in de map staat. Liever heb ik de code gewoon bij mijn project in.

In de source code van VncSharp( een .NET vnc client ) heb ik gevonden dat vnc een DES encryptie gebruikt.( niet 3DES ) zoals op veel sites staat. Ik heb vanalles geprobeerd om een string te encrypten met de DES encrypty maar het is me niet gelukt om een geldig ge-encrypt vnc wachtwoord te krijgen.
De ge-encrypte strings die ik kreeg waren niet in HEX formaat zoals het vnc wachtwoord.

Op de volgende site staat welke key vnc gebruikt om het wachtwoord te encrypten.
KEY : (23 82 107 6 35 78 88 7)
http://studentorganizatio.../Security/VNCSecurity.htm

Weet iemand misschien hoe je een string met c# kan encrypten die gebruikt kan worden als een geldig vnc wachtwoord ? Ik gebruik C# .net 2

Hier nog een link met een aantal voorbeelden.
http://www.w00w00.org/advisories/vnc.html

Alvast bedankt

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:21
Hoe encrypt je nu ?
Zonder relevante code kunnen we je niet helpen.

https://fgheysels.github.io/


Verwijderd

Ik heb op goolge gezocht en allerlei libraries geprobeerd. Maar ik heb geen string naar een geldig vnc wachtwoord kunnen encrypten.
Hier is een stuk code uit vncsharp. Misschien dat iemand deze code aan kan passen om een string te encrypten.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <summary>
        /// Encrypts a challenge using the specified password. See RFB Protocol Document v. 3.8 section 6.2.2.
        /// </summary>
        /// <param name="password">The user's password.</param>
        /// <param name="challenge">The challenge sent by the server.</param>
        /// <returns>Returns the encrypted challenge.</returns>
        protected byte[] EncryptChallenge(string password, byte[] challenge)
        {
            byte[] key = new byte[8];

            // Key limited to 8 bytes max.
            if (password.Length >= 8) {
                System.Text.Encoding.ASCII.GetBytes(password, 0, 8, key, 0);
            } else {
                System.Text.Encoding.ASCII.GetBytes(password, 0, password.Length, key, 0);
            }           

            // HACK: VNC reverses key order!?
            key = FixBug(key); 

            // VNC uses DES, not 3DES as written in some documentation
            DES des = new DESCryptoServiceProvider();
            des.Padding = PaddingMode.None;
            des.Mode = CipherMode.ECB;

            ICryptoTransform enc = des.CreateEncryptor(key, null); 

            byte[] response = new byte[16];
            enc.TransformBlock(challenge, 0, challenge.Length, response, 0);
            
            return response;
        }

[ Voor 5% gewijzigd door Verwijderd op 22-05-2006 17:13 ]


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
Die code aanpassen is redelijk rechttoe-rechtaan, wat lukt er niet aan? In principe hoef je alleen maar wat variabelen om te wisselen: de key weet je al, en ipv de challenge encrypt je het cleartext password.

Verwijderd

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        using System.Security.Cryptography; 

        public static string EncryptChallenge(string password)
        {
            byte[] key = {23, 82, 107, 6, 35, 78, 88, 7};
            byte[] passArr = new ASCIIEncoding().GetBytes(password);
            byte[] response = new byte[passArr.Length];
            key = FixBug(key);
            DES des = new DESCryptoServiceProvider();
            des.Padding = PaddingMode.None;
            des.Mode = CipherMode.ECB;
            ICryptoTransform enc = des.CreateEncryptor(key, null);
            enc.TransformBlock(passArr, 0, passArr.Length, response, 0);
            return new ASCIIEncoding().GetString(response);
        }
     /// <summary>VNC DES authentication has a bug, such that keys are reversed.  This code 
     /// <param name="desKey">The key to be altered.</param>
     /// <returns>Returns the fixed key as an array of bytes.</returns>
        private static byte[] FixBug(byte[] desKey)
        {
            byte[] newkey = new byte[8];

            for (int i = 0; i < 8; i++)
            {
                // revert desKey[i]:
                newkey[i] = (byte)(
                    ((desKey[i] & 0x01) << 7) |
                    ((desKey[i] & 0x02) << 5) |
                    ((desKey[i] & 0x04) << 3) |
                    ((desKey[i] & 0x08) << 1) |
                    ((desKey[i] & 0x10) >> 1) |
                    ((desKey[i] & 0x20) >> 3) |
                    ((desKey[i] & 0x40) >> 5) |
                    ((desKey[i] & 0x80) >> 7)
                    );
            }
            return newkey;
        }

Moet deze output naar hex omgezet worden ?

[ Voor 44% gewijzigd door Verwijderd op 22-05-2006 23:25 ]


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
Verwijderd schreef op maandag 22 mei 2006 @ 23:11:
Moet deze output naar hex omgezet worden ?
Dat hangt er vanaf hoe de waarde in de registry moet worden opgeslagen. Indien het als REG_BINARY is opgeslagen niet.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
Verwijderd schreef op maandag 22 mei 2006 @ 23:11:
C#:
1
2
3
4
5
6
7
8
        using System.Security.Cryptography; 

        public static string EncryptChallenge(string password)
        {
            byte[] key = {23, 82, 107, 6, 35, 78, 88, 7};
            byte[] passArr = new ASCIIEncoding().GetBytes(password);
            byte[] response = new byte[passArr.Length];
...
Let trouwens wel op dat je een password langer dan 8 tekens afkapt op 8 tekens, zoals in de link in je post staat: http://www.w00w00.org/advisories/vnc.html

Verwijderd

De vnc wachtwoorden in het register zijn hex waarden en de waarden die uit deze methode komen zijn niet goed.Probeer maar eens een van de wachtwoorden te encrypten die ook op
http://www.w00w00.org/advisories/vnc.html staan.

Totaal ander resultaat.

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 23:18

pistole

Frutter

Ik ben er laatst (min of meer toevallig) achter gekomen dat Microsoft's encryptie provider de HEX respresentatie van een hash "verkeerd om" representeerd. Wellicht dat je de hexadecimale representatie eens byte-gewijs kan omkeren?

Ik frut, dus ik epibreer


Verwijderd

Hoe laat je de uitkomst op een goede manier in hexadecimale waarde zien ? Heb je misschien een voorbeeld code ?

pistole en matthijs alvast bedankt voor jullie snelle reacties.

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 23:18

pistole

Frutter

Verwijderd schreef op maandag 22 mei 2006 @ 23:49:
Hoe laat je de uitkomst op een goede manier in hexadecimale waarde zien ? Heb je misschien een voorbeeld code ?

pistole en matthijs alvast bedankt voor jullie snelle reacties.
Ik heb helaas geen (bruikbare) voorbeeldcode aangezien ik het AspEncrypt component van Peter Persits heb gebruikt (in ASP).

Overigens lees ik in de code van Clermond dat er al e.e.a. gereversed wordt...

Ik frut, dus ik epibreer


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-02 22:41
Verwijderd schreef op maandag 22 mei 2006 @ 23:49:
Hoe laat je de uitkomst op een goede manier in hexadecimale waarde zien ? Heb je misschien een voorbeeld code ?
Om een enkele byte weer te geven als hexadecimaal deel je deze op in twee nibbles van 4 bits. Deze 4 bits kunnen lopen van 0000 t/m 1111, oftewel 0 t/m F als hexadecimaal.

Het opdelen van een byte kan je doen met bitwise operators:

Hoogste nibble: b >> 4
Laagste nibble: b & 0xf

Je kan met de nibble dan bijvoorbeeld een hex character halen uit een array van 16 elementen van '0' t/m 'F'.

Verwijderd

Topicstarter
Kan iemand laten zien hoe dit in c# moet ?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ook in c# heb je gewoon bitwise operators

C#:
1
2
3
4
5
6
7
byte value = 120;

char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

string hexString = String.Empty;
hexString += chars[ value >> 4 ];
hexString += chars[ value & 0xf ];

[ Voor 48% gewijzigd door Woy op 23-05-2006 12:06 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Het werkt ! heel erg bedankt allemaal

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
        public static string EncryptChallenge(string password)
        {
            if(password.Length > 8)
            {
                password= password.Substring(0,8);
            }
            if (password.Length < 8)
            {
                password = password.PadRight(8, '\0'); 
            }

            byte[] key = {23, 82, 107, 6, 35, 78, 88, 7};
            byte[] passArr = new ASCIIEncoding().GetBytes(password);
            byte[] response = new byte[passArr.Length];
            char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

            // HACK: VNC reverses key order!?
            key = FixBug(key);

            // VNC uses DES, not 3DES as written in some documentation
            DES des = new DESCryptoServiceProvider();
            des.Padding = PaddingMode.None;
            des.Mode = CipherMode.ECB;

            ICryptoTransform enc = des.CreateEncryptor(key, null);
            enc.TransformBlock(passArr, 0, passArr.Length, response, 0);

            string hexString = String.Empty;
            for (int i = 0; i < response.Length; i++)
            {
                hexString += chars[response[i] >> 4];
                hexString += chars[response[i] & 0xf];
                hexString += " ";
            }
             return hexString.Trim();
        }

[ Voor 10% gewijzigd door Verwijderd op 23-05-2006 14:41 ]

Pagina: 1