Solaris 10 텔넷 데몬(in.telnetd) 취약점.

Posted 2007/07/23 20:06 by silverbug

>> 본 분석은 맘대로 분석한것이니.. 절대 100% 신뢰하지 말기를 바란다.
>> - 이 글은 유치원 선생님인 황진희로 부터 작성되었으며.. 도와준 우리반 유치원생들에게 감사를 ......
>> 2007년 02월......  유치원 교사 황.(Teacher.Hwang) 씀...

  제목
     Solaris 10  텔넷 데몬(in.telnetd) 취약점.

◈ 개요
      Sun Microsystems사의 Solaris 운영체제는 텔넷 데몬(in.telnetd)의 취약점으로 인해 인증 매커니즘을 우회할 수 있다.

◈ 해당시스템
    # Sun Solaris 10
    # Sun Solaris 11 Beta

◈ 취약점 분석.
    일단 Telnet 데몬이 어떻게 동작하게 되는지 살펴 보도록 하겠다.

>> Telnet Daemon 흐름

- 사용자가 Telnet Client 를 이용하여 접속. 이때 각종 변수는 환경 변수를 통해 전달 된다.
- Telnet Daemon은 사용자가 접속하였을 경우 -l 옵션이나 기타 옵션을 통해 사용자 명이나 기타 옵션을 확인 후 형태에 맞게 실행하게 된다.
- 인증 처리 절차에 의해 Kerberos 인증을 요청했는지 그외의 인증을 요청했는지 확인 후
  각 인증 형태에 맞는 인자값을 주면서 execl 함수를 통하여 login 프로그램을 실행하게 된다.
- 즉 telnet -l root 를 실행했다면..
  execl(LOGIN_PROGRAM, "login", "-p", "-h", host, "-d", slavename, root);
  이런식으로 처리된다.
(실제 인증 처리는 PAM 에서 처리하겠죠~)
- id/password 메세지가 뜨고 인증을 시작하게 된다.

>> 그럼 어디서 문제가 생기는가...??

- 취약점 익스플로잇을 보도록 하자

      telnet -l"-f<user>" <hostname>
      telnet client의 -l옵션은 사용자명을 미리 입력받아 처리해주는 옵션이다.
      이는 환경변수로 USER라는 변수에 유저 네임이 저장되어 처리되게 된다.
      즉! 이 부분에서 문제가 생기게 되는 것이다.
     
      -l 옵션을 주어 유저명을 -f<user>라고 입력하였을 때 -f<user>는 유저명으로 인식되고..
      위에서 telnet 데몬의 흐름을 봤던걸 기억하면 그 유저명은 login 프로그램이 실행될 때 인자값으로
      들어간다는걸 확인 할 수 있었다.
      즉 .. execl(LOGIN_PROGRAM, "login", "-p", "-h", host, "-d", slavename, "-f<user");
      이렇게 들어가게 되서 login 프로그램에서 -f 옵션을 사용함으로서 인해 인증없이 접속이 가능하다.

>> 패치는 어떻게 구성되는가??
패치 전...
(void) execl(LOGIN_PROGRAM, "login", "-p", "-h", host, "-d", slavename, getenv("USER"), 0);

패치 후...
(void) execl(LOGIN_PROGRAM, "login", "-p", "-h", host, "-d", slavename, "--", getenv("USER"), 0);

즉 -- 를 줘서 뒤에 오는 옵션인 환경 변수를 사용하지 못하게 하였다.

 ◈ 해결책

Sun Microsystems사에서 제공하는 패치를 적용함으로써 해당 취약점을 제거할 수 있으며, 운영체제별로 해당하는 패치를 다운받아 설치하면 된다.
또한 telnetd 의 사용보다는 sshd 사용을 권장하며, root 사용자의 원격 접속은 막아두는 것이 좋다.

SPARC Platform
Solaris 10 with patch(120068-02)
http://sunsolve.sun.com/search/document.do?assetkey=urn:cds:docid:1-21-120068-02-1

x86 Platform
Solaris 10 with patch(120069-02)
http://sunsolve.sun.com/search/document.do?assetkey=urn:cds:docid:1-21-120069-02-1

또한 임시 해결책으로는 방화벽에서 특정 호스트만 telnet 포트인 TCP 23번을 허용할 수도 있으며, telnetd 의 사용보다는 sshd 사용을 권장하며, root 사용자의 원격 접속은 막아두는 것이 좋다.



이런 실수를 두번 다시 반복하지 않도록 ^^ 항상 조심하여 코딩!!! 하는 습관을 들이자!!

« PREV : 1 : ... 24 : 25 : 26 : 27 : 28 : 29 : 30 : NEXT »