У меня есть виртуальная машина под управлением 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 на терминал.