본문 바로가기

Pwnable/FTZ

[ProjectH4C] [Write-up] 해커스쿨 FTZ Level 4

level4에 로그인 후, 역시나 ls -al 과 find / -user level5 명령어를 먼저 실행시켜 보았다.

 

하나도 나오지 않았다. 혹시나 싶어 level4 그룹의 파일들로 검색하면 나올까 싶어 -group level4 옵션을 이용해서 한번 더 검색해보았다.

위와 같이 결과가 나오는데, /proc 디렉토리는

Memory에 커널이 적재된 후의 메모리의 정보들을 긁어와서

하드웨어정보 프로세스 정보들을 파일로 관리하는 디렉토리

라고 한다. 왠지 건들면 안될 것 같기에 패스하고, 맨 아래의 /home/level4 디렉토리는 level4로 로그인하자마자 나오는 홈 디렉토리이다. 이 곳엔 별 이상이 없었기에 패스하고, 중간에 /etc/xinetd.d/backdoor 라는 파일이 있다. ls -l을 이용해 상세 정보를 출력해보았다.

 

이번엔 다음 레벨 유저의 소유가 아닌 root의 소유로 되어있어서 처음 검색 결과에 나오지 않았던 것이였다. 그런데 소유자, 그룹, 그 외 사용자 모두에게 읽기 권한만 주어지고 쓰기, 실행 권한이 없다. SetUID 또한 설정되어 있지 않다. 심지어 이름 마저 backdoor인 것이다..!

 

백도어(backdoor) : 정상적인 인증과정을 거치지 않고 시스템에 접근하는 방법을 말한다. 시스템 자원이나 혹은 시스템이 자료를 빼내기 위해 해킹을 한 경우 다음 접속을 쉽게 하기 위해 시스템의 보안이 제거된 비밀 통로이다.

 

괜히 건드렸다가 내 컴퓨터에 문제가 생기는 건 아닐까..?

실행도 못하고, 수정도 못하고, 이게 열쇠이긴 한 것 같은데, 접근할 방법이 없어보인다.

 

일단 내용을 출력해보았다.

[level4@ftz tmp]$ cat /etc/xinetd.d/backdoor
service finger 
{
	disable	= no
	flags		= REUSE
	socket_type	= stream        
	wait		= no
	user		= level5
	server		= /home/level4/tmp/backdoor
	log_on_failure	+= USERID
}

 

이게 뭘 하는 걸까. /etc는 설정파일이 들어있는 디렉토리엔데, 우선 backdoor 파일이 들어있는 xinetd.d 디렉토리에 대해 먼저 알아보았다.

 

 

 

xinetd : 슈퍼데몬이라고도 하며, 어떠한 서비스에 대한 설정 값을 파일로 저장해두는 디렉토리이다. backdoor 파일의 내용으로 
예를 들면 다음과 같다. /etc/services 파일에 들어있는 서비스에 대해서만 설정해 줄 수있다.  

 

슈퍼데몬을 알기 전에 데몬이라는 것부터 알아보았다. 

데몬이란, 시스템에 관련된 작업을 하는 백그라운드 프로세스를 말한다. 대부분이 시스템이 부팅될 때 시작되는데, telnet, ftp, http, sendmail 등이 대표적이다. 데몬은 보통 시스템에 관련된 작업을 하는데 서비스 요청이 없는 경우엔 대기모드가 되어서 CPU를 낮게 차지하는데, 메모리와 기타 자원을 상당부분 차지한다. 

그들 중 슈퍼 데몬(xinetd)이라는 것이 있는데. 이들은 리눅스 상의 데몬들을 관리하고 각각의 연결을 담당하는 역할을 한다. telnet이라는 데몬이 슈퍼 데몬에 의해 제어되는 서비스라고 가정해서 예를 들면, 어떠한 유저가 telnet 접속을 시도하면 telnet에 연결되기 전에 슈퍼데몬에 의해 허가된 사용자인지 검사를 받고나서, /etc/xinetd/telnet 에 정의 된 telnet 서비스에 연결된다. 데몬은 기본 설정에 의해 실행되는 standalone 모드와, 슈퍼데몬의 설정에 의해 실행되는 xinetd모드 두 가지가 존재한다.슈퍼데몬의 설정 값은 다음과 같다. 

service finger 
{
	disable	= no
	flags		= REUSE
	socket_type	= stream        
	wait		= no
	user		= level5
	server		= /home/level4/tmp/backdoor
	log_on_failure	+= USERID
}

 

finger라는 서비스에 대한 설정이다. 

  • disable : 슈퍼데몬에 의해 실행할 건지에 대한 설정. yes는 일반적으로 작동하고, no는 슈퍼데몬으로 작동한다.
  • flags : 서비스 포트가 사용 중인 경우 해당 포트의 재사용 허가에 대한 설정. REUSE가 재사용하겠다는 의미.
  • socket_type : 사용하는 tcp/ip 소켓에 대한 설정. tcp의 경우엔 stream, udp의 경우엔 dgram으로 설정.
  • wait : 서비스 요청을 처리하는 도중 다음 요청이 들어오면 이를 즉시 처리할 것인지 이전 요청이 완료될 때까지 기다릴 것인지에 대한            설정. 즉시 처리할 경우 no, 대기할 경우 yes로 설정하는데, 거의 no를 사용한다고 생각하면 된다.
  • user : 어떤 사용자로 서비스를 실행할 지에 대한 설정.
  • server : 서비스 실행 파일 경로에 대한 설정. 절대경로로 설정해야 한다.
  • log_on_failure : 서버 접속에 실패했을 경우, 로그파일에 기록할 내용에 대한 설정.

 

위의 설명을 토대로 해석하자면, finger라는 서비스를 실행하면 슈퍼데몬에 의해 실행되고 level5라는 유저로 사용하며 실행파일의 경로는 level4/tmp 내에 있는 backdoor라는 파일이고 접속에 실패했을 경우 로그파일에 USERID를 기록한다.

실행 파일 경로인 tmp 내에 my-pass를 호출하는 c 실행 파일을 backdoor라는 이름으로 만들어두면, finger라는 서비스 실행시에 슈퍼데몬에 의해 backdoor 프로그램이 실행되는데, 이 때의 user가 level5이기 때문에 level5의 패스워드가 출력되지 않을까 싶다.

backdoor의 코드는 다음과 같다.

 

//backdoor.c

#include <stdio.h>

int main(){
    system("my-pass");

    return 0;
}

 

backdoor라는 실행파일을 만들고 finger 라는 프로그램을 실행시켜 보았다.

 

 

 

 

 

backdoor에 의해 설정된 프로그램이 아닌 실제 finger 프로그램이 실행되었다. 슈퍼데몬으로 실행되기 위한 조건이 있는지에 찾아보았는데 이유는 backdoor 설정 파일 부분의 disable의 정의에 있었다. disable은 슈퍼데몬에 의해 실행할 것인지에 대한 설정이라고 했는데, 정확히는 "외부 접속에 의해 실행되었을 때" 슈퍼데몬에 의해 실행할 것인지에 대한 설정이다. no이면 그렇다는 것이고, yes이면 그렇지 않고 finger 설정파일의 설정에 따라 실행한다는 의미이다. 또한, finger 명령어 사용 방법 중에 finger @ip 를 통해 해당 서버에 접속하여서 사용자의 정보를 출력하는 방법이 있다. 따라서, finger @자신의 ip주소 명령어를 통해 외부의 접속처럼 실행시키면 슈퍼데몬이 적용되어서 backdoor 파일의 설정에 따라 실행되게 된다. 

먼저 finger을 사용하기 전에 슈퍼데몬을 실행시켜주어야 하는데 명령어는 다음과 같다.

/etc/rc.d/init.d/xinetd start  	//슈퍼데몬 시작
/etc/rc.d/init.d/xinetd stop	//슈퍼데몬 중지
/etc/rc.d/init.d/xinetd restart //슈퍼데몬 재시작

 

이후 127.0.0.1에 접속 요청을 보내면 다음과 같이 출력된다.

 

 

 

 

초반에는 기본적인 명령어의 조합으로도 충분히 풀 수 있었는데, 점점 다양한 기법에 대한 문제가 나오면서 시간이 점점 오래 걸리는데 가장 큰 이유가 리눅스에 대해 모르는 개념이 많아서 인 것 같다. 제공하는 서비스들이 무엇이 있는지, 서비스의 작동 과정이 어떻게 되는지 등에 대해 문제를 하나씩 풀면서 그때마다 필요한 지식들에 대해서 찾아보고, 대충 넘기지 말고 꼭 익히고 넘어가야 할 것 같다.