level3 / can you fly?
접속 후에 바로 cat hint로 어떤 힌트를 줄지 보도록 합시다.
이번 힌트는 조금 길군요.
어셈블러를 리버싱하며 얻은 지식이 여기서 도움이 되는군요. ㅎㅎ
int main(int argc, char **argv) 부분을 보시면
- int argc : 해당 파일(여기서는 autodig)을 실행시킬 때 넘겨받은 인자 값의 개수
- char **argv : 넘겨받은 인자 값들의 스트링을 인자값의 개수만큼 저장하고 있습니다.
예를 들어보겠습니다.
./autodig 9 hello
로 이 파일을 실행시켰다고 가정했을 때
- argc = 3
- *argv[0] = "./autodig" | *argv[1] = "9" | *argv[2] = "hello"
이렇게 저장이 되어 main 함수의 인자로 넘어가게 됩니다.
일단 제대로 들어가기 전에 autodig라는 파일이 어디에 있으며 어떤 permission을 가지고 있는지 보도록 하겠습니다.
find / -name autodig 2> /dev/null
ls -l /bin/autodig
이번 문제 역시 SetUID의 취약점을 이용한 문제군요.
지난번 문제와는 달리 이번에는 C언어를 이해하고 파라미터(Parameter) 값의 전달로 실행시키는 해킹이라고 할 수 있겠군요.
파일도 찾았고 파라미터 전달을 이용한다는 것을 알았으니 hint 에서 보여준 코드를 차근차근 보도록 합시다.
argc의 값이 2개가 아닐 시 exit(0); 으로 배쉬를 종료시키게 됩니다.
즉 저희는 실행경로를 포함해 파라미터를 2개를 무조건 전달해주어야 한다는 것입니다.
ex) ./autodig hi
char cmd[100] 으로 설정된 문자열이 있는데 마지막에 system(cmd)로 넘겨준 것을 보아하니
위의 과정을 통해서 명령어를 만들어야 하는 것 같습니다.
[C언어에서 쓰는 함수 설명]
- strcpy( source, destination ) : 소스(source)에 목적지(destination) 문자열을 NULL 만날 때까지 복사
- strcat( source, destination) : 소스(source)와 목적지(destination)의 문자열을 합친 후, 소스(source)에 저장
만들어지게 될 명령어의 최종 형태를 예측해보자면
dig @(인자값1) version.bind chaos txt
라는 명령어가 될 것입니다.
dig라는 명령어를 알아보도록 할까요? ( man dig )
DNS 서버를 통해 찾은 정보를 보여주는 툴이군요.
(이전까지 사용되던 nslookup 명령어를 대체하는 명령어라고 합니다.)
이제 저희가 기본적으로 알아봐야 할 정보는 다 알아본 것 같습니다.
그래서 DNS 서버로 구글을 정하고 다음과 같이 파라미터를 전달해보았습니다.
./autodig "8.8.8.8;my-pass"
이렇게 해서 ""(큰 따옴표) 안에 있는 내용을 넘겨주는 데
strcat( cmd, argv[1] ); 에서 딱히 다른 검사를 하지 않기 때문에
실제로 넘겨진 값에 의해 완성된 cmd 명령어는
dig @8.8.8.8 vision.bind chaos txt
라고 정상적으로 실행됩니다.
이어 여러 개의 명령어를 쓸 수 있는 ;(세미콜론)을 이용해 my-pass를 실행시켜 준 것입니다.