Использование Bash Script для использования C-программы (Shell Script Injection & String Format) - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть виртуальная машина под управлением Linux.На этой машине есть программа на C в публичном каталоге другого пользователя.Эта программа c открывает файл после ввода правильного пароля.Я не могу редактировать C-программу.Мы стремимся написать bash-скрипт, чтобы использовать слабость программы на Си для получения доступа к секретному файлу, к которому у меня, как у другого пользователя, обычно не было бы доступа.Основываясь на моем анализе, я вижу две возможности для эксплуатации (могут быть неправильными): формат строки и внедрение кода Shell.

Я написал короткий сценарий оболочки, пытаясь вставить команду оболочки после точки с запятой.Однако я не уверен, как использовать эту слабость в целом.В настоящее время я просто вставляю в качестве пароля случайный файл file.txt, а за точкой с запятой следует команда ls.Это выявило все файлы, к которым программа C имеет доступ.Теперь мне просто нужно специально указать секретный файл и передать его на терминал.Однако я не уверен, как это сделать.

C-Program:

#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] = "/etc/comp2700/alice/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/alice/Public/error.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
execute("cat /etc/comp2700/alice/secret"); 
return 0;
}

error.sh:

#!/bin/bash -p

# Get date and time
dt=$(/bin/date '+%d/%m/%Y %H:%M:%S') 

# Add new entry to log
/bin/echo "[$dt] Wrong password attempt by $1: $2" >> /home/alice/Public/error.log

Ожидаемый вывод сценария оболочкивыводит содержимое секретного файла в / etc / comp2700 / Alice / secret на терминал.

...