InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Пароли пользователей в Netscape Communicator


(c) Elli0t


В данной статье рассматриваются алгоритмы шифрования/дешифрования паролей для почтового сервера (pop3) в весьма популярном браузере Netscape Communicator.

Как уже было отмечено, существует возможность получения настроек пользователя через браузер. Среди них и пароль пользователя для почтового сервера. Эти настройки хранятся в файлах *.js (в WinXX - prefs.js, liprefs.js, а в Linux - preferences.js). Кроме того, в Windows-версии настройки пользователя также хранятся в реестре:

[HKEY_CURRENT_USER\Software\Netscape\Netscape Navigator\biff\users\<юзер>\servers\<сервер>]
"password"="зашифрованный_пароль1"

В файлах настроек *.js пароль лежит в таком виде:

user_pref("mail.pop_password","зашифрованный_пароль2");

Алгоритмы шифрования в первом и втором случае (в реестре и в файле) слегка отличаются.
Для реестра этот алгоритм можно изобразить, например, так:

1) pass --> XOR(key) --> Base64_encode --> ROT13 --> Reverse --> encrypted_pass

или так:

encrypted_pass = Reverse(ROT13(Base64_encode(XOR(pass,key))));

Для второго случая этот алгоритм значительно проще:

2) pass --> XOR(key) --> Base64_encode --> encrypted_pass

или

encrypted_pass = Base64_encode(XOR(pass,key)), где

XOR - последовательный xor по ключу key;
ROT13 - кодирование на основании циклического сдвига латинского алфавита на 13 символов;
Reverse - реверсирование строки;
Base64_encode - кодирование MIME (см. RFC2045).
Что касается ключа, по которому XOR-ится пароль, он фиксирован и представляет собой такую последовательность байт (в 16-ричной системе счисления):

56, C9, EF, 4A, 9B, BE, 5A, 42, ...

На самом деле это только первые 8 байт ключа, продолжение его можно легко найти, имея зашифрованный пароль длиной более 8 символов. Правда, такие пароли встречаются довольно редко.

Для дешифрования используются те же алгоритмы, что и для шифрования, в обратном порядке, за исключением Base64_encode, вместо которого используется алгоритм декодирования Base64:

1) pass = Reverse(ROT13(Base64_decode(XOR(encrypted_pass,key))));

2) pass = Base64_decode(XOR(encrypted_pass,key));

Ниже приводится текст программы на C, позволяющая расшифровать пароль в обоих случаях (из реестра и из файлов настроек).

/*
 * Netscape Communicator vX.X Password Cracker
 * (c) 2000 Elli0t <elli0t@i.am>
 * Decrypts passwords from registry or file prefs.js
 *
 * For non-commercial use only.
 */

#include <stdio.h>
#include <stdlib.h>

char    p[12], dp[9],
        key[] = { 0x56, 0xc9, 0xef, 0x4a, 0x9b, 0xbe, 0x5a, 0x42 };

char *
rot13 (char *str)
{
    int   i;
    char  c, s;
    for(i=0;i<strlen(str);i++)
    {
        c=str[i];
        if (c>='a' && c<='z') s='a';
        else if (c>='A' && c<='Z') s='A';
        else s=0;
        if(s>0) c=(c-s+13)%26;
        str[i]=c+s;
    }
    return str;
}

char *
strrev(char *ptr)
{
    int        i,l;
    char    t;
    l = strlen(ptr)-1;
    for(i=0;i<=l>>1;i++)
    {
        t = ptr[i];
        ptr[i] = ptr[l-i];
        ptr[l-i] = t;
    }
    return ptr;
}

int
cvt_ascii( unsigned char a )
{
   if      ( (a >= 'A') && (a <= 'Z') ) return (int)(a - 'A');
   else if ( (a >= 'a') && (a <= 'z') )
        return 26 + (int)(a - 'a');
   else if ( (a >= '0') && (a <= '9' ) )
        return 52 + (int)(a - '0');
   else if ( a == '+' ) return 62;
   else if ( a == '/' ) return 63;
   else if ( a == '=' ) return -2;
   else                 return -1;
}

int
base64_decode (char *buf, char *dest)
{
   int i, sh=0, ds=0, offs=0;
   unsigned char bv;
   unsigned long ac=0, vl;

   for (i = 0; (buf[i] != '\n') && (buf[i] != '\0') && (ds >= 0); i++ )
   {
      if (((buf[i] >= 'A') && (buf[i] <= 'Z') ) ||
          ((buf[i] >= 'a') && (buf[i] <= 'z') ) ||
          ((buf[i] >= '0') && (buf[i] <= '9') ) ||
           (buf[i] == '+') ||
           (buf[i] == '/') || 
           (buf[i] == '=') )
         ds = 1;
      else
         ds = -2;
   }
   if ( ds <= 0 )  ds = 0;
   for (i = 0; (buf[i] != '\n') && (buf[i] != '\0'); i++)
   {
      vl = cvt_ascii( buf[i] );
      if ( vl < 64 ) {
         ac <<= 6;
         sh += 6;
         ac |= vl;
         if ( sh >= 8 ) {
            sh -= 8;
            vl = ac >> sh;
            bv = (unsigned char)vl & 0xFFl;
            *(dest+offs) = bv;
            offs++;
         }
      }
      else break;
   }
   return offs;
}

void main()
{
    int     i, cn;
    printf("Netscape Communicator Password Cracker (c) Elli0t\n");
    printf("Encrypted password: ");
    scanf("%12s", p);
    if(*p=='=')
        rot13(strrev(p));
    cn = base64_decode(p, dp);
    for(i=0;i<cn;i++)
        dp[i] ^= key[i%8];
    printf("Password: '%s'\n", dp);
}

Все вышеизложенное проверялось на версиях 4.5 и 4.08, но должно работать и на других версиях.
Все замечания и предложения направляйте сюда.


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua