level2를 풀고 얻은 password를 가지고 로그인을 하면 역시나 hint가 보입니다.

당연히 hint를 확인 해주어야겠죠.


힌트가 뭔가 길어졌습니다.

단순히 문장 한줄이었던 예전과 다르게 이번엔 autodig의 소스코드가 주어졌네요.

일단 소스코드를 분석해 봅시다.


우선 argc란 프로그램을 실행할 때 넘겨주는 인자의 개수를 말합니다.
$ ls -s / 라고 프로그램을 실행하였다면 총 3개의 인자값을 가지게 됩니다.
argc[0] = ls
argc[1] = -s
argc[2] = /
이렇게 총 3개의 인자값을 갖게 되죠. argc[0]는 항상 프로그램 자기자신을 가르킵니다.

소스를 보면 if( argc!=2 )가 보입니다.
argc의 개수가 2가 아니라면 if문 내부를 실행하는 것이죠.
if문 내부에 exit(0);가 보이는 것으로 보아 if문은 실행하면 안될 것 같습니다.

if문 이후를 보면 strcpy이 나오고, strcat2개가 나오고 system(cmd)가 보입니다.

strcpy의 형태는
char* strcpy(char * dest, cont shar * src)인데
이함수는 src의 문자열을 dest로 복사하는 것입니다.
즉, strcpy( cmd, "dig @" );는 "dig @"문자열을 cmd에 복사하는 것이 되겠습니다.

다음 나오는 strcat의 형태는
char * strcat( char * dest, const char * src)인데
이 함수는 src의 문자열을 dest에 담겨있는 문자열 뒤에 붙이는 것입니다.
즉 strcat( cmd, argv[1] ); 이므로 cmd는 "dig @argv[1]"라는 문자열이 담기게 되는것입니다.

다음 strcat( cmd, " version.bind chaos txt")까지 실행하게 되면,
cmd안에는 "dig @argv[1] version.bind chaos txt"라는 문자열이 담기게 되는것입니다.

그리고 그 다음 system( cmd ); 함수를 통해 cmd안에 담긴 문자열을 쉘에서 명령어로 입력하게 됩니다.
즉, $ dig @argv[1] version.bind chaos txt가 되는 것이죠.


여기서 잠깐 dig함수에 대해 알아보고 가면(사실 dig함수는 문제를 푸는데는 큰 의미는 없습니다만.. 일단 나왔으니...)

dig란 Domain Information Groper의 약자로 dns 진단용 유틸리티입니다.

dig 명령어는 기본적으로 다음과 같은 문법 형식을 갖고 있습니다.

$ dig @ [서버] [도메인] [쿼리형태]


쿼리형태

a : 네트워크 주소

any : 특정 도메인에 대한 모든 정보

mx : 도메인의 메일 교환

ns : 네임서버

soa : Zone파일 상단의 authority 레코드

hinfo : 호스트 정보

axfr : Zone 파일 교환(transfer)

txt : txt


$ dig를 실행하면 윗 사진과 같이 나오는데 각 필드의 뜻은 다음과 같습니다.

;; QUESTION SECTION:
- DNS 질의 내용을 표시

;; ANSWER SECTION:
- DNS 질의 사항에 대한 DNS 응답 RR(Resource Record)을 표시

;; AUTHORITY SECTION:
- DNS 응답 RR이 속한 도메인 존의 NS RR 정보

;; ADDITIONAL SECTION:
- 부가적인 RR 정보를 표시

;; Query time:
- DNS 질의 메시지 발송시점에서 응답시점까지의 소요시간

;; SERVER:
- DNS 응답 메시지를 보내온 질의응답 네임서버

;; WHEN:
- DNS 응답 메시지를 받은 시점의 date & time

;; MSG SIZE rcvd:
- 응답받은 DNS 메시지의 size표시 (byte단위)
IP TCP/UDP 헤더는 제외된 size

autodig를 통해 만들어진 명령어(dig @argv[1] servion.bind chaos txt]는 dns의 bind 버전을 알아내는데 사용되는 명령어입니다.


다시 문제풀이로 돌아가 소스의 추가 힌트 2개를 보겠습니다.
추가 힌트는
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
입니다.

- 동시에 여러 명령어를 사용하려면?
동시에 여러 명령어를 사용하려면 명령어 사이에 ;를 넣으면 됩니다.
$ sh; ls이런식인것이죠.
이렇게 하면 sh실행이 종료된후 ls를 실행하게 됩니다.

- 문자열 형태로 명령어를 전달하려면?
문자열 형태로 명령어를 전달하려면 명령어를 큰따옴표("")로 묶어주면 됩니다.


그럼 autodig에 인자를 넘겨줘 봅시다.

$ autodig "168.126.63.1;my-pass"라 입력하겠습니다.


이렇게 하면 autodig 168.126.63.1이 실행된후 my-pass가 실행 되겠죠.

빙고 암호가 나왔습니다.

암호는 suck my brain입니다.


level3의 암호가 나올 거라 예상했는데 level4의 암호가 나온것으로 보아 autodig는 level4로 setUID가 되어 있나봅니다.
한번 확인해 보겠습니다.

확인 결과 예상대로 autodig는 level4에 setUID가 걸려 있음을 확인할 수 있었습니다.


+ Recent posts