티스토리 뷰




※ 레벨에대한 정확한 비밀번호를 알려드지는 않습니다.  힌트와 해결과정을 포스팅하려고합니다.

※ 이 게시물은 시스템에대한 폭넓은 이해를 돕기위함이며, 이 게시물을 악용하여 발생한 피해는 책임지지 않습니다.

※ 최대한 스스로 풀어보시기를 권합니다.



레벨1에서는 로컬 백도어를 배웠다. 하지만 로컬 백도어 보다는 당연히 원격 백도어가 훨씬 공격자에게는 편리한 백도어이다. 이번 레벨에서는 리눅스 서버의 네트워크를 이용하는 백도어에 관한 문제이다.





  주어진 힌트




  

 ↑ 힌트를 보며 /etc/xinetd.d/에 배고어를 심어 놓았다고 되어있다. /etc/xinetd.d/ 에 이있는 백도어라면 레벌1에서본 로컬 백도어와는 다른

     네트워크를 이용한 서비스 포트와 관련되 포트임을 알아야한다. 이름에서 알 수 있듯이 포트 백도어는 로컬 백도러와는 달리 원격에서도

     사용할 수 있는 백도어다.



    # 로컬 백도어와 포트배고어로 용어에 차이를 두는 것으 백도어를 이용하는 곳이 로컬 시스템인지 아니면 네트워크를 통한 원격인지의 차이일뿐,

       인증과 인가를 우회해서 신원확인을 거치지 앟은 채로 로그인하겠다는 목적은 동일하다.



   참고 : 슈퍼데몬(xinetd)



  문제 분석




 

↑ /etc/xinetd.d 디렉터리에는 네트워크 서비스 데몬이 모여있다.

    # 다른 서비스와는 권한과 이름이 다른  backdoor라는 서비스가 있다.




↑ backdoor 파일을 분석하는게 관건이다.

    # servicce finger : 서비스의 이름으로서, /etc/service 파일에 있는 서비스명으로 선택하는 것을 권장

    # disable = no : 데몬을 비활성화 하지 않음. disable = yes로 설정된 경우에는 할당 서비스를 기동하지 않음

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

    # socket_type = stream : TCP/IP 프로토콜 선택

    # wait = no : 이미 서비스가 연결된 상태에서 다른 요청이 들어오면 바로 응답함. 즉, finger은 동시에 다수의 접속이 가능하다는 의미

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

    # server = /home/level4/tmp/backdoot : xinetd에 의해 실행될 데몬 파일

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

  

   # 가장 중요한것은 level5의 궈하으로 finger라는 서비스를 이용해 /home/level4/tmp/backdoor 파일이 실행된다는 것이다.





↑ finger 서비스가 사용하는 포트가 79/tcp임을 backdoor 파일을 통해 알 수 있었다. 따라서 공격할때 79번 포트로 접속을 시도하면 된다.

  # 여기서 79/tcp 포트로 접속을 시도하면 된다는 말은 FTZ 서버에 79/tcp 포트가 LISTEN으로 되어있어야 한다는 의미이다.

  # FTZ서버레 접속할 수 있는 것은 FTZ서버에 telnetd 데몬이 기동되어 23/tcp 포트가 열려 있기 때문이다.




↑ 79/tcp 포트가 열려있음을 알 수 있다.




 정작 /home/level4/tmp 안에는 backdoor 파일이 없다.




 데몬을 시작하기위하 'backdoor'파일이 존재 하지 않아 네트워크 백도어가 제대로 구동되지 않는다.

    # 데몬을 실행하기 위해 backdoor 환경의 테스트 파일을 /home/level4/tmp/에  만들어 주면 된다.

     






  해결



백도어느 실행하는 위치에 따라서 로컬 백도어와 원격 백도어로 분류할 수 있다. 용어에서도 짐작할 수 있겠지만 로컬 백도어 보다는 원격 백도어가 공격자에게는 훨씬 유용하다.





 system()함수는 c언어에서 리눅스 쉘 명령어를 불러낼 수 있습니다.

   # /home/level4/tmp/backdoor.c 파일을 만들고, system() 함수를 이용해 level5의 권한으로 명령어 실행을 시도 합니다.

   # hint파일을 열어보고, 로그인한 계정을 확인하는 id 명령어까지 실행하도록 작성했다.




 level5의 권한으로 정확하게 실행되는것을 볼 수 있다.



 우리가 워하는 명령어를 작성한뒤




 level5의 권한으로 실행해보면, 비밀번호를 얻을 수 있다!