2017. 5. 23. 14:04ㆍSystemHacking/FTZ
3번 문제를 풀기에 앞서 알아두어야 할 개념들입니다
1> nslookup
도메인 서버의 IP주소를 확인하는 프로그램입니다
사용방법
- ]$ nslookup [확인하고싶은 도메인 주소]
- ]$ nslookup www.tistory.com
2> dig
nslookup과 동일하게 도메인의 IP주소를 확인하는 프로그램
사용방법
- $] dig @[정보를받을서버] [확인하고싶은도메인주소]
- ]$ dig @100.100.100.2 www.tistory.com
< 그림 3.1 >
[level3 @ftz level3]$ nslookup www.tisory.com
Server : 100.100.100.2 : 제가 사용하는 서버의 IP주소입니다
Non-authoritative answer : nslookup으로 요청한 도메인의 IP주소가 나옵니다
[level3 @ftz level3]$ dig @100.100.100.2 www.tistory.com
;; ANSWER SECTION
www.tistory.com. 5 IN A 61.251.98.169
3> int argc , char *argv[]
임의의 소스코드가 다음과 같다고 하자
int main( int argc , char *argv[] ) {
return 0;
}
=> argc : Argument Count
- 해당 소스코드를 실행했을 때 명령어+인자의 개수가 저장된다
=> *argv[] : Argument Vector
- 입력한 명령어+인자들이 실제 문자열로 저장되는 공간
- argv[0] , argv[1] ...
문제를 풀면서 더 자세히 설명하겠습니다.
힌트를 먼저 열어보겠습니다
< 그림 3.2 >
< autodig 소스코드 설명 >
if ( argc != 2 ){
printf("Auto Digger Version 0.9\n");
printf("Usage : %s host\n",argv[0]);
exit(0);
}
위에서 배웠던 개념이 나왔습니다 ! 명령어와 인자의 개수(argc)가 2개가 아니면 해당함수를 종료합니다
예를 들면,
level3@ftz level3]$ /autodig // "/autodig" 명령어 1개 => argc == 1
level3@ftz level3]$ /autodig arg1 // "/autodig" 명령어 1개 + "arg1" 인자 1개 => argc == 2
level3@ftz level3]$ /autodig arg1 arg2 // "/autodig" 명령어 1개 + "arg1 , arg2 " 인자2개 => argc == 3
또한
argv[0]는 "/autodig"
argv[1]는 "arg1"
argv[2]는 "arg2" 이 됩니다
응용해서 printf("%s",argv[1]) 이 코드는 "arg1" 이자리에 우리가 입력한 문자열이 출력됩니다
< 사용한 함수 설명 >
(1) strcpy(cmd,dig @);
strcpy( 문자열1 , 문자열2 )
문자열2의 내용을 문자열1로 복사한다
(2) strcat(cmd, argv[1] );
(3) strcat(cmd, version.bind chaos txt);
strcat( 문자열1 , 문자열2 )
문자열1에 이어서 그 뒤에 바로 문자열2를 추가한다
따라서 cmd ="dig @ [사용자가 입력한 문자열] version.bind chaos txt" 가 됩니다
< more hint >
1. 동시에 여러 명령어를 사용하려면?
동시에 여러 명령어를 전달하는 방법은 " ; " 를 사용하는 것입니다
리눅스에서 " ; " 는 and 를 뜻하며 " A ; B " 는 A명령어를 실행한 후 B명령어를 실행합니다
2. 문자열 형태로 명령어를 전달하려면?
문자열 형태로 명령어 전달하는 방법은 ' "" ' 쌍따옴표 안에 명령어를 입력해서 문자열 취급을 받게하면된다
힌트에 대해 모두 파악했으니 이제 공격대상을 찾아서 공격해보겠습니다
<그림 3.3 >
find 명령어를 통해서 level4권한으로 setuid가 걸려있는 /bin/autodig 실행파일을 찾았습니다
< 그림 3.4 >
위에서 해석했던 것처럼 argc가 1일때와 2일때의 출력하는 내용이 다름을 알 수 있습니다
다음으로 코드를 직접 입력한 것과 실행파일을 실행한 출력결과를 비교해겠습니다
[level3@ftz level3]$ dig@100.100.100.2 version.bind chaos txt
[level3@ftz level3]$ /bin/autodig 100.100.100.2
< 그림 3.5 >
그림3.5 를 보시면 두 코드가 출력한 내용이 같음을 알 수 있습니다
분석한 내용이 옳음을 확인 할 수 있고 이제 공격을 시작합시다
< 공격할 방식 >
명령어를 문자열 형태로 어떻게 보낼것인지 ? 또한, 동시에 여러 명령어를 사용하는 방식을 통해서 공격해야합니다
코드 작동 원리를 봐보자
[level3@ftz level3 ]$ /bin/autodig 100.100.100.2
=> cmd = "dig @100.100.100.2 version.bind chaos txt" => system(cmd);
여기서 " ; " 를 사용해보자 ! ( 그림 3.6 확인 )
< 그림 3.6 >
언뜻보면 system 함수를 명령어 두개를 실행해서 공격에 성공한 것처럼 보인다!
하지만, 자세히봐보면 uid부터 모든게 level3임을 알 수있다.
왜일까? /bin/autodig 코드를 보면 " strcat(cmd,argv[1]) " 에서 확인할 수 있다 argv[1] 은 100.100.100.2 를 가르키고 있다
id명령어는 argv[2] 이므로 /bin/autodig에서 사용되어지지 않는다
따라서 위의 실행코드는 level4의 권한으로 system("dig @100.100.100.2 version.bind chaos txt") 가 실행된 후
level3쉘에서 "id" 명령어를 친 것이다
어떻게하면 level4의 비밀번호를 얻을 수 있을까 ?
level4의 권한으로 setuid가 걸려있는 /bin/autodig에서 실행하는 system함수의 인자로 "my-pass" 명령어를 넣어주면 된다!
이 때 바로 ' "" ' 를 사용한다
[level3 @ftz level3]$ /bin/autodig "100.100.100.2 www.tistory.com ; my-pass ;"
=> "100.100.100.2 www.tistory.com ; my-pass; " 를 하나의 문자열로 인식해서 argv[1] 이 된다
< 그림 3.7 >
코드 작동 원리는 다음과 같습니다
sytem("dig @100.100.100.2 www.tistory.com ; my-pass ; version.bind chaos txt");
1> dig @100.100.100.2 www.tistory.com
2> my-pass
3> version.bind chaos txt
세개의 명령어가 실행됩니다. 단! 여기서 system함수를 실행시킨 파일은 /bin/autodig 입니다
따라서 level4의 권한을 가지고 명령어가 실행됩니다
문제가 풀렸습니다
마지막으로 gdb로 해당 코드를 분석해봅시다!
< 그림 3.8 >
<main+16>: cmpl $0x02,0x8($ebp) argc 와 '2' 를 비교한다
일치하면 <main+69>로 jump , 그렇지 않다면 그대로 코드를 진행해 나간다
printf() 두번 실행한 후 exit(0) 함수에 의해서 프로세스가 종료된다
< 그림 3.8 >
argc 가 2일 때 점프해서 넘어왔을 때의 코드이다
[1] <main+81>
strcpy( cmd , "dig @")
[2]<main+104>
strcat( cmd, "사용자가 입력할 인자")
[3]<main+124>
strcat( cmd,"version.bind chaos txt")
[4]<main+145> // 해당 명령어로 인해 system함수가 level4의 권한으로 실행된다
setreuid(3004,3004)
[5]<main+160>
system(cmd)
마지막으로 leave , ret => main함수는 종료 됩니다
부족하거나 이상한 점 있으시면 말씀해주세요
'SystemHacking > FTZ' 카테고리의 다른 글
FTZ level5 레이스 컨디션 ( Race Condition ) (0) | 2017.05.23 |
---|---|
FTZ level4 xinetd백도어 (0) | 2017.05.23 |
FTZ level2 VI편집기의 고급기능 (0) | 2017.05.23 |
FTZ level1 문제풀이 및 gdb분석 (0) | 2017.05.23 |
FTZ 문제 풀기에 앞서 (0) | 2017.05.23 |