Here you go:
(01 March 1998)
Dear Fravia,
I've reached you 'javdevio.htm' page 3 days ago, and yesterday I finally
got a username/password to reach the protected part...
The method I used was :
1 - look at the JavaScript code, and modify it in order to localize the
usernames/passwords
I mean username/password is user 2, fred/fred user 1, Fravia/Fravia
user 3...
Doing this I realised that I have to find username/password for user
4 & 6.
Just a little observation lead me the conclusion that user 6 name is
"username" 'coz it's the same that user 2.
2 - write an utility to brute-force these unknown codes (user4,
password4, password6)
My first C program was performing about 20000 tries by second on my
Pentium 2 233Mhz.
I then computed how much time should be required with this approach,
assuming that the username/password to find has only characters (so
digits), the result was :
Phase 1 (password is 1 character long)............... 26 possibilities immediate result
Phase 2 (password is 2 character long).............. 676 possibilities immediate result
Phase 3 (password is 3 character long)........... 17.576 possibilities immediate result
Phase 4 (password is 4 character long).......... 456.976 possibilities 23 seconds
Phase 5 (password is 5 character long)....... 11.881.376 possibilities 10 minutes
Phase 6 (password is 4 character long)...... 308.915.776 possibilities 4 hours
Phase 7 (password is 4 character long).... 8.031.810.176 possibilities 4,5 days
Phase 8 (password is 8 character long)...208.827.064.576 possibilities 121 days
3 - considering the results above, I then decided to optimize my C code,
moving as much computation I could outside of the loops, storing results
in arrays... I also decided to change to order of characters to check,
from 'A', 'B'... 'Z' to the growing order of frequency of the characters
in a common language "ERISANTOULCPMDGFBVHZQXYJKW" (in french) my result
was something like the following code :
--------------------------------------------------------
//__________________________________________________________________________
// parse(c) <==> parse(uppercase(j[i]),36);
#define parse(c) ((c)-'A'+10)
//__________________________________________________________________________
char savefile[80],resultfile[80];
FILE *fcfg, *fsav;
char last_try[]="AAAA"; // starting values for a,b,c,d
char start_phase;
char a,b,c,d,e,f,g,h;
char CharacterSet[26]="ERISANTOULCPMDGFBVHZQXYJKW";
double
tpow1[10][26+'A'],tpow2[10][26+'A'],tpow3[10][26+'A'],tpow4[10][26+'A'];
int len;
void init_arrays(void)
{
char i,j;
for(i=0;i<10;i++)
for(j='A';j<='Z';j++) {
tpow1[i][j]=parse(j)*pow(base1,i);
tpow2[i][j]=parse(j)*pow(base2,i);
tpow3[i][j]=parse(j)*pow(base3,i);
tpow4[i][j]=parse(j)*pow(base4,i);
}
}
//__________________________________________________________________________
//
// Encryption functions F1 F2 ...
double F1(char j[])
{
char i;
double z=0;
// if (strlen(j)>10) j=j.substring(0,10);
for(i=0;i<len;i++){
z+=tpow1[i][j[i]];
}
return floor(5e14*sin(m11*sin(z*k11+fi11)*cos(z*k12+fi12)+fj11)*
sin(m12*sin(z*k13+fi13)*cos(z*k14+fi14)+fj12)*
sin(m13*sin(z*k15+fi15)*cos(z*k16+fi16)+fj13)*
sin(m14*sin(z*k17+fi17)*cos(z*k18+fi18)+fj14)+5e14);
}
double F2(char *j)
{
char i;
double z=0;
// if (strlen(j)>10) j=j.substring(0,10);
for(i=0;i<len;i++){
z+=tpow2[i][j[i]];
}
return floor(5e14*sin(m21*sin(z*k21+fi21)*cos(z*k22+fi22)+fj21)*
sin(m22*sin(z*k23+fi23)*cos(z*k24+fi24)+fj22)*
sin(m23*sin(z*k25+fi25)*cos(z*k26+fi26)+fj23)*
sin(m24*sin(z*k27+fi27)*cos(z*k28+fi28)+fj24)+5e14);
}
void write_result(char type, char u, char *s, double v)
{
if((fsav=f0/*n(resultfile,"at*/;)==NULL){
printf("ERROR: can't open result file\n"); exit(1);
}
fprintf(fsav,"\n%s %d : %s
[%15.0lf]\n",(!type)?"User":"Password",u,s,v);
fclose(fsav);
}
void test(char *s)
{
double z1,z2;
z1=F1(s);
z2=F2(s);
// if(USERS[0][0]==z1) printf("\nUser 1 : %s [%15.0lf]\n",s,z1);
// if(USERS[1][0]==z1) printf("\nUser 2 : %s [%15.0lf]\n",s,z1);
// if(USERS[2][0]==z1) printf("\nUser 3 : %s [%15.0lf]\n",s,z1);
if(USERS[3][0]==z1) write_result(0,4,s,z1);
// if(USERS[4][0]==z1) printf("\nUser 5 : %s [%15.0lf]\n",s,z1);
// if(USERS[5][0]==z1) printf("\nUser 6 : %s [%15.0lf]\n",s,z1);
// if(USERS[0][1]==z2) printf("\nPassword 1 : %s [%15.0lf]\n",s,z2);
// if(USERS[1][1]==z2) printf("\nPassword 2 : %s [%15.0lf]\n",s,z2);
// if(USERS[2][1]==z2) printf("\nPassword 3 : %s [%15.0lf]\n",s,z2);
if(USERS[3][1]==z2) write_result(1,4,s,z2);
// if(USERS[4][1]==z2) printf("\nPassword 5 : %s [%15.0lf]\n",s,z2);
if(USERS[5][1]==z2) write_result(1,6,s,z2);
}
void main(int argc, char **argv)
{
char tmp[]="AAAAAAAAAA"; // word to test against user/password
char current[]="AAAAAAAAAA"; // starting counters
clock_t clk;
double tim;
double speed=0.015; // tick / possibility
init_arrays();
sprintf(savefile,"%s.cfg",argv[0]);
sprintf(resultfile,"%s.out",argv[0]);
if((fcfg=fopen(savefile,"rb+"))==NULL){
start_phase='5';
a=b=c=d=0;
if((fcfg=fopen(savefile,"wb+"))==NULL){
printf("ERROR: can't creat save file\n"); exit(1);
}
save_last_try();
printf("Starting a new session at phase %c with word
%s\n",start_phase,last_try);
} else {
fread(&start_phase,sizeof(char),1,fcfg); // starting_phase
fread(&last_try,sizeof(char),4,fcfg); // last_try
printf("Continuing, phase %c - word %s\n",start_phase,last_try);
}
if((fsav=fopen(resultfile,"at+"))==NULL){
printf("ERROR: can't creat result file\n"); exit(1);
}
if(start_phase<'5') {
// 1 char, 26 possibilities
clk=clock();
printf("--- Phase 1\n");
len=1;
tmp[1]=0;
for(a=0;a<26;a++){ tmp[0]=CharacterSet[a];
test(tmp);
}
tim=clock()-clk;
printf("Phase 1 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/26);
// 2 chars, 676 possibilities
clk=clock();
printf("--- Phase 2 (will take %.3lf s)\n",speed*676/CLOCKS_PER_SEC);
len=2;
tmp[2]=0;
for(a=0;a<26;a++){ tmp[0]=CharacterSet[a];
for(b=0;b<26;b++){ tmp[1]=CharacterSet[b];
test(tmp);
}
}
tim=clock()-clk;
printf("Phase 2 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/676);
// 3 chars, 17.576 possibilities
clk=clock();
printf("--- Phase 3 (will take %.3lf s)\n",speed*17576/CLOCKS_PER_SEC);
len=3;
tmp[3]=0;
for(a=0;a<26;a++){ tmp[0]=CharacterSet[a];
for(b=0;b<26;b++){ tmp[1]=CharacterSet[b];
for(c=0;c<26;c++){ tmp[2]=CharacterSet[c];
test(tmp);
}
}
}
tim=clock()-clk;
printf("Phase 3 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/17576);
// 4 chars, 456.976 possibilities
clk=clock();
printf("--- Phase 4 (will take %.3lf s)\n",speed*456976/CLOCKS_PER_SEC);
len=4;
tmp[4]=0;
for(a=0;a<26;a++){ tmp[0]=CharacterSet[a];
for(b=0;b<26;b++){ tmp[1]=CharacterSet[b];
for(c=0;c<26;c++){ tmp[2]=CharacterSet[c];
for(d=0;d<26;d++){ tmp[3]=CharacterSet[d];
test(tmp);
}
}
}
}
tim=clock()-clk;
printf("Phase 4 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/456976);
}
if(start_phase<='5') {
current[0]=last_try[0];
current[1]=last_try[1];
current[2]=last_try[2];
current[3]=last_try[3];
// 5 chars, 11.881.376 possibilities
clk=clock();
printf("--- Phase 5 (will take %.3lf s)\n",speed*11881376/CLOCKS_PER_SEC);
len=5;
tmp[5]=0;
for(a=current[0]-'A';a<26;a++){ tmp[0]=CharacterSet[a];
for(b=current[1]-'A';b<26;b++){ tmp[1]=CharacterSet[b];
for(c=current[2]-'A';c<26;c++){ tmp[2]=CharacterSet[c];
for(d=current[3]-'A';d<26;d++){ tmp[3]=CharacterSet[d];
save_last_try();
for(e=0;e<26;e++){ tmp[4]=CharacterSet[e];
test(tmp);
}
}
current[3]='A';
}
current[2]='A';
}
current[1]='A';
}
start_phase++;
current[0]='A';
tim=clock()-clk;
printf("Phase 5 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/11881376);
}
if(start_phase=='6') {
current[0]=last_try[0];
current[1]=last_try[1];
current[2]=last_try[2];
current[3]=last_try[3];
// 6 chars, 308.915.776 possibilities
clk=clock();
printf("--- Phase 6 (will take %.3lf
s)\n",speed*308915776/CLOCKS_PER_SEC);
len=6;
tmp[6]=0;
for(a=current[0]-'A';a<26;a++){ tmp[0]=CharacterSet[a];
for(b=current[1]-'A';b<26;b++){ tmp[1]=CharacterSet[b];
for(c=current[2]-'A';c<26;c++){ tmp[2]=CharacterSet[c];
for(d=current[3]-'A';d<26;d++){ tmp[3]=CharacterSet[d];
save_last_try();
for(e=0;e<26;e++){ tmp[4]=CharacterSet[e];
for(f=0;f<26;f++){ tmp[5]=CharacterSet[f];
test(tmp);
}
}
}
current[3]='A';
}
current[2]='A';
}
current[1]='A';
}
start_phase++;
current[0]='A';
tim=clock()-clk;
printf("Phase 6 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/308915776);
}
if(start_phase=='7') {
current[0]=last_try[0];
current[1]=last_try[1];
current[2]=last_try[2];
current[3]=last_try[3];
// 7 chars, 8.031.810.176 possibilities
clk=clock();
printf("--- Phase 7 (will take %.3lf s)\n",speed*8031810176/CLOCKS_PER_SEC);
len=7;
tmp[7]=0;
for(a=current[0]-'A';a<26;a++){ tmp[0]=CharacterSet[a];
for(b=current[1]-'A';b<26;b++){ tmp[1]=CharacterSet[b];
for(c=current[2]-'A';c<26;c++){ tmp[2]=CharacterSet[c];
for(d=current[3]-'A';d<26;d++){ tmp[3]=CharacterSet[d];
save_last_try();
for(e=0;e<26;e++){ tmp[4]=CharacterSet[e];
for(f=0;f<26;f++){ tmp[5]=CharacterSet[f];
for(g=0;g<26;g++){ tmp[6]=CharacterSet[g];
test(tmp);
}
}
}
}
current[3]='A';
}
current[2]='A';
}
current[1]='A';
}
start_phase++;
current[0]='A';
tim=clock()-clk;
printf("Phase 7 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/8031810176);
}
if(start_phase=='8') {
current[0]=last_try[0];
current[1]=last_try[1];
current[2]=last_try[2];
current[3]=last_try[3];
// 8 chars, 208.827.064.576 possibilities
clk=clock();
printf("--- Phase 8 (will take %.3lf s)\n",speed*208827064576/CLOCKS_PER_SEC);
len=8;
tmp[8]=0;
for(a=current[0]-'A';a<26;a++){ tmp[0]=CharacterSet[a];
for(b=current[1]-'A';b<26;b++){ tmp[1]=CharacterSet[b];
for(c=current[2]-'A';c<26;c++){ tmp[2]=CharacterSet[c];
for(d=current[3]-'A';d<26;d++){ tmp[3]=CharacterSet[d];
save_last_try();
for(e=0;e<26;e++){ tmp[4]=CharacterSet[e];
for(f=0;f<26;f++){ tmp[5]=CharacterSet[f];
for(g=0;g<26;g++){ tmp[6]=CharacterSet[g];
for(h=0;h<26;h++){ tmp[7]=CharacterSet[h];
test(tmp);
}
}
}
}
}
current[3]='A';
}
current[2]='A';
}
current[1]='A';
}
start_phase++;
current[0]='A';
tim=clock()-clk;
printf("Phase 8 took %lf sec (%lf ticks by possibility)\n",(tim/CLOCKS_PER_SEC),tim/208827064576);
}
printf("All done... bye\n");
fclose(fcfg);
exit(0);
}
--------------------------------------------------------
With this code the performance was : about 666667 tries by second,
giving :
Phase 1 (password is 1 character long)............... 26 possibilities immediate result
Phase 2 (password is 2 character long).............. 676 possibilities immediate result
Phase 3 (password is 3 character long)........... 17.576 possibilities immediate result
Phase 4 (password is 4 character long).......... 456.976 possibilities 6 seconds
Phase 5 (password is 5 character long)....... 11.881.376 possibilities 3 minutes
Phase 6 (password is 4 character long)...... 308.915.776 possibilities 80 minutes
Phase 7 (password is 4 character long).... 8.031.810.176 possibilities 35 hours
Phase 8 (password is 8 character long)...208.827.064.576 possibilities 37 days
This was much better, but not enough for me...
4 - Considering that when you want to use brute force, you have to be
very strong, powerful, etc...
I choosed to reduce the waiting time using the computing power of
the network of my company...
This required a little more coding but the result is here : only
using the network after working hours (in order to not disturb the
employees), the more the network uses computer, the less it takes to
find a solution.
That's all, the result is here.
Comments can be send at :
Azazel_Corp(at)hotmail(point)com