FTP 인증에 대해 질문 드리겠습니다.
글쓴이: anaud2 / 작성시간: 수, 2008/10/22 - 4:18오후
안녕하세요 FTP를 수정하기 위해 공부 하고 있는 사회초년생입니다.
제가 가지고 있는 소스는 4~5년정도 지난 logdaemon-5.7 이라는 공개 소스중에서 ftp를 보고 있습니다. 계발환경은 리눅스이구요
여기서 인증이 이루어 지는 부분을 보고 있는데요
소스중에서 보면 우선 사용자가 입력하는 ID를 가지고 에 정의되어 있는 passwd 구조체를 읽어 드립니다.
struct passwd { char *pw_name; /* 유저 이름 */ char *pw_passwd; /* 유저 패스워드 */ uid_t pw_uid; /* 유저 id */[code] gid_t pw_gid; /* 그룹 id */ char *pw_gecos; /* 실제 이름 */ char *pw_dir; /* 홈 디렉토리 */ char *pw_shell; /* shell 프로그램 */ }
/*pw <-에 사용자 사용자 아이디를 이용 passwd구조체를 받았다*/
if (!guest) {/* "ftp" is only account allowed no password */ if (pw == NULL) salt = "xx"; else salt = pw->pw_passwd; /*게스트 접속이 아닐경우 salt에 pw->passwd값을 넣는다 출력해보면 "x" 가들어있다. #ifdef KEY xpasswd = key_crypt(passwd, salt, pw, pwok); /*KEY 를 define하지 않았음 (무시)*/ #else xpasswd = crypt(passwd, salt); /*crypt 함수를 사용 crypt함수는 밑에서 설명 passwd는 사용자(FTP접속자)가 입력을한 비번이다.ex)134679 사용자계정과 비밀번호를 올바르게삽입*/ #endif /* The strcmp does not catch null passwords! */ if (pw == NULL || *pw->pw_passwd == '\0' || strcmp(xpasswd, pw->pw_passwd)) /*사용자 아이디 검사이다. pw->pw_passwd와 xpasswd(위에서 접속자가 입력한 비번과 etc/passwd파일을 읽어들인 구조체의 패스워드와 비교한다.*/ { reply(530, "Login incorrect.");/*아래는 모두 실패했을경우*/ pw = NULL; last.failures++; if (login_attempts++ >= 5) { syslog(LOG_ERR,"REPEATED LOGIN FAILURES FROM %.100s, %s",remotehost, last.name); exit(0); } return; } }
/**/으로된 한글은 소스를 제가 분석해서 올린것입니다.
요지를 보면 게스트 접속이 아닐경우 /etc/passwd/파일을 읽어 들여서 사용자가 입력한 패스워드를 crypt 함수로 암호화한 값과 같은지 비교를 합니다.
또한 어떤자료에서는 위의 같은 방법으로 인증을 확인을 한다고 써있습니다.
http://www.osxdev.org/smalltalk/read.php?ID=3843
그런데 문제가 현재 etc/passwd파일을 읽어서 구조체 값을 찍어보면 pw->pw_passwd 이값에는 x란 값이 들어있습니다.
etc/passwd파일을 vi로 열어보더라도 아이디:x:UID 등(순서가 좀 틀릴지 모르겠습니다.)으로 되어있습니다.
이부분을 자료를 찾아보니 x라는 값은 패스워드가 etc/shadow 파일에 들어있다는 표시라고 합니다.
그렇다면 저 소스가 정상적으로 돌아가는거 같지 않는데요 제 추측이 맞다면
4~5년 전에는 passwd파일에서 ID:사용자패스워드를 암호화한 값?사용자 패스워드를 암호화할때 사용한 salt값 :UID:GID
이렇게 되어있었다.라고 생각이 되네요 제 생각이 맞나요?
또한 그렇다면 저소스를 수정해야 되는데 shadow 파일에서 패스워드를 암호화한 값이라고 해야할까요 salt에 들어가는 값을 읽어 들여야 할꺼같은데
알고 계신분이 계신다면 도움을 요청 드리겠습니다.
Forums:
음...
shadow passwd 에 관한 libarary 는 shadow.h 에 정의되어 있습니다.
man getspent 로 확인해 보세요.
struct spwd 구조체의 char *sp_pwdp; 가 encrypt 된 passwd 입니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기