문제분석 & 풀이
힌트 먼저 확인해보자.
요약하면 autodig 코드를 보여주고 있으며, autodig를 이용하여 level4의 권한을 얻는 문제인 것 같다.
○ 코드 분석
1. cmd[100]이라는 배열을 선언한다.
2. argc != 2 , 즉 argv 갯수가 2개여야 한다.
3. strcpy(), strcat()을 이용하여 cmd라는 배열에 값을 넣어주고 있다.
("dig @ [사용자가 입력한 인자 값] version.bind chaos txt"와 같은 형태로 cmd에 저장된다.)
4. 마지막으로 cmd 배열에 저장된 값을 인자로 하는 system 명령을 실행한다.
결과적으로system("dig @ [사용자가 입력한 인자 값] version.bind chaos txt") 를 실행하는 코드이다.
그러나 level4의 권한을 얻기 위해서 실행하고 싶은 명령은 "my-pass", "/bin/bash" 같은 명령어들인데, 위와 같은 방식이면 쓸데없는 명령어가 실행된다.
그렇다면 어떻게 해야 우리가 원하는 명령을 실행시킬 수 있을까?
힌트의 첫 번째를 보면 "동시에 여러 명령어를 실행하는 것"을 언급하고 있다.
이것이 의미는 os command injection 취약점을 활용하라는 의미다.
지금부터 예를 들어서 설명하겠다.
리눅스에서 여러 명령을 동시에 실행하기 위한 방법은 ; 를 이용해서 원래의 명령과 추가적인 명령을 연결하면 된다.
예를 들어 "ls" , "cat hint" 두 가지의 명령을 동시에 실행시키고 싶다면, "ls;cat hint"의 형태로 2가지의 명령을 동시에 실행하면 된다.
autodig에서는 "dig @ [사용자가 입력한 인자 값] version.bind chaos txt"가 실행된다. 중간에 사용자의 입력값이 삽입되므로 이전에 언급한 것처럼 ; 를 이용해서 명령어를 삽입할 수 있다.
이와 같은 취약점이 발생하는 경우를 os command injection이라고 한다.
그렇다면 솔루션은 간단하다.
;my-pass
를 argv[1]으로 입력하면 된다.
직접 실습해보자.
find 명령을 이용하여 autodig 파일의 위치를 찾았다.
/bin 경로로 이동 후 autodig 를 위와 같이 실행했다.
인자로 ;my-pass 를 입력했다.
결과는?
level4의 패스워드가 아닌 level3의 패스워드가 나왔다.
결과가 왜 잘못나왔을까?
힌트를 다시 봐보자.
2번째 힌트 내용은 "문자열 형태로 명령어를 전달하려면?" 이라는 내용이다.
우리는 ./autodig 실행 시 인자로 ;my-pass 명령을 위와 같이 전송했다. 그러나 위와 같이 전달하는 경우에는 ;mypass가 autodig의 인자로 전송되지 못한다.
autodig → my-pass
[그림]과 같이 명령어가 전송되면, 인자로 전달되는 것이 아니라 위 순서로 별개의 명령으로 실행된다는 것이다.
따라서 autodig의 인자로 전송하기위해서는 ";my-pass" 로 바꿔서 전송해야한다.
바꿔서 다시 실행해보자.
이번에는 level4의 패스워드가 출력됐다!