[level3] Write-Up : SetUID의 취약점 3
Pwn/FTZ

[level3] Write-Up : SetUID의 취약점 3

반응형

level3 / can you fly?

 

접속 후에 바로 cat hint로 어떤 힌트를 줄지 보도록 합시다.

이번 힌트는 조금 길군요.

 

어셈블러를 리버싱하며 얻은 지식이 여기서 도움이 되는군요. ㅎㅎ

int main(int argc, char **argv) 부분을 보시면

  • int argc : 해당 파일(여기서는 autodig)을 실행시킬 때 넘겨받은 인자 값의 개수
  • char **argv : 넘겨받은 인자 값들의 스트링을 인자값의 개수만큼 저장하고 있습니다.
...더보기

예를 들어보겠습니다.

./autodig 9 hello

로 이 파일을 실행시켰다고 가정했을 때

  1. argc = 3
  2. *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의 개수

argc의 값이 2개가 아닐 시 exit(0); 으로 배쉬를 종료시키게 됩니다.

즉  저희는 실행경로를 포함해 파라미터를 2개를 무조건 전달해주어야 한다는 것입니다.

ex) ./autodig hi

 

cmd 문자열의 생성

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 )

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를 실행시켜 준 것입니다.

반응형