ipwn

[FTZ(Free Training Zone)] level12 -> level13 본문

Write up/FTZ

[FTZ(Free Training Zone)] level12 -> level13

ipwn 2018. 2. 22. 13:10

ID : level12


PW : it is like this

[level12@ftz level12]$ ls -l
total 28
-rwsr-x---    level13  level12     13771 Mar   2003 attackme
-rw-r-----    root     level12       204 Mar   2003 hint
drwxr-xr-x    root     level12      4096 Feb 24  2002 public_html
drwxrwxr-x    root     level12      4096 Feb 22 12:39 tmp



hint파일을 한 번 읽어보겠다.


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main( void )
{
    char str[256];
 
     setreuid( 30933093 );
    printf"문장을 입력하세요.\n" );
    gets( str );
    printf"%s\n", str );
}


str문자열이 제한없이 입력이 되고, 그로인해 ret을 변조시켜 shellcode를 실행시키는 문제이다.


일단 가장먼저 str과 sfp 사이의 dummy값이 얼마나 있는지 한 번 보도록 하겠다.


Dump of assembler code for function main:
0x08048470 <main+0>:    push   ebp
0x08048471 <main+1>:    mov    ebp,esp
0x08048473 <main+3>:    sub    esp,0x108
0x08048479 <main+9>:    sub    esp,0x8
0x0804847c <main+12>:    push   0xc15
0x08048481 <main+17>:    push   0xc15
0x08048486 <main+22>:    call   0x804835c <setreuid>
0x0804848b <main+27>:    add    esp,0x10
0x0804848e <main+30>:    sub    esp,0xc
0x08048491 <main+33>:    push   0x8048538
0x08048496 <main+38>:    call   0x804834c <printf>
0x0804849b <main+43>:    add    esp,0x10
0x0804849e <main+46>:    sub    esp,0xc
0x080484a1 <main+49>:    lea    eax,[ebp-264]
0x080484a7 <main+55>:    push   eax
0x080484a8 <main+56>:    call   0x804831c <gets>
0x080484ad <main+61>:    add    esp,0x10
0x080484b0 <main+64>:    sub    esp,0x8
0x080484b3 <main+67>:    lea    eax,[ebp-264]
0x080484b9 <main+73>:    push   eax
0x080484ba <main+74>:    push   0x804854c
0x080484bf <main+79>:    call   0x804834c <printf>
0x080484c4 <main+84>:    add    esp,0x10
0x080484c7 <main+87>:    leave  
0x080484c8 <main+88>:    ret    
0x080484c9 <main+89>:    lea    esi,[esi]
0x080484cc <main+92>:    nop    
0x080484cd <main+93>:    nop    
0x080484ce <main+94>:    nop    
0x080484cf <main+95>:    nop    
End of assembler dump.



str의 공간은 256byte, 즉 0x100이 할당되어있는데, sfp까지의 거리는 0x108, 즉 264byte의 공간이 할당되어있다.

그러므로 str과 sfp의 사이에는 8byte의 dummy가 껴있다는 것을 알 수 있다.


이제 ret을 변조하기 위해서는, 총 268byte(str[256] + dummy[8] + sfp[4])를 덮어주어야 한다는 것을 알 수 있다.


이제 한 번 tmp디렉토리에 있는 복사파일에 ret을 덮어주고, 그 뒤에는 nop과 shellcode로 덮어주어보겠다.



gets함수등 사용자의 입력을 main함수의 인자로 받지않는 경우에는 (python -c 'print "~~~"';cat)|./file name의 형태로

값을 넘겨주어야 한다.


일단 core dump를 보도록 하겠다.



eip가 제대로 변조된 것을 확인할 수 있다.

이제 메모리를 확인해보도록 하겠다.



nop이 쌓여있는 위치를 확인했다.

이제 저 위치 중 아무 것이나 ret으로 변조해주면, ASLR로 인한 몇 번의 segmentation fault 이후에 shell이 가져와질 것이다.



한 번 밖에 segmentation fault가 뜨지 않았고, 성공적으로 shell이 가져와진 것을 확인할 수 있다.


이제 홈디렉토리로 돌아가서 원본파일을 공격해서, 권한이 상승된 shell을 가져오겠다.



성공적으로 몇 번의 segmentation fault를 거쳐서 권한이 상승한 shell을 가져왔다.


NEXT ID : level13


NEXT PW : have no clue

'Write up > FTZ' 카테고리의 다른 글

[FTZ(Free Training Zone)] level11 -> level12  (0) 2018.02.06
Comments