Использование переменной среды для выполнения другого файла - PullRequest
0 голосов
/ 03 октября 2019

Я немного застрял. У меня есть программа на C, которая включает переменную среды $ USER. Цель состоит в том, чтобы использовать переменную окружения для выполнения другого файла с помощью внедрения команды.

Я уже пробовал разные способы объявления пользователя. Например: объявление USER как

env USER=">/dev/null ; cat /home/Steve/Public/file2.txt". 

К сожалению, это не сработало.

Программа C:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

// Execute any shell command
void execute(char *cmd)
{
   execl("/bin/bash", "bash", "-p", "-c", cmd, NULL);
}

void sanitise(char *password)
{
  int i,j;
  char tmp[15];

  // remove non-alphabet  characters from passwords
  j=0;
  for(i=0; i < 15; ++i) 
    if(password[i] >= 'a' && password[i] <= 'z') {
      tmp[j]=password[i];
      ++j;
    } else break; 
  tmp[j] = '\0';

  strcpy(password, tmp);

}


int authenticate(char *str)
{
  char stored_password[15]="";
  char pass[15];
  char path[128] = "/home/Steve/private/password";
  int i;

  FILE *fpp; 
  int auth=0;

  fpp = fopen(path, "r");

  if(fpp == NULL)
  {
     printf("Password file %s not found\n", path);
     exit(1);
  }

  fgets(stored_password, 15, fpp);
  sanitise(stored_password);

  strcpy(pass, str);
  sanitise(pass); 

  if(strcmp(stored_password,pass) == 0)
     auth=1;
  else {
     auth=0;
  }

  fclose(fpp);

  return auth; 
}

int main(int argc, char* argv[], char *envp[])
{
  char error[256] = "/home/Steve/Public/errormessage.sh $USER ";
  char pass[15];

  if(argc < 2) 
  {
    printf("Usage: %s password\n", argv[0]);
    return 0; 
  }

  // copy only 15 characters from user input, to prevent stack smashing
  strncpy(pass, argv[1], 15);
  pass[14]='\0';

  if(!authenticate(pass)) {
    // Log all failed attempts
    printf("Wrong password. This incident has been logged.\n");
    strcat(error, pass);
    execute(error); // Execute script to log events
    return 0;
  }

  // Display 'secret-file2'
  execute("cat /home/Steve/Public/file2.txt");

  return 0;
}

Цель состоит в том, чтобы программа выводила файл из переменной USER, а не исходный путь к файлу, объявленный в коде ошибки. В идеале, без изменения программы на С вообще.

Может кто-нибудь сказать, что мне здесь не хватает?

Ответы [ 4 ]

0 голосов
/ 03 октября 2019

Если это то, что делает программа, она выполнит следующую команду:

/home/Steve/Public/errormessage.sh $USER <provided-password>

Поскольку вы управляете предоставленным паролем (то есть вы можете передать то, что вы хотите в argv[1], до тех пор, покаэто не более 14 символов), вы можете просто выполнить еще одну оболочку bash, а затем использовать ее для запуска любой команды. На самом деле нет необходимости вмешиваться в $USER.

$ ./program '; bash'
Wrong password. This incident has been logged.
$ <--- another bash shell has now started
$ cat /home/Steve/Public/file2.txt
...contents of file2.txt...

. Если вы хотите запустить его одной командой, это должно сработать:

echo 'cat /home/Steve/Public/file2.txt' | ./program '; bash'
0 голосов
/ 03 октября 2019
#include <stdlib.h>

...
char path[256] = "/home/Steve/Public/file1.sh ";
strcat( path, getenv("USER") );

//char path[256];
//sprintf(file,"%s%s","/home/Steve/Public/file1.sh ",getenv("USER"));
...
0 голосов
/ 03 октября 2019

Если вы хотите использовать вашу программу на C с новой переменной $ {USER}, то вам следует использовать env -i. Пример: env -i USER='injected code' name_of_c_program

0 голосов
/ 03 октября 2019

Используйте библиотечную функцию 'getenv', чтобы получить значение переменной среды (USER). А затем выполните команду, используя 'system (path)'.

...