char *BuildName(char *path, char *name)
{ char buffer[256];
sprintf(buffer,"%s/%s",path,name);
return buffer;
}
name = BuildName("/home/mark",".cshrc");
fp = fopen(name,"w");
Beskriv en sikker måte som en systemprosess kan bruke for
å åpne filen. Beskriv hva som kan gå galt med
denne enkle operasjonen.
Hensikten med det praktiske arbeidet denne uke er å demonstrere flere software tabber.
man 2 chmod man statForandre koden i Security Kit filen appl.cpp slik at den innholder følgende:
main ()
{ FILE *fp;
struct stat statbuf;
umask(0); // Change this and remove it...see what happens
if ((fp = fopen("newfile","w")) == NULL)
{
perror("fopen");
return error;
}
fprintf(fp,"This is an example file.");
fclose(fp);
// Now check permissions
if (stat("newfile",&statbuf) == -1)
{
perror("stat");
return error;
}
printf("The file perms on the file are %o\n",statbuf.st_mode & 07777);
chmod("newfile",0755);
if (stat("newfile",&statbuf) == -1)
{
perror("stat");
return error;
}
printf("The file perms on the file are now %o\n",statbuf.st_mode & 07777);
}
Kompiler og kjør dette programmet. Prøv å slette umask linjen fra
programmet og forandre verdien til umask i shellet i stedet:
% umask 0 % ./appl % umask 022 % ./appl % umask 077 % ./applHusk det å slette filen newfile mellom prøvene for å se virkningen av filopprettelse. Arv av attributter fører til problemer!
main()
{ FILE *pp;
char line[1024];
line[0] = '\0';
if ((pp = popen("ls -al","r")) == NULL)
{
printf("cannot open\n");
exit(0);
}
while(!feof(pp))
{
fgets(line,1024,pp);
printf("comm: %s",line);
}
printf("Done with program\n");
pclose(pp);
}
Legg merke til hvordan programmet ikke spesifiserer en PATH for kommandoen
ls, men programmet kompilerer og kjører allikevel.
Grunnen er at et implisitt Bourne shell brukes for å tolke kommandoen.
Bytt ut:
popen() -> cfpopen() pclose() cfpclose()i programmet og legg merke til at programmet ikke lenger eksekveres. I stedet åpnes det en blank datastrøm til kommandoen som ikke ble funnet. Selv om dette oppførselet er noe suspekt indikerer det at ingen shell er lenger involvert i forsøk på å eksekvere kommandoer.
Uansett bør en PATH alltid skrives eksplisitt. Sjekk hva som skjer dersom du linker kommandoen ls til directoryet du kjører fra:
ln -s /bin/ls ./lsKjor programmet på nytt og bekreft at exec funksjonen som jobber bak kulissene for (cf)popen ser etter programmer uten PATH i current-directory. Dette kan også føre til feil.
For å utføre oppgaven kommer du til å trenge tre vinduer, en per prosess. En sender en mottager og en angriper. Du må kompilere programmene nedenfor. Du trenger ikke Security Kit for å gjøre dette, det bør holde å kompilere med:
gcc -o prog1 prog1.cosv.
Her er senderprogrammet. Det er et meget forenklet program som genererer en strøm med data. For å gjøre ting klarest mulig skriver den ut en liste med tall Disse skrives til en fil som heter pipe_simul, som er en representasjon av en pipe (rør) mellom programmene. F.eks. det kune være en Unix pipe eller det kunne være en nettverksforbindelse mellom klient og server.
#includeHer er mottaker programmet. Det leser datastrømmen fra pipen og sender outputen til skjermen.main() { FILE *fp; int i; char line[1024]; for (i = 0; i < 10; i++) { if ((fp = fopen("pipe_simul","a")) == NULL) { exit(1); } fprintf(fp,"Line %d\n",i); fclose(fp); sleep(5); /* simulate context switch or delay between packets */ } }
#includeKompiler disse programmene og kjør dem, i et vindu for seg. Start det første programmet først. Du bør observere at det første programmet skriver data, og at det andre programmet leser dem. Se gjennom programmene og pass på at du skjønner hvorfor dette skjer.main() { FILE *fp; char line[1024]; fp = fopen("pipe_simul","r"); while (!feof(fp)) { fgets(line,1023,fp); printf("read: %s\n",line); sleep(5); /* Context switch */ } fclose(fp); }
Slett nå filen pipe_simul og start pånytt. Denne gangen, når prosessene kjører, prøv å taste følgende inn i det tredje vinduet:
echo "Attack by a man in the middle" >> pipe_simulDu bør se at denne setningen dukker opp i utskrikten til det andre programmet, etter en kort stund. Du kan øke hastigheten hvis du vil for å gjøre ting mer realistisk, ved å redusere sleep-tiden. Skjønner du hvordan dette kan brukes for å lure et challenge-response system?
Poenget er dette: så lenge en mann i midten har tilgang til det mediet som brukes for å overføre/lagre data, så er det lett å utføre et slikt angrep. I Internett-tilfellet har hver maskin tilgang til internettet. Angriperen trenger selvsagt kunnskaper om hva slags transaksjoner som foregår for å forandre en samtale. Det blir også mye vanskeligere å oppnå ettersom hastigheten øker og alt blir mer tidskritisk.