>> 본 분석은 맘대로 분석한것이니.. 절대 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);
즉 -- 를 줘서 뒤에 오는 옵션인 환경 변수를 사용하지 못하게 하였다.
◈ 해결책
이런 실수를 두번 다시 반복하지 않도록 ^^ 항상 조심하여 코딩!!! 하는 습관을 들이자!!
Trackback URL : http://hacker.or.kr/trackback/3