먼저, 파일 목록을 확인해보겠습니다.
hint 파일이 있습니다.
hint 파일을 읽어보겠습니다.
엄청나게 깁니다.
그리고 level 4의 권한을 가진 파일을 찾아보겠습니다.
/bin/autodig 입니다!
hint에서는 autodig 파일의 소스가 제공됩니다.
이 파일의 소스를 해석한 뒤, 아래에 주석을 적어놓았습니다.
이번 문제는 Command Injection 문제입니다.
먼저 원리 설명을 먼저 하겠습니다.
리눅스상에서 ; 를 명령어 중간에 넣으면, 다른 명령어를 함께 실행할 수 있습니다.
예를 들어
cat hint;cat blabla
를 입력하게 되면, hint 파일을 읽고 나서, blabla 파일을 읽을 수 있습니다.
다음은, 여러 특수문자(띄어쓰기 등)가 포함된 문자열을 한개의 인자로 주는 방법입니다.
여기서 인자란, 명령어를 실행하면서 넘겨주는 입력입니다.
인자는 프로그램 실행 구문 뒤에 문자열입니다.
main 함수의 매개변수를 보면
처럼 되어있습니다.
여기서 argc 는 argv의 길이를,
argv는 명령어 실행줄이 들어있습니다.
예를 들어보겠습니다.
아까 cat hint 를 생각해볼 수 있습니다.
이때, argc, argv는 각각
가 들어있게 됩니다.
위의 예시 처럼 인자의 구분은 스페이스바를 통해서 하게 됩니다.
하지만 스페이스바를 포함한 인자를 넘겨주고 싶다면...
"(큰따옴표)를 통해서 전달해줄 수 있습니다.
cat "give me hint" 와 같이 입력하게 되면
와 같이 들어가게 됩니다.
(만약 " 안에서 "를 넣고싶다면, \" 를 하면 되고, \를 넣고싶다면 \\를 하시면 됩니다.)
자, 이제 다시 메인으로 돌아와서,
프로그램의 소스를 해석해보면,
를 실행하는 프로그램입니다.
하지만 여기서,
; my-pass ; 를 입력하게 되면,
가 되어,
명령어가 나뉘게 됩니다.
즉, my-pass를 실행할 수 있게 되는 것입니다.
이게 바로 커맨드 인젝션입니다.
하지만, 여기서 생각해봐야 할 점이 있습니다.
만약,
를 입력해서 인자를 주게 되면, autodig 와 my-pass로 나뉘게 됩니다.
그래서 아까의 "(큰따옴표) 를 사용해서 인자를 묶어주면,
다음과 같이 level 4의 비밀번호를 얻을 수 있게 됩니다.
'Security > HackerSchool FTZ' 카테고리의 다른 글
| FTZ Level 4 (0) | 2017.09.11 |
|---|---|
| FTZ Level 2 (0) | 2017.09.05 |
| FTZ Level 1 (0) | 2017.09.05 |