pwnable cmd1
Starting to solve the pwnable.kr series of problems!
Provided Source
#include <stdio.h>
#include <string.h>
int filter(char* cmd){
int r=0;
r += strstr(cmd, "flag")!=0;
r += strstr(cmd, "sh")!=0;
r += strstr(cmd, "tmp")!=0;
return r;
}
int main(int argc, char* argv[], char** envp){
putenv("PATH=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
Breaking this down, we can see three main parts:
- Reset the $PATH to only include one entry
- Filter the input to no include any strings
- Run
system()
Solving
The $PATH holds the main directories for where binaries are located, allowing for users to just run something short like pwd instead of /bin/pwd. $PATH allows this to get shortened to the normal commands run, however this challenge wipes out the normal path of /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin to contain only /thankyouverymuch. This means when a user want to run a binary, the absolute path will need to be specified to allow for the binary to be found.
With this is mind, we can call the program with ./cmd1 /bin/pwd to print the current working directory. If we ran the program with ./cmd1 pwd, it will inform the user that the executable isn’t found.
Like normal challenges, we’ll use /bin/cat to read the flag to the standard out. However, the user can’t input flag directly. I used a wildcard to complete this challenge. Instead of needing to write flag, Bash will interpret the wildcard * to finish the rest of the word. Hence, running ./cmd1 "/bin/cat fla*".
cmd1@pwnable:~$ ./cmd1 "/bin/cat fla*"
#REDACTED#