Cooler_

PathWalk

Jun 6th, 2012
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.29 KB | None | 0 0
  1. /*
  2.  
  3. Code simples para listar paths
  4. para serem abertos com Curl
  5.  
  6. para testes de Full Path Disclosure
  7.  
  8. para testar contra erros para ajudar em codereview
  9. mostre local do arquivo do apache
  10.  
  11. exemplo ./code pasta_site localhost/pasta/ log.txt
  12. entao ele ira usar o curl em cada
  13. url relacionada a
  14. http://localhost/site/pasta_site/View...
  15. http://localhost/site/pasta_site/Controller...
  16.  
  17. ira salvar em file de log
  18.  
  19.  
  20. gcc -o code code.c
  21.  
  22. $ ./code pasta url log.txt
  23. $ cat logWalk.txt
  24.  
  25. contact: c00f3r[at]gmail[dot]com
  26. by Cooler_
  27. code test
  28.  
  29. depois add api do curl faco algo decente
  30. */
  31. #include <stdlib.h>
  32. #include <stdio.h>
  33. #include <sys/types.h>
  34. #include <string.h>
  35. #include <errno.h>
  36. #include <dirent.h>
  37. #include <limits.h>
  38. #include <unistd.h>
  39. #include <alloca.h>
  40.  
  41. #define LOG "logWalk.txt"
  42.  
  43. void *xmalloc(unsigned int len);
  44. char *StrRep(char *st, char *orig, char *repl,int mim);
  45. char **split(char *src, const char *token, int *total);
  46. char *StrChunk(char *src, const int start, const int count);
  47. int PathWalk(char * dir2find,char *buffer);
  48. void writefile(char *filename,char *msg,int msglen);
  49.  
  50. int main(int argc, char ** argv)
  51. {
  52.  char *buffer=(char *)xmalloc(PATH_MAX*sizeof(char));
  53.  char *LocalPath=(char *)xmalloc(512*sizeof(char));
  54.  char *CMD=(char *)xmalloc(1024*sizeof(char));
  55.  char **URL;
  56.  int total=128,NumFiles=0,x=0;
  57.  
  58.  if(strlen(argv[1])>128)
  59.  {
  60.   puts("PATH muito grande");
  61.   return 0;
  62.  }
  63.  
  64.  if(strlen(argv[2])>256)
  65.  {
  66.   puts("URL muito grande");
  67.   return 0;
  68.  }
  69.  
  70.  if(strlen(argv[3])>32)
  71.  {
  72.   puts("file de LOG muito grande");
  73.   return 0;
  74.  }
  75.  
  76.   getcwd(LocalPath, 256);
  77.   NumFiles=PathWalk(argv[1],buffer);
  78.  
  79.   puts("Listando files");
  80.   puts(buffer);
  81.  
  82.   puts("Listando array de strings");
  83.   URL=split(buffer,"\n",&NumFiles);
  84.   fprintf(stdout,"Files: %d \n",NumFiles);
  85.  
  86.  puts("PATHs para evidencia");
  87.  
  88.   while(x<(NumFiles-1))
  89.   {
  90. // apagando o path inicial "/home/local/app/dir" para "/app/dir"
  91.    URL[x]=StrRep(URL[x],LocalPath,"", 512 );
  92.    URL[x]=StrRep(URL[x],"\n","", 512 );
  93.    puts("---");
  94.    puts(URL[x]);
  95.    puts("---");
  96.  
  97.    sprintf(CMD,"curl %s%s >> %s",argv[2],URL[x],argv[3]);
  98.    system(CMD);
  99.    sprintf(CMD,"\nPATH: %s\n---\nCMD: curl %s%s >> %s \n---\n",URL[x],argv[2],URL[x],argv[3]);
  100.    writefile(argv[3],CMD,strlen(CMD));
  101.  
  102.    x++;
  103.   }
  104.  
  105.  
  106.  // free(URL);
  107.   free(CMD);
  108.   free(buffer);
  109.   free(LocalPath);
  110.  return 0;  
  111. }
  112.  
  113.  
  114. void *xmalloc(unsigned int len)
  115. {
  116.  void *ptr;
  117.  
  118.  ptr=malloc(len);
  119.  if(ptr==NULL)
  120.   fprintf(stderr,"fail malloc with size %d",len);
  121.  
  122.  return ptr;
  123. }
  124.  
  125. //string replace
  126. char *StrRep(char *st,char *orig,char *repl,const int mim)
  127. {
  128.  char bufer[mim];
  129.  char *ch;
  130.  
  131.   if(!(ch = strstr(st, orig)))
  132.    return st;
  133.  
  134.  strncpy(bufer, st, ch-st);  
  135.  bufer[ch-st] = 0;
  136.  sprintf(bufer+(ch-st),"%s%s",repl,ch+strlen(orig));
  137.  
  138.  char *out=bufer;
  139.  
  140.  return out;
  141. }
  142.  
  143. char *StrChunk(char *src, const int start, const int count)
  144. {
  145.  char *tmp;
  146.  tmp = (char *)xmalloc(count+1);
  147.  if (tmp == NULL)
  148.  {
  149.   puts("error");
  150.   return NULL;
  151.  }
  152.  
  153.  strncpy(tmp, src+start, count);
  154.  tmp[count] = '\0';
  155.  
  156.  free(tmp);
  157.  
  158.  return tmp;
  159. }
  160.  
  161. // simple split return array of strings between string separator
  162. char **split(char *src, const char *token, int *total)
  163. {
  164.  char **str;
  165.  register int i, j, count, item, start;
  166.  int len;
  167.  
  168.  if(!src || !token)
  169.  {
  170.   *total = 0;
  171.   return NULL;
  172.  }
  173.  
  174.  count = item = start = 0;
  175.  j = 1;
  176.  len = strlen(src);
  177.  
  178.  for(i = 0; i < len; i++)
  179.  {
  180.   if(src[i] == *token)
  181.    count++;
  182.  }
  183.  
  184.  if(!count)
  185.  {
  186.   *total = 0;
  187.   return NULL;
  188.  }
  189.  
  190.  str = (char **)xmalloc(count * sizeof(char *));
  191.  if(str == NULL)
  192.   puts("error");
  193.  
  194.  for(i = 0; i < len; i++)
  195.  {
  196.   if(src[i] != *token)
  197.    j++;
  198.   else {
  199.    str[item] = (char *)xmalloc(j-start);
  200.     if (str[item] == NULL)
  201.     {
  202.      puts("error");
  203.      return NULL;
  204.     }
  205.    *(str+item) = StrChunk(src, start, j-1);
  206.    str[item][j-start-1] = '\0';
  207.    item++;
  208.    start = j++;
  209.   }
  210.  }
  211.  
  212.  *(str+count) = (char *)xmalloc(j);
  213.  if(str[count] == NULL)
  214.   puts("error");
  215.  
  216.  str[count] = StrChunk(src, start, j);
  217.  str[count][j-start] = '\0';
  218.  *total = ++count;
  219.  
  220.  free(str);
  221.  
  222.  return str;
  223. }
  224.  
  225.  
  226.  
  227.  
  228. int PathWalk(char * dir2find,char *buffer)
  229. {
  230.  DIR *d;
  231.  struct dirent *entry;
  232.  const char *d_name;
  233.  int path_length,counter=0;
  234.  char path[PATH_MAX];
  235.  char dir_name[PATH_MAX];
  236.  char *tmp=(char *)alloca(PATH_MAX*sizeof(char));
  237.  
  238.   strcpy(dir_name,"");
  239.  
  240.   if( dir2find[0] != '/')
  241.   {
  242.    getcwd(dir_name, PATH_MAX);
  243.    dir_name[strlen(dir_name)] = '/';
  244.   }
  245.   strncat(dir_name,dir2find,PATH_MAX-strlen(dir_name));
  246.   d=opendir(dir_name);
  247.  
  248.     if(!d)
  249.     {
  250.      fprintf(stderr, "Cannot open directory '%s': %s\n", dir_name, strerror (errno));
  251.      return;
  252.     }
  253.  
  254.     while(1)  
  255.     {
  256.  
  257.      entry=readdir(d);
  258.  
  259.       if(!entry)
  260.        break;
  261.        
  262.       d_name = entry->d_name;
  263.  
  264.       if(entry->d_type & DT_DIR)
  265.       {      
  266.        if(d_name[0]!='.')
  267.        {
  268.  
  269.         path_length = snprintf(path, PATH_MAX, "%s/%s", dir_name, d_name);
  270.  
  271.         if(path_length >= PATH_MAX)
  272.         {
  273.          fprintf (stderr, "Path length has got too long.\n");
  274.          exit (EXIT_FAILURE);
  275.         }
  276.    
  277.         counter=PathWalk(path,buffer);
  278.        }
  279.       }
  280.       else
  281.       {
  282.  
  283.        sprintf(tmp,"%s/%s\n",dir_name,d_name);
  284.        strncat(buffer,tmp,strlen(tmp));
  285.        counter++;
  286.       }
  287.     }
  288.      
  289.  
  290.     if(closedir(d))
  291.     {
  292.      fprintf (stderr, "Could not close '%s': %s\n",dir_name, strerror (errno));
  293.      exit (EXIT_FAILURE);
  294.     }
  295.   return counter;
  296. }
  297.  
  298. void writefile(char *filename,char *msg,int msglen)
  299. {
  300.  __asm__(
  301. // syscall open("string", O_CREAT | O_WRONLY, 0644);
  302.    "movl $0x05, %eax\n"
  303. // nosso primeiro argumento
  304.    "movl 8(%ebp), %ebx\n"
  305. // O_CREAT | O_WRONLY
  306.    "movl $1001, %ecx\n"
  307. // aqui você já sabe permissões em octal do unix
  308.    "movl $0644, %edx\n"
  309.    "int $0x80\n"
  310. // fd esta em %eax do open(), movemos para o %ebx para o write()
  311.    "movl %eax, %ebx\n"
  312. // syscall write(fd, message, messageLen);
  313.    "movl $0x04, %eax\n"
  314. // fd em  %ebx para acima
  315. // segundo argumento
  316.    "movl 12(%ebp), %ecx\n"
  317. // 12+4 terceiro argumento nosso
  318.    "movl 16(%ebp), %edx\n"
  319.    "int $0x80\n"
  320. // syscall close(fd);
  321.    "movl $0x06, %eax\n"
  322. // fd still in %ebx
  323.    "int $0x80\n"
  324.  );
  325. }
Advertisement
Add Comment
Please, Sign In to add comment