Паролі користувачів в Netscape Communicator, Браузери та поштові програми, Security & Hack, статті

(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, але має працювати і на інших версіях.
Всі зауваження та пропозиції направляйте
сюди.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*